From e9b01b2fae12e52db15cf1a6bb2563a5ba1c7b47 Mon Sep 17 00:00:00 2001 From: Moez Bhatti Date: Wed, 27 Dec 2017 01:10:56 -0500 Subject: [PATCH] clear everything --- .DS_Store | Bin 0 -> 6148 bytes .github/ISSUE_TEMPLATE.md | 8 - .gitignore | 28 - .travis.yml | 30 - LICENSE | 674 ----- QKSMS/build.gradle | 116 - QKSMS/qksms-proguard.pro | 99 - .../QKSMS/common/emoji/EmojiRegistryTest.java | 70 - .../QKSMS/common/utils/DateFormatterTest.java | 19 - .../java/com/qklabs/qkms/test/ApnTest.java | 237 -- QKSMS/src/main/AndroidManifest.xml | 577 ---- .../vending/billing/IInAppBillingService.aidl | 144 - QKSMS/src/main/assets/fonts/Roboto-Light.ttf | Bin 126792 -> 0 bytes QKSMS/src/main/assets/fonts/Roboto-Medium.ttf | Bin 127488 -> 0 bytes .../src/main/assets/fonts/Roboto-Regular.ttf | Bin 126072 -> 0 bytes QKSMS/src/main/assets/fonts/Roboto-Thin.ttf | Bin 127584 -> 0 bytes .../assets/fonts/RobotoCondensed-Bold.ttf | Bin 127340 -> 0 bytes .../assets/fonts/RobotoCondensed-Light.ttf | Bin 126168 -> 0 bytes .../assets/fonts/RobotoCondensed-Regular.ttf | Bin 125332 -> 0 bytes .../java/android/annotation/SdkConstant.java | 37 - .../database/sqlite/SqliteWrapper.java | 110 - .../main/java/android/location/Country.java | 202 -- .../android/location/CountryDetector.java | 137 - .../android/location/CountryListener.java | 30 - .../android/location/ICountryDetector.java | 41 - .../android/location/ICountryListener.java | 26 - .../java/android/net/ConnectivityManager.java | 989 ------- .../java/android/net/DhcpInfoInternal.java | 167 -- .../android/net/IConnectivityManager.java | 1536 ----------- .../android/net/INetworkPolicyListener.java | 138 - .../android/net/INetworkPolicyManager.java | 494 ---- .../main/java/android/net/LinkAddress.java | 152 -- .../java/android/net/LinkCapabilities.java | 393 --- .../main/java/android/net/LinkProperties.java | 438 --- .../java/android/net/NetworkIdentity.java | 229 -- .../main/java/android/net/NetworkPolicy.java | 185 -- .../android/net/NetworkPolicyManager.java | 299 -- .../java/android/net/NetworkQuotaInfo.java | 87 - .../main/java/android/net/NetworkState.java | 86 - .../java/android/net/NetworkTemplate.java | 445 --- .../main/java/android/net/NetworkUtils.java | 307 --- .../java/android/net/ProxyProperties.java | 220 -- .../src/main/java/android/net/RouteInfo.java | 287 -- .../main/java/android/provider/Downloads.java | 835 ------ .../annotations/VisibleForTesting.java | 56 - .../android/internal/net/LegacyVpnInfo.java | 95 - .../com/android/internal/net/VpnConfig.java | 117 - .../com/android/internal/net/VpnProfile.java | 203 -- .../internal/telephony/EncodeException.java | 36 - .../internal/telephony/GsmAlphabet.java | 1500 ----------- .../android/internal/telephony/IccUtils.java | 519 ---- .../internal/telephony/PhoneConstants.java | 190 -- .../internal/telephony/RILConstants.java | 338 --- .../internal/telephony/SmsConstants.java | 83 - .../telephony/TelephonyProperties.java | 207 -- .../com/android/internal/util/ArrayUtils.java | 243 -- .../com/android/internal/util/Objects.java | 62 - .../android/internal/util/Preconditions.java | 69 - .../java/com/android/mms/dom/AttrImpl.java | 108 - .../com/android/mms/dom/DocumentImpl.java | 194 -- .../java/com/android/mms/dom/ElementImpl.java | 172 -- .../com/android/mms/dom/NamedNodeMapImpl.java | 88 - .../java/com/android/mms/dom/NodeImpl.java | 274 -- .../com/android/mms/dom/NodeListImpl.java | 129 - .../com/android/mms/dom/events/EventImpl.java | 127 - .../mms/dom/events/EventTargetImpl.java | 132 - .../ElementParallelTimeContainerImpl.java | 156 -- .../ElementSequentialTimeContainerImpl.java | 74 - .../dom/smil/ElementTimeContainerImpl.java | 33 - .../android/mms/dom/smil/ElementTimeImpl.java | 349 --- .../mms/dom/smil/SmilDocumentImpl.java | 295 -- .../android/mms/dom/smil/SmilElementImpl.java | 48 - .../mms/dom/smil/SmilLayoutElementImpl.java | 60 - .../mms/dom/smil/SmilMediaElementImpl.java | 340 --- .../mms/dom/smil/SmilParElementImpl.java | 218 -- .../com/android/mms/dom/smil/SmilPlayer.java | 744 ----- .../mms/dom/smil/SmilRefElementImpl.java | 29 - .../mms/dom/smil/SmilRegionElementImpl.java | 264 -- .../dom/smil/SmilRegionMediaElementImpl.java | 53 - .../dom/smil/SmilRootLayoutElementImpl.java | 84 - .../com/android/mms/dom/smil/TimeImpl.java | 295 -- .../android/mms/dom/smil/TimeListImpl.java | 54 - .../dom/smil/parser/SmilContentHandler.java | 85 - .../mms/dom/smil/parser/SmilXmlParser.java | 76 - .../dom/smil/parser/SmilXmlSerializer.java | 85 - .../mms/transaction/AbstractRetryScheme.java | 32 - .../mms/transaction/DefaultRetryScheme.java | 56 - .../android/mms/transaction/HttpUtils.java | 362 --- .../mms/transaction/MessageSender.java | 34 - .../transaction/MessageStatusReceiver.java | 35 - .../mms/transaction/MessageStatusService.java | 102 - .../mms/transaction/MmsMessageSender.java | 195 -- .../transaction/MmsPushOutboxMessages.java | 46 - .../transaction/MmsSystemEventReceiver.java | 97 - .../transaction/NotificationTransaction.java | 278 -- .../android/mms/transaction/Observable.java | 78 - .../com/android/mms/transaction/Observer.java | 32 - .../transaction/ProgressCallbackEntity.java | 90 - .../mms/transaction/ReadRecTransaction.java | 111 - .../mms/transaction/RetrieveTransaction.java | 303 --- .../mms/transaction/RetryScheduler.java | 342 --- .../mms/transaction/SendTransaction.java | 178 -- .../android/mms/transaction/Transaction.java | 211 -- .../mms/transaction/TransactionBundle.java | 146 - .../mms/transaction/TransactionService.java | 979 ------- .../mms/transaction/TransactionSettings.java | 209 -- .../mms/transaction/TransactionState.java | 89 - .../com/android/mms/util/DownloadManager.java | 198 -- .../com/android/mms/util/RateController.java | 155 -- .../mms/util/SendingProgressTokenManager.java | 52 - .../java/com/google/android/collect/Sets.java | 92 - .../main/java/com/google/android/mms/APN.java | 17 - .../com/google/android/mms/APNHelper.java | 54 - .../com/google/android/mms/ContentType.java | 230 -- .../mms/InvalidHeaderValueException.java | 41 - .../java/com/google/android/mms/MMSPart.java | 10 - .../com/google/android/mms/MmsException.java | 60 - .../android/mms/pdu_alt/AcknowledgeInd.java | 89 - .../google/android/mms/pdu_alt/Base64.java | 163 -- .../android/mms/pdu_alt/CharacterSets.java | 172 -- .../android/mms/pdu_alt/DeliveryInd.java | 138 - .../mms/pdu_alt/EncodedStringValue.java | 289 -- .../android/mms/pdu_alt/GenericPdu.java | 123 - .../mms/pdu_alt/MultimediaMessagePdu.java | 150 -- .../android/mms/pdu_alt/NotificationInd.java | 285 -- .../android/mms/pdu_alt/NotifyRespInd.java | 114 - .../google/android/mms/pdu_alt/PduBody.java | 191 -- .../android/mms/pdu_alt/PduComposer.java | 1188 -------- .../android/mms/pdu_alt/PduContentTypes.java | 110 - .../android/mms/pdu_alt/PduHeaders.java | 1345 --------- .../google/android/mms/pdu_alt/PduParser.java | 1967 -------------- .../google/android/mms/pdu_alt/PduPart.java | 406 --- .../android/mms/pdu_alt/PduPersister.java | 1537 ----------- .../android/mms/pdu_alt/QuotedPrintable.java | 68 - .../android/mms/pdu_alt/ReadOrigInd.java | 153 -- .../android/mms/pdu_alt/ReadRecInd.java | 144 - .../android/mms/pdu_alt/RetrieveConf.java | 300 --- .../google/android/mms/pdu_alt/SendConf.java | 117 - .../google/android/mms/pdu_alt/SendReq.java | 346 --- .../google/android/mms/smil/SmilHelper.java | 139 - .../android/mms/util_alt/AbstractCache.java | 97 - .../mms/util_alt/DownloadDrmHelper.java | 112 - .../mms/util_alt/DrmConvertSession.java | 173 -- .../google/android/mms/util_alt/PduCache.java | 253 -- .../android/mms/util_alt/PduCacheEntry.java | 44 - .../android/mms/util_alt/SqliteWrapper.java | 120 - .../sdk/EndlessJabberInterface.java | 105 - .../sdk/EndlessJabberReceiver.java | 22 - .../sdk/EndlessJabberWakefulService.java | 79 - .../sdk/IEndlessJabberImplementation.java | 50 - .../mariussoft/endlessjabber/sdk/MMSPart.java | 57 - .../sdk/WakefulBroadcastReceiver.java | 135 - .../QKSMS/ContentRestrictionException.java | 37 - .../QKSMS/ExceedMessageSizeException.java | 33 - .../src/main/java/com/moez/QKSMS/LogTag.java | 131 - .../main/java/com/moez/QKSMS/MmsConfig.java | 466 ---- .../java/com/moez/QKSMS/QKSMSAppBase.java | 208 -- .../com/moez/QKSMS/ResolutionException.java | 33 - .../java/com/moez/QKSMS/TempFileProvider.java | 177 -- .../QKSMS/UnsupportContentTypeException.java | 33 - .../QKSMS/common/AnalyticsManagerBase.java | 24 - .../common/BlockedConversationHelper.java | 188 -- .../moez/QKSMS/common/CIELChEvaluator.java | 156 -- .../QKSMS/common/ConversationPrefsHelper.java | 103 - .../com/moez/QKSMS/common/DialogHelper.java | 151 -- .../moez/QKSMS/common/DonationManager.java | 221 -- .../com/moez/QKSMS/common/FontManager.java | 149 - .../moez/QKSMS/common/LifecycleHandler.java | 70 - .../com/moez/QKSMS/common/ListviewHelper.java | 42 - .../moez/QKSMS/common/LiveViewManager.java | 121 - .../com/moez/QKSMS/common/QKPreferences.java | 47 - .../com/moez/QKSMS/common/QKRateSnack.java | 55 - .../moez/QKSMS/common/TypefaceManager.java | 140 - .../QKSMS/common/emoji/EmojiRegistry.java | 136 - .../com/moez/QKSMS/common/emoji/Emojis.java | 1281 --------- .../QKSMS/common/formatter/Formatter.java | 5 - .../common/formatter/FormatterFactory.java | 12 - .../formatter/NumberToContactFormatter.java | 43 - .../google/BackgroundLoaderManager.java | 164 -- .../moez/QKSMS/common/google/BlobCache.java | 680 ----- .../QKSMS/common/google/CacheManager.java | 89 - .../moez/QKSMS/common/google/DraftCache.java | 259 -- .../common/google/ImageCacheService.java | 172 -- .../common/google/ItemLoadedCallback.java | 32 - .../QKSMS/common/google/ItemLoadedFuture.java | 37 - .../common/google/NullItemLoadedFuture.java | 40 - .../QKSMS/common/google/PduLoaderManager.java | 235 -- .../moez/QKSMS/common/google/Recycler.java | 473 ---- .../moez/QKSMS/common/google/SimpleCache.java | 136 - .../QKSMS/common/google/ThumbnailManager.java | 535 ---- .../moez/QKSMS/common/google/UriImage.java | 562 ---- .../moez/QKSMS/common/utils/AddressUtils.java | 85 - .../moez/QKSMS/common/utils/ArrayUtils.java | 18 - .../moez/QKSMS/common/utils/ColorUtils.java | 43 - .../moez/QKSMS/common/utils/CursorUtils.java | 72 - .../QKSMS/common/utils/DateFormatter.java | 95 - .../com/moez/QKSMS/common/utils/DrmUtils.java | 78 - .../moez/QKSMS/common/utils/EmojiUtils.java | 1456 ---------- .../moez/QKSMS/common/utils/ImageUtils.java | 127 - .../QKSMS/common/utils/KeyboardUtils.java | 59 - .../moez/QKSMS/common/utils/LinkifyUtils.java | 111 - .../moez/QKSMS/common/utils/MessageUtils.java | 1446 ---------- .../moez/QKSMS/common/utils/PackageUtils.java | 16 - .../QKSMS/common/utils/PhoneNumberUtils.java | 468 ---- .../moez/QKSMS/common/utils/TextUtils.java | 81 - .../com/moez/QKSMS/common/utils/Units.java | 36 - .../moez/QKSMS/common/utils/ViewUtils.java | 25 - .../common/vcard/AndroidCustomField.java | 123 - .../QKSMS/common/vcard/ContactOperations.java | 560 ---- .../moez/QKSMS/common/vcard/DataMappings.java | 287 -- .../java/com/moez/QKSMS/data/Contact.java | 1189 -------- .../com/moez/QKSMS/data/ContactHelper.java | 218 -- .../java/com/moez/QKSMS/data/ContactList.java | 178 -- .../com/moez/QKSMS/data/Conversation.java | 1466 ---------- .../moez/QKSMS/data/ConversationLegacy.java | 309 --- .../java/com/moez/QKSMS/data/Message.java | 189 -- .../com/moez/QKSMS/data/RecipientIdCache.java | 276 -- .../com/moez/QKSMS/enums/QKPreference.java | 124 - .../QKSMS/exif/ByteBufferInputStream.java | 48 - .../QKSMS/exif/CountedDataInputStream.java | 136 - .../java/com/moez/QKSMS/exif/ExifData.java | 348 --- .../com/moez/QKSMS/exif/ExifInterface.java | 2398 ----------------- .../exif/ExifInvalidFormatException.java | 23 - .../com/moez/QKSMS/exif/ExifModifier.java | 195 -- .../com/moez/QKSMS/exif/ExifOutputStream.java | 518 ---- .../java/com/moez/QKSMS/exif/ExifParser.java | 913 ------- .../java/com/moez/QKSMS/exif/ExifReader.java | 92 - .../java/com/moez/QKSMS/exif/ExifTag.java | 996 ------- .../java/com/moez/QKSMS/exif/IfdData.java | 152 -- .../main/java/com/moez/QKSMS/exif/IfdId.java | 31 - .../java/com/moez/QKSMS/exif/JpegHeader.java | 39 - .../QKSMS/exif/OrderedDataOutputStream.java | 56 - .../java/com/moez/QKSMS/exif/Rational.java | 88 - .../com/moez/QKSMS/external/iab/Base64.java | 570 ---- .../external/iab/Base64DecoderException.java | 32 - .../moez/QKSMS/external/iab/IabException.java | 43 - .../moez/QKSMS/external/iab/IabHelper.java | 1009 ------- .../moez/QKSMS/external/iab/IabResult.java | 45 - .../moez/QKSMS/external/iab/Inventory.java | 91 - .../com/moez/QKSMS/external/iab/Purchase.java | 63 - .../com/moez/QKSMS/external/iab/Security.java | 119 - .../moez/QKSMS/external/iab/SkuDetails.java | 58 - .../QKSMS/interfaces/ActivityLauncher.java | 11 - .../AdaptableSlideViewInterface.java | 45 - .../QKSMS/interfaces/ConversationDetails.java | 7 - .../com/moez/QKSMS/interfaces/LiveView.java | 5 - .../QKSMS/interfaces/RecipientProvider.java | 5 - .../QKSMS/interfaces/SlideViewInterface.java | 49 - .../moez/QKSMS/interfaces/ViewInterface.java | 40 - .../main/java/com/moez/QKSMS/mmssms/Apn.java | 65 - .../java/com/moez/QKSMS/mmssms/ApnUtils.java | 200 -- .../moez/QKSMS/mmssms/DeliveredReceiver.java | 114 - .../com/moez/QKSMS/mmssms/DisconnectWifi.java | 34 - .../java/com/moez/QKSMS/mmssms/Message.java | 496 ---- .../com/moez/QKSMS/mmssms/SentReceiver.java | 114 - .../java/com/moez/QKSMS/mmssms/Settings.java | 465 ---- .../com/moez/QKSMS/mmssms/StripAccents.java | 49 - .../com/moez/QKSMS/mmssms/Transaction.java | 1257 --------- .../java/com/moez/QKSMS/mmssms/Utils.java | 426 --- .../java/com/moez/QKSMS/model/AudioModel.java | 160 -- .../model/CarrierContentRestriction.java | 106 - .../com/moez/QKSMS/model/ChangeModel.java | 63 - .../moez/QKSMS/model/ContentRestriction.java | 34 - .../model/ContentRestrictionFactory.java | 31 - .../QKSMS/model/IModelChangedObserver.java | 22 - .../java/com/moez/QKSMS/model/ImageModel.java | 255 -- .../com/moez/QKSMS/model/LayoutModel.java | 271 -- .../java/com/moez/QKSMS/model/MediaModel.java | 313 --- .../moez/QKSMS/model/MediaModelFactory.java | 501 ---- .../main/java/com/moez/QKSMS/model/Model.java | 62 - .../moez/QKSMS/model/RegionMediaModel.java | 68 - .../com/moez/QKSMS/model/RegionModel.java | 147 - .../java/com/moez/QKSMS/model/SlideModel.java | 574 ---- .../com/moez/QKSMS/model/SlideshowModel.java | 751 ------ .../java/com/moez/QKSMS/model/SmilHelper.java | 415 --- .../java/com/moez/QKSMS/model/TextModel.java | 111 - .../java/com/moez/QKSMS/model/VideoModel.java | 221 -- .../QKSMS/receiver/AirplaneModeReceiver.java | 73 - .../com/moez/QKSMS/receiver/BootReceiver.java | 22 - .../QKSMS/receiver/DeliveredReceiver.java | 35 - .../QKSMS/receiver/IconColorReceiver.java | 91 - .../moez/QKSMS/receiver/MarkReadReceiver.java | 24 - .../moez/QKSMS/receiver/MarkSeenReceiver.java | 16 - .../QKSMS/receiver/MessageFailedReceiver.java | 18 - .../QKSMS/receiver/MessagingReceiver.java | 135 - .../com/moez/QKSMS/receiver/MmsReceiver.java | 166 -- .../QKSMS/receiver/NightModeAutoReceiver.java | 52 - .../com/moez/QKSMS/receiver/PushReceiver.java | 256 -- .../com/moez/QKSMS/receiver/QKIntent.java | 5 - .../receiver/RemoteMessagingReceiver.java | 142 - .../com/moez/QKSMS/receiver/SmsReceiver.java | 5 - .../QKSMS/receiver/SmsReceiverLegacy.java | 4 - .../QKSMS/receiver/UnreadBadgeService.java | 31 - .../service/CopyUnreadMessageTextService.java | 41 - .../service/DeleteOldMessagesService.java | 86 - .../service/DeleteUnreadMessageService.java | 44 - .../QKSMS/service/HeadlessSmsSendService.java | 49 - .../moez/QKSMS/service/MarkReadService.java | 23 - .../moez/QKSMS/service/MarkSeenService.java | 21 - .../QKSMS/service/NotificationService.java | 88 - .../moez/QKSMS/service/PushbulletService.java | 36 - .../QKSMS/service/ShouldIAnswerService.java | 64 - .../com/moez/QKSMS/theme/IconAdapter.java | 50 - .../com/moez/QKSMS/theme/IconViewHolder.java | 27 - .../moez/QKSMS/transaction/EndlessJabber.java | 57 - .../transaction/NotificationManager.java | 760 ------ .../com/moez/QKSMS/transaction/SmsHelper.java | 887 ------ .../moez/QKSMS/transaction/SqliteWrapper.java | 105 - .../com/moez/QKSMS/ui/ContentFragment.java | 47 - .../java/com/moez/QKSMS/ui/MainActivity.java | 406 --- .../com/moez/QKSMS/ui/SwipeBackLayout.java | 512 ---- .../java/com/moez/QKSMS/ui/ThemeManager.java | 786 ------ .../moez/QKSMS/ui/base/ClickyViewHolder.java | 32 - .../com/moez/QKSMS/ui/base/QKActivity.java | 311 --- .../com/moez/QKSMS/ui/base/QKFragment.java | 53 - .../moez/QKSMS/ui/base/QKPopupActivity.java | 55 - .../QKSMS/ui/base/QKSwipeBackActivity.java | 51 - .../QKSMS/ui/base/RecyclerCursorAdapter.java | 142 - .../QKSMS/ui/compose/ComposeActivity.java | 63 - .../QKSMS/ui/compose/ComposeFragment.java | 115 - .../ConversationListAdapter.java | 128 - .../ConversationListFragment.java | 350 --- .../ConversationListViewHolder.java | 114 - .../ui/delivery/DeliveryReportHelper.java | 330 --- .../QKSMS/ui/delivery/DeliveryReportItem.java | 34 - .../com/moez/QKSMS/ui/dialog/AsyncDialog.java | 162 -- .../QKSMS/ui/dialog/BlockedNumberDialog.java | 64 - .../ui/dialog/BubblePreferenceDialog.java | 107 - .../ui/dialog/ColorPickerPagerAdapter.java | 57 - .../ui/dialog/ConversationSettingsDialog.java | 142 - .../QKSMS/ui/dialog/DefaultSmsHelper.java | 91 - .../com/moez/QKSMS/ui/dialog/QKDialog.java | 478 ---- ...ConversationDetailsContactListAdapter.java | 65 - .../ConversationDetailsDialog.java | 53 - .../ui/dialog/mms/MMSDialogFragment.java | 481 ---- .../QKSMS/ui/dialog/mms/MMSSetupFragment.java | 402 --- .../QKSMS/ui/messagelist/MessageColumns.java | 247 -- .../QKSMS/ui/messagelist/MessageItem.java | 442 --- .../ui/messagelist/MessageItemCache.java | 63 - .../ui/messagelist/MessageListActivity.java | 171 -- .../ui/messagelist/MessageListAdapter.java | 622 ----- .../ui/messagelist/MessageListFragment.java | 1020 ------- .../ui/messagelist/MessageListViewHolder.java | 232 -- .../QKSMS/ui/mms/MmsThumbnailPresenter.java | 116 - .../java/com/moez/QKSMS/ui/mms/Presenter.java | 62 - .../java/com/moez/QKSMS/ui/mms/SlideView.java | 553 ---- .../moez/QKSMS/ui/mms/SlideshowActivity.java | 410 --- .../moez/QKSMS/ui/mms/SlideshowPresenter.java | 313 --- .../ui/mms/layout/HVGALayoutParameters.java | 96 - .../QKSMS/ui/mms/layout/LayoutManager.java | 106 - .../QKSMS/ui/mms/layout/LayoutParameters.java | 56 - .../QKSMS/ui/popup/QKComposeActivity.java | 104 - .../moez/QKSMS/ui/popup/QKReplyActivity.java | 306 --- .../moez/QKSMS/ui/popup/QKReplyAdapter.java | 60 - .../moez/QKSMS/ui/search/SearchActivity.java | 35 - .../moez/QKSMS/ui/search/SearchAdapter.java | 94 - .../com/moez/QKSMS/ui/search/SearchData.java | 33 - .../moez/QKSMS/ui/search/SearchFragment.java | 137 - .../QKSMS/ui/search/SearchViewHolder.java | 27 - .../QKSMS/ui/settings/QKResponseAdapter.java | 67 - .../QKSMS/ui/settings/SettingsActivity.java | 38 - .../QKSMS/ui/settings/SettingsFragment.java | 755 ------ .../QKSMS/ui/settings/TimePickerFragment.java | 71 - .../QKSMS/ui/view/AttachmentImageView.java | 32 - .../ui/view/AutoCompleteContactView.java | 71 - .../com/moez/QKSMS/ui/view/AvatarView.java | 341 --- .../com/moez/QKSMS/ui/view/ComposeView.java | 1035 ------- .../ui/view/MessageListRecyclerView.java | 80 - .../com/moez/QKSMS/ui/view/QKEditText.java | 106 - .../com/moez/QKSMS/ui/view/QKImageView.java | 54 - .../moez/QKSMS/ui/view/QKLinearLayout.java | 77 - .../com/moez/QKSMS/ui/view/QKPreference.java | 51 - .../QKSMS/ui/view/QKRingtonePreference.java | 54 - .../java/com/moez/QKSMS/ui/view/QKSwitch.java | 87 - .../QKSMS/ui/view/QKSwitchPreference.java | 72 - .../com/moez/QKSMS/ui/view/QKTextView.java | 145 - .../moez/QKSMS/ui/view/RobotoTextView.java | 57 - .../com/moez/QKSMS/ui/view/RunnableToast.java | 29 - .../ui/view/SmoothLinearLayoutManager.java | 53 - .../QKSMS/ui/view/StarredContactsView.java | 181 -- .../com/moez/QKSMS/ui/view/WrapLayout.java | 64 - .../ui/view/WrappingLinearLayoutManager.java | 191 -- .../view/colorpicker/ColorPickerDialog.java | 119 - .../view/colorpicker/ColorPickerPalette.java | 131 - .../view/colorpicker/ColorPickerSwatch.java | 54 - .../view/colorpicker/ColorStateDrawable.java | 43 - .../QKSMS/ui/welcome/BaseWelcomeFragment.java | 29 - .../moez/QKSMS/ui/welcome/PagerScroller.java | 35 - .../QKSMS/ui/welcome/WelcomeActivity.java | 169 -- .../ui/welcome/WelcomeIntroFragment.java | 31 - .../ui/welcome/WelcomeNightFragment.java | 92 - .../QKSMS/ui/welcome/WelcomePagerAdapter.java | 46 - .../ui/welcome/WelcomeThemeFragment.java | 43 - .../moez/QKSMS/ui/widget/WidgetProvider.java | 175 -- .../moez/QKSMS/ui/widget/WidgetService.java | 306 --- .../muzutozvednout/ShouldIAnswerBinder.java | 98 - .../org/w3c/dom/events/DocumentEvent.java | 56 - .../main/java/org/w3c/dom/events/Event.java | 141 - .../org/w3c/dom/events/EventException.java | 36 - .../org/w3c/dom/events/EventListener.java | 41 - .../java/org/w3c/dom/events/EventTarget.java | 102 - .../smil/ElementExclusiveTimeContainer.java | 41 - .../java/org/w3c/dom/smil/ElementLayout.java | 55 - .../smil/ElementParallelTimeContainer.java | 40 - .../smil/ElementSequentialTimeContainer.java | 21 - .../org/w3c/dom/smil/ElementSyncBehavior.java | 49 - .../w3c/dom/smil/ElementTargetAttributes.java | 38 - .../java/org/w3c/dom/smil/ElementTest.java | 83 - .../java/org/w3c/dom/smil/ElementTime.java | 161 -- .../w3c/dom/smil/ElementTimeContainer.java | 39 - .../org/w3c/dom/smil/ElementTimeControl.java | 103 - .../w3c/dom/smil/ElementTimeManipulation.java | 75 - .../w3c/dom/smil/SMILAnimateColorElement.java | 20 - .../org/w3c/dom/smil/SMILAnimateElement.java | 20 - .../dom/smil/SMILAnimateMotionElement.java | 41 - .../java/org/w3c/dom/smil/SMILAnimation.java | 124 - .../java/org/w3c/dom/smil/SMILDocument.java | 51 - .../java/org/w3c/dom/smil/SMILElement.java | 40 - .../org/w3c/dom/smil/SMILLayoutElement.java | 48 - .../org/w3c/dom/smil/SMILMediaElement.java | 157 -- .../java/org/w3c/dom/smil/SMILParElement.java | 23 - .../java/org/w3c/dom/smil/SMILRefElement.java | 20 - .../org/w3c/dom/smil/SMILRegionElement.java | 61 - .../org/w3c/dom/smil/SMILRegionInterface.java | 26 - .../w3c/dom/smil/SMILRegionMediaElement.java | 22 - .../w3c/dom/smil/SMILRootLayoutElement.java | 21 - .../java/org/w3c/dom/smil/SMILSetElement.java | 27 - .../org/w3c/dom/smil/SMILSwitchElement.java | 30 - .../w3c/dom/smil/SMILTopLayoutElement.java | 21 - .../src/main/java/org/w3c/dom/smil/Time.java | 119 - .../main/java/org/w3c/dom/smil/TimeEvent.java | 53 - .../main/java/org/w3c/dom/smil/TimeList.java | 41 - .../java/org/w3c/dom/views/AbstractView.java | 27 - .../java/org/w3c/dom/views/DocumentView.java | 30 - .../src/main/res/color/text_primary_dark.xml | 6 - .../src/main/res/color/text_primary_light.xml | 6 - .../res/drawable-nodpi/widget_preview.png | Bin 58227 -> 0 bytes QKSMS/src/main/res/drawable-v21/ripple.xml | 9 - .../main/res/drawable-v21/ripple_light.xml | 9 - .../res/drawable-xhdpi/ic_swatch_selected.png | Bin 1767 -> 0 bytes .../main/res/drawable-xhdpi/shadow_bottom.png | Bin 2868 -> 0 bytes .../main/res/drawable-xhdpi/shadow_left.png | Bin 2865 -> 0 bytes .../main/res/drawable-xxhdpi/card_mask.9.png | Bin 547 -> 0 bytes .../drawable-xxhdpi/dialog_background.9.png | Bin 2231 -> 0 bytes .../main/res/drawable-xxhdpi/scrollbar.9.png | Bin 269 -> 0 bytes .../res/drawable-xxhdpi/send_background.png | Bin 1543 -> 0 bytes .../main/res/drawable-xxhdpi/tools_avatar.png | Bin 9436 -> 0 bytes .../main/res/drawable-xxxhdpi/ab_shadow.9.png | Bin 156 -> 0 bytes .../main/res/drawable-xxxhdpi/ic_accept.png | Bin 587 -> 0 bytes .../res/drawable-xxxhdpi/ic_notification.png | Bin 3181 -> 0 bytes .../ic_notification_failed.png | Bin 5443 -> 0 bytes .../main/res/drawable-xxxhdpi/ic_reply.png | Bin 722 -> 0 bytes .../drawable-xxxhdpi/message_neutral.9.png | Bin 444 -> 0 bytes .../drawable-xxxhdpi/message_neutral_2.9.png | Bin 815 -> 0 bytes .../drawable-xxxhdpi/message_received.9.png | Bin 620 -> 0 bytes .../drawable-xxxhdpi/message_received_2.9.png | Bin 951 -> 0 bytes .../message_received_alt.9.png | Bin 467 -> 0 bytes .../message_received_alt_2.9.png | Bin 845 -> 0 bytes .../res/drawable-xxxhdpi/message_sent.9.png | Bin 636 -> 0 bytes .../res/drawable-xxxhdpi/message_sent_2.9.png | Bin 962 -> 0 bytes .../drawable-xxxhdpi/message_sent_alt.9.png | Bin 465 -> 0 bytes .../drawable-xxxhdpi/message_sent_alt_2.9.png | Bin 846 -> 0 bytes .../res/drawable-xxxhdpi/plus_to_arrow_00.png | Bin 248 -> 0 bytes .../res/drawable-xxxhdpi/plus_to_arrow_01.png | Bin 933 -> 0 bytes .../res/drawable-xxxhdpi/plus_to_arrow_02.png | Bin 999 -> 0 bytes .../res/drawable-xxxhdpi/plus_to_arrow_03.png | Bin 1017 -> 0 bytes .../res/drawable-xxxhdpi/plus_to_arrow_04.png | Bin 1032 -> 0 bytes .../res/drawable-xxxhdpi/plus_to_arrow_05.png | Bin 1003 -> 0 bytes .../res/drawable-xxxhdpi/plus_to_arrow_06.png | Bin 957 -> 0 bytes .../res/drawable-xxxhdpi/plus_to_arrow_07.png | Bin 992 -> 0 bytes .../res/drawable-xxxhdpi/plus_to_arrow_08.png | Bin 986 -> 0 bytes .../res/drawable-xxxhdpi/plus_to_arrow_09.png | Bin 983 -> 0 bytes .../res/drawable-xxxhdpi/plus_to_arrow_10.png | Bin 952 -> 0 bytes .../res/drawable-xxxhdpi/plus_to_arrow_11.png | Bin 1002 -> 0 bytes .../res/drawable-xxxhdpi/plus_to_arrow_12.png | Bin 1000 -> 0 bytes .../res/drawable-xxxhdpi/plus_to_arrow_13.png | Bin 963 -> 0 bytes .../res/drawable-xxxhdpi/plus_to_arrow_14.png | Bin 920 -> 0 bytes .../res/drawable-xxxhdpi/plus_to_arrow_15.png | Bin 669 -> 0 bytes QKSMS/src/main/res/drawable/arrow_to_plus.xml | 52 - QKSMS/src/main/res/drawable/blank.xml | 3 - QKSMS/src/main/res/drawable/button_white.xml | 24 - QKSMS/src/main/res/drawable/cancel_shadow.xml | 9 - QKSMS/src/main/res/drawable/card.xml | 31 - QKSMS/src/main/res/drawable/check_to_off.xml | 53 - QKSMS/src/main/res/drawable/check_to_on.xml | 53 - QKSMS/src/main/res/drawable/circle.xml | 5 - .../main/res/drawable/color_picker_swatch.xml | 4 - .../main/res/drawable/compose_background.xml | 9 - QKSMS/src/main/res/drawable/edittext.xml | 9 - .../res/drawable/edittext_colour_selector.xml | 7 - QKSMS/src/main/res/drawable/ic_add.xml | 9 - QKSMS/src/main/res/drawable/ic_arrow_left.xml | 10 - .../src/main/res/drawable/ic_arrow_right.xml | 9 - .../src/main/res/drawable/ic_attach_audio.xml | 9 - QKSMS/src/main/res/drawable/ic_call.xml | 9 - QKSMS/src/main/res/drawable/ic_camera.xml | 12 - QKSMS/src/main/res/drawable/ic_cancel.xml | 9 - QKSMS/src/main/res/drawable/ic_chat.xml | 9 - QKSMS/src/main/res/drawable/ic_compose.xml | 9 - QKSMS/src/main/res/drawable/ic_delete.xml | 9 - QKSMS/src/main/res/drawable/ic_delivered.xml | 9 - QKSMS/src/main/res/drawable/ic_donate.xml | 9 - QKSMS/src/main/res/drawable/ic_drop_down.xml | 9 - QKSMS/src/main/res/drawable/ic_error.xml | 9 - QKSMS/src/main/res/drawable/ic_fold.xml | 9 - QKSMS/src/main/res/drawable/ic_info.xml | 9 - QKSMS/src/main/res/drawable/ic_info_fill.xml | 9 - QKSMS/src/main/res/drawable/ic_lock.xml | 10 - QKSMS/src/main/res/drawable/ic_mark_read.xml | 9 - .../src/main/res/drawable/ic_mark_unread.xml | 9 - .../main/res/drawable/ic_notifications.xml | 9 - .../res/drawable/ic_notifications_muted.xml | 9 - QKSMS/src/main/res/drawable/ic_palette.xml | 9 - QKSMS/src/main/res/drawable/ic_person.xml | 9 - QKSMS/src/main/res/drawable/ic_photo.xml | 9 - QKSMS/src/main/res/drawable/ic_play.xml | 9 - QKSMS/src/main/res/drawable/ic_search.xml | 9 - QKSMS/src/main/res/drawable/ic_selected.xml | 9 - QKSMS/src/main/res/drawable/ic_settings.xml | 9 - QKSMS/src/main/res/drawable/ic_timer.xml | 9 - QKSMS/src/main/res/drawable/ic_unfold.xml | 9 - .../main/res/drawable/ic_unread_indicator.xml | 9 - QKSMS/src/main/res/drawable/ic_unselected.xml | 9 - QKSMS/src/main/res/drawable/plus_to_arrow.xml | 52 - QKSMS/src/main/res/drawable/ripple.xml | 15 - QKSMS/src/main/res/drawable/ripple_light.xml | 15 - QKSMS/src/main/res/drawable/seek_thumb.xml | 12 - .../main/res/drawable/shadow_slidingmenu.xml | 9 - .../main/res/drawable/system_bar_empty.xml | 6 - QKSMS/src/main/res/drawable/widget_header.xml | 16 - .../res/drawable/widget_list_background.xml | 16 - .../src/main/res/layout/activity_fragment.xml | 27 - .../main/res/layout/activity_qkcompose.xml | 46 - .../src/main/res/layout/activity_qkreply.xml | 50 - .../src/main/res/layout/activity_welcome.xml | 80 - QKSMS/src/main/res/layout/content_frame.xml | 5 - QKSMS/src/main/res/layout/dialog_bubbles.xml | 65 - .../main/res/layout/dialog_color_picker.xml | 208 -- .../res/layout/dialog_color_picker_led.xml | 31 - .../layout/dialog_conversation_details.xml | 53 - .../main/res/layout/dialog_delete_thread.xml | 35 - QKSMS/src/main/res/layout/dialog_donate.xml | 121 - QKSMS/src/main/res/layout/dialog_material.xml | 101 - QKSMS/src/main/res/layout/dialog_redeem.xml | 14 - .../src/main/res/layout/fragment_compose.xml | 35 - .../main/res/layout/fragment_conversation.xml | 30 - .../res/layout/fragment_conversations.xml | 53 - QKSMS/src/main/res/layout/fragment_search.xml | 35 - .../res/layout/fragment_welcome_greeting.xml | 46 - .../res/layout/fragment_welcome_night.xml | 48 - .../layout/fragment_welcome_quickreply.xml | 48 - .../res/layout/fragment_welcome_theme.xml | 50 - .../src/main/res/layout/list_item_contact.xml | 69 - .../res/layout/list_item_conversation.xml | 123 - .../layout/list_item_conversation_widget.xml | 91 - QKSMS/src/main/res/layout/list_item_dual.xml | 26 - QKSMS/src/main/res/layout/list_item_icon.xml | 17 - .../main/res/layout/list_item_message_in.xml | 141 - .../main/res/layout/list_item_message_out.xml | 141 - .../main/res/layout/list_item_preference.xml | 55 - .../layout/list_item_preference_category.xml | 26 - .../main/res/layout/list_item_qk_response.xml | 25 - .../main/res/layout/list_item_recipient.xml | 39 - .../src/main/res/layout/list_item_search.xml | 60 - .../src/main/res/layout/list_item_simple.xml | 11 - .../src/main/res/layout/list_item_triple.xml | 29 - QKSMS/src/main/res/layout/menu_frame.xml | 6 - QKSMS/src/main/res/layout/toolbar.xml | 6 - .../res/layout/view_color_picker_swatch.xml | 16 - QKSMS/src/main/res/layout/view_compose.xml | 166 -- .../main/res/layout/view_favorite_contact.xml | 27 - .../main/res/layout/view_mms_downloading.xml | 46 - .../main/res/layout/view_playing_audio.xml | 43 - QKSMS/src/main/res/layout/view_slideshow.xml | 38 - .../main/res/layout/view_starred_contacts.xml | 53 - QKSMS/src/main/res/layout/view_swipeback.xml | 5 - QKSMS/src/main/res/layout/view_switch.xml | 7 - QKSMS/src/main/res/layout/view_toolbar.xml | 21 - QKSMS/src/main/res/layout/widget.xml | 68 - QKSMS/src/main/res/layout/widget_loading.xml | 18 - QKSMS/src/main/res/menu/changelog.xml | 5 - QKSMS/src/main/res/menu/compose.xml | 16 - QKSMS/src/main/res/menu/conversations.xml | 26 - .../main/res/menu/conversations_selection.xml | 29 - QKSMS/src/main/res/menu/message_list.xml | 33 - QKSMS/src/main/res/menu/message_picker.xml | 9 - QKSMS/src/main/res/menu/qkreply.xml | 35 - QKSMS/src/main/res/menu/search.xml | 16 - QKSMS/src/main/res/menu/settings.xml | 10 - .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 20089 -> 0 bytes .../res/mipmap-xxxhdpi/ic_launcher_amber.png | Bin 21819 -> 0 bytes .../res/mipmap-xxxhdpi/ic_launcher_blue.png | Bin 21925 -> 0 bytes .../mipmap-xxxhdpi/ic_launcher_blue_grey.png | Bin 21489 -> 0 bytes .../res/mipmap-xxxhdpi/ic_launcher_brown.png | Bin 21331 -> 0 bytes .../res/mipmap-xxxhdpi/ic_launcher_cyan.png | Bin 21380 -> 0 bytes .../res/mipmap-xxxhdpi/ic_launcher_dark.png | Bin 15066 -> 0 bytes .../ic_launcher_deep_orange.png | Bin 22071 -> 0 bytes .../ic_launcher_deep_purple.png | Bin 21664 -> 0 bytes .../res/mipmap-xxxhdpi/ic_launcher_green.png | Bin 22101 -> 0 bytes .../res/mipmap-xxxhdpi/ic_launcher_grey.png | Bin 18870 -> 0 bytes .../res/mipmap-xxxhdpi/ic_launcher_indigo.png | Bin 21303 -> 0 bytes .../mipmap-xxxhdpi/ic_launcher_light_blue.png | Bin 21905 -> 0 bytes .../ic_launcher_light_green.png | Bin 22065 -> 0 bytes .../res/mipmap-xxxhdpi/ic_launcher_lime.png | Bin 22323 -> 0 bytes .../res/mipmap-xxxhdpi/ic_launcher_orange.png | Bin 21298 -> 0 bytes .../res/mipmap-xxxhdpi/ic_launcher_pink.png | Bin 21800 -> 0 bytes .../res/mipmap-xxxhdpi/ic_launcher_purple.png | Bin 21431 -> 0 bytes .../res/mipmap-xxxhdpi/ic_launcher_red.png | Bin 22009 -> 0 bytes .../res/mipmap-xxxhdpi/ic_launcher_teal.png | Bin 20274 -> 0 bytes .../res/mipmap-xxxhdpi/ic_launcher_yellow.png | Bin 22210 -> 0 bytes QKSMS/src/main/res/values-bn/strings.xml | 768 ------ QKSMS/src/main/res/values-cs/strings.xml | 769 ------ QKSMS/src/main/res/values-da/strings.xml | 768 ------ QKSMS/src/main/res/values-de/strings.xml | 768 ------ QKSMS/src/main/res/values-es/strings.xml | 768 ------ QKSMS/src/main/res/values-fa/strings.xml | 768 ------ QKSMS/src/main/res/values-fi/strings.xml | 768 ------ QKSMS/src/main/res/values-fr/strings.xml | 768 ------ QKSMS/src/main/res/values-hi/strings.xml | 768 ------ QKSMS/src/main/res/values-hu/strings.xml | 768 ------ QKSMS/src/main/res/values-in/strings.xml | 767 ------ QKSMS/src/main/res/values-it/strings.xml | 768 ------ QKSMS/src/main/res/values-iw/strings.xml | 775 ------ QKSMS/src/main/res/values-ja/strings.xml | 767 ------ QKSMS/src/main/res/values-ko/strings.xml | 767 ------ QKSMS/src/main/res/values-lt/strings.xml | 769 ------ QKSMS/src/main/res/values-ne/strings.xml | 768 ------ QKSMS/src/main/res/values-nl/strings.xml | 768 ------ QKSMS/src/main/res/values-no/strings.xml | 768 ------ QKSMS/src/main/res/values-pl/strings.xml | 769 ------ QKSMS/src/main/res/values-pt-rBR/strings.xml | 770 ------ QKSMS/src/main/res/values-pt/strings.xml | 768 ------ QKSMS/src/main/res/values-ro/strings.xml | 769 ------ QKSMS/src/main/res/values-ru/strings.xml | 770 ------ QKSMS/src/main/res/values-sk/strings.xml | 769 ------ QKSMS/src/main/res/values-sr/strings.xml | 769 ------ QKSMS/src/main/res/values-sv/strings.xml | 768 ------ QKSMS/src/main/res/values-tl/strings.xml | 768 ------ QKSMS/src/main/res/values-tr/strings.xml | 768 ------ QKSMS/src/main/res/values-v19/bools.xml | 5 - QKSMS/src/main/res/values-v19/dimens.xml | 4 - QKSMS/src/main/res/values-v19/themes.xml | 12 - QKSMS/src/main/res/values-v21/bools.xml | 5 - QKSMS/src/main/res/values-v21/dimens.xml | 5 - QKSMS/src/main/res/values-v21/themes.xml | 24 - QKSMS/src/main/res/values-v24/bools.xml | 5 - QKSMS/src/main/res/values-vi/strings.xml | 767 ------ QKSMS/src/main/res/values-zh-rCN/strings.xml | 767 ------ QKSMS/src/main/res/values-zh/strings.xml | 770 ------ QKSMS/src/main/res/values/attrs.xml | 70 - QKSMS/src/main/res/values/bools.xml | 11 - QKSMS/src/main/res/values/colors.xml | 39 - QKSMS/src/main/res/values/dimens.xml | 17 - QKSMS/src/main/res/values/donottranslate.xml | 55 - QKSMS/src/main/res/values/ids.xml | 5 - QKSMS/src/main/res/values/integers.xml | 22 - QKSMS/src/main/res/values/strings.xml | 834 ------ QKSMS/src/main/res/values/styles.xml | 22 - QKSMS/src/main/res/values/themes.xml | 85 - .../main/res/xml-mcc204-mnc4/mms_config.xml | 8 - .../main/res/xml-mcc208-mnc1/mms_config.xml | 8 - .../main/res/xml-mcc208-mnc10/mms_config.xml | 8 - .../main/res/xml-mcc208-mnc15/mms_config.xml | 8 - .../main/res/xml-mcc208-mnc20/mms_config.xml | 8 - .../main/res/xml-mcc208-mnc26/mms_config.xml | 8 - .../main/res/xml-mcc214-mnc3/mms_config.xml | 8 - .../main/res/xml-mcc214-mnc7/mms_config.xml | 8 - .../main/res/xml-mcc218-mnc5/mms_config.xml | 8 - .../main/res/xml-mcc222-mnc1/mms_config.xml | 8 - .../main/res/xml-mcc222-mnc8/mms_config.xml | 8 - .../main/res/xml-mcc238-mnc2/mms_config.xml | 8 - .../main/res/xml-mcc240-mnc1/mms_config.xml | 8 - .../main/res/xml-mcc240-mnc24/mms_config.xml | 8 - .../main/res/xml-mcc240-mnc4/mms_config.xml | 8 - .../main/res/xml-mcc240-mnc8/mms_config.xml | 8 - .../main/res/xml-mcc242-mnc1/mms_config.xml | 8 - .../main/res/xml-mcc242-mnc2/mms_config.xml | 8 - .../main/res/xml-mcc262-mnc7/mms_config.xml | 8 - .../main/res/xml-mcc274-mnc2/mms_config.xml | 8 - .../main/res/xml-mcc274-mnc3/mms_config.xml | 8 - .../main/res/xml-mcc286-mnc1/mms_config.xml | 8 - .../main/res/xml-mcc286-mnc3/mms_config.xml | 8 - .../main/res/xml-mcc294-mnc1/mms_config.xml | 8 - .../main/res/xml-mcc294-mnc2/mms_config.xml | 8 - .../main/res/xml-mcc294-mnc3/mms_config.xml | 8 - .../main/res/xml-mcc302-mnc220/mms_config.xml | 8 - .../main/res/xml-mcc302-mnc221/mms_config.xml | 8 - .../main/res/xml-mcc302-mnc270/mms_config.xml | 8 - .../main/res/xml-mcc302-mnc290/mms_config.xml | 8 - .../main/res/xml-mcc302-mnc370/mms_config.xml | 8 - .../main/res/xml-mcc302-mnc490/mms_config.xml | 8 - .../main/res/xml-mcc302-mnc500/mms_config.xml | 8 - .../main/res/xml-mcc302-mnc510/mms_config.xml | 8 - .../main/res/xml-mcc302-mnc610/mms_config.xml | 8 - .../main/res/xml-mcc302-mnc660/mms_config.xml | 8 - .../main/res/xml-mcc302-mnc720/mms_config.xml | 8 - .../main/res/xml-mcc302-mnc780/mms_config.xml | 8 - .../main/res/xml-mcc310-mnc10/mms_config.xml | 16 - .../main/res/xml-mcc310-mnc120/mms_config.xml | 23 - .../main/res/xml-mcc310-mnc150/mms_config.xml | 8 - .../main/res/xml-mcc310-mnc170/mms_config.xml | 8 - .../main/res/xml-mcc310-mnc26/mms_config.xml | 8 - .../main/res/xml-mcc310-mnc260/mms_config.xml | 8 - .../main/res/xml-mcc310-mnc380/mms_config.xml | 8 - .../main/res/xml-mcc310-mnc410/mms_config.xml | 8 - .../main/res/xml-mcc310-mnc420/mms_config.xml | 8 - .../main/res/xml-mcc310-mnc450/mms_config.xml | 8 - .../main/res/xml-mcc310-mnc490/mms_config.xml | 8 - .../main/res/xml-mcc310-mnc560/mms_config.xml | 8 - .../main/res/xml-mcc310-mnc680/mms_config.xml | 8 - .../main/res/xml-mcc310-mnc770/mms_config.xml | 8 - .../main/res/xml-mcc310-mnc90/mms_config.xml | 8 - .../main/res/xml-mcc310-mnc980/mms_config.xml | 8 - .../main/res/xml-mcc311-mnc180/mms_config.xml | 8 - .../main/res/xml-mcc311-mnc370/mms_config.xml | 8 - .../main/res/xml-mcc311-mnc480/mms_config.xml | 21 - .../main/res/xml-mcc311-mnc490/mms_config.xml | 16 - .../main/res/xml-mcc311-mnc870/mms_config.xml | 16 - .../main/res/xml-mcc334-mnc20/mms_config.xml | 8 - .../main/res/xml-mcc418-mnc20/mms_config.xml | 8 - .../main/res/xml-mcc418-mnc30/mms_config.xml | 8 - .../main/res/xml-mcc418-mnc5/mms_config.xml | 8 - .../main/res/xml-mcc420-mnc4/mms_config.xml | 8 - .../main/res/xml-mcc440-mnc10/mms_config.xml | 8 - .../main/res/xml-mcc440-mnc20/mms_config.xml | 16 - .../main/res/xml-mcc450-mnc2/mms_config.xml | 11 - .../main/res/xml-mcc450-mnc5/mms_config.xml | 11 - .../main/res/xml-mcc450-mnc6/mms_config.xml | 12 - .../main/res/xml-mcc450-mnc8/mms_config.xml | 11 - QKSMS/src/main/res/xml-mcc450/mms_config.xml | 8 - .../main/res/xml-mcc505-mnc1/mms_config.xml | 8 - .../main/res/xml-mcc530-mnc5/mms_config.xml | 8 - .../main/res/xml-mcc604-mnc2/mms_config.xml | 8 - QKSMS/src/main/res/xml-mcc604/mms_config.xml | 8 - .../main/res/xml-mcc647-mnc10/mms_config.xml | 8 - QKSMS/src/main/res/xml/apns.xml | 2362 ---------------- .../main/res/xml/google_analytics_tracker.xml | 7 - QKSMS/src/main/res/xml/mms_config.xml | 112 - QKSMS/src/main/res/xml/settings.xml | 183 -- QKSMS/src/main/res/xml/settings_about.xml | 47 - .../src/main/res/xml/settings_appearance.xml | 139 - QKSMS/src/main/res/xml/settings_general.xml | 208 -- QKSMS/src/main/res/xml/settings_main.xml | 71 - QKSMS/src/main/res/xml/settings_mms.xml | 87 - .../main/res/xml/settings_notifications.xml | 83 - .../main/res/xml/settings_quickcompose.xml | 15 - .../src/main/res/xml/settings_quickreply.xml | 22 - QKSMS/src/main/res/xml/widget_info.xml | 9 - .../java/com/moez/QKSMS/QKSMSApp.java | 4 - .../moez/QKSMS/common/AnalyticsManager.java | 36 - .../java/com/moez/QKSMS/QKSMSApp.java | 12 - .../moez/QKSMS/common/AnalyticsManager.java | 71 - README.md | 112 - _config.yml | 1 - build.gradle | 8 - gradle/wrapper/gradle-wrapper.jar | Bin 50508 -> 0 bytes gradle/wrapper/gradle-wrapper.properties | 6 - gradlew | 164 -- gradlew.bat | 90 - settings.gradle | 1 - 760 files changed, 121352 deletions(-) create mode 100644 .DS_Store delete mode 100644 .github/ISSUE_TEMPLATE.md delete mode 100644 .gitignore delete mode 100644 .travis.yml delete mode 100644 LICENSE delete mode 100644 QKSMS/build.gradle delete mode 100644 QKSMS/qksms-proguard.pro delete mode 100644 QKSMS/src/androidTest/java/com/moez/QKSMS/common/emoji/EmojiRegistryTest.java delete mode 100644 QKSMS/src/androidTest/java/com/moez/QKSMS/common/utils/DateFormatterTest.java delete mode 100644 QKSMS/src/androidTest/java/com/qklabs/qkms/test/ApnTest.java delete mode 100644 QKSMS/src/main/AndroidManifest.xml delete mode 100644 QKSMS/src/main/aidl/com/android/vending/billing/IInAppBillingService.aidl delete mode 100644 QKSMS/src/main/assets/fonts/Roboto-Light.ttf delete mode 100644 QKSMS/src/main/assets/fonts/Roboto-Medium.ttf delete mode 100644 QKSMS/src/main/assets/fonts/Roboto-Regular.ttf delete mode 100644 QKSMS/src/main/assets/fonts/Roboto-Thin.ttf delete mode 100644 QKSMS/src/main/assets/fonts/RobotoCondensed-Bold.ttf delete mode 100644 QKSMS/src/main/assets/fonts/RobotoCondensed-Light.ttf delete mode 100644 QKSMS/src/main/assets/fonts/RobotoCondensed-Regular.ttf delete mode 100644 QKSMS/src/main/java/android/annotation/SdkConstant.java delete mode 100644 QKSMS/src/main/java/android/database/sqlite/SqliteWrapper.java delete mode 100644 QKSMS/src/main/java/android/location/Country.java delete mode 100644 QKSMS/src/main/java/android/location/CountryDetector.java delete mode 100644 QKSMS/src/main/java/android/location/CountryListener.java delete mode 100644 QKSMS/src/main/java/android/location/ICountryDetector.java delete mode 100644 QKSMS/src/main/java/android/location/ICountryListener.java delete mode 100644 QKSMS/src/main/java/android/net/ConnectivityManager.java delete mode 100644 QKSMS/src/main/java/android/net/DhcpInfoInternal.java delete mode 100644 QKSMS/src/main/java/android/net/IConnectivityManager.java delete mode 100644 QKSMS/src/main/java/android/net/INetworkPolicyListener.java delete mode 100644 QKSMS/src/main/java/android/net/INetworkPolicyManager.java delete mode 100644 QKSMS/src/main/java/android/net/LinkAddress.java delete mode 100644 QKSMS/src/main/java/android/net/LinkCapabilities.java delete mode 100644 QKSMS/src/main/java/android/net/LinkProperties.java delete mode 100644 QKSMS/src/main/java/android/net/NetworkIdentity.java delete mode 100644 QKSMS/src/main/java/android/net/NetworkPolicy.java delete mode 100644 QKSMS/src/main/java/android/net/NetworkPolicyManager.java delete mode 100644 QKSMS/src/main/java/android/net/NetworkQuotaInfo.java delete mode 100644 QKSMS/src/main/java/android/net/NetworkState.java delete mode 100644 QKSMS/src/main/java/android/net/NetworkTemplate.java delete mode 100644 QKSMS/src/main/java/android/net/NetworkUtils.java delete mode 100644 QKSMS/src/main/java/android/net/ProxyProperties.java delete mode 100644 QKSMS/src/main/java/android/net/RouteInfo.java delete mode 100644 QKSMS/src/main/java/android/provider/Downloads.java delete mode 100644 QKSMS/src/main/java/com/android/internal/annotations/VisibleForTesting.java delete mode 100644 QKSMS/src/main/java/com/android/internal/net/LegacyVpnInfo.java delete mode 100644 QKSMS/src/main/java/com/android/internal/net/VpnConfig.java delete mode 100644 QKSMS/src/main/java/com/android/internal/net/VpnProfile.java delete mode 100644 QKSMS/src/main/java/com/android/internal/telephony/EncodeException.java delete mode 100644 QKSMS/src/main/java/com/android/internal/telephony/GsmAlphabet.java delete mode 100644 QKSMS/src/main/java/com/android/internal/telephony/IccUtils.java delete mode 100644 QKSMS/src/main/java/com/android/internal/telephony/PhoneConstants.java delete mode 100644 QKSMS/src/main/java/com/android/internal/telephony/RILConstants.java delete mode 100644 QKSMS/src/main/java/com/android/internal/telephony/SmsConstants.java delete mode 100644 QKSMS/src/main/java/com/android/internal/telephony/TelephonyProperties.java delete mode 100644 QKSMS/src/main/java/com/android/internal/util/ArrayUtils.java delete mode 100644 QKSMS/src/main/java/com/android/internal/util/Objects.java delete mode 100644 QKSMS/src/main/java/com/android/internal/util/Preconditions.java delete mode 100644 QKSMS/src/main/java/com/android/mms/dom/AttrImpl.java delete mode 100644 QKSMS/src/main/java/com/android/mms/dom/DocumentImpl.java delete mode 100644 QKSMS/src/main/java/com/android/mms/dom/ElementImpl.java delete mode 100644 QKSMS/src/main/java/com/android/mms/dom/NamedNodeMapImpl.java delete mode 100644 QKSMS/src/main/java/com/android/mms/dom/NodeImpl.java delete mode 100644 QKSMS/src/main/java/com/android/mms/dom/NodeListImpl.java delete mode 100644 QKSMS/src/main/java/com/android/mms/dom/events/EventImpl.java delete mode 100644 QKSMS/src/main/java/com/android/mms/dom/events/EventTargetImpl.java delete mode 100644 QKSMS/src/main/java/com/android/mms/dom/smil/ElementParallelTimeContainerImpl.java delete mode 100644 QKSMS/src/main/java/com/android/mms/dom/smil/ElementSequentialTimeContainerImpl.java delete mode 100644 QKSMS/src/main/java/com/android/mms/dom/smil/ElementTimeContainerImpl.java delete mode 100644 QKSMS/src/main/java/com/android/mms/dom/smil/ElementTimeImpl.java delete mode 100644 QKSMS/src/main/java/com/android/mms/dom/smil/SmilDocumentImpl.java delete mode 100644 QKSMS/src/main/java/com/android/mms/dom/smil/SmilElementImpl.java delete mode 100644 QKSMS/src/main/java/com/android/mms/dom/smil/SmilLayoutElementImpl.java delete mode 100644 QKSMS/src/main/java/com/android/mms/dom/smil/SmilMediaElementImpl.java delete mode 100644 QKSMS/src/main/java/com/android/mms/dom/smil/SmilParElementImpl.java delete mode 100644 QKSMS/src/main/java/com/android/mms/dom/smil/SmilPlayer.java delete mode 100644 QKSMS/src/main/java/com/android/mms/dom/smil/SmilRefElementImpl.java delete mode 100644 QKSMS/src/main/java/com/android/mms/dom/smil/SmilRegionElementImpl.java delete mode 100644 QKSMS/src/main/java/com/android/mms/dom/smil/SmilRegionMediaElementImpl.java delete mode 100644 QKSMS/src/main/java/com/android/mms/dom/smil/SmilRootLayoutElementImpl.java delete mode 100644 QKSMS/src/main/java/com/android/mms/dom/smil/TimeImpl.java delete mode 100644 QKSMS/src/main/java/com/android/mms/dom/smil/TimeListImpl.java delete mode 100644 QKSMS/src/main/java/com/android/mms/dom/smil/parser/SmilContentHandler.java delete mode 100644 QKSMS/src/main/java/com/android/mms/dom/smil/parser/SmilXmlParser.java delete mode 100644 QKSMS/src/main/java/com/android/mms/dom/smil/parser/SmilXmlSerializer.java delete mode 100644 QKSMS/src/main/java/com/android/mms/transaction/AbstractRetryScheme.java delete mode 100644 QKSMS/src/main/java/com/android/mms/transaction/DefaultRetryScheme.java delete mode 100644 QKSMS/src/main/java/com/android/mms/transaction/HttpUtils.java delete mode 100644 QKSMS/src/main/java/com/android/mms/transaction/MessageSender.java delete mode 100644 QKSMS/src/main/java/com/android/mms/transaction/MessageStatusReceiver.java delete mode 100644 QKSMS/src/main/java/com/android/mms/transaction/MessageStatusService.java delete mode 100644 QKSMS/src/main/java/com/android/mms/transaction/MmsMessageSender.java delete mode 100644 QKSMS/src/main/java/com/android/mms/transaction/MmsPushOutboxMessages.java delete mode 100644 QKSMS/src/main/java/com/android/mms/transaction/MmsSystemEventReceiver.java delete mode 100644 QKSMS/src/main/java/com/android/mms/transaction/NotificationTransaction.java delete mode 100644 QKSMS/src/main/java/com/android/mms/transaction/Observable.java delete mode 100644 QKSMS/src/main/java/com/android/mms/transaction/Observer.java delete mode 100644 QKSMS/src/main/java/com/android/mms/transaction/ProgressCallbackEntity.java delete mode 100644 QKSMS/src/main/java/com/android/mms/transaction/ReadRecTransaction.java delete mode 100644 QKSMS/src/main/java/com/android/mms/transaction/RetrieveTransaction.java delete mode 100644 QKSMS/src/main/java/com/android/mms/transaction/RetryScheduler.java delete mode 100644 QKSMS/src/main/java/com/android/mms/transaction/SendTransaction.java delete mode 100644 QKSMS/src/main/java/com/android/mms/transaction/Transaction.java delete mode 100644 QKSMS/src/main/java/com/android/mms/transaction/TransactionBundle.java delete mode 100644 QKSMS/src/main/java/com/android/mms/transaction/TransactionService.java delete mode 100644 QKSMS/src/main/java/com/android/mms/transaction/TransactionSettings.java delete mode 100644 QKSMS/src/main/java/com/android/mms/transaction/TransactionState.java delete mode 100644 QKSMS/src/main/java/com/android/mms/util/DownloadManager.java delete mode 100644 QKSMS/src/main/java/com/android/mms/util/RateController.java delete mode 100644 QKSMS/src/main/java/com/android/mms/util/SendingProgressTokenManager.java delete mode 100644 QKSMS/src/main/java/com/google/android/collect/Sets.java delete mode 100644 QKSMS/src/main/java/com/google/android/mms/APN.java delete mode 100644 QKSMS/src/main/java/com/google/android/mms/APNHelper.java delete mode 100644 QKSMS/src/main/java/com/google/android/mms/ContentType.java delete mode 100644 QKSMS/src/main/java/com/google/android/mms/InvalidHeaderValueException.java delete mode 100644 QKSMS/src/main/java/com/google/android/mms/MMSPart.java delete mode 100644 QKSMS/src/main/java/com/google/android/mms/MmsException.java delete mode 100644 QKSMS/src/main/java/com/google/android/mms/pdu_alt/AcknowledgeInd.java delete mode 100644 QKSMS/src/main/java/com/google/android/mms/pdu_alt/Base64.java delete mode 100644 QKSMS/src/main/java/com/google/android/mms/pdu_alt/CharacterSets.java delete mode 100644 QKSMS/src/main/java/com/google/android/mms/pdu_alt/DeliveryInd.java delete mode 100644 QKSMS/src/main/java/com/google/android/mms/pdu_alt/EncodedStringValue.java delete mode 100644 QKSMS/src/main/java/com/google/android/mms/pdu_alt/GenericPdu.java delete mode 100644 QKSMS/src/main/java/com/google/android/mms/pdu_alt/MultimediaMessagePdu.java delete mode 100644 QKSMS/src/main/java/com/google/android/mms/pdu_alt/NotificationInd.java delete mode 100644 QKSMS/src/main/java/com/google/android/mms/pdu_alt/NotifyRespInd.java delete mode 100644 QKSMS/src/main/java/com/google/android/mms/pdu_alt/PduBody.java delete mode 100644 QKSMS/src/main/java/com/google/android/mms/pdu_alt/PduComposer.java delete mode 100644 QKSMS/src/main/java/com/google/android/mms/pdu_alt/PduContentTypes.java delete mode 100644 QKSMS/src/main/java/com/google/android/mms/pdu_alt/PduHeaders.java delete mode 100644 QKSMS/src/main/java/com/google/android/mms/pdu_alt/PduParser.java delete mode 100644 QKSMS/src/main/java/com/google/android/mms/pdu_alt/PduPart.java delete mode 100644 QKSMS/src/main/java/com/google/android/mms/pdu_alt/PduPersister.java delete mode 100644 QKSMS/src/main/java/com/google/android/mms/pdu_alt/QuotedPrintable.java delete mode 100644 QKSMS/src/main/java/com/google/android/mms/pdu_alt/ReadOrigInd.java delete mode 100644 QKSMS/src/main/java/com/google/android/mms/pdu_alt/ReadRecInd.java delete mode 100644 QKSMS/src/main/java/com/google/android/mms/pdu_alt/RetrieveConf.java delete mode 100644 QKSMS/src/main/java/com/google/android/mms/pdu_alt/SendConf.java delete mode 100644 QKSMS/src/main/java/com/google/android/mms/pdu_alt/SendReq.java delete mode 100644 QKSMS/src/main/java/com/google/android/mms/smil/SmilHelper.java delete mode 100644 QKSMS/src/main/java/com/google/android/mms/util_alt/AbstractCache.java delete mode 100644 QKSMS/src/main/java/com/google/android/mms/util_alt/DownloadDrmHelper.java delete mode 100644 QKSMS/src/main/java/com/google/android/mms/util_alt/DrmConvertSession.java delete mode 100644 QKSMS/src/main/java/com/google/android/mms/util_alt/PduCache.java delete mode 100644 QKSMS/src/main/java/com/google/android/mms/util_alt/PduCacheEntry.java delete mode 100644 QKSMS/src/main/java/com/google/android/mms/util_alt/SqliteWrapper.java delete mode 100644 QKSMS/src/main/java/com/mariussoft/endlessjabber/sdk/EndlessJabberInterface.java delete mode 100644 QKSMS/src/main/java/com/mariussoft/endlessjabber/sdk/EndlessJabberReceiver.java delete mode 100644 QKSMS/src/main/java/com/mariussoft/endlessjabber/sdk/EndlessJabberWakefulService.java delete mode 100644 QKSMS/src/main/java/com/mariussoft/endlessjabber/sdk/IEndlessJabberImplementation.java delete mode 100644 QKSMS/src/main/java/com/mariussoft/endlessjabber/sdk/MMSPart.java delete mode 100644 QKSMS/src/main/java/com/mariussoft/endlessjabber/sdk/WakefulBroadcastReceiver.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ContentRestrictionException.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ExceedMessageSizeException.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/LogTag.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/MmsConfig.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/QKSMSAppBase.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ResolutionException.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/TempFileProvider.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/UnsupportContentTypeException.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/common/AnalyticsManagerBase.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/common/BlockedConversationHelper.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/common/CIELChEvaluator.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/common/ConversationPrefsHelper.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/common/DialogHelper.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/common/DonationManager.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/common/FontManager.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/common/LifecycleHandler.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/common/ListviewHelper.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/common/LiveViewManager.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/common/QKPreferences.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/common/QKRateSnack.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/common/TypefaceManager.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/common/emoji/EmojiRegistry.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/common/emoji/Emojis.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/common/formatter/Formatter.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/common/formatter/FormatterFactory.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/common/formatter/NumberToContactFormatter.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/common/google/BackgroundLoaderManager.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/common/google/BlobCache.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/common/google/CacheManager.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/common/google/DraftCache.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/common/google/ImageCacheService.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/common/google/ItemLoadedCallback.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/common/google/ItemLoadedFuture.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/common/google/NullItemLoadedFuture.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/common/google/PduLoaderManager.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/common/google/Recycler.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/common/google/SimpleCache.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/common/google/ThumbnailManager.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/common/google/UriImage.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/common/utils/AddressUtils.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/common/utils/ArrayUtils.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/common/utils/ColorUtils.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/common/utils/CursorUtils.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/common/utils/DateFormatter.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/common/utils/DrmUtils.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/common/utils/EmojiUtils.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/common/utils/ImageUtils.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/common/utils/KeyboardUtils.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/common/utils/LinkifyUtils.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/common/utils/MessageUtils.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/common/utils/PackageUtils.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/common/utils/PhoneNumberUtils.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/common/utils/TextUtils.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/common/utils/Units.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/common/utils/ViewUtils.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/common/vcard/AndroidCustomField.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/common/vcard/ContactOperations.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/common/vcard/DataMappings.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/data/Contact.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/data/ContactHelper.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/data/ContactList.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/data/Conversation.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/data/ConversationLegacy.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/data/Message.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/data/RecipientIdCache.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/enums/QKPreference.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/exif/ByteBufferInputStream.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/exif/CountedDataInputStream.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/exif/ExifData.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/exif/ExifInterface.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/exif/ExifInvalidFormatException.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/exif/ExifModifier.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/exif/ExifOutputStream.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/exif/ExifParser.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/exif/ExifReader.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/exif/ExifTag.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/exif/IfdData.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/exif/IfdId.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/exif/JpegHeader.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/exif/OrderedDataOutputStream.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/exif/Rational.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/external/iab/Base64.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/external/iab/Base64DecoderException.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/external/iab/IabException.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/external/iab/IabHelper.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/external/iab/IabResult.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/external/iab/Inventory.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/external/iab/Purchase.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/external/iab/Security.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/external/iab/SkuDetails.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/interfaces/ActivityLauncher.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/interfaces/AdaptableSlideViewInterface.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/interfaces/ConversationDetails.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/interfaces/LiveView.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/interfaces/RecipientProvider.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/interfaces/SlideViewInterface.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/interfaces/ViewInterface.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/mmssms/Apn.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/mmssms/ApnUtils.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/mmssms/DeliveredReceiver.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/mmssms/DisconnectWifi.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/mmssms/Message.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/mmssms/SentReceiver.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/mmssms/Settings.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/mmssms/StripAccents.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/mmssms/Transaction.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/mmssms/Utils.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/model/AudioModel.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/model/CarrierContentRestriction.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/model/ChangeModel.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/model/ContentRestriction.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/model/ContentRestrictionFactory.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/model/IModelChangedObserver.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/model/ImageModel.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/model/LayoutModel.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/model/MediaModel.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/model/MediaModelFactory.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/model/Model.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/model/RegionMediaModel.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/model/RegionModel.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/model/SlideModel.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/model/SlideshowModel.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/model/SmilHelper.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/model/TextModel.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/model/VideoModel.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/receiver/AirplaneModeReceiver.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/receiver/BootReceiver.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/receiver/DeliveredReceiver.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/receiver/IconColorReceiver.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/receiver/MarkReadReceiver.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/receiver/MarkSeenReceiver.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/receiver/MessageFailedReceiver.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/receiver/MessagingReceiver.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/receiver/MmsReceiver.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/receiver/NightModeAutoReceiver.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/receiver/PushReceiver.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/receiver/QKIntent.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/receiver/RemoteMessagingReceiver.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/receiver/SmsReceiver.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/receiver/SmsReceiverLegacy.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/receiver/UnreadBadgeService.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/service/CopyUnreadMessageTextService.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/service/DeleteOldMessagesService.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/service/DeleteUnreadMessageService.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/service/HeadlessSmsSendService.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/service/MarkReadService.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/service/MarkSeenService.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/service/NotificationService.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/service/PushbulletService.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/service/ShouldIAnswerService.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/theme/IconAdapter.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/theme/IconViewHolder.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/transaction/EndlessJabber.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/transaction/NotificationManager.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/transaction/SmsHelper.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/transaction/SqliteWrapper.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/ContentFragment.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/MainActivity.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/SwipeBackLayout.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/ThemeManager.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/base/ClickyViewHolder.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/base/QKActivity.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/base/QKFragment.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/base/QKPopupActivity.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/base/QKSwipeBackActivity.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/base/RecyclerCursorAdapter.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/compose/ComposeActivity.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/compose/ComposeFragment.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/conversationlist/ConversationListAdapter.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/conversationlist/ConversationListFragment.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/conversationlist/ConversationListViewHolder.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/delivery/DeliveryReportHelper.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/delivery/DeliveryReportItem.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/dialog/AsyncDialog.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/dialog/BlockedNumberDialog.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/dialog/BubblePreferenceDialog.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/dialog/ColorPickerPagerAdapter.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/dialog/ConversationSettingsDialog.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/dialog/DefaultSmsHelper.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/dialog/QKDialog.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/dialog/conversationdetails/ConversationDetailsContactListAdapter.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/dialog/conversationdetails/ConversationDetailsDialog.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/dialog/mms/MMSDialogFragment.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/dialog/mms/MMSSetupFragment.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/messagelist/MessageColumns.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/messagelist/MessageItem.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/messagelist/MessageItemCache.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/messagelist/MessageListActivity.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/messagelist/MessageListAdapter.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/messagelist/MessageListFragment.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/messagelist/MessageListViewHolder.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/mms/MmsThumbnailPresenter.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/mms/Presenter.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/mms/SlideView.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/mms/SlideshowActivity.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/mms/SlideshowPresenter.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/mms/layout/HVGALayoutParameters.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/mms/layout/LayoutManager.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/mms/layout/LayoutParameters.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/popup/QKComposeActivity.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/popup/QKReplyActivity.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/popup/QKReplyAdapter.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/search/SearchActivity.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/search/SearchAdapter.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/search/SearchData.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/search/SearchFragment.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/search/SearchViewHolder.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/settings/QKResponseAdapter.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/settings/SettingsActivity.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/settings/SettingsFragment.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/settings/TimePickerFragment.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/view/AttachmentImageView.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/view/AutoCompleteContactView.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/view/AvatarView.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/view/ComposeView.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/view/MessageListRecyclerView.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/view/QKEditText.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/view/QKImageView.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/view/QKLinearLayout.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/view/QKPreference.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/view/QKRingtonePreference.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/view/QKSwitch.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/view/QKSwitchPreference.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/view/QKTextView.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/view/RobotoTextView.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/view/RunnableToast.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/view/SmoothLinearLayoutManager.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/view/StarredContactsView.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/view/WrapLayout.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/view/WrappingLinearLayoutManager.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/view/colorpicker/ColorPickerDialog.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/view/colorpicker/ColorPickerPalette.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/view/colorpicker/ColorPickerSwatch.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/view/colorpicker/ColorStateDrawable.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/welcome/BaseWelcomeFragment.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/welcome/PagerScroller.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/welcome/WelcomeActivity.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/welcome/WelcomeIntroFragment.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/welcome/WelcomeNightFragment.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/welcome/WelcomePagerAdapter.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/welcome/WelcomeThemeFragment.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/widget/WidgetProvider.java delete mode 100644 QKSMS/src/main/java/com/moez/QKSMS/ui/widget/WidgetService.java delete mode 100644 QKSMS/src/main/java/org/mistergroup/muzutozvednout/ShouldIAnswerBinder.java delete mode 100644 QKSMS/src/main/java/org/w3c/dom/events/DocumentEvent.java delete mode 100644 QKSMS/src/main/java/org/w3c/dom/events/Event.java delete mode 100644 QKSMS/src/main/java/org/w3c/dom/events/EventException.java delete mode 100644 QKSMS/src/main/java/org/w3c/dom/events/EventListener.java delete mode 100644 QKSMS/src/main/java/org/w3c/dom/events/EventTarget.java delete mode 100644 QKSMS/src/main/java/org/w3c/dom/smil/ElementExclusiveTimeContainer.java delete mode 100644 QKSMS/src/main/java/org/w3c/dom/smil/ElementLayout.java delete mode 100644 QKSMS/src/main/java/org/w3c/dom/smil/ElementParallelTimeContainer.java delete mode 100644 QKSMS/src/main/java/org/w3c/dom/smil/ElementSequentialTimeContainer.java delete mode 100644 QKSMS/src/main/java/org/w3c/dom/smil/ElementSyncBehavior.java delete mode 100644 QKSMS/src/main/java/org/w3c/dom/smil/ElementTargetAttributes.java delete mode 100644 QKSMS/src/main/java/org/w3c/dom/smil/ElementTest.java delete mode 100644 QKSMS/src/main/java/org/w3c/dom/smil/ElementTime.java delete mode 100644 QKSMS/src/main/java/org/w3c/dom/smil/ElementTimeContainer.java delete mode 100644 QKSMS/src/main/java/org/w3c/dom/smil/ElementTimeControl.java delete mode 100644 QKSMS/src/main/java/org/w3c/dom/smil/ElementTimeManipulation.java delete mode 100644 QKSMS/src/main/java/org/w3c/dom/smil/SMILAnimateColorElement.java delete mode 100644 QKSMS/src/main/java/org/w3c/dom/smil/SMILAnimateElement.java delete mode 100644 QKSMS/src/main/java/org/w3c/dom/smil/SMILAnimateMotionElement.java delete mode 100644 QKSMS/src/main/java/org/w3c/dom/smil/SMILAnimation.java delete mode 100644 QKSMS/src/main/java/org/w3c/dom/smil/SMILDocument.java delete mode 100644 QKSMS/src/main/java/org/w3c/dom/smil/SMILElement.java delete mode 100644 QKSMS/src/main/java/org/w3c/dom/smil/SMILLayoutElement.java delete mode 100644 QKSMS/src/main/java/org/w3c/dom/smil/SMILMediaElement.java delete mode 100644 QKSMS/src/main/java/org/w3c/dom/smil/SMILParElement.java delete mode 100644 QKSMS/src/main/java/org/w3c/dom/smil/SMILRefElement.java delete mode 100644 QKSMS/src/main/java/org/w3c/dom/smil/SMILRegionElement.java delete mode 100644 QKSMS/src/main/java/org/w3c/dom/smil/SMILRegionInterface.java delete mode 100644 QKSMS/src/main/java/org/w3c/dom/smil/SMILRegionMediaElement.java delete mode 100644 QKSMS/src/main/java/org/w3c/dom/smil/SMILRootLayoutElement.java delete mode 100644 QKSMS/src/main/java/org/w3c/dom/smil/SMILSetElement.java delete mode 100644 QKSMS/src/main/java/org/w3c/dom/smil/SMILSwitchElement.java delete mode 100644 QKSMS/src/main/java/org/w3c/dom/smil/SMILTopLayoutElement.java delete mode 100644 QKSMS/src/main/java/org/w3c/dom/smil/Time.java delete mode 100644 QKSMS/src/main/java/org/w3c/dom/smil/TimeEvent.java delete mode 100644 QKSMS/src/main/java/org/w3c/dom/smil/TimeList.java delete mode 100644 QKSMS/src/main/java/org/w3c/dom/views/AbstractView.java delete mode 100644 QKSMS/src/main/java/org/w3c/dom/views/DocumentView.java delete mode 100644 QKSMS/src/main/res/color/text_primary_dark.xml delete mode 100644 QKSMS/src/main/res/color/text_primary_light.xml delete mode 100755 QKSMS/src/main/res/drawable-nodpi/widget_preview.png delete mode 100644 QKSMS/src/main/res/drawable-v21/ripple.xml delete mode 100644 QKSMS/src/main/res/drawable-v21/ripple_light.xml delete mode 100755 QKSMS/src/main/res/drawable-xhdpi/ic_swatch_selected.png delete mode 100644 QKSMS/src/main/res/drawable-xhdpi/shadow_bottom.png delete mode 100644 QKSMS/src/main/res/drawable-xhdpi/shadow_left.png delete mode 100755 QKSMS/src/main/res/drawable-xxhdpi/card_mask.9.png delete mode 100755 QKSMS/src/main/res/drawable-xxhdpi/dialog_background.9.png delete mode 100755 QKSMS/src/main/res/drawable-xxhdpi/scrollbar.9.png delete mode 100755 QKSMS/src/main/res/drawable-xxhdpi/send_background.png delete mode 100755 QKSMS/src/main/res/drawable-xxhdpi/tools_avatar.png delete mode 100755 QKSMS/src/main/res/drawable-xxxhdpi/ab_shadow.9.png delete mode 100755 QKSMS/src/main/res/drawable-xxxhdpi/ic_accept.png delete mode 100644 QKSMS/src/main/res/drawable-xxxhdpi/ic_notification.png delete mode 100644 QKSMS/src/main/res/drawable-xxxhdpi/ic_notification_failed.png delete mode 100755 QKSMS/src/main/res/drawable-xxxhdpi/ic_reply.png delete mode 100755 QKSMS/src/main/res/drawable-xxxhdpi/message_neutral.9.png delete mode 100755 QKSMS/src/main/res/drawable-xxxhdpi/message_neutral_2.9.png delete mode 100755 QKSMS/src/main/res/drawable-xxxhdpi/message_received.9.png delete mode 100755 QKSMS/src/main/res/drawable-xxxhdpi/message_received_2.9.png delete mode 100755 QKSMS/src/main/res/drawable-xxxhdpi/message_received_alt.9.png delete mode 100755 QKSMS/src/main/res/drawable-xxxhdpi/message_received_alt_2.9.png delete mode 100755 QKSMS/src/main/res/drawable-xxxhdpi/message_sent.9.png delete mode 100755 QKSMS/src/main/res/drawable-xxxhdpi/message_sent_2.9.png delete mode 100755 QKSMS/src/main/res/drawable-xxxhdpi/message_sent_alt.9.png delete mode 100755 QKSMS/src/main/res/drawable-xxxhdpi/message_sent_alt_2.9.png delete mode 100755 QKSMS/src/main/res/drawable-xxxhdpi/plus_to_arrow_00.png delete mode 100755 QKSMS/src/main/res/drawable-xxxhdpi/plus_to_arrow_01.png delete mode 100755 QKSMS/src/main/res/drawable-xxxhdpi/plus_to_arrow_02.png delete mode 100755 QKSMS/src/main/res/drawable-xxxhdpi/plus_to_arrow_03.png delete mode 100755 QKSMS/src/main/res/drawable-xxxhdpi/plus_to_arrow_04.png delete mode 100755 QKSMS/src/main/res/drawable-xxxhdpi/plus_to_arrow_05.png delete mode 100755 QKSMS/src/main/res/drawable-xxxhdpi/plus_to_arrow_06.png delete mode 100755 QKSMS/src/main/res/drawable-xxxhdpi/plus_to_arrow_07.png delete mode 100755 QKSMS/src/main/res/drawable-xxxhdpi/plus_to_arrow_08.png delete mode 100755 QKSMS/src/main/res/drawable-xxxhdpi/plus_to_arrow_09.png delete mode 100755 QKSMS/src/main/res/drawable-xxxhdpi/plus_to_arrow_10.png delete mode 100755 QKSMS/src/main/res/drawable-xxxhdpi/plus_to_arrow_11.png delete mode 100755 QKSMS/src/main/res/drawable-xxxhdpi/plus_to_arrow_12.png delete mode 100755 QKSMS/src/main/res/drawable-xxxhdpi/plus_to_arrow_13.png delete mode 100755 QKSMS/src/main/res/drawable-xxxhdpi/plus_to_arrow_14.png delete mode 100755 QKSMS/src/main/res/drawable-xxxhdpi/plus_to_arrow_15.png delete mode 100644 QKSMS/src/main/res/drawable/arrow_to_plus.xml delete mode 100644 QKSMS/src/main/res/drawable/blank.xml delete mode 100644 QKSMS/src/main/res/drawable/button_white.xml delete mode 100644 QKSMS/src/main/res/drawable/cancel_shadow.xml delete mode 100644 QKSMS/src/main/res/drawable/card.xml delete mode 100644 QKSMS/src/main/res/drawable/check_to_off.xml delete mode 100644 QKSMS/src/main/res/drawable/check_to_on.xml delete mode 100644 QKSMS/src/main/res/drawable/circle.xml delete mode 100644 QKSMS/src/main/res/drawable/color_picker_swatch.xml delete mode 100644 QKSMS/src/main/res/drawable/compose_background.xml delete mode 100644 QKSMS/src/main/res/drawable/edittext.xml delete mode 100644 QKSMS/src/main/res/drawable/edittext_colour_selector.xml delete mode 100644 QKSMS/src/main/res/drawable/ic_add.xml delete mode 100644 QKSMS/src/main/res/drawable/ic_arrow_left.xml delete mode 100644 QKSMS/src/main/res/drawable/ic_arrow_right.xml delete mode 100644 QKSMS/src/main/res/drawable/ic_attach_audio.xml delete mode 100644 QKSMS/src/main/res/drawable/ic_call.xml delete mode 100644 QKSMS/src/main/res/drawable/ic_camera.xml delete mode 100644 QKSMS/src/main/res/drawable/ic_cancel.xml delete mode 100644 QKSMS/src/main/res/drawable/ic_chat.xml delete mode 100644 QKSMS/src/main/res/drawable/ic_compose.xml delete mode 100644 QKSMS/src/main/res/drawable/ic_delete.xml delete mode 100644 QKSMS/src/main/res/drawable/ic_delivered.xml delete mode 100644 QKSMS/src/main/res/drawable/ic_donate.xml delete mode 100644 QKSMS/src/main/res/drawable/ic_drop_down.xml delete mode 100644 QKSMS/src/main/res/drawable/ic_error.xml delete mode 100644 QKSMS/src/main/res/drawable/ic_fold.xml delete mode 100644 QKSMS/src/main/res/drawable/ic_info.xml delete mode 100644 QKSMS/src/main/res/drawable/ic_info_fill.xml delete mode 100644 QKSMS/src/main/res/drawable/ic_lock.xml delete mode 100644 QKSMS/src/main/res/drawable/ic_mark_read.xml delete mode 100644 QKSMS/src/main/res/drawable/ic_mark_unread.xml delete mode 100644 QKSMS/src/main/res/drawable/ic_notifications.xml delete mode 100644 QKSMS/src/main/res/drawable/ic_notifications_muted.xml delete mode 100644 QKSMS/src/main/res/drawable/ic_palette.xml delete mode 100644 QKSMS/src/main/res/drawable/ic_person.xml delete mode 100644 QKSMS/src/main/res/drawable/ic_photo.xml delete mode 100644 QKSMS/src/main/res/drawable/ic_play.xml delete mode 100644 QKSMS/src/main/res/drawable/ic_search.xml delete mode 100644 QKSMS/src/main/res/drawable/ic_selected.xml delete mode 100644 QKSMS/src/main/res/drawable/ic_settings.xml delete mode 100644 QKSMS/src/main/res/drawable/ic_timer.xml delete mode 100644 QKSMS/src/main/res/drawable/ic_unfold.xml delete mode 100644 QKSMS/src/main/res/drawable/ic_unread_indicator.xml delete mode 100644 QKSMS/src/main/res/drawable/ic_unselected.xml delete mode 100644 QKSMS/src/main/res/drawable/plus_to_arrow.xml delete mode 100644 QKSMS/src/main/res/drawable/ripple.xml delete mode 100644 QKSMS/src/main/res/drawable/ripple_light.xml delete mode 100644 QKSMS/src/main/res/drawable/seek_thumb.xml delete mode 100644 QKSMS/src/main/res/drawable/shadow_slidingmenu.xml delete mode 100644 QKSMS/src/main/res/drawable/system_bar_empty.xml delete mode 100644 QKSMS/src/main/res/drawable/widget_header.xml delete mode 100644 QKSMS/src/main/res/drawable/widget_list_background.xml delete mode 100644 QKSMS/src/main/res/layout/activity_fragment.xml delete mode 100644 QKSMS/src/main/res/layout/activity_qkcompose.xml delete mode 100644 QKSMS/src/main/res/layout/activity_qkreply.xml delete mode 100644 QKSMS/src/main/res/layout/activity_welcome.xml delete mode 100644 QKSMS/src/main/res/layout/content_frame.xml delete mode 100644 QKSMS/src/main/res/layout/dialog_bubbles.xml delete mode 100644 QKSMS/src/main/res/layout/dialog_color_picker.xml delete mode 100644 QKSMS/src/main/res/layout/dialog_color_picker_led.xml delete mode 100644 QKSMS/src/main/res/layout/dialog_conversation_details.xml delete mode 100644 QKSMS/src/main/res/layout/dialog_delete_thread.xml delete mode 100644 QKSMS/src/main/res/layout/dialog_donate.xml delete mode 100644 QKSMS/src/main/res/layout/dialog_material.xml delete mode 100644 QKSMS/src/main/res/layout/dialog_redeem.xml delete mode 100644 QKSMS/src/main/res/layout/fragment_compose.xml delete mode 100644 QKSMS/src/main/res/layout/fragment_conversation.xml delete mode 100644 QKSMS/src/main/res/layout/fragment_conversations.xml delete mode 100644 QKSMS/src/main/res/layout/fragment_search.xml delete mode 100644 QKSMS/src/main/res/layout/fragment_welcome_greeting.xml delete mode 100644 QKSMS/src/main/res/layout/fragment_welcome_night.xml delete mode 100644 QKSMS/src/main/res/layout/fragment_welcome_quickreply.xml delete mode 100644 QKSMS/src/main/res/layout/fragment_welcome_theme.xml delete mode 100644 QKSMS/src/main/res/layout/list_item_contact.xml delete mode 100644 QKSMS/src/main/res/layout/list_item_conversation.xml delete mode 100644 QKSMS/src/main/res/layout/list_item_conversation_widget.xml delete mode 100644 QKSMS/src/main/res/layout/list_item_dual.xml delete mode 100644 QKSMS/src/main/res/layout/list_item_icon.xml delete mode 100644 QKSMS/src/main/res/layout/list_item_message_in.xml delete mode 100644 QKSMS/src/main/res/layout/list_item_message_out.xml delete mode 100644 QKSMS/src/main/res/layout/list_item_preference.xml delete mode 100644 QKSMS/src/main/res/layout/list_item_preference_category.xml delete mode 100644 QKSMS/src/main/res/layout/list_item_qk_response.xml delete mode 100644 QKSMS/src/main/res/layout/list_item_recipient.xml delete mode 100644 QKSMS/src/main/res/layout/list_item_search.xml delete mode 100644 QKSMS/src/main/res/layout/list_item_simple.xml delete mode 100644 QKSMS/src/main/res/layout/list_item_triple.xml delete mode 100644 QKSMS/src/main/res/layout/menu_frame.xml delete mode 100644 QKSMS/src/main/res/layout/toolbar.xml delete mode 100644 QKSMS/src/main/res/layout/view_color_picker_swatch.xml delete mode 100644 QKSMS/src/main/res/layout/view_compose.xml delete mode 100644 QKSMS/src/main/res/layout/view_favorite_contact.xml delete mode 100644 QKSMS/src/main/res/layout/view_mms_downloading.xml delete mode 100644 QKSMS/src/main/res/layout/view_playing_audio.xml delete mode 100644 QKSMS/src/main/res/layout/view_slideshow.xml delete mode 100644 QKSMS/src/main/res/layout/view_starred_contacts.xml delete mode 100644 QKSMS/src/main/res/layout/view_swipeback.xml delete mode 100644 QKSMS/src/main/res/layout/view_switch.xml delete mode 100644 QKSMS/src/main/res/layout/view_toolbar.xml delete mode 100644 QKSMS/src/main/res/layout/widget.xml delete mode 100644 QKSMS/src/main/res/layout/widget_loading.xml delete mode 100644 QKSMS/src/main/res/menu/changelog.xml delete mode 100644 QKSMS/src/main/res/menu/compose.xml delete mode 100644 QKSMS/src/main/res/menu/conversations.xml delete mode 100644 QKSMS/src/main/res/menu/conversations_selection.xml delete mode 100644 QKSMS/src/main/res/menu/message_list.xml delete mode 100644 QKSMS/src/main/res/menu/message_picker.xml delete mode 100644 QKSMS/src/main/res/menu/qkreply.xml delete mode 100644 QKSMS/src/main/res/menu/search.xml delete mode 100644 QKSMS/src/main/res/menu/settings.xml delete mode 100644 QKSMS/src/main/res/mipmap-xxxhdpi/ic_launcher.png delete mode 100644 QKSMS/src/main/res/mipmap-xxxhdpi/ic_launcher_amber.png delete mode 100644 QKSMS/src/main/res/mipmap-xxxhdpi/ic_launcher_blue.png delete mode 100644 QKSMS/src/main/res/mipmap-xxxhdpi/ic_launcher_blue_grey.png delete mode 100644 QKSMS/src/main/res/mipmap-xxxhdpi/ic_launcher_brown.png delete mode 100644 QKSMS/src/main/res/mipmap-xxxhdpi/ic_launcher_cyan.png delete mode 100644 QKSMS/src/main/res/mipmap-xxxhdpi/ic_launcher_dark.png delete mode 100644 QKSMS/src/main/res/mipmap-xxxhdpi/ic_launcher_deep_orange.png delete mode 100644 QKSMS/src/main/res/mipmap-xxxhdpi/ic_launcher_deep_purple.png delete mode 100644 QKSMS/src/main/res/mipmap-xxxhdpi/ic_launcher_green.png delete mode 100644 QKSMS/src/main/res/mipmap-xxxhdpi/ic_launcher_grey.png delete mode 100644 QKSMS/src/main/res/mipmap-xxxhdpi/ic_launcher_indigo.png delete mode 100644 QKSMS/src/main/res/mipmap-xxxhdpi/ic_launcher_light_blue.png delete mode 100644 QKSMS/src/main/res/mipmap-xxxhdpi/ic_launcher_light_green.png delete mode 100644 QKSMS/src/main/res/mipmap-xxxhdpi/ic_launcher_lime.png delete mode 100644 QKSMS/src/main/res/mipmap-xxxhdpi/ic_launcher_orange.png delete mode 100644 QKSMS/src/main/res/mipmap-xxxhdpi/ic_launcher_pink.png delete mode 100644 QKSMS/src/main/res/mipmap-xxxhdpi/ic_launcher_purple.png delete mode 100644 QKSMS/src/main/res/mipmap-xxxhdpi/ic_launcher_red.png delete mode 100644 QKSMS/src/main/res/mipmap-xxxhdpi/ic_launcher_teal.png delete mode 100644 QKSMS/src/main/res/mipmap-xxxhdpi/ic_launcher_yellow.png delete mode 100644 QKSMS/src/main/res/values-bn/strings.xml delete mode 100644 QKSMS/src/main/res/values-cs/strings.xml delete mode 100644 QKSMS/src/main/res/values-da/strings.xml delete mode 100644 QKSMS/src/main/res/values-de/strings.xml delete mode 100644 QKSMS/src/main/res/values-es/strings.xml delete mode 100644 QKSMS/src/main/res/values-fa/strings.xml delete mode 100644 QKSMS/src/main/res/values-fi/strings.xml delete mode 100644 QKSMS/src/main/res/values-fr/strings.xml delete mode 100644 QKSMS/src/main/res/values-hi/strings.xml delete mode 100644 QKSMS/src/main/res/values-hu/strings.xml delete mode 100644 QKSMS/src/main/res/values-in/strings.xml delete mode 100644 QKSMS/src/main/res/values-it/strings.xml delete mode 100644 QKSMS/src/main/res/values-iw/strings.xml delete mode 100644 QKSMS/src/main/res/values-ja/strings.xml delete mode 100644 QKSMS/src/main/res/values-ko/strings.xml delete mode 100644 QKSMS/src/main/res/values-lt/strings.xml delete mode 100644 QKSMS/src/main/res/values-ne/strings.xml delete mode 100644 QKSMS/src/main/res/values-nl/strings.xml delete mode 100644 QKSMS/src/main/res/values-no/strings.xml delete mode 100644 QKSMS/src/main/res/values-pl/strings.xml delete mode 100644 QKSMS/src/main/res/values-pt-rBR/strings.xml delete mode 100644 QKSMS/src/main/res/values-pt/strings.xml delete mode 100644 QKSMS/src/main/res/values-ro/strings.xml delete mode 100644 QKSMS/src/main/res/values-ru/strings.xml delete mode 100644 QKSMS/src/main/res/values-sk/strings.xml delete mode 100644 QKSMS/src/main/res/values-sr/strings.xml delete mode 100644 QKSMS/src/main/res/values-sv/strings.xml delete mode 100644 QKSMS/src/main/res/values-tl/strings.xml delete mode 100644 QKSMS/src/main/res/values-tr/strings.xml delete mode 100644 QKSMS/src/main/res/values-v19/bools.xml delete mode 100644 QKSMS/src/main/res/values-v19/dimens.xml delete mode 100644 QKSMS/src/main/res/values-v19/themes.xml delete mode 100644 QKSMS/src/main/res/values-v21/bools.xml delete mode 100644 QKSMS/src/main/res/values-v21/dimens.xml delete mode 100644 QKSMS/src/main/res/values-v21/themes.xml delete mode 100644 QKSMS/src/main/res/values-v24/bools.xml delete mode 100644 QKSMS/src/main/res/values-vi/strings.xml delete mode 100644 QKSMS/src/main/res/values-zh-rCN/strings.xml delete mode 100644 QKSMS/src/main/res/values-zh/strings.xml delete mode 100644 QKSMS/src/main/res/values/attrs.xml delete mode 100644 QKSMS/src/main/res/values/bools.xml delete mode 100644 QKSMS/src/main/res/values/colors.xml delete mode 100644 QKSMS/src/main/res/values/dimens.xml delete mode 100644 QKSMS/src/main/res/values/donottranslate.xml delete mode 100644 QKSMS/src/main/res/values/ids.xml delete mode 100644 QKSMS/src/main/res/values/integers.xml delete mode 100644 QKSMS/src/main/res/values/strings.xml delete mode 100644 QKSMS/src/main/res/values/styles.xml delete mode 100644 QKSMS/src/main/res/values/themes.xml delete mode 100644 QKSMS/src/main/res/xml-mcc204-mnc4/mms_config.xml delete mode 100644 QKSMS/src/main/res/xml-mcc208-mnc1/mms_config.xml delete mode 100644 QKSMS/src/main/res/xml-mcc208-mnc10/mms_config.xml delete mode 100644 QKSMS/src/main/res/xml-mcc208-mnc15/mms_config.xml delete mode 100644 QKSMS/src/main/res/xml-mcc208-mnc20/mms_config.xml delete mode 100644 QKSMS/src/main/res/xml-mcc208-mnc26/mms_config.xml delete mode 100644 QKSMS/src/main/res/xml-mcc214-mnc3/mms_config.xml delete mode 100644 QKSMS/src/main/res/xml-mcc214-mnc7/mms_config.xml delete mode 100644 QKSMS/src/main/res/xml-mcc218-mnc5/mms_config.xml delete mode 100644 QKSMS/src/main/res/xml-mcc222-mnc1/mms_config.xml delete mode 100644 QKSMS/src/main/res/xml-mcc222-mnc8/mms_config.xml delete mode 100644 QKSMS/src/main/res/xml-mcc238-mnc2/mms_config.xml delete mode 100644 QKSMS/src/main/res/xml-mcc240-mnc1/mms_config.xml delete mode 100644 QKSMS/src/main/res/xml-mcc240-mnc24/mms_config.xml delete mode 100644 QKSMS/src/main/res/xml-mcc240-mnc4/mms_config.xml delete mode 100644 QKSMS/src/main/res/xml-mcc240-mnc8/mms_config.xml delete mode 100644 QKSMS/src/main/res/xml-mcc242-mnc1/mms_config.xml delete mode 100644 QKSMS/src/main/res/xml-mcc242-mnc2/mms_config.xml delete mode 100644 QKSMS/src/main/res/xml-mcc262-mnc7/mms_config.xml delete mode 100644 QKSMS/src/main/res/xml-mcc274-mnc2/mms_config.xml delete mode 100644 QKSMS/src/main/res/xml-mcc274-mnc3/mms_config.xml delete mode 100644 QKSMS/src/main/res/xml-mcc286-mnc1/mms_config.xml delete mode 100644 QKSMS/src/main/res/xml-mcc286-mnc3/mms_config.xml delete mode 100644 QKSMS/src/main/res/xml-mcc294-mnc1/mms_config.xml delete mode 100644 QKSMS/src/main/res/xml-mcc294-mnc2/mms_config.xml delete mode 100644 QKSMS/src/main/res/xml-mcc294-mnc3/mms_config.xml delete mode 100644 QKSMS/src/main/res/xml-mcc302-mnc220/mms_config.xml delete mode 100644 QKSMS/src/main/res/xml-mcc302-mnc221/mms_config.xml delete mode 100644 QKSMS/src/main/res/xml-mcc302-mnc270/mms_config.xml delete mode 100644 QKSMS/src/main/res/xml-mcc302-mnc290/mms_config.xml delete mode 100644 QKSMS/src/main/res/xml-mcc302-mnc370/mms_config.xml delete mode 100644 QKSMS/src/main/res/xml-mcc302-mnc490/mms_config.xml delete mode 100644 QKSMS/src/main/res/xml-mcc302-mnc500/mms_config.xml delete mode 100644 QKSMS/src/main/res/xml-mcc302-mnc510/mms_config.xml delete mode 100644 QKSMS/src/main/res/xml-mcc302-mnc610/mms_config.xml delete mode 100644 QKSMS/src/main/res/xml-mcc302-mnc660/mms_config.xml delete mode 100644 QKSMS/src/main/res/xml-mcc302-mnc720/mms_config.xml delete mode 100644 QKSMS/src/main/res/xml-mcc302-mnc780/mms_config.xml delete mode 100644 QKSMS/src/main/res/xml-mcc310-mnc10/mms_config.xml delete mode 100644 QKSMS/src/main/res/xml-mcc310-mnc120/mms_config.xml delete mode 100644 QKSMS/src/main/res/xml-mcc310-mnc150/mms_config.xml delete mode 100644 QKSMS/src/main/res/xml-mcc310-mnc170/mms_config.xml delete mode 100644 QKSMS/src/main/res/xml-mcc310-mnc26/mms_config.xml delete mode 100644 QKSMS/src/main/res/xml-mcc310-mnc260/mms_config.xml delete mode 100644 QKSMS/src/main/res/xml-mcc310-mnc380/mms_config.xml delete mode 100644 QKSMS/src/main/res/xml-mcc310-mnc410/mms_config.xml delete mode 100644 QKSMS/src/main/res/xml-mcc310-mnc420/mms_config.xml delete mode 100644 QKSMS/src/main/res/xml-mcc310-mnc450/mms_config.xml delete mode 100644 QKSMS/src/main/res/xml-mcc310-mnc490/mms_config.xml delete mode 100644 QKSMS/src/main/res/xml-mcc310-mnc560/mms_config.xml delete mode 100644 QKSMS/src/main/res/xml-mcc310-mnc680/mms_config.xml delete mode 100644 QKSMS/src/main/res/xml-mcc310-mnc770/mms_config.xml delete mode 100644 QKSMS/src/main/res/xml-mcc310-mnc90/mms_config.xml delete mode 100644 QKSMS/src/main/res/xml-mcc310-mnc980/mms_config.xml delete mode 100644 QKSMS/src/main/res/xml-mcc311-mnc180/mms_config.xml delete mode 100644 QKSMS/src/main/res/xml-mcc311-mnc370/mms_config.xml delete mode 100644 QKSMS/src/main/res/xml-mcc311-mnc480/mms_config.xml delete mode 100644 QKSMS/src/main/res/xml-mcc311-mnc490/mms_config.xml delete mode 100644 QKSMS/src/main/res/xml-mcc311-mnc870/mms_config.xml delete mode 100644 QKSMS/src/main/res/xml-mcc334-mnc20/mms_config.xml delete mode 100644 QKSMS/src/main/res/xml-mcc418-mnc20/mms_config.xml delete mode 100644 QKSMS/src/main/res/xml-mcc418-mnc30/mms_config.xml delete mode 100644 QKSMS/src/main/res/xml-mcc418-mnc5/mms_config.xml delete mode 100644 QKSMS/src/main/res/xml-mcc420-mnc4/mms_config.xml delete mode 100644 QKSMS/src/main/res/xml-mcc440-mnc10/mms_config.xml delete mode 100644 QKSMS/src/main/res/xml-mcc440-mnc20/mms_config.xml delete mode 100644 QKSMS/src/main/res/xml-mcc450-mnc2/mms_config.xml delete mode 100644 QKSMS/src/main/res/xml-mcc450-mnc5/mms_config.xml delete mode 100644 QKSMS/src/main/res/xml-mcc450-mnc6/mms_config.xml delete mode 100644 QKSMS/src/main/res/xml-mcc450-mnc8/mms_config.xml delete mode 100644 QKSMS/src/main/res/xml-mcc450/mms_config.xml delete mode 100644 QKSMS/src/main/res/xml-mcc505-mnc1/mms_config.xml delete mode 100644 QKSMS/src/main/res/xml-mcc530-mnc5/mms_config.xml delete mode 100644 QKSMS/src/main/res/xml-mcc604-mnc2/mms_config.xml delete mode 100644 QKSMS/src/main/res/xml-mcc604/mms_config.xml delete mode 100644 QKSMS/src/main/res/xml-mcc647-mnc10/mms_config.xml delete mode 100644 QKSMS/src/main/res/xml/apns.xml delete mode 100644 QKSMS/src/main/res/xml/google_analytics_tracker.xml delete mode 100644 QKSMS/src/main/res/xml/mms_config.xml delete mode 100644 QKSMS/src/main/res/xml/settings.xml delete mode 100644 QKSMS/src/main/res/xml/settings_about.xml delete mode 100644 QKSMS/src/main/res/xml/settings_appearance.xml delete mode 100644 QKSMS/src/main/res/xml/settings_general.xml delete mode 100644 QKSMS/src/main/res/xml/settings_main.xml delete mode 100644 QKSMS/src/main/res/xml/settings_mms.xml delete mode 100644 QKSMS/src/main/res/xml/settings_notifications.xml delete mode 100644 QKSMS/src/main/res/xml/settings_quickcompose.xml delete mode 100644 QKSMS/src/main/res/xml/settings_quickreply.xml delete mode 100644 QKSMS/src/main/res/xml/widget_info.xml delete mode 100644 QKSMS/src/noAnalytics/java/com/moez/QKSMS/QKSMSApp.java delete mode 100644 QKSMS/src/noAnalytics/java/com/moez/QKSMS/common/AnalyticsManager.java delete mode 100644 QKSMS/src/withAnalytics/java/com/moez/QKSMS/QKSMSApp.java delete mode 100644 QKSMS/src/withAnalytics/java/com/moez/QKSMS/common/AnalyticsManager.java delete mode 100644 README.md delete mode 100644 _config.yml delete mode 100644 build.gradle delete mode 100644 gradle/wrapper/gradle-wrapper.jar delete mode 100644 gradle/wrapper/gradle-wrapper.properties delete mode 100755 gradlew delete mode 100644 gradlew.bat delete mode 100644 settings.gradle diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..4c889e0f4edc24810a0688025fbbaaa03afe6536 GIT binary patch literal 6148 zcmeH~y{ZC1422WjLa^D=avIwUzQG{+1ipZ%AcA0__VehT{2;jAT0~AD`6ihO%bsFq zBOyQ5diE^cEj3d39wiJtjQKc1*XvoMyvW5 zVs&o^OP;IA7L0b$96mIktTx5KG}=WA5|~y80~MeG0|myB_jdoU;s4G5gBGS#fC~JW z0@|%Mt0i74@7A~1v-&oxwr+6Hk0ZSN1R$}icm{XFez65ulP!n}j6VV{0|OQKr~(gE CJ`!~R literal 0 HcmV?d00001 diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md deleted file mode 100644 index 5da13087b..000000000 --- a/.github/ISSUE_TEMPLATE.md +++ /dev/null @@ -1,8 +0,0 @@ - diff --git a/.gitignore b/.gitignore deleted file mode 100644 index bf4d98772..000000000 --- a/.gitignore +++ /dev/null @@ -1,28 +0,0 @@ -# Built application files -build/ - -# Crashlytics configuations -com_crashlytics_export_strings.xml - -# Local configuration file (sdk path, etc) -local.properties - -# Gradle generated files -.gradle/ -build/ - -# Signing files -.signing/ - -# User-specific configurations -.idea/ -*.iml - -# OS-specific files -.DS_Store -.DS_Store? -._* -.Spotlight-V100 -.Trashes -ehthumbs.db -Thumbs.db diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index efd23aaec..000000000 --- a/.travis.yml +++ /dev/null @@ -1,30 +0,0 @@ -language: android -sudo: required - -android: - components: - # Uncomment the lines below if you want to - # use the latest revision of Android SDK Tools - - platform-tools - - tools - - # The BuildTools version used by your project - - build-tools-23.0.2 - - # The SDK version used to compile your project - - android-22 - - # Additional components - - extra-google-google_play_services - - extra-google-m2repository - - extra-android-m2repository - -jdk: - - oraclejdk8 - -before_install: - - export JAVA8_HOME=$JAVA_HOME - -script: - - ./gradlew clean - - ./gradlew build diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 9cecc1d46..000000000 --- a/LICENSE +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - {one line to give the program's name and a brief idea of what it does.} - Copyright (C) {year} {name of author} - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - {project} Copyright (C) {year} {fullname} - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/QKSMS/build.gradle b/QKSMS/build.gradle deleted file mode 100644 index 0ea70822d..000000000 --- a/QKSMS/build.gradle +++ /dev/null @@ -1,116 +0,0 @@ -apply plugin: 'com.android.application' -apply plugin: 'me.tatarka.retrolambda' -apply plugin: 'io.fabric' - -repositories { - mavenCentral() - jcenter() - maven { url 'https://maven.fabric.io/public' } - maven { url 'https://clojars.org/repo/' } -} - -android { - flavorDimensions "analytics" - - productFlavors { - withAnalytics { - dimension "analytics" - } - noAnalytics { - dimension "analytics" - } - } - - lintOptions { - checkReleaseBuilds false - abortOnError false - disable 'InvalidPackage' - } - - compileSdkVersion 22 - buildToolsVersion '25.0.0' - - defaultConfig { - versionCode 135 - versionName "2.7.3" - minSdkVersion 15 - targetSdkVersion 22 - multiDexEnabled true - } - - buildTypes { - release { - minifyEnabled true - shrinkResources true - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'qksms-proguard.pro' - } - debug { - minifyEnabled true - shrinkResources true - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'qksms-proguard.pro' - } - } - - compileOptions { - // Use Java 1.7, requires minSdk 8 - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 - } - - lintOptions { - checkReleaseBuilds false - abortOnError false - - // Translations are crowd-sourced - disable 'MissingTranslation' - } - -} - -buildscript { - repositories { - mavenCentral() - maven { url 'https://maven.fabric.io/public' } - } - - dependencies { - classpath 'me.tatarka:gradle-retrolambda:3.2.2' - classpath 'io.fabric.tools:gradle:1.21.5' - } -} - -String leakCanaryVersion = '1.4-beta2' - -dependencies { - // Open source libraries - compile 'com.mcxiaoke.volley:library:1.0.19' - compile 'com.melnykov:floatingactionbutton:1.3.0' - compile 'com.pushbullet:android-extensions:1.0.4' - compile 'com.jakewharton:butterknife:7.0.1' - compile 'com.klinkerapps:android-chips:1.0.0' - compile 'com.googlecode.libphonenumber:libphonenumber:6.2' - compile 'com.nispok:snackbar:2.10.6' - compile 'com.github.lzyzsd:circleprogress:1.1.0' - debugCompile "com.squareup.leakcanary:leakcanary-android-no-op:$leakCanaryVersion" - releaseCompile "com.squareup.leakcanary:leakcanary-android-no-op:$leakCanaryVersion" - compile 'com.vdurmont:emoji-java:3.1.3' - compile 'me.leolin:ShortcutBadger:1.1.1' - compile 'com.googlecode.ez-vcard:ez-vcard:0.9.6' - compile 'com.google.code.gson:gson:2.4' - compile 'com.koushikdutta.ion:ion:1.1.7' - compile 'org.ligi:snackengage:0.4' - compile 'frankiesardo:icepick:3.2.0' - provided 'frankiesardo:icepick-processor:3.2.0' - - // Google libraries - compile 'com.android.support:multidex:1.0.1' - compile 'com.android.support:appcompat-v7:22.2.1' - compile 'com.android.support:support-v13:22.2.1' - compile 'com.android.support:recyclerview-v7:22.2.1' - withAnalyticsCompile 'com.google.android.gms:play-services-analytics:8.3.0' - - // External services - withAnalyticsCompile('com.crashlytics.sdk.android:crashlytics:2.5.5@aar') { - transitive = true; - } -} diff --git a/QKSMS/qksms-proguard.pro b/QKSMS/qksms-proguard.pro deleted file mode 100644 index 8dbb0eed1..000000000 --- a/QKSMS/qksms-proguard.pro +++ /dev/null @@ -1,99 +0,0 @@ --dontobfuscate - -# -# To fix an error to do with android.location.Country. We may be able to optimize -# more parts of the android.location package. -# --keep class android.location.** { *; } - -# -# See com.moez.QKSMS.ui.mms.PresenterFactory---it uses reflect -# --keep class com.moez.QKSMS.ui.mms.MmsThumbnailPresenter { *; } --keep class com.moez.QKSMS.ui.mms.SlideshowPresenter { *; } --keep class com.android.internal.util.ArrayUtils { *; } - -# -# Klinker's MMS code uses reflection on android.net.ConnectivityManager (and subclasses). -# --keep class android.net.** { *; } - -# -# SlidingMenu -# --keep class android.view.Display { *; } - -# -# SystemBarTint -# --keep class android.os.SystemProperties { *; } - -# -# libphonenumber -# --keep class com.google.i18n.phonenumbers.** { *; } - -# -# Android Volley -# see: http://stackoverflow.com/questions/21816643/volley-seems-not-working-after-proguard-obfuscate -# --keep class org.apache.commons.logging.** { *; } - -# -# Google Play Services proguard -# see: http://developer.android.com/google/play-services/setup.html#Proguard -# --keep class * extends java.util.ListResourceBundle { - protected Object[][] getContents(); -} - --keep public class com.google.android.gms.common.internal.safeparcel.SafeParcelable { - public static final *** NULL; -} - --keepnames @com.google.android.gms.common.annotation.KeepName class * --keepclassmembernames class * { - @com.google.android.gms.common.annotation.KeepName *; -} - --keepnames class * implements android.os.Parcelable { - public static final ** CREATOR; -} - -# -# Crittercism -# see: http://docs.crittercism.com/android/android.html -# --keep public class com.crittercism.** --keepclassmembers public class com.crittercism.* { - *; -} - -# To get line numbers, source files from Crittercism: --keepattributes SourceFile, LineNumberTable - -# ez-vcard -# https://github.com/nickel-chrome/CucumberSync/blob/master/proguard-project.txt --dontwarn com.fasterxml.jackson.** # Jackson JSON Processor (for jCards) not used --dontwarn freemarker.** # freemarker templating library (for creating hCards) not used --dontwarn org.jsoup.** # jsoup library (for hCard parsing) not used --dontwarn sun.misc.Perf --keep class ezvcard.property.** { *; } # keep all VCard properties (created at runtime) - -# ButterKnife -# http://jakewharton.github.io/butterknife/ --keep class butterknife.** { *; } --dontwarn butterknife.internal.** --keep class **$$ViewBinder { *; } - --keepclasseswithmembernames class * { - @butterknife.* ; -} - --keepclasseswithmembernames class * { - @butterknife.* ; -} - -# RetroLambda -# https://github.com/evant/gradle-retrolambda --dontwarn java.lang.invoke.* diff --git a/QKSMS/src/androidTest/java/com/moez/QKSMS/common/emoji/EmojiRegistryTest.java b/QKSMS/src/androidTest/java/com/moez/QKSMS/common/emoji/EmojiRegistryTest.java deleted file mode 100644 index 6f991a38e..000000000 --- a/QKSMS/src/androidTest/java/com/moez/QKSMS/common/emoji/EmojiRegistryTest.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.moez.QKSMS.common.emoji; - -import com.vdurmont.emoji.EmojiParser; - -import junit.framework.TestCase; - -public class EmojiRegistryTest extends TestCase { - public void testWhitespaceBothSides() { - String src = " :) "; - String expected = EmojiParser.parseToUnicode(" :" + Emojis.SMILEY + ": "); - assertEquals(EmojiParser.parseToUnicode(expected), EmojiRegistry.parseEmojis(src)); - } - - public void testJustEmoji() { - String src = ":)"; - String expected = EmojiParser.parseToUnicode(":" + Emojis.SMILEY + ":"); - assertEquals(EmojiParser.parseToUnicode(expected), EmojiRegistry.parseEmojis(src)); - } - - public void testPunctuationNothing() { - String src = ".:)"; - String expected = EmojiParser.parseToUnicode(".:" + Emojis.SMILEY + ":"); - assertEquals(EmojiParser.parseToUnicode(expected), EmojiRegistry.parseEmojis(src)); - } - - public void testNothingPunctuation() { - String src = ":)!"; - String expected = EmojiParser.parseToUnicode(":" + Emojis.SMILEY + ":!"); - assertEquals(EmojiParser.parseToUnicode(expected), EmojiRegistry.parseEmojis(src)); - } - - public void testPunctuationPunctuation() { - String src = ".:)!!!"; - String expected = EmojiParser.parseToUnicode(".:" + Emojis.SMILEY + ":!!!"); - assertEquals(EmojiParser.parseToUnicode(expected), EmojiRegistry.parseEmojis(src)); - } - - public void testUrlsWork() { - String src = "http://github.com/srcreigh"; - assertEquals(src, EmojiRegistry.parseEmojis(src)); - } - - public void testMultipleEmojisOnlyReplaceFirst() { - String src = ":):):)"; - String expected = EmojiParser.parseToUnicode(":" + Emojis.SMILEY + "::):)"); - assertEquals(EmojiParser.parseToUnicode(expected), EmojiRegistry.parseEmojis(src)); - } - - public void testEmojiWithWordDoesntReplace() { - String src = "hey:)"; - assertEquals(src, EmojiRegistry.parseEmojis(src)); - } - - public void testPoop() { - String src = ":poop:"; - assertEquals(EmojiParser.parseToUnicode(src), EmojiRegistry.parseEmojis(src)); - } - - public void testNewlineAfter() { - String src = ":)\n"; - String expected = EmojiParser.parseToUnicode(":" + Emojis.SMILEY + ":\n"); - assertEquals(EmojiParser.parseToUnicode(expected), EmojiRegistry.parseEmojis(src)); - } - - public void testNewlineNewline() { - String src = "\n:)\n"; - String expected = EmojiParser.parseToUnicode("\n:" + Emojis.SMILEY + ":\n"); - assertEquals(EmojiParser.parseToUnicode(expected), EmojiRegistry.parseEmojis(src)); - } -} diff --git a/QKSMS/src/androidTest/java/com/moez/QKSMS/common/utils/DateFormatterTest.java b/QKSMS/src/androidTest/java/com/moez/QKSMS/common/utils/DateFormatterTest.java deleted file mode 100644 index 47f9213a5..000000000 --- a/QKSMS/src/androidTest/java/com/moez/QKSMS/common/utils/DateFormatterTest.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.moez.QKSMS.common.utils; - -import android.test.AndroidTestCase; - -import java.text.SimpleDateFormat; - -public class DateFormatterTest extends AndroidTestCase { - protected void setUp() throws Exception { - super.setUp(); - } - - public void testDateSymbolsAPI(){ - assertEquals(new SimpleDateFormat("H:mm a").toPattern(), "H:mm a"); - } - - protected void tearDown() throws Exception { - super.tearDown(); - } -} diff --git a/QKSMS/src/androidTest/java/com/qklabs/qkms/test/ApnTest.java b/QKSMS/src/androidTest/java/com/qklabs/qkms/test/ApnTest.java deleted file mode 100644 index fc815755c..000000000 --- a/QKSMS/src/androidTest/java/com/qklabs/qkms/test/ApnTest.java +++ /dev/null @@ -1,237 +0,0 @@ -/* - * Copyright (C) 2015 QK Labs - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.qklabs.qkms.test; - -import android.content.Context; -import android.test.InstrumentationTestCase; - -import com.moez.QKSMS.mmssms.Apn; -import com.moez.QKSMS.mmssms.ApnUtils; - -import java.util.Arrays; -import java.util.List; - -public class ApnTest extends InstrumentationTestCase { - Context context; - - public void setUp() { - context = getInstrumentation().getContext(); - } - - public void testQueryPortInsteadOfMmsPort() { - List actual = ApnUtils.query(context, "310", "012"); - List expected = Arrays.asList( - new Apn("Verizon", "http://mms.vtext.com/servlets/mms", null, "80") - ); - assertEquals(expected, actual); - } - - public void testQueryMultipleMatching() { - List actual = ApnUtils.query(context, "310", "240"); - List expected = Arrays.asList( - new Apn("T-Mobile US 240", "http://mms.msg.eng.t-mobile.com/mms/wapenc", null, null), - new Apn("MetroPCS 240", "http://metropcs.mmsmvno.com/mms/wapenc", null, null) - ); - assertEquals(expected, actual); - } - - public void testQueryLeadingZero() { - List actual = ApnUtils.query(context, "724", "019"); - List expected = Arrays.asList( - new Apn("Vivo MMS", "http://termnat.vivomms.com.br:8088/mms", "200.142.130.104", "80") - ); - assertEquals(expected, actual); - } - - public void testQueryNonLeadingZeroDoesntMatchLeadingZero() { - List actual = ApnUtils.query(context, "724", "19"); - List expected = Arrays.asList( - new Apn("Vivo MMS", "http://termnat.vivomms.com.br:8088/mms", "200.142.130.104", "80") - ); - assertEquals(expected, actual); - } - - public void testQueryBoostMobile() { - List actual = ApnUtils.query(context, "311", "870"); - List expected = Arrays.asList( - new Apn("Boost Mobile", "http://mm.myboostmobile.com", "68.28.31.7", "80") - ); - assertEquals(expected, actual); - } - - public void test311480Verizon() { - List actual = ApnUtils.query(context, "311", "480"); - List expected = Arrays.asList( - new Apn("Verizon", "http://mms.vtext.com/servlets/mms", null, null) - ); - assertEquals(expected, actual); - } - - public void test310260TMobile() { - List actual = ApnUtils.query(context, "310", "260"); - Apn expected = new Apn("T-Mobile", "http://mms.msg.eng.t-mobile.com/mms/wapenc", null, null); - assertTrue(actual.contains(expected)); - } - - public void test310120Sprint() { - List actual = ApnUtils.query(context, "310", "120"); - List expected = Arrays.asList( - new Apn("Sprint", "http://mms.sprintpcs.com", "68.28.31.7", "80") - ); - assertEquals(expected, actual); - } - - public void test26806TMN() { - List actual = ApnUtils.query(context, "268", "06"); - List expected = Arrays.asList( - new Apn("TMN", "http://mmsc/", "10.111.2.16", "8080") - ); - assertEquals(expected, actual); - } - - public void test311490VirginMobile() { - List actual = ApnUtils.query(context, "311", "490"); - Apn expected = new Apn("Virgin Mobile", "http://mmsc.vmobl.com:8088/mms?", "205.239.233.136", "81"); - assertTrue(actual.contains(expected)); - } - - public void test23410O2() { - List actual = ApnUtils.query(context, "234", "10"); - List expected = Arrays.asList( - new Apn("O2", "http://mmsc.mms.o2.co.uk:8002", "82.132.254.1", "8080"), - new Apn("TESCO", "http://mmsc.mms.o2.co.uk:8002", "193.113.200.195", "8080") - ); - assertEquals(expected, actual); - } - - public void testSolaveiBlank() { - List actual = ApnUtils.query(context, "310", "260"); - Apn expected = new Apn("Solavei", "http://solavei.mmsmvno.com/mms/wapenc", null, null); - assertTrue(actual.contains(expected)); - } - - public void testNet10() { - List actual = ApnUtils.query(context, "310", "410"); - Apn expected = new Apn("net10", "http://mms.tracfone.com", null, null); - assertTrue(actual.contains(expected)); - } - - public void testATTApnSettings() { - List actual = ApnUtils.query(context, "310", "410"); - Apn expected1 = new Apn("AT&T 4G", "http://mmsc.mobile.att.net", "proxy.mobile.att.net", "80"); - Apn expected2 = new Apn("AT&T 3G/WAP", "http://mmsc.cingular.com/", "wireless.cingular.com", "80"); - assertTrue(actual.contains(expected1)); - assertTrue(actual.contains(expected2)); - } - - public void testGrameenPhone() { - List actual = ApnUtils.query(context, "470", "01"); - Apn expected = new Apn("Grameenphone", "http://mmsc.grameenphone.com/servlets/mms", null, null); - assertTrue(actual.contains(expected)); - } - - public void testAirtel() { - List actual = ApnUtils.query(context, "470", "07"); - Apn expected = new Apn("Airtel", "http://100.1.201.171:10021/mmsc", "100.1.201.172", "8799"); - assertTrue(actual.contains(expected)); - } - - public void testSMARTFREN() { - List actual = ApnUtils.query(context, "510", "09"); - Apn expected1 = new Apn("SMARTFREN 0881, 0882", "http://mmsc-jkt.smart-telecom.co.id", "10.17.27.250", "8080"); - Apn expected2 = new Apn("SMARTFREN 0887, 0888, 0889", "http://mmsc2.smartfren.com", "10.17.27.250", "8080"); - assertTrue(actual.contains(expected1)); - assertTrue(actual.contains(expected2)); - } - - public void testStraightTalk() { - List actual = ApnUtils.query(context, "310", "410"); - Apn expected = new Apn("Straight Talk", "http://mms-tf.net", "mms3.tracfone.com", "80"); - assertTrue(actual.contains(expected)); - } - - public void testCricket310410() { - List actual = ApnUtils.query(context, "310", "410"); - Apn expected = new Apn("Cricket", "http://mmsc.aiowireless.net", "proxy.aiowireless.net", "80"); - assertTrue(actual.contains(expected)); - } - - public void testCricket310150() { - List actual = ApnUtils.query(context, "310", "150"); - Apn expected = new Apn("Cricket", "http://mmsc.aiowireless.net", "proxy.aiowireless.net", "80"); - assertTrue(actual.contains(expected)); - } - - public void testTIGO() { - List actual = ApnUtils.query(context, "640", "02"); - Apn expected = new Apn("TIGO", "http://mms", "10.16.17.12", "8888"); - assertTrue(actual.contains(expected)); - } - - public void testDSTCom() { - List actual = ApnUtils.query(context, "528", "11"); - Apn expected = new Apn("DSTCom", "http://mms.dst.com.bn/mmsc", "10.100.6.101", "3130"); - assertTrue(actual.contains(expected)); - } - - public void testVodacomMozambique() { - List actual = ApnUtils.query(context, "643", "04"); - Apn expected = new Apn("Vodacom", "http://mms.vm.co.mz", "10.201.47.14", "9201"); - assertTrue(actual.contains(expected)); - } - - public void testVirginMobileMms() { - List actual = ApnUtils.query(context, "310", "000"); - Apn expected = new Apn("Virgin Mobile", "http://mmsc.vmobl.com:8088/mms?", "205.239.233.136", "81"); - assertTrue(actual.contains(expected)); - } - - public void testH2O() { - List actual = ApnUtils.query(context, "310", "410"); - Apn expected = new Apn("H2O", "http://mmsc.cingular.com", "66.209.11.33", "80"); - assertTrue(actual.contains(expected)); - } - - public void testSpeakOut() { - List actual = ApnUtils.query(context, "302", "720"); - Apn expected = new Apn("SpeakOut", "http://mms.gprs.rogers.com", "mmsproxy.rogers.com", "80"); - assertTrue(actual.contains(expected)); - } - - public void testApnEquals() { - assertEquals(new Apn(null, null, null, null), new Apn(null, null, null, null)); - assertEquals(new Apn("Test", null, null, null), new Apn("Test", null, null, null)); - assertEquals(new Apn("A", "B", null, null), new Apn("A", "B", null, null)); - assertEquals(new Apn("A", "B", "C", null), new Apn("A", "B", "C", null)); - assertEquals(new Apn("A", "B", "C", "D"), new Apn("A", "B", "C", "D")); - assertEquals(new Apn("", "B", "", "D"), new Apn("", "B", "", "D")); - } - - public void testApnEmptyConstructor() { - assertEquals(new Apn(), new Apn(null, null, null, null)); - } - - public void testApnManuallyConstructed() { - Apn manual; - manual = new Apn(); - manual.name = "A"; manual.mmsc = "B"; manual.proxy = "C"; manual.port = "D"; - assertEquals(new Apn("A", "B", "C", "D"), manual); - - manual = new Apn(); - manual.name = "A"; manual.proxy = "C"; - assertEquals(new Apn("A", null, "C", null), manual); - } -} diff --git a/QKSMS/src/main/AndroidManifest.xml b/QKSMS/src/main/AndroidManifest.xml deleted file mode 100644 index 290fb33c5..000000000 --- a/QKSMS/src/main/AndroidManifest.xml +++ /dev/null @@ -1,577 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/QKSMS/src/main/aidl/com/android/vending/billing/IInAppBillingService.aidl b/QKSMS/src/main/aidl/com/android/vending/billing/IInAppBillingService.aidl deleted file mode 100644 index 2a492f784..000000000 --- a/QKSMS/src/main/aidl/com/android/vending/billing/IInAppBillingService.aidl +++ /dev/null @@ -1,144 +0,0 @@ -/* - * Copyright (C) 2012 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.vending.billing; - -import android.os.Bundle; - -/** - * InAppBillingService is the service that provides in-app billing version 3 and beyond. - * This service provides the following features: - * 1. Provides a new API to get details of in-app items published for the app including - * price, type, title and description. - * 2. The purchase flow is synchronous and purchase information is available immediately - * after it completes. - * 3. Purchase information of in-app purchases is maintained within the Google Play system - * till the purchase is consumed. - * 4. An API to consume a purchase of an inapp item. All purchases of one-time - * in-app items are consumable and thereafter can be purchased again. - * 5. An API to get current purchases of the user immediately. This will not contain any - * consumed purchases. - * - * All calls will give a response code with the following possible values - * RESULT_OK = 0 - success - * RESULT_USER_CANCELED = 1 - user pressed back or canceled a dialog - * RESULT_BILLING_UNAVAILABLE = 3 - this billing API version is not supported for the type requested - * RESULT_ITEM_UNAVAILABLE = 4 - requested SKU is not available for purchase - * RESULT_DEVELOPER_ERROR = 5 - invalid arguments provided to the API - * RESULT_ERROR = 6 - Fatal error during the API action - * RESULT_ITEM_ALREADY_OWNED = 7 - Failure to purchase since item is already owned - * RESULT_ITEM_NOT_OWNED = 8 - Failure to consume since item is not owned - */ -interface IInAppBillingService { - /** - * Checks support for the requested billing API version, package and in-app type. - * Minimum API version supported by this interface is 3. - * @param apiVersion the billing version which the app is using - * @param packageName the package name of the calling app - * @param type type of the in-app item being purchased "inapp" for one-time purchases - * and "subs" for subscription. - * @return RESULT_OK(0) on success, corresponding result code on failures - */ - int isBillingSupported(int apiVersion, String packageName, String type); - - /** - * Provides details of a list of SKUs - * Given a list of SKUs of a valid type in the skusBundle, this returns a bundle - * with a list JSON strings containing the productId, price, title and description. - * This API can be called with a maximum of 20 SKUs. - * @param apiVersion billing API version that the Third-party is using - * @param packageName the package name of the calling app - * @param skusBundle bundle containing a StringArrayList of SKUs with key "ITEM_ID_LIST" - * @return Bundle containing the following key-value pairs - * "RESPONSE_CODE" with int value, RESULT_OK(0) if success, other response codes on - * failure as listed above. - * "DETAILS_LIST" with a StringArrayList containing purchase information - * in JSON format similar to: - * '{ "productId" : "exampleSku", "type" : "inapp", "price" : "$5.00", - * "title : "Example Title", "description" : "This is an example description" }' - */ - Bundle getSkuDetails(int apiVersion, String packageName, String type, in Bundle skusBundle); - - /** - * Returns a pending intent to launch the purchase flow for an in-app item by providing a SKU, - * the type, a unique purchase token and an optional developer payload. - * @param apiVersion billing API version that the app is using - * @param packageName package name of the calling app - * @param sku the SKU of the in-app item as published in the developer console - * @param type the type of the in-app item ("inapp" for one-time purchases - * and "subs" for subscription). - * @param developerPayload optional argument to be sent back with the purchase information - * @return Bundle containing the following key-value pairs - * "RESPONSE_CODE" with int value, RESULT_OK(0) if success, other response codes on - * failure as listed above. - * "BUY_INTENT" - PendingIntent to start the purchase flow - * - * The Pending intent should be launched with startIntentSenderForResult. When purchase flow - * has completed, the onActivityResult() will give a resultCode of OK or CANCELED. - * If the purchase is successful, the result data will contain the following key-value pairs - * "RESPONSE_CODE" with int value, RESULT_OK(0) if success, other response codes on - * failure as listed above. - * "INAPP_PURCHASE_DATA" - String in JSON format similar to - * '{"orderId":"12999763169054705758.1371079406387615", - * "packageName":"com.example.app", - * "productId":"exampleSku", - * "purchaseTime":1345678900000, - * "purchaseToken" : "122333444455555", - * "developerPayload":"example developer payload" }' - * "INAPP_DATA_SIGNATURE" - String containing the signature of the purchase data that - * was signed with the private key of the developer - * TODO: change this to app-specific keys. - */ - Bundle getBuyIntent(int apiVersion, String packageName, String sku, String type, - String developerPayload); - - /** - * Returns the current SKUs owned by the user of the type and package name specified along with - * purchase information and a signature of the data to be validated. - * This will return all SKUs that have been purchased in V3 and managed items purchased using - * V1 and V2 that have not been consumed. - * @param apiVersion billing API version that the app is using - * @param packageName package name of the calling app - * @param type the type of the in-app items being requested - * ("inapp" for one-time purchases and "subs" for subscription). - * @param continuationToken to be set as null for the first call, if the number of owned - * skus are too many, a continuationToken is returned in the response bundle. - * This method can be called again with the continuation token to get the next set of - * owned skus. - * @return Bundle containing the following key-value pairs - * "RESPONSE_CODE" with int value, RESULT_OK(0) if success, other response codes on - * failure as listed above. - * "INAPP_PURCHASE_ITEM_LIST" - StringArrayList containing the list of SKUs - * "INAPP_PURCHASE_DATA_LIST" - StringArrayList containing the purchase information - * "INAPP_DATA_SIGNATURE_LIST"- StringArrayList containing the signatures - * of the purchase information - * "INAPP_CONTINUATION_TOKEN" - String containing a continuation token for the - * next set of in-app purchases. Only set if the - * user has more owned skus than the current list. - */ - Bundle getPurchases(int apiVersion, String packageName, String type, String continuationToken); - - /** - * Consume the last purchase of the given SKU. This will result in this item being removed - * from all subsequent responses to getPurchases() and allow re-purchase of this item. - * @param apiVersion billing API version that the app is using - * @param packageName package name of the calling app - * @param purchaseToken token in the purchase information JSON that identifies the purchase - * to be consumed - * @return 0 if consumption succeeded. Appropriate error values for failures. - */ - int consumePurchase(int apiVersion, String packageName, String purchaseToken); -} diff --git a/QKSMS/src/main/assets/fonts/Roboto-Light.ttf b/QKSMS/src/main/assets/fonts/Roboto-Light.ttf deleted file mode 100644 index aa4534075781ca6567452f1ae8ed0d4f6cb453c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 126792 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

$(!at=3<`mujoM2yp_khnd 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 GpZ!0>9ZseI diff --git a/QKSMS/src/main/assets/fonts/RobotoCondensed-Light.ttf b/QKSMS/src/main/assets/fonts/RobotoCondensed-Light.ttf deleted file mode 100644 index d4eb1980614ecb06a773971ca51a17e5ac0251a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 126168 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­l{Dh%zq^1{d? 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 Q;Y^!rta7v%BjZB+4>qMJRsaA1 diff --git a/QKSMS/src/main/assets/fonts/RobotoCondensed-Regular.ttf b/QKSMS/src/main/assets/fonts/RobotoCondensed-Regular.ttf deleted file mode 100644 index b9fc49c95b0675c7bf972da903c7409b03c350b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 125332 zcmeFZcYqYd);?U--7`yEHs_pknw{C4Bb#^G#O64g^Rkhg1SBp|k_16TBuUnbh+Yg= zQMm?0MMUK)dJU+ku+#HB)w7G}d;PudAK#yMp-%NocUM=PI_Ej3&Z!=~=BWITn>8weRWpE9E$-o@SSSwg?aCq#(Op5Y&K`mm=1 zA+!gQ9B07ZZP(kdF3T@Y$uYt#@E~KutM5ze0$?ORXKX)gB+!j}qcuMaYD@ zw(5aSA%}Y5d@8PYXs>Ro|7ptC?-J?}fajZacJ%aKO=&15)EDPn1;WOPQupbx*D9w) z{!AuLz!!wP^u3`UtKU5I*$;PDY2MYlH=zd~ClZc*i$C0>*D6lIGnF`hMem-}lJ1;D zg+TTV=n-N@28irW=XreQ`Jd=ooFTHUG6kBn*VX*nL_Pi(U4z#Nr_CV_rTFB)zUdt7 z?jf;+Xf<*o5~9}I%HafkG@Cs!Ty_MPI1rA$%dSPcs9E9GkY&P5lEeQy0;L8e5@j8Kn=C?IfYOW7 zNUxC<^ikr?uOr#~yJQ1@h%Do)NRHec&)QDBg>te(SWadO>&Ol~X9s@;pU>j+9kK)C z-N#=e5keWhe}n9hPsX{QP%e=_K0)N;#k{s&Uce@qsGKg;NA z+OPO+WC@N(O8jIB62vbe!F&O6MqR=6 zkW~63IgHv}I7Q~rtKh-=q(LwvRkGux31jf0Uz7Dh1}Wo-iy)LT`i5?~;CuYmg5keYm$?W=Zm7tt3}g zOFH;Uk|Lj{75SG)sqiNFXHT{YzGR8)pJaw$P5K0a`4LH_U`SR8Ul4!#DH-9vMcZ!> z75Ek`{DW-5vsTD=kQR9;QPb;W3pYe$!t)r19`3sa-mA$1`Y-LL{8`e-w_)xg$O^t0 z-~B*VaZi&$PLD+JEs(3nF(=lfmw0H-q5O>EjPe2T7=4d^rwQezl2iPnc*c*o|6gRk zaEo{e=SjP;frJWjG9>(h@8l#$_>JTWZ(!~p$M}9Gb%Hb5$gjpTG(?SY*73(B{w#-F z&Eo3GbNpw-pYI{HkQD{4SZNOskeU1k(1Rb)*1t%p>?rs#4Lm%f{YBPJie*Zo z5KfZ;y($u^*FyHo_K|eqSF#V|-7HHbA@Y3UBe;-!$mTxb-y~Y7A!V`_6kGK35_wp@ znCzE7hxvd2+>M0_F3gnxxJ z$==6(xAC1w%vd|}Nn}J8O#1n^wLi%N&_6%2R#1@;$e69%l$?}BlS8t*WF?-xM(--d za1}D~7|G!4NEVw9eiZZGMqK!n&{6go@&g?ikwub0jB^Bh>lfBS$Iut>qyzJN5A$q< za-DdH7KGegh4L7CzR(99zYG1kLN-J8mkT*$Kfelf8`*;Atd|`oX~M@OL%tXK{xw;y zH-$WoXDpXFkxn6kw8`U1lJE@i7hWO{Lq~^E7s=F+4>#?1QX3yazwV$-%)9V1DHcpg zBTAFtO>($fBwOev)w0(}t?WneZ8nJ)7LaJjPyzZdTmCf3l5HZH@~_D@*|X$fA)j>d zJ29qjNsurAIXn%XZUpx8;PY6`bpceA!kwx?(=Bo_)_$t0n zBa39AIG2dx4x4gSs!M?9njo(j{{8!NRo5UHi83j34@K3=$?Il^@dp*iJlsuFf zD4{4r{07X`Mv{)AMkz(VW}~lzC^`&fyxR*r+Dm4lB%l4H0J5%>t|kW|=_CX6dj@FWij70}P8FbB*|9RbfKK<5aG z5so?7AVb(9X1~tERxrEuBW%!*I1hUY>}i#39K&E{?_s}%!z6$e%>6WGGhw$l$qqAH z{GSSJvt*ZW4SeQM2u)rQm{b6?ZKNU6(*x&~X{ZxAf zwrDx(TPTOe?Ju*z4;IPxGW$DTnC(SjV`9(xA2k~np2vKT|5!8rtp;z|m|36xmzw!3 zjQ@XG!=HgJF9yFZV;mPAsNcoszk{DpFl?*S(3&YKE>>Tg^ z1GR*u3`fVYl;J6gUOa5B?S z{gPviaUZKLXKE9}i!C{J#5bGe4K{X1pH9lyRSMyoQg<>wLd5 zNvAO%f2iRbGyfIiew_KO67Si%32QOQkA~m-=YBr$*@=Hw`^E#G|1-}2759)p^EC*ryTHD=P7Ko{6LV|-4~Z)vW^Yql<9>y>fY827cAjT4%*H(0?n zlW>gz)&NfYVeR$%@-p@eChyX^hOL>{T#w1>_%kJ3xI!G6pUiwsR_HHeJB}!!?2k+# zzfRDS31os+L>y+KRzoI{NuZO-WY8&O3g}caRXa-bi9YBwG7Z##7=RiQL+w3cM2tX< zi7}`NF#$CNy^HvaDX2Ly1GOOLpq9i!`x~($mY~+e3e<*JgW3`s?XSd+*n-*1`Q!f&`_cR4I?4iA4oU} z1&ttKpphgTGz#>45=|mNV@M=uEQtb*BhlLLNIZ!FO(3zLi6jm*iNtHaCCMZKG=(IB zrjjJk=_FbEZ<0n*K+{PoXa<=Mnn}{M-;gYl4w_9eKyyeYXfEj2B#&f)&LG*K`6LIl zfaGd#kwTIOT0~}m7L$C?nWRAb6)7Qwprxb;w2TykmXn#qqb+Dke>XOT|r4bn%tK>JBI=m6;f9R&T943S>YVKNJJ zHt7SML;AJX$y_o3I*$y3&L=~l3&^nc6S9!Z23 zECgLn7HK~wE68HdhshGqm1HUCD$tL}YVr^$tPbc}vK(|BS)u)qjF5*x*OQf?8^|iq zjbydpna*_NE^ks4m^cC_v=&PV_kk`n0(0`B@Kwl>pK;IxQYF{Up$V;HO8}u!55%g{H zvi2Y3GI<5`pX620cgSm??~;FLUnB34*FoPWZ-8DQmq0%tZ)#s9SIJwTACk90KO&bw zKL&k;TqFMk{e-*&dY!xr`YCx&`!cyf-Ut1RTmk)@d;t0dxvITLZjui{|3y9m{gQkP z`W3mR{X4luJ^}rjTnGJzU}Zx7O>SskBHxnFK))lOgMLrG0Q~{Q>A3+f^ z(Ul1+f%NRp2H)U_b0czY68i!lbZ6KH-5;>MKFaWFoy-O1oB&>AGSbxd*T3ecLJ)r0L|Ti;vPV6FQB#$(Ap0u z9RPF=0xAasjS*1;0*3*4BY?P3K-w4}Y#fj^0f?FeBuxQ=P6u+P12Hp!l-WSYTp;5N zAR=NmK*3_5UkOmJ3}{yYl&bqFmPxAT}C?T zO1cVo*-IDEC3G=)fi4F=4no5g19|2GVO!}#WIbI09c>{)w3G0hjGMq&0%6wC8d^)6 zXfv&+YO<8B<|4QQw3iOjZrVdf_&VA~`e*}fpV9Von1iS?ZBFyz|`HqnQcUnt1-*p04?P}YFv&voQipwi)#;}N6$k?--Mih zM?^Y}8d6v4P6KEtjiobaC7wK&&Z8rAH$6hXr}wCqv*fJ7o0;5m+{@gn+{fIHJmqXvGIFwVvUBowN_DDos&{?uTkg(__XJU^)o8VnZ0knr04dxBemo6) zJP$N_3mW}B(NY6yMBS(d4WwZ-j^@)U+9-{77d?#8-le0Q1*Aqd+KU+N6^s_Cr?Js4 z#%Ndb>-oL>QT{Cd8viy%O9VF|Ku8vHgj%6f7!sBVZwgn08^RqKCo{AocF}h8?RMGS zw)+XAB@V_8<_-=Ht{82QL)iV%?!{=I`om~T$3|=Tz-a3*T8hz9jCK^GrGgKlxIZJa zbpz!*%JWeEB$QZ`NR)7tP!tskGI}%!*HG~%@n3Wncy$8ycSx)jW61%{JDPo(mo$ep zdo_DBJ2YD~OK|04?IOlejSRx{50d!v`^zc^ZzvLGxtveKBd=xA>{hoD6_6NURPf){bbGcoa-*1 zEV%agC$m23{iN-a=1(d=L!^B0%QvWwkd#XO87(%0oy_tx?vp4I3fs$DsW^4*Tgk*EnF+t#fgiX7&xc^h(swn9 zVX?&*@m+i|$`9~^f?Uv}KGavR73`=V^%o`x6M@NrG>9r_FjewH{ID=dn9R@S=LqhChcHE$ zN>wyO&=;lwxx;932ro!9#ua)_)l^KKW|5};AA|Ec1D}(bW*WpbI7%um)Qm&={xb@IpLugO1`-_;A(%hRjS zTdcQ7@0i{@dbcKcOembNeZp%KttR?SES}gpal^#p6JMWrW8$4j!X&dvUXwy6B~RKp z>FQ*&$r+PZPd+|{o8mSleoE(*)l;@k`DiLPHF9eA)F-CCu5YKGrr)W*SbvZHdHrvu zanquwWlUQ(?YU`J4Xg}G3=SE*XK>4~-Ef1^1fwjY5~F6Ln?^qw`x$2$&ow@8e98EZ ziGhimNt#KS$ySs7CZ|naGx^BW#WcgT-SoWa_h!jv7tC$U)66%SUo!vILa=bKh_uMJ zm}_y`LbPnQTxNORYLZpH)k>=iRyVBOti!Fdth=q3SzoZeWn*IFWm96)Xwzpi-)5K1 zNt@SguG&tpHL!KE4Yi$XJ7Rmt_Pp&iJ0H6WyFGTd?UU^*?9VyqJLEYGIXvfZ&C$xS z&vB3Abte}mwbN>+bIy~T6P-6Wf9c}l(&uu(;Wfpp%&XgLwbwDPOI|m z-R-@?`;hl5-e3Ay_+^*!kOt)H7;o?olq0l%C6cK*%&$Nb;%|24oZ zAU|MBz&n9aKzUAiUHQF=sBVSC zhV+FT47n9bLQO(rLpwt^g`N$)8hSU(EG#IjDr`g8ui?evec>CzUkd*|!XlzM;&{Z3 zNR!Cu$i~P+kvF4kqI{wvqne`*Me9e`MIVphVzOdJVy?uR#OB3rhHb!+OO)QhRNQ*Tdy zFU=#ZENy<;*0kek*V68!8>MHZuS`FlekuL)47ZHvjI@mQjFlPNGtOnalc}E>o;i@Y zKl9hDDOo{TX<6-AE3+QUI-B)vHpvdnUY7kt_Ln)ToV1)>Ip5?4{w zC$BE=WZs<_!i?}4B{LdltetUa#+CfK{MP*a`QH}=7pyFJz2M72q0pf)vQS;Pr|@Et zyePS7WzpH9(cSIE4f-~QJP=6w)9e&epyx7 zk#bV*Q{G$tO8HymSIVzf7*xbov{$UCI9Ksn#d{SuD!#3_TPd$Js}A zzox3DwPv7Zan0JA?KMx-9IrWF^Lovdn$K&#ul1;1T02s^v-Uvk$=VCGmuj!p-mJY{ zE7nb_Gplo|^Q#N5ORmeStEgL6ccJc5-PO9Ab+_xp`bqU>^-lGE_2Ko&^?CIb_09Et z^$Y7)*Ke)gUw^FrT>WeH@73R^|F-_FTCO%y+o`?ODs{X%OI@N?tGm^6)hpDS)O*y2 z)MwQf)tA-R)VI`k8n_1i2CD|QhMR#8|@ms8dZ()jaiK) zjq1kk#<`6v8aFlWX*|?;w((-)<;H7`w;Jy>aZUP7R!weAK~2$3X-$PqHBIeJLrqJY zMw)gu9cVh)bfM`|)77S%O}CrG=1I+F%}&jJ&Ed_-&3Vl$o3}JS)_kP-x#m}z-)X+y z{7s8XOF&CxOKMAgOI1s2%RtNGmbEQsTQ0U-Zn@TStL08B*Q(!Y)#}z7)EeEI)>_zF z)7suT)Vj2Fq;+TOf!33)7g{g1UTwYEdb?F@i*L(nD```=b+^rJThX?uZBN^wwzF*) z+b*|VYrEBUr%h~^x9hi?wcEA3wfnWJ+N0Z(+q2pW+bi1D?cMEj+gG%2YTwg-sQqmF zh4$ClFSlQ9ztR3}``r$Chf#-JhgXNHV`<0gj;$SgIu3N4?6}bJTF2#%s~tBwzU{cv zA$H0;^*hZv?K<5${W?{h(Vc0Xd7UMln>u%P?(aO-d9L$f=cUf8oi{qa?Y!G1?=tGL z>+o?ojnJ7PWGJZx!7~L=UUILo;$riF5S$(q>&RRWd>#Y5= zj?FqZ>(Z=ivu@40)5rDc_gVG1^#%1s_oej}_SN*Y_YL(e?c3D1zwcPzxxUx>-s`*3 z_if+ZetEx9zg@pqzp6jJKdZl_U)|r=zqEg(e`o)J{*(O|`Y-ig?Z4T7yI&lbG+;L1 zG~hQ7K9D?+H&8LqJkU3=aA5Vo)`9&4#|F*~yf*OOz>R@#2mJ=42h#=%2Wtk~2Zsii z4vq}&96T_1a`3|7rNOI%HwSMIibIoz%!cfS@`qLoJvMZ1=*IAbVT)mp;o#xe;f&$p z;kx0@;kCnuhTj{$JDZ!WKifk3r$U5unP9{@%dxo}v2H?nXJe&8CQ)i?*MVrSKBKY$ zaVsqwSq56Sf_Ww!;?acvO?CtkaC_Y6j9Z+Q3aKb~g)xe$vs6HhowGOzW_#kQm5&^@3`q40NcJ~3R~5zP%`Not%O6O8IHs>ub;Kxvy&fpzlTw5SkfTq|KS>$ zJ2h`{j;n}_tc-VZ($&rjrXjRy?{7bCnuEWC18Vw@u}hqt<0~R?>7Op~bC@O;RdWS3 z!j|Z^ynukbw&={Lw%mY#+_os^*dRN*z&Phj=Qtb$#W|0@5!KF4wMS(|>#m6&Kb7Si z7bso)OT5q>kFoQ}k$xkj%3dOVB#Oxi8+V9q&e-tT3{9gnnqv5JJ!5BgeV#Ex7NiQH zdit0^JB~LoGY^TzEbF+^;2cw|bWpmP_|E7}N$$+@GWUvhFQvrXVrQW8*gI+VX*qfB zAJA?0Pzz$uK-KAO=y0q$~)7_!)mIrOR$quu#*veD7K}%(8o7FFVCl7afyFW zerL3@C^Nw^OI#DaG-LR!0xf9)8>dCJZ9WjHqWdg8(qk0{%E}Z^{tH!iY`m#gK$x3d zsJFGfDg|=cAUG1dTY=do#*)rxOc&6NvUTEGS~U;n7l>Y5hP(wj!gwHrnCo+F@{R1M zxt^a)xxh1NW<{C1vw!UjrE*5Czq5N;#mpp6E_9U&P~+w7US3g* zhLc9bD@T@BS#|mDzD0x3Fb%%7+XoFVJ9b68j>#=0He5Ad0KL}72iFi8ui#zHWyX4w z5xz?kFZ)ryiH}U8o_^vR7iXV6K8Jt5WOFAi7WcMqDHVUHpbp}{*y|@~rx3fLb_gdW zRB<$QG;}s}R5}_exO_TYJatSwPBV`2QxA*5^!3B^NnCF$UZcUtVgiL+nF_l{Banv> zpt*0XSChZuM2c@sRk2fQ{KL7MrS|Yr&JvZ-h* zBv_>gGBY)iJ3G0p4GRm4hybY$h>Z>Ki;ia3+G`ha&tSZ0$K07JPHdvujdSF_cm{{; z{5SkO$T8DlMB8;r3r6eI*wlSoX${AKM#;|$sb4#@cx^*ysCrHD%(d#!qc*CXU`4jd z);1(Z5uBs6=Gvb5d2@XH=AWOr_RQ@Kv9TL&KVv_9uq7a%<>0V*bLenqaB%10Asr8Q zp%aT`r;yDej?RWMrK^Hld`!GVU$GJ1UjD?(5+5p{aC^~57eYL#lK!qV0LHO?GIml& ze(&gIx;7-mbDCAqbpNQLFzchi>POVY4_7Iiqx1a4=eW`(oYC~o@?0-fWwNJFR$F}8 zV?!yS4Qq>H7cQ6=B^FE1s{v11@jRAmVBo3@c9VeX4^Pv<@B!-m~YZ<|=13pSJ;gWTL(>ge~aM;MH?r_>ezy1_(W+;#EgdymNcGNl3DZUEA>U{f1G)AR=lRuPMP94y=G&5 zaNx|L>2ZVQNTo5}6o9u|z#GWpLe~ zXXLw6a3f&;0f~^T0c94PF_s@!A`>%3km~nOx`FXE)p`DzD%;4$HF+~uH%8hh)BW=* zR8>o|vzJsUH`;|}2L@%SY&+EIc5AD^L@%$z09~CFU?l{%9SE>UEp3ge+uEd3HEpen zYAs8(2zausa-&+MQg0l+8>OD^;W1quHFxDo-bq!K;08$x4=syxc8)89EH!Gid>h6g z&4nw3Jw%^MLOs@ZX2=C^sx)S&#*G!56Y4a3dx;AlFeklyQNDXX<(jINjpbfby|NZQ zzhvs`PI2M>2Ch+=9zj`38;hXKZJ7(7D2qxfSbk_`Ksa^d^+vyi} z!6}|uwU0Eaf=g#lj~lKENB(mK@U08`ecgz`UA$z1y=(XQ9(?Z&44sMZ-SN$5c&|xL z^cjp}_rQzXJ-o|-c{7%o0wqi}RMg~i2f4+Xm+0^a9YTH&4>=GJlf0A{>)DT z|6EBR+GF$1;AspmqWN*X($h!I=mDIj;Ra5jp4LI`7Dc%ZF$()5R8=`YJ#YR@Key;i zcW>L{fr=mn{s+>nsp|afK#J-kFU&Z`1@kQULC|}=* z2x)vRVub8v*=F#g8vW6i!6vxtW)vM`y)ozII=Kr`!I(n#D5ocfxn?>B>&^TW%7v(m zR4%w0=`J~BHkyl}#?r-{>^x`e5|U9Don3G4+YuI19&R>aQey2;jDJdapoOn&nytHO zV7k(l*9%>AY4xHvM`pB;d) zMxLIo(>QlyA1j}XNKbkvYHn|Ry7!EXoa~tH-L;F~*^pys>t?2TZ+dBvVNBbG{Aa2A zrMCVL#LK6i72kWibF!(eQIDCU`Q!z+>CE@vpyk@Ni+&KF5Z_z9#l$xy$b@PpO%3hb zkNJX?6MCTEdO%MCivfGc)STxNMU$@Q=({`Ud(Ua!rmJ42v&F@-BX@JKV_*}cWe1f0 zOWbDyP4OW_Vdy9!=6$W_4aY&s*;RK0W3YohTCuS~r7lwDhS-F+Y$?BcSCt=bXQ`YK zE^5E_%L;X9ZbPHKl_P5Pc5j3D(#~l0jusX7q~<5rgzCu1nnc&F4v|G618ovE&4$nE z2U%m5TIWzI4ad~f+}RH^hZVxOoemNFuPI^O}lODa)b!<+2;jSC2=+u>;?JA0$eX_4`cCLF|-xCeu4^{hTr?_ShOa4B` zcpw;p2UD>(Xp93oKc5X=1g!I|{cW^O4Us-r0C#OQy`| z-orOO{_W=b=)T0ygJ=u>3(OYto}|JTX*68%=nuS1a}4?C-I`Gts+}S@K6cM~+%r+S z2i_LDi;opePH}fMFVJteMVdM6YJFVGc;y3L!N$3c^U8qD892qH{sB%g1Q2|TqSPCk zyPjQ|M!#y_*BvWAHF?3J{NCw~egy+*F@<4HQ^Y&;g%cJ@F}@jFZazYdxZ0?m{Y}dr z3GI5aOZ=wyU}uP#gTrK+gN+koeH99I6qj}yW2=-M(X8gW zrR(?MrZQX)9}U+lXxXV#_(ZWk^&37NN8mVB7>@a8_ZL-4ZvE--#&v}SYZ@a?IfQ2T z_-2OM%Z}Xpt@ZKFa7ELjElG88_O7X|uuwYw3C!=Ef)9F9k3y(|S-H>FoH{i?mwhC< zQ}ILY(Wgay^epaC&OtM86dO9m?&a6wUaSLL8Q&GOfQ!&fJ-vfD61ui!Z8!uNPvjJ6 z+!*Z|qo&L0Y&!d!Q-HTQPn?ni_M=IkfqtfV8&KSkea+S?u$*0HAvn{q4@Dx+*|qbd``e{tcO zi?So}{d=pM_H{<=@Jerp4sFT_01r6$6_bQgjLQ=H>EKmxdggkrI{f~hPWc0aOKqt9 zV77SIHp=1t2v5#S!U%iPlXW9ZPVdfg=VqQ4e@T0B@H@F)*7h&Ajc&cQJv)2*t>1?! z4jy9TJv7Mr!p3QPf1J|#Mp|d+!DqYgA$n5|OUl!9%X=U7w^6IVYc$tlDqT7ql)dz$zvrv}1o;dP}n7Y@NI_ANzZZ zUGfsx6vIpSUR-cWT*x1n8QuL>X0%h1*@cipit8+yB#f&kbbVax37=R5p;8fJ;eQ^n0^nv)L z_^%J>5^>Rc{6fx8Z!fi}3aI*#VdQ+@9CDy#fy~}+# z+M)TBv&Ziupvx>?#D9S6q3;Y+l*}D7rEc6aqYJssnohoK$Bwna!ku_s8oy;AzCz!X z&zI%{z`&57zPoK3TV%_={B2;1-f7(!6j}aO=%#I!M`M;)akuSqFN!$nAQQQySvq&KVdvtjH-qF6hyM<>(JMMiAexQT3 zWua~2U2%lx$e3)nj{e9`-Mm>k7baYxS7jnQ$0mz=GjV3r!|Q=BAQcZYUWoeCCc$oXi^sMx}V9^yK-dns+r17Z!Ub_*ooP zR4&U;pHmtnOq@DFEOU)lc}^*hZJ6$E;t^#M<7^Y;X6BJID=TYpRY*^Dp0!_;Q+Q8l zs7ub=Qq9-ak>N@+gH>kEz7~|TQDy}NCU`=u@UAWTy8+BFg~vS>A8>QmW7ceJ#ir9% zxt^gN+)I^`-{4=mxS({7*TmgNyoL%3mz4S+F;^DFX4Km1yDMVc2OH^E3!a}FlaV@K zPBbqjq(;uUu%u*3u}^-iMq{sXH+$-&#KS5)w;6l_yQSePbbPuGg5zdf!azFeo~&}j z?xv{Ph0~k1se^*lTbuHhRI2#LWESwB)X zFc4HaKYJ)=K`H!qjJFccZI#CB3<;9FD>HM979l*{x=0}{;zA6W7a=#T46a<7o7?Yo zbk9Vup@N(xmCB>7LunPZc9ki^tz6cU3v(jlqPT#&q&Ge}X72L~PCk_u!8wIZKXd}m zs>QQ9Fh&RFQOdCLzCSu!EX&z*bS^p1*1?Vl_i}pG+uOnuJJx2Z*Oqx{9$Pf*n;IEp zR%RAm*iqt_72zV#1H7qkhDmt;$=O3|{ywZqSa@!BgXN)}MvlJLo%Z3rHvDTgDFdYz zF-;jj87A)-bT5AQz=C;n2yg4wtccyQ;n`9aT)4bym3K~Ws!}!4(8nY-`^*{ssWsh2 z50&{FZW3foHQj4Qv1n$zs}>9Sc8tdz`@iq=F66$~g20_*HKOQ$WMy?w#nKr?LtYbi zg*C1zv@b3%vP%u09~PV+;o#LjBX3EC;%LiI`X5-EnlyOtZ>>AjL55BW=b~)W)ek|h_P)fFm(S|;vsfC`Y$NRTjJ)o zs(N~NmgfBoq)~5K;F8=2CQS&R6_@(QNz=8Z)9c5iwmimV z^M7V34DSaxD&xAg6cumnibGvo{76^aQP;TQ;2&J$W(F&YV_muIdC$*}i<|%aJoVh? z=f}p*e|~Ps(wV+gt)98G#Lo}MOjeeNRs0B^X^b@^p$2Tq-I=V7bJBTC{B%;lkDPh3 zVA%V}u8H1rii(z$_#f$WtT1=bYr>wRUVT}G4^;#m?Ho!fvv(+uAMPB-t>(LK zR2v#0snd}-6_=3~5-W9^zBa?YSHsWw;TupzQGU{#@_ClDS!V3rhly zuo${;jEAwI*YvQwd4)cTip4o)tE&Q!ac*JBPQ_(N^#%I+SlLHTuZ)ZBoDmQ-b0Env zCdkgxQ)O%C?dE3b5SLjKm(r8#9acFzAuP?uFk6yAbL}^rfh<<1wG0g<$4(W3fR5yq zGR!ojt$X(xSUDOQ`Ap=DBK*9wBAoZ_lf{a6*J!G}6gCql@|)!Pwuv3N+|D%=>IEJy zz}Sl+oLJY5`S;3kuTd4k>0*`g6QGbitF zXWkI6Qr~|(fBtpqD}MM7?l65=^Ofdfx>0PwhIO`VCC*|x?~8kxkBsN)EV;Xqi9L%f zp_PMwe@@&w#XG({YLbvnG9RgIU~=+pcd&j z#aLbdF#9L}(Sw_$@uA;~CfswIH!tHYA6dlukSdOF)8$dp+q8Z>3@so`DFrQbHWq#a zVmVZDC(Jq5qP}E1W3M>B(p*wO+e;ITnO;(ISiDUWb^a)2W+rjtM)9`%oOI3|eeyt` zV2RD6S)WuPe#i*1{$Z(#R>; z*eVMgnd~487=DTEWc(d%j|EEiNOFoh=Fa8G~kmJXEK)=j}h@&}unQm@bvvQ6u z+AROG518Cv8a3ssThp@VJkdDR@Wh;)X`g;#@$#MrJwZyUAX{vGD%n4Ms^=t#J!osph=(OkWVhE+3WEGh{&X|GIhaZ3oYn?MDw z{iEdh{#bG-Q*#_Y-a&NQ0%MWL3iDUAu@=nn9%N&AJY6u-^ojQ8kt2m!a- z9r6M0g}8@|ndA_2$Sg8{h!Wfnbc`8iAv@#QrpB`wOBX&Iq>50kU${Q~SY6%m^o@%* z2ZyTy)+`>aO6b{IT(q?(KE7uwY+X-6XG~IJ^sNYhxZ%qEvr|)N@2{-bKb(>>ydU$#)~b^r-)6cs9~NfpAIuIGMfj({3ebw$zb)>& zC%#HU#8=NCw-+Q{62-^f<^#C-nt(a`W{c-&{Oo;mxVJFw_0X40Nnfz?Ha1jPGObyE z_Uu{lHg7)q75@r%N0O~F(U8A}`I(OQ0wKjrcUjV1!sL+g#W&L=mXv3DHJ*(5ebU(4 z%8qwsYcSl)J}^&*xd8mN8R-#G5p7#5@*bU=c{CuS%0Fyol!HxTM_$?5I%V$kut=P& ztl8EYe#9ZFG$Ohr!p0)Dqp)J6K3EKLOLT|~wTNjia80m_jIoJtr-!Rncmyu1D_T|= z=u@|Eh|6w`w{Z;1^7Ts!SK8So*DS3lf7ml{dEJbMs)EDXb~lErGkl!Fv%G^+!W6dl z$<>P=pJJhJQkSTh9v*CmL$lgMzm!M_21nGw_uO~bgE5&|65|Il46Y9xt3y<(&`=dN z9~>G#l9ftXgUCqlajoO=7Wvn*o8YNCEOOEB*dS@#SY!sSmxM{wW)!0`@tyc5SH2-kTASPoga5>W6(Ng9P;dFCXY}!!j7T;!^p-j$OBwgL)>WhPa@I7d!h#TRR>Du(SAObcVO{WXaI{a#2(Z9z`a2G z>4e>QgSP~8^##UYjWOil{a9)D#e=+mPzhM?WlSgU=PY1S%*;)l{kUMvuA8$vgEk1h zH!bV5J-WG~=T}jawEleGxELpY+o^h!)`2$(IeWJ|g!@<-dnG9z;y(C` zS!n*#Y`rBO;*kccj*TgI(DzctIET2!n;T5^@N%21Oih|k4eWgFTon#1u0KcS$bB|u zPr()LGtE{`EpuGMbYUTXo|_Gx7_(S~Ztad0!x$?3nI8*1lgfjGOA|dj5=(=F%ac6k zm^%AgTl+g38|!LQ;XKVauC8>};4u9l0Wr{1D<5;2W;o=p0`e8D19SXyz5^wu~ll+gj{=>Z1aDA_Bb?x#9MyWtaIQ}ZFLJ~(QZv%9Ak``*h7Y=Tu|6!;!C4HHU1j4u=%r?Z1r)+xC@YHDaSD`&yq7J z4QzbxpX4!00M+M}(Uy?dmf`7{(VB?bYa5m)&d$M3hKA0;sGSXk+RTL&!NC;^Gjqld z{IbFvVT}B8e02x#xPVLb_yx*o{0ZPv55lv0czYciB=CJ6?EP!9r-?g#LHhx>1$8gp zs+@o;UgDZCGImWaTW3hu^y2O83DUJ!aIGG_z&$>8O$Q=g(;)Y_pXN%}yu=;CIX(I! z@#41Oh$AWDJbohlM_q1RpO<#dNl`K7SU8YPZU}VdLC2EQr-m+}?w0;8W~GI{=hpKV zmHNAePj~ThIKd(`2+#y^Po&o6Wd%9MB;_dDdMp(g!37Uh1}SP*l_U1B6@DdzMKJ0ibt2?J=Zd!R+77kG-M(*pGfs4(sF7ne%(b4s6nTAi<)$a zx5XdnbectThsBdLZCE@k9vh}9;u*N8$b;<_T4dkA4tTINn$Dj`fL6DXU{=gLM8TXR z8312ett0j680;>Eo{+23rNu_trZ4VJ%3ztXXNR&D&I<@0{mjOie(c^goh8UPwYjKr znW^|aNtU?kgRFn=meORc8-C1ud#R>oql#at3SzmkIc1}pY^`uK$R?Y^?-&sN@8Fw( zgmTCg>rmO7WeDKnjit=6cPjmA-S(!Ckf!Z*SC1aO8e0->Z5>_`3w0JhjP2fDTDH9_ zR(u(s5;Y(DWmYSKYuQ2ru_~;k-;o=!y|a!8PK}vv_#p7=m@guEg=|SR_9%gg%@`6= z<&mJ0Iq9hbMF9pDwiX87vFWkieuV>R&S^=Z2JTb66=603u^xuru^F-6ZoY1X2{THB zqW1kAp&t43id4CADrKmXUs_^PZe48QycwQTOsw>`O|~*OunvfI_0LF3nxRgNES*st zURS@0?IW0>{YLf>VjhwB%?kvHWNdqev^Vs3_X888^FPKzZioi!`p))eNYU^ye}wJA zkwU{jA0edkNtIbbNq2H;M~3_PXO9-;cqa#0A68a9lv_FCqg+!^wyH8vv!8Q}t4&a3 z#{`;2ObO0u)41A3hbv7E2W13X8M#Mrn*uUIUF7s}Q~ykp(p-n=06T0PPTO&)pk>%T zILX~OxxX+lBXfFA;=JRXeVI#Z!%Xen43|yybhp`L?C5R&i-RiJ-6h)3iVybB?~1n% ztIq(QFf79yZI%0A4!*7h_W-L0U?)lr2=^?%~JEGUrE(}aEe^j}AZr$jQ)9m#bS_G9Z$%`JSjEHL8 z0Ph!bl}!%voABF~EY{1Swy@|}qu<|aY52e~ziIRgpQ5=lZZgJeuJ|+!m#jy0^r$H9 z$%Gj}i`Kh`eMx68>DEZ?b^Rbzq_SyfiL%rz5$C> zW)1sl3e53?C77pGu*cgFNHWFB^MRNp7Gb|9e3*lRe2)~n=C|phmh`CCQ2t*9j3p0XY%e2lfrZti9TSY}P`GxsZ=$1v?VK1Dxirm5Va=LR z!ZuL|WDRu`KcSAA)fX7vQ2e?RV%qR2_}^pN_yk`Aj6aMc7XM;3h zd$Kj(?%53tMX#R3f7)L~UGb?Q1z%&%)A77NF3)imfCeNN z4Q2U4%Dpp4F`pHZ(dG)o-dJ21xk_CeAK0tQK8&@EEkrDuuZ!S&Oz~ZqpWL0}GqTXq z$8riDV=D7kTKFgXCso-W6~fnL6$Pjt?HJV@I5uI@4qnD{6=j?j`xmTZRil3gYw^di z_X1=ZtVyj|^u}{M+oJ4kOfYZEWE z?e7XhUwHhY**CJUF@E-jLgu)h{RvoAx_xis8|CiruKC@u`W+xG>BJX%t{ zy39v&oU@NCj+{B{nQRh~t&Zt@LZ#f(R=uS$aa2@MsMUDQmwP0s-1O)svw(EY zz3|Kdh@ca3;*eiQK;y4yn zU{fKzBmoy?e6u+Ka18T>@CP^Tv>%O)4}G*zZSVNMZQV&rH(K7l^(B{-BhCL|2M?1` zZFZ)lKq0+5kwl2ncD~;S^d@Zg2Upb3CoMVpEAC(bHg~OV)7lf7o5}j@&1$F}`kF zYm{75@|PP;q#T5x7S>5f&xZYbk{i%?e=Wv(BB(8+8?&Df{+yCfgjmUhb-6<`eCX)e z|B#+oNUgE;5tFX{6#35?00_wIAF)koNN0>Jvhrr)WdTqNMyj)o!OOTn0ktt-jqo4p zg>1|h6MuM+%t{LGQqtU!c?xp8PQe?qj5$*0aEx9=bS}(RIlZV_!4#FtkQB9K$Sct# zJg2_YBU$A#L2QOD3fVbpU+(kCUNuk^??O|ckAs;@k*4&WV-etHF{<>-X^$IIJIv8O z;d72yJo{FWL`!gULTe_+4L`%;c`%u~IOKT7V3XI4j2Qb(58W&`IiPmeGc z1KIl#H7On*DK!yxDo+awPZa_O?0Kt%Z)v0K!k^c$tM149ipJx792pdjbMEq-|6817 z&@nvA&o?{V(J?&R*DovFvDVPu%gWN*-q6tA+tSL*-cUB*J0r}&AuPk&CoRO@J|xY@ z%*(;p*xt+B!pqUv*byOO>|+$OX$O80&Js46y#NI-hQY2bi3a=%p;gvF9u_vv)?WIP zOcR2gqkXL`l!eh2L7@?jj_yVi2B+Ct1f=+T0S6_N86ca9+qjvx2eDQwhq&J#TL3tdjdSfyMg8s0K>A5^&~_Zo^FNF zYvBc^s65QgJyc+hmqnJ3ovoLbt)0(pmuMeLOP^>L*GO-3bMHu3=YRlbm!KdvpPF;R z74Z?NFTiMCAwJU6_!zbjA+SX?KMNm<|Aq|0zd`a2*|j~Zo8?6O|2X>&fVirx|GDqY zKnlGLy$vw*HZa35bQpT?y|)y48VRHj(i0NXAl1YalUM>#6Jjq>*S>b$b=6&US6AKr zT%)TA^Z5Vndow^1_4EIsgg0;AyZ793&OQD78M3!dCjM}G9p=SYbb{vb;@kRA{2}+L z(J~(Q5OYM~Qc*`f8l$HBl4w-vQAQiq+sXo^MEv0)v76lAYjInNkJ8IVOw}nPKcVN6=T!MbWpzkq4zEZ%9tehhD2>33lYvuKK>=E5_lgtmipWis0 zLx#6=Jcwsl-pUH?p2~wT!6(S4HwV6B&Tx-WSMg)WyhUN}#Mwf9Jy^XLCpcJ%erM=U zJ#3Xb4?9-PRg$x0-rOVam;F@tkG}nTJXPt~ptTWGpIU4e>gkK6W3=4l^W=$>#~to_uNsmvzb8ZB!&_5HD9Z2U3S>^Pkle(uD1 zc+Z&UwfWf-=S}KfxWb;-PaomqXvgsk`0n{sVG=o?z|jx$cZ}P{Y@a$ows9+2weD`R zoOxaM#G+uFRku>d2jwz?p##sp7M&_Eh=`w)Q_rGgud-=1t4_nC4g-aU;_o9L22~RfpQtS3o#!UC0!58eakPcii=xyX?Y(v&Hcmi zo@3z~_MI&38TseAnwoR}9O)@Mxo<-_ynwO)o2S2K-v%G;NqxI!G_^bdH}K6f9Gyzw z-(WT|u=niZ1(voZ#-?Ih=SUZIo^{~b@)CFkhE#1TEg1|n;}YzZrLh^*w<|TSRB11c zp87U8+QXD(w%M6z^V4&3wm;o#yZ+t7rJ33_x<_-iG)Gsb6Y^z7t#HqnD#>c;jBedom^h%Ah;84Q z8Iciehf^mwFe}PU){_xQgEtUYy-IQ|x_wVs)mTW-a~qbN>CyNGaEX$MqJ13+x`Upv z#o<9ENq#=b)yk=>p{jtK#qkks1>xY>v1c@puWP^uQN94a5D@EtlYjivL);%GxECL$ zo)=TboE!NTB^CH_L4JYrh%>mJNqRL`pAhEb0`{E=sSY%7keF0_!ycj}sQwztK`wr$U`O&Dy? zG>vQDo=xE=*f-y>_0ZwcRl)hJhm2>l1?>G*+pGpbSMS%?J4IxN1!pT=#*>zAOD)>f zs;(%`EQ+Y#T9mb^IeOehk?I?k9xSy9NDjS3J}#<~C4@S=M`(R2)))B(7Ol#uUF+_( zIwN~Uo?lSW%1p1g5J%@=jk`?aZ@-_1ZwWJu0zO-~rcemoh%0Lgb+d3*hG4dN zJ+rk(B%8r~6`CFCywJhdxi6$JPDWgVBc;`TGEGWWTD``>NmG^h58b~c8f@Jk{2t_f?P>Yz*q(+`!A}QheZz``E$Q z9CKy!1)&=Yscb$@X<2(yv@j@>MDFE}Agb&m=#&EdUQZCc5M<}_6)Imv# zuuEn)vz?UrPf%ree3i!8CB7-OzyIhl@0e_PV?=SZn`=;{wAI$lZlRf5m}hX&)&}LC zH7&iGrHAV@%e^J@%x&EwQoO?o)b3+P&L+2HhL}2;yM?4i`j+G-+Z8(o_y@b#xJYdl zm`W4c4|R{e80bG%U%0+J*v=AgE2giraNFYf;yazy==m&zE%}fAw@p6x;>33L7<*FJ zd&?3qyQb>clZQZGw}Ec$1O2z7oRDB;;HfIb4E{`>iP|vGRd!!+`NoohHNlr++qdU5 zA8ZPPBX~({WKNjWr6wb`G|G`&?|o`}jw*ti&;FHcxHgjJ@xj)2Y zMmKNH!I)aO?QA9b#u>;{c0*S<@c0N39#ydlK5`$yg_``3x3Mvj%&~e!`A{h^%3UQj;9ug9pFz~O2&kv&%>a%;0Z6kXV{Ov%q>>6k2N%m z!m!akT2DUJX(*kAX2{7Yssi*@<;0#$e`}Mpd2*zLYJTi`p50xbd%s{$M?yje6hPVA z+GAtex9RC=1z;!!43tiI7?8>!NAZ3F#oXJbwoc}Dz9xSDc>$qWk2>AeLE%n_K|t!QsK+H=7Np*b9hK8OLgvoc6CkkHlk{%TL^0>f$oCgstg zEr%B6udN7y9kx5aC(S))&EedwgdMEqxO2&bTDCXSqceDN4rrQo_3~tsfuH z@6v)w$5h5R*jbphAA4cRIbvM4NnYLD950w+Qx-xEp*9eS z5`99SOpyK8a26VrE&7QUprATAgLG`AB6lm2#8$qEA>Q#Jj+Y!m;=Mx>eXYbvimP^h zZdRUo8){p&%4FM`Yd7S1Cd1Wokek|8c65c-yI`n>1aR-x3>A2TRVv>`#DgJS8xIus zy>+5)MPJ{Fx)X2pohNK9zgE;n^ScFDtfZQeVNlUVPog*DNv8%cmjz|vvt`cE;N`IZKwzitJ_h@oe(daM+!9^Raz@j(9>!g zl&*j->Aw&RUXVOa^Fa`7nptI~F$?;}QgThTLAqh>jN)NDHXfeu4Jc4xtx@VX~W+>Q0!XC6RG55=$x?~1* zH@=Zje^W;)RT1F7FhR2mrBqSk3QLv;JO=g4iwqwIu16ByEp>HE>nm>FD)ZdhT)ZsR z%~e_>{?oUN%vsmzEMv^v6<)#$2gmz(g}Xrr$i3V#cda@u=N{7iST|W&Iay~|;F~w~ z%L|}D|9=qEm@w+w>0vP0&~=nk-dC6!OcF#=_G_+OGZ4J!bgxFai7-M|)8E?eSd&fkpi}SPxhdjTd690*5mj zg$etDwH@35z}8c?M$Qs^htX4JN~|SbEk_rtREv+ca9-RZmIT%xS{ft+J$69mdkOK1 zt57>RsVm|T0{cobVl?YdtxT3!>8`)X{pG2eW6Ar!zL&Y63(`FuRsf3L#)oYJ7U&R+ zZ2^lNuT4dK>@DD6#=+~)06}UQ_2gVQbT1;p^}E@=Sv9j#cRaT1aCObG-UQ~Tt{Kok z@e`0yAEBsC#}Q1|It#MlH2UOilZLfMSF=nbwVjE$JoVaA>Z^FwCAwUbu_=C%dl>mc zthi!J>oA&dD{beQ0eY&m8 zD*m^0>IUC#F=*;5z!OSQ4SSH%%Gq2pvtlZol?*;TU}mULYMoH2c5;cUO$slG^SYAM zJ6h6ovL|kF&7$t){uMtUVyC?l%1zTSzIku?X~qaqg_ zZf!Xm>VMyQnn@hkHO2WjJgddCJU@@gXN_i&Ol2+BPI603!~qq%+e6^I8g4JPpzqJ3PRc%tI%uaF zdBYsh4)!e#Au!|p9}NB(G#-FSBI0+r8k?Y`y7Yxk4mM)3*v?*RPeUAGEMmjtS92@D^0A;j46JT7dbV>Zx?&!iU0#R zu}=gTfSQz4@xP>&?6^#}PTqiv4UgMAe&abk+(xyyHm7hH-VspH@ZLJBV>kXg=hZK{ z`J|429k?5SanSr3Jbj?ix4%pu0>}?@$b&ccEd4w~9>#SK&X5Ot-ML%H1J?asjH?EH zn881b>g4A10lnvK6nJhoSJ>$*SEk5pPi*Z>KXeP}cSzK1=8G zZt3Nh+rN#>Va<`B2{?I;w{+?Lw!kx?B`dEt!;^4+y7gayv{p-;WnEsC5@nnGg9B3T5QQX2L1KvD_2hcj$8}gx{a9N z=EUDfxd3>;p|XF(+M1&p5%uhZ>z&@G-@}rMT~PZ{9u%tTo6ixKWvgR*?r9+-y5;T( z^@(r27hf0e&Zu-RF}@W_Y& zvY#v|A8Crr%?i?nNW-d!i>_aC2XrKXZ?k z=H`^_A3KIU37;C~ee^YBBVpd>IxaC<_T*F@ZsUg$skvvxEIwFJYJ~~Iv5d{apVHQ# z^7MQjatZf!Ha2Cd*G}jTT_R+k#9kKUMD|RJM&*Ue&-RmpQ#D)wi38%l%b3<3+tB96 z{DcLeHgSmzZO@#~EDb*cYl8pycr>=DZM^MoA0x)(^LO8B8E<;`UG6iY`h>j4`O{yN zN-^RR$kX&!_p|Ob+Gf@Cw}?vGgf=KudU5lRT$`tL{C22NOzae z1X)$yQ9HkAnY$*~*)b%}D|2O0kYAo)m!j)Ch%w)CHZ!k{k8`Ug;EaP1J=>|TA%p%C zV>y6lp%A>&x9LLj#6&rfzs-%3jdOjQbh?-597N*1b$D;)OgCc#P*w!2iprW@H^F_r zz{oRwWmTBiGf3@eF0tghJ;}X%7@1Pe5JkuR{p1bW4qz1@5c>DlGZOT?QZS>$^P_R@ z-~HTIez$MN@4}PccN0EXZ80S`Bx3{@Yf1On^chpQo##5q1=b#++Ua*?CGg$_B2!NI&n zHHwLvB6WT6B{FPk9@cWGoy2h0HuqbYF`&c3dPo)s{m$|QAjzpDY@CEo+}v*Hmpvtf zq2irw+*6Xxc;}aR361dH7OSH-vBd?D0d_4?6D8sm{4kVPM{ONSXP~vBG-meng{(1y zt%2n7NAS@N3@lq$%q`o+p(Y}F?nA5(VkC^F$q|E7JoE?~$m>Qnxg?Zl42gMpF%dXGu2f66b*$TcND#6X| z#Q~r60_&|k{9@a;wkz0NDxfc=o-%Vu){MGxM$AxwuLx$z%U&Qx=QK@2sr3h1BcK|s z&)rxTdCpm(^-~onUBuk;L@jZR%wsRRVXtNkH*3oFU+du2qR41jL{+Go`hlde_+^ze z-|~L&4teO`iPsK5KD(7);duz*@SJt4BH9v4Keqnqdm#Y^Ai(f#jSz&T`M12 z6+07nAGhY}YAEuebr;qSOu_;Mewbx0{x)#EVC8# zO-Pw>n@1gQWueZW)U{4wt6*He(x;jrd#PKUsgV@UoFNfH-ihJiiLb<0|0U#}nAZLE z!X@Jc`>AVPTMg?j9UTW#P7ovd4cmu#25-%Kh5uTP6sm}EMUleaN|KUN8EHp| zntPGh{(7pE(6TkzV>t-p6YvmvOvx_HuU`K$X9L6XV1{5a{v3h&corwws*j4+Q~SHiuXAr>Cu{j$rji%@LyPxrn1i_bRvBQ3gr!FeqnzoOIY|z2P2uH2*9as35j*Ra4hi}Z z@`zAFk`C7C-s@?MX$%PmbPqAEl$*QT|-RIcT7x^f&|^ z-7?PoeVqHNKn!obz#S#c7%yG_y}&c*VR(y-;3hbuiqunb&=7hh@TrlOk|AaNa8Bij zf6)G#%yrcfSF5!CsS1~;oI(TDnY|)$ilGAup+`AZQ{r%2N~IFi{Zi z8tG$)d6w7htO-s@O-%`|*;&VYsFU|}Iz<&n&Aq~UqXM*uU2bGIyWX?3ANYmA&OHH` zeD3={7Yq9hN5Jvp6T}pE=9~iKs-`XZdD~l~#nGcg%RQ#sz-hhXa{cA`i5MBid3O3+ z$$ju;2Fp!m#2$l&lcwpJRdLRspFrShj{ZX4Me-~cHP&{lqgSr5iLSTjUvwWU zGbCU%Bxx+um0`gF*B;1-9{~5mC|m-C1ysDDQb2dQ=~a4=03an6H89wL{yO!_M*Dj15&XahLKj-tVZIN5J)LxG%T z%!b_Y!up3v_bBOmm|OR4yM;ONJbXi01w-b){% z$DFolA5azoR#Nxc2NcXk9^{t8ILB7=06)X@<51CqEr71uA^^^yLZe911-N~Ai#>u( zcv6N&!F2}k85`xiorT_^L5&y~6rUfkVccbtrlU)t{?U}jR9j8X@6eQMT(78?9&L2y zF26|>f9E13r%ZLLLl&Lu=XR5xqK-sInQoL>ZRMEQQAF?bpIa2dY}RcfA7cJ?V=bx8 zP6p0c1YZajBBQ$VIUw+Nu)kOjK)|NZx&spq;n@n`dE;!jA}8EoA{64~zu8c(eHZt4 zrb-gA_@3U=r;EFioGcMQ`IN*dsjK+(>1C%EDOmCeVlCkGDCp3s&N+};dOZ+cqvBT! zD6NqG#%urtW{FJ3-H%|1SGg;18vV+IkY_Ouq^EvQgl-8m4g<`v>2J<LEnda<381 zd%~{?Tqb5x zpNpfXrpop$jd4-tgmx^~EV`@IH$my_8*G*4SCHUG5KEfm9#I(OvT5DwzYC7btV)(x zsSGPk@EKDgcbcL$Khe(bfsL)lm#X8#ePe>$77SR& zQ7*~7UpefiYm)3uTwT`%JWN%q(exb z8GS9rPims6QMA?&sRI0VIdmlTY$E`|YM z9cFzyZS~m$_@mF@06@n<{c2!mqI~xp&l+)}K`Um^h)sRQv>FnSGOfD9zmbGAI>wNN z^qqj2G^Buq=Bg8NTDj13_|6Dn5^fE~&l<28gU!DqrxiK%wGrpS_#~8tg%v0GvgB{9 zJh9{#a$BJ$N^!~h5`R|VU$~~AU`-*l#}KM>LO$Z>pnrnTl8RblrN(sN#?;Z2k+`_N zWE&ct84^Sm+PXT}F5n)$n=5>gtXQ*}^~>!}^&t0|c|`f$><7lfFAkGC2we=N*g{(~ zAt*vN%W-pymDZtAaUS-;Qfslr0>{t=KW*Zkewf7M<}z+c)zOZ|mSB`agQgw^y5dI+ zKiocXqERGf%2=<*1byad^c|~qryi5JI)NXu_4akUBlJZ45E=S8j_e?nzt1OEjCI?F zb)$71C|sc!u>mfWDLYnf$$-4oJh0B+rF_M z#NL@}kz}E2ZD!5>prC!#l=qCNUYDt@5*W~{E{ZgNZDpml#4mk$eV)uaWaZ+Tu!`Cx z$y|=J>wX7$h@IqORL_N8-SfTYd!h;o3k#5TxtG!OUg(KBzW0Fc`Ga>+&XnBG6;m$t zu7ix`z+Up~I(eu(GRn%UYY8s6J-%r^^{p;3k%6Xkf3Tu{@USmQzWe_f_l!0Fca57p zOj+Hag07^34ZgnX^9`S(($XmRYd_%-pz&0trKt}1Wh}4Hm3f7(TwEJgUb{G%D{yu> zK*udkQM4Ut<34Ub+^W!~rfLV?LL1r)(W9Q*uA=C{Ue$<-)Q~wefoVjN_8*F7tfwc3we+^+Cxm>xoU9BB>pndU$l?jtXmfDt*yf{-X z&s>tSgc~NE7K`qAd(Dk4pWj=XvhI=Y>@_998EeniPc>dxn?d&=bTvpQOm#KC(3k!g zG4xe5kpufuY$#A#`^oX>tmx&d>{AYz2C?GaOl8OKPLW%JbC|`3*1v= z<4llzc$P zr?Zksrw=055PC++iojQgClS2E5SS8Obn@bw^03+^t3teGx%JC3{3Qo{LwuKXd0D9< zv5(i%Ha?ZuaSt1n@wNwOP^8AXPfv%YNj_S$a~VSZ31^S*ztw*)SIHH&TwPiyIV-VC zT()zKXx@!o+%?8mauF~Hb*ef<8%2ji7xC&H&Wm^6F`TNid86)p=Kpr*&X#qnU6i?D zVYw=o?uAkxCns;|0`f6#g@)y+TzVGR`#3q`R)&iTcj!a%3`t1g{ygN8hNNn_cfsFr zkEM}-8J$JXujnkWqyIm277}~iTLzs4O3^&?%+x(|G!}fF3Nc)laJmULaAWxBf#sPo zh0n=QFOF;Do@wJsemzfpd@I@C#B+*XhN_Vky!pYeyffk`Zb z*7W#&yZK--E+qHBds~NI*^#kN-M+8#<#%-rSP0PGZQSQU{zL#HStcWjw6)^__9ZUvLrO%8v~AzJTKW&}{!kLlJjL%IZ= z1;D`jaCa8NWbzB|Gfy^8aHklvTa23QJ!5>v2HvVk-#-Sqy#W1#)q@QXY!1KfR6kRU z@Un+E315eUjbnPpZhR@!;^6zmUJ;L>-#g#akj>g@1YHPyodFWw-C0G9g%wO}umS&@uy5Hp2dqJO!AjPp7_ZS`d$VOAFhFHqG{q zG@MzHY=Qk#rwLMJ1zQt&T2su3U>jvN|H=lMYrpTF{v5tZ&%-7R9Rr`4h7Zpb*dKi& zQmRT;s`P&L6d154RQaHwzW9{mHweGtw`%Xr&}_P<1BXjp$@;JBe{!K{fcP4G%eA9!y&+RTS zn%6*VE_}A^rG3SPdtd3lew_QM&diL7*!Pdj^iQ|_Tr$!eMI*N;KiPp;wJF4kE2y5~ zH^woWBZ(h|k+Iz!qhP0Ux5R{Y#n&9}hzZE+Om+!&v+#(mh?2|li@j5uyrUwL zO1O5l+DmR??`1EQNli>#oZUSu@BUygy7hte>BmEgm!-s1-@Po!B=5uZ?X|~x;o4P(@5vKFD1ACwP znz8&YrnrKQb*IM}b9LuV(s`%X8Hr<_Admd2=NThf1KLso*l1j=$eXtROO|Iwf#yAL zvp#>pD5t*oMH4jUs|@Xa54h1PrFnujd~Wnq8Gy|xkG$1IPIuPeAZKuZb#c&vY%!vO z>3@o^L$47?tCI+M`4PB46Y&`Qo~YtqZ&jhu3|J+@wr9K6UE8cpX-)Cm6O)oYaIUWR zzFxJ?+oxzlb$C&-(l)?Ek+&3uU%edT7v&|jrFz*_pZ)u`=7n*M8*omQM~3;xY&0yu}b_ryV1 z2kN1P)ur^FM$%DD!ps>;@+T)7$(i@K)V7mdsBL(tnMo>(uw{;%eIF;$Zl*`K#iVTC zOKaD?GLk)p(ne)3zs=LveH@2eOwl5D>}#}n>-oud#YATfmWSyNP)Y!8h%X4>Hk#Te z@olErEV*N}-mAExBtvPk*Fv3D5soY=?uJ}HXcoSiSz?-d7W+uB!QGk~g&raB+*VB< z*yI@KXktvwwxJR5lLg?N%-&m)@G$S{)}bXzyR+CH!2Mfo;$#`;GpxWA>}V?qjl>ay za}_QxH#_E}R$=7S69)SeaR}l<_~v=?_H|mNjS^wOha+}&FVZ8znp%PQy~?<6d24rO z{*Ff%t$T7^0-NYxwYw#?^Twa5dd+;^{8E@j@m-U_5J1^=mP{cF@|pF;XhOA~;W2ZEVLG7X!hQ8Bnp^ zgu766S5sts&(Z3P-94$3ZYXW2u8eixvVIVf;7^kALC)1Usrz_y>)jo2Rz5l7tbA-_ zlstKy-v^7h)94x2vP0x+0$KV`6XQBLbnm;pDOeoj(&5oYRctcm*)|p>_x;(;l?#PQ4Fi z+NHD}agZvd4~=F*zC@XPwkO7@DYcSO-%Je6Q@fF z897tw5}6%*rYE%_#tCVj;<>j;(5vq@H>k2hY|LH!9fQ-u95E7y2|F*s#4p;Kg^2tB zmh?q8Xnl^uGc`e7o#b`=&6oSmhT0@mEQ!^6#|AkNb=#iu=2x0AfbFkuPhq_B264bq zSmUNY6Vp8Zu(f)lETdta4b#hG8eBaE@B;`gscne5gSrrAgg8Ndz?wT;u=8e^n5GSB z%T^c_7fdjtii{vzlu1;4B>8Lk)|#-w+@Lsb%XfW4nIqeBPvz#GDCoJjQ^j^~%*x0= zDD{u=mM4Zd9Skg7m0i%|Wfl^b<)1_0qp^PPvl}p%fiyk}Mb>8^!6mIv%macG3VDaA zPL0ksjU)w~qMG6pTT&ZhogLMc3158i^4pDdk?BF!4(^w2Z08e{L`6|bKSP~lrhm*6 zCZ?GBWbd)JUhO#>#!ueX_)c#J+XQXA&9DYVwsbGfsiw?`2Dlg5Ud){zUz=E){bD1rYD17kE0=MEM1$;=hW1wjo~0scNF)}~<*AtrSN)!fQCP|-Ebo&JjVtA|e;J6))6L)z_8hyB+Zs@Js58(Lp`(t>mzJ_HH)Tn*8(|_Q3HN&fi3hJJ&4X&+k z2wnf=U>t+a8<}+OwZmT>%{xPA>QM43U^#+0p|u2|QK;^CXo{2J;%%IX+JIj`Nd{LMOq=;rv27iv@HNHVBiT&m;){a(!ns1VjfPuVHPGqs(M45gbbWI6b0j_IX)7> zQ{qJN#)uJ5t*3Q7d&%ocX8_`OcVRxt$c7g6B)1^4E3)lCec?*EpHHg> z3Tj8E=;|S29~duJuU1E|)D-sT%gYa3Tk5~`+WvBx+a4!3ZPyO1f7*^NY7`cQgC5g! zjmo-$>|;QJ*^>nGPafe0**|c7R&@0dQqM3>juTQZmOn4jgzbO)_*DALmcM=FX^6t%(!$RfP zbFNFp?{I!@;S-5GInV#!@?bC>BYS;wdNLB)GkvcX44*4q^3aBiRXr`e$!i{1QgwPw z`lNq)gDP{W*26WiHT@_vx^_!+Lz=IDMx(0xL|d48>D{gC@AD5m+tPYuQDoGjgEf(r zN#1_i>Ih{;q8Ioo@G>Wv9qd0*69gV|pNO(wOQ84eW_CzK!o8!S)>i(W9k-N4E(YL8 z;xso+vmqsNbS|64VWh>#n)-25y*5qI07ZYZt#7nXv#hsL+gY2 zkX93Vzm<661qS`T&BTd*M8DEodZr1T^amH20fLwU9G@l%PDp!mwO4xDzS8^7&0f+y z2cB>@_BS0jr7_s!l#sEzxyuvW<0NH*WKxw3cvG^1+YS)$PAyl@*K3E5z8}%QqkoU; z2H0cVl}q$p`g@6Fa98kKPfm=o3;0G3P5mgevz?JLp6n;o7GtnI0F5D?QG&DGB_bgXq#ZZp2s&?`?o zMgKBW=I$Zx?jdgGhQDOM!Y#xd{|k45-OZ;K7`}r`zq@;|oB8E>rlf(i#C8^h#zrXO zLJK-$bK^SjL7|8ZE$E12H^g-mhK3e)#O1`|Hg3gEy(&u#cXbU97K%)V2JfE=C1kP*`-1gmKWuEkGZql-d|~cQgYwQ_%vD8 zvI0&_K2kzfj||d1$GQt})&WOo?HvWi;{if)OYt3AfX9&KZ`LLUlQGQ3%p=^_%q>-T zn61O&^@Ea`LOkvf$$TLm2~q}sCMFK#y_DH%JlesngIC&aE5~zXa4Wz8Px6g~>c*%n zhtrZrL!P~+%8gl0*Bhlt?@YTwJyS{6I7wTyzsBFcX8)qmQEhRcnOR`5c9f0!h1y|E zr0x~TI2FU{Pp?cK3olp{6}7l1-1pZiiqU#W->^F{XE?isY~eH673qXU;+N`$^vAam zADZvM`~x+4pd*P5tM<1EZBsU#UX{Y^#g903#i<5mbA*k5O<4aPBU-nIs2G>Fv6e7P z%M)f6sXO1^Ik0VT>+9RKmS*=@SU>&Z;5Jy|2H{Wf2+zYLLMK-RNc6-7*a@MRPS>2& zE#PgbfN&=zGQ>d7;+Iy~Xlm-@=S2Vh&49%+ zU^m6$q1zFZE2eu{?239Hz7+d%C_egWYa^V(yrmSaawwwN%R}sSX%vfRFqmTR9r*cQ z9t9auH~1z7X9};65%h&dC@!Wl^yWqK<%l?CJ$muGsRo<~Gk zf|q~6${b6-ES0}=ZsDs%SzThOFxsU1fmx_~j~0(W z55B&%h(u?$-(f^9c$1X#837-h<@m2osyLt|~mdYF$oa&brF5u*!8g z!C6XIS0Hs`kZ=)%n%$i@kzMfSZgCIJ)J5zluQM{?J;#t{lLCM`bTsH5mo$e)Zf{_3 zLCdmbEd^Zds=|JfEb-u0&^&>R1J^@#>;8c_sVMRXWCuihW8kf5ZX!481t(O~qbdGr zDI%CBJcLZ;DtJaBbvH87iS0@rZA#y=tUkrtFQaMs`Xq#S=jueNow>DFE4V#byVR(F zyR9}d);F_taCc75?!nef-@-jFEDzx(6&g)E>z}CRz9y~_v7m>gIQKr29N}wR{Ds-f z*TZ-UP#KdypyCC7@J!wG50W;?!}#twkt4I8uX)iZJj2o`D*8-4o@tVt#&^$)B+PF9 z88F1O9oAm|Oa-3t;-7g@WG6f$`j7Aof6CIiptg_0h<*3rH5x$pU{=V6LW6L4MWJxs z^C&6B5y~_26ccH37xI0|#?blEMQy71o){B{h`8*~{_$l|G*Mi`XuC3^`L3?ma+Q*GKvvw9j(H{>;SqD)D9Dg z?a=N#ArAqZ#DOwXr1fDgVECOA#Dm0$m%*H|>@eQ02mi7kd(2OiOsg#!D4Sd`kIWD_ zz4qO}mxxu7!4jTP(T8t~jcr{eJl!+eAG36K=( zt{z<)b7R0Qwn8106%*`fE0NfGhQwqCsmo*B#P7Jrl&gZXVnYn~vx1Os+?_G+cyY8M zu4zq7%$laSiqRK49C4#Eu4#2l%<87NN_wNV2PbCI*IE;|g{S9t@hV#UhCUG8e47Il~@imEx zJG#|9)=g@PGN2ht&YxU>%24x4Y9tO9C;2So9gR2sf%RuZZN#4KXTJwem<-MVOrR19 z7*}l6nev*b0bvZZrA)=_ceaA2TmN0VZ@0=bJRrcyLGBmqu4?lozHKVE5MN&hr+|QP z4^@vZLa~J{Uq!fEtB18%E728=SLWYJ(KKJk@?jqU!=TH9(9fw@! z$Gp!F-L!6+A((!&`;h2fa#;KWWH}4y(=SnOT_h8G@oUq`^fMC3#?(huWK9nU{QhTn zm{<=FGyUWlE}lF?aj1N{j>L=peY;#1Z{ZQ<+2rna?u2hyX)X#muhbUu?SewH#n?{{ z)W!&kZ>TtJ*hwyY$!TgndSutG(2Di>@xAe`vUYWI!NrT@+e?>Fd%CuIq#<19c+|>$ z@zPopp9Yk6qAIS}_+OF-A=`MtvoQt!2l=8>Q8nglv8Yqji%h?(MQcTyMcYLqh-E*B znlzAm4Ol#bzP8qI&k*#11PV(Te^kS%RmkT|L;EQ8^r3b(iUT+_ZQ;E`i->!%J9c}?;SQFcvL zuZ>WIg-QNM>~vMcR#y!((Sq6Q$7@zZ$J9)H*Ter9dv@_ZLsFixu@r4?s+3O0t!}S zCUh2sl2?eOi>J-X_kNV$W@mGcpwhE2m{BSTMAR86us zb?2d#)DA?3hpM8&LL-T`bZwEJU(wpq?Ir6_-lBM2iFtE%b@RO~H8m}uy)ST|Fr927 zmDl+Y+FLED(GT42O7g%RP9#7%*op_lZ!+H)4M9F!fIUx>)>|tim@np=$!*&&-`K%D zKJ?&Y;x~^UC&uN3;olLh5P!~oX>>sU4r;gJEt+hc^zOVdxpmuB=JMkgH%k7=-N0KD zoQ}usD)Cw7Zliv{ORb&yd6_i?8beTG?)F1s;^ZY+e!KXL_EBCIS=%qaBpKHT&Td zpS)EC`D;B*lo{nAMFYkDj1{-3u_Q1<;k=6}DX1#M`0A(shdm)a#z%bJ&P(X?sLgO_ zD)z*@sFuBr^+&s6V!KZ^)s8ep&6_ZCQRJx;>*L*>H8n}Gg^@1Cq`!1eyC!GkmBE(5 zS9a%W7VRxpSI2uQTldwpR@}8n?H*gHq316h^Dd0pl&+UBV)O+HM+eJmS$t$0N!a3x z11TwMAL?GdJb!t%_x^+8UAcQ+T^qj^O|#dhPN~}W)g(Us8pcA~3qpH>Zj1L@q53K2 zbL9TNp(|xhb0%bhG2^z4igz92F7fM2-?7I#P{s-RF#e7AxSDb10Ov$bk?%QE`t+E7 zu1;dEz&?8auX6>F*MmJ_5mh-<(R5~2a&*_p_S#(yQ47b7T_bap$&K-@^7PjDFm15Q zg1?ZR2koQ7J+pSdK3qKf#_lXtiMFL)uH|+8!I9*L+utfp!qrQKxxTG z2*Um=)HFJ`e0;o-#JmTw>GZo~dLw+=cj-RgK#u5c>L{w{-?aq{63i!EE$XlFH(lrW zDAq^+z4&2V!iR4@Ljz~5flAi+OWH^ziTM1YCHKMx?s=<=0IrAK4P3g5d^fe09pr4d zF4}~?kEd~s_4SyMG}))eIT>c_FXQaesr`6+AKQWb*a%#>hV`}OEik`KS7!tkWh8qo zuIKK?I^>E==)Jp+rr3IL>wu;XgjQRp8Q9Et4ZnF;Zth)g4kr)4xi2?&-YZXl9*PqFJLV8LcUyDp;>M;n<|!e!k-g!$MaNO*%K@N z77|u>Vp&2$ABJ?24rx$Ro8sl2f+1~Tyv}}~dZO$3g}*f_VN94+z25;9sr80zYg>@R z8LKSAygoq|Pd?jR{p}N6%_PD%9i^c;%Bz&Q6YrY5zwd5;&Se2p?xxHP2+mcx@#~q1 zH7dopKtQMx7EHLoCu&BwLlqrh<9V`4HOu-<&783cDM~0Du2CRIXi?>^hVXIw@SMo7 zv=BS$b5OXpBp|Y3M@jbH-qZ54MDdw;XI{O{T6V z*2cQ_Z(vQ(rwn~QhqfR~()cxc=qSj?wzk|8+|X%m=t<&LQp7H~*@s8?zGERznd1Z8 zUHRv&=}W8(`K(z5*(#R2bo6;veEi}MXI^{f^!E=CAAd)7<Cif^QeCx}*C_pJ+tw_jZd$Qja~cnM(4AqPM!VY-gD>f1x$CLvqJG6s{00gm7tC)Q+SE{ zj+}E~FE-tMhKC!H2b&34fS7(DT(gWMwya(+iPbj-myoG*A#EYCUS_DR>m8XLDxC z;SikcU((!FznD4V6qf8;RBsRWSuJoR06B-e(v#ITR#9oiK?Uo|g8T~C6v>l992=`z zp}3%H6NUMx#5yjZl%1EiKq2JVG#-}5%o{s)OmHrU%AVw8B+!f;8%5?EqdwL~XFVm#A|G%7O#SH& zSGY@XW>2=E`4fZ3gw*m}dlev^f$z!_bn4iR6H$UQu53Ni0 zKj4*)f!hq?Y3Z%`$8M=u&+=jqvd&YP^VSb`Md^k0s`?FCSwr=zy2A8=FeEQYUtJk~ z$T1|@ueheR1Um!i#k|rA3e(ez*vhiaK0f;z3kHe<0*VI;n)b?lHkanEDhvoHT%|i6 zm>%K0w7jahnQ50NhC0?47Bqm%pl8_)en0c`&1aesG%yCrPnkwB+*YhH%_@VCMo$4^ z+_0(GPa<2AQM5AGJGf%Fw029GzfDN~s?$qNpK^@~^)Yc(B+2}fg6wSr6Za}A*JK2$ z6PAqR7Vqy$%-nE)leYBK?vV`QDJx56bYts}$RS6ihBtX1c?Qd2Pw>gI!L@U+f1s0- zT=HN@uG$Srk3ysYw3JnVlq~Q{40DmXNEJS|UWp1<{tD|3qDP)&ZS{0$ZartAnls%S z>6pwi$c?T%9fHCO7*BzlOND;B*7vVh`ljt`A(y73{ZPnCf&${!*5QB!t%m-b)2lFk zcdc*o%I~Q4&4>~(#sHonq~_~XQO0SOtnk#-xWk`}a-Uh4#dvkBbc?G^2&+g9VD?I)f+4pr z)Sxb{z12L(XnTh*%(LCruWZZ+bd4@iMugb;M7YJ}%rh~^vB!v@Q)kLqSCI?6)_7WC z^b4c}b{l9R_5RdYH1dxHUCS3bW`!y9A{}Lk)zPsH$zGwgBeko1qfO&N?R}liRjljA z#hq>_AK#!-H)Z$*7A#9wwV&>Z;W`7{yh@7gydzxWvIUxv3_uEny`!fYOd9owgA&?bnYhbdlzHX2fsSWZsX$HTu^dw{Un$bjtD&tX_CQ@0I;uD7w@3Ocu zMMP4s4Rl~{Q?91{R5d~O}V2}Lz22g?d*(yk{X;G%QZ@5gm8%}smbC>$zuJ`1LQW>Nv86P-^LG`V+>3L~CUpg0iS{4n8zPQ0;n@dAfr zKV^Z^*)yR!T2q@SyZrRRtulp~Cdl3!20lmms@g_JH@UV!qi)L%LSdI|#hafZZb|N( zP?T@)r*dBFQG))uPgopy;6X z^gLlt)FLa7IigfqyiMgs^N9)W5F>o&!Znk_q9iJ{qim;u(Y$w*UPU4QA}l4)#yu)C zAgS2V#XQ186=dxyw@q?NOwEufawD8v%vaB|R>+;gg8giuXZj4a8B37S))IUj)q2j9 z14Z5064Yi4lp1O?j(s<$@auPUy_Y~w)MNAp=$<`=l-Dgu;m}D}cc#c3^Ubl-XO4V% zag;=aC4@@4x&e+25r6*Zqr_-nqr}0(+qJqp!z0AaijBdDy|_$vD{L(q=x|$Ut2320 zP!fUe7i2Y=Aq(^nLLiU+kDkMndJs?jvooB?osJ>w){XX#k@cGklVdFGEu7`j-RCBe z@V=wrKud(wH_}DwXyxKt>=x5s{5M~g0h>VLi3XpR(3IRd4fW25jI+3 zmpfdiw7K~oBWYEPhbG9;OO@>I8R2EkoRMcn%Vg1+ay$PlwTFi~3!E18^(B~awd4xs z+WHaw+(WPT4nBio@^kO4P|X~AKrMrx1V0DDA`o`u!a!pMg<3J z*lePa?m=a&x6D8WA#5;jc!W3lwfGXXmwEB?6Wk{cE_85qw>Gx3w=)i#=ei&wGdk3M z=|_)}#H|Zmyn~z;dMza8N^yp&pho^B`9c@Md3vaPr3_(?8_$!av?P-t-G{6l8I&a{ z+{9$R1Uf$KLF%{oJoXD;mqoDuQWqi0+M|}Zg0+S-ui$L}a~z<;%&<)0q2-1WWPPJS z4)<0!oYnnE-O3{}BV;D?J(bxC>S+E!&j6o%lV;~!)%lk0Z@SOPb((xLv13=ZSLUv+ zWPJ%Tz|jgg4oYY&1f)AcbM8S57Bp%gEj&ajWjL*L9%-!y2sfz^&FAg1MY^Q@^SuIs ztWx@lLk&e^!W(u~&NGr^?2n5#)QzE4KP_DC5^FThlJWhPA(4^x+N~pF#df_yU9Mic z>eK6rObAnQZ$aNwPL5DOCdV#zNx4>PB#CYs0w)4^&%*wxl3WzI^V-K*H31Lw95-#5 zw?X&mL24(-wO8J5Z%}3g*+@N}gbOt9oz4CA=PiA_3;d7FGTlze#kXGVI}>V?45#+Z zu|3}QHi_`d9@5lny^jqKMAs!l6hpiX`lo)rRCh(S6nq#DJpuo*{mPYF!$ZesqeD?! zRfKxnMxwdz@uDv|yZF+j#oxTa{gKrDk^I0dG!jjXASZ~m?jej<=#SdUsD5&8cQse8 zEFfQhuKScp_>?)PD~GkLpV^{|)IlXg-=qEYBgTQgC%`GF*kTDX)GEG!=hTG{sGicu zergp8Wtr=)(DxY8p!gGJ$Y}eo>BHqXf0!Y!p z?WW2JmeNwH?*7t0yM$9y;Vmx%kzc+4R0mAU7m^6>gei3*>)4B09RLkN0U=T z6OpPk8eC)R;crLKRW|J^n|5VItF~GWi0xfG91C-kT>P9Y*f@R;KzrB&m^;d-nMurv zOr>-rNQMRZ=0NePVx_0;e6vet)@f~9igX=pg2cY(l_ws4_-fOUBPeP|?5Ed^QTT~y z06s!NdOsySsnVk=lt#BIyixWXyrVcMzV}39=cC(lQrAr^?mX33eD*pS+hPX zy(L+WwCe5SLm6$4llk|=+(YI+(Vo8HVOp~!q;UW1195||?=K82M#&P4U+7<`=g8}@ zf4hI`A1YpKsqH-6vh3x9rFpxa>FqhUJjHZ!fn3{`nYFe`p>E!ii>h-03%UQ2r=E1l zObBdwl33jDbU(3pvc)hDg$Li+=(6R#gL$^@-WDYF2we*S|7lKtQ<}q`*Z>S) z#x3ZXvT%%@?xm}HEy~kX40KQhAbWtJZiA>DEoae+Zo!oTV#{gNs$4q62`?2 zSus7%KI+Eg^k;`VWk`fP&7F_nJh8jb1{i8M@1hQ6H>`!Cqe!wV&hit^cX||#i0C>0 z=}DtDjtK33ci&zG13TQaJ_LgrGo9JKz4F(LTm0@Fy~6EF+jWw|;*UQj&xYyc+#!BO z9`sJw8lP!pQxl=ao5aA48@E<$;;9%QVRzPAu~N=no@O>b@6ErL=l^9ni^MGRPC2uy za;zx|Q$a51^hz1wr*ar*(Qq7=bGm)=u|0?0k#3Kk{@C;pkN1m=x@U0riOGS@yN`$p zOX%3pn-z%qPdW=4wqY!J;f~y#SMMGa8N1XT8a?sW0ZB85hhYRD0C^9B+!IwOQlJ;u!^o_Ye z9sAs}GiTmwOA?dr{P>=8Tb$>1jAyN6+Vo`hlO!l@0t^vp42)pX?*OQr95`o7Z0SQJn+S`+RMIJ zk&?3Fi)H=?K8wmO$_mPQC_DP|1LRl9@Zmv-Eoi1IZ8yl-Vk4{iy%anR7E>Gmy6 zyN>P}*e$$`zki$X?rma6b#2OP&3fnl!HID*Y(~YQ&fWUow{Py?d#7}*-?2*z=XEVQ zcc|Yj`yR}1!uMB)$U@%{QHn;kT${M+7sCsh1oj&?No^q>6I~}P?wz$JBQ$i<>a0Px zTptNk)9{`_Nu%s_>qLxP91z_vsMq2N?z?2)J2-5ZK4`Gl(wsyp7rB4mT++P_degeU z3e8*M)kVIHR(?5gZ7@GJX42Ausk4H%Jm?oRFKxgb8J)KTbQ|5ZFAmNfm)vbkw*VeE zci(*juo|-YZ$@Tpk3sjpGi%^IQ@ai9!F{?7=sNY@!75+pP<;20YsX`%@{Q7yThJZF zOC>sdUD+Q=5j}C~;Isun)gFkLyfVE-|3Up**c)_c*e3F*%P~Eg^O|tSK~WJ-FOS37-Qow3J5KGI8e8#IY@Z%-svYtj zi+pda%(v1XP%f@r67-j}Du0NYc=u48u<5&MOVF&oX?JEsA=@!slg2b_c6~gC#G3Qg zbN4M95F3;JTOd0dW*>C_+q2|EzuujBP)wih)0RnpP<3Dw@~x}`*f2o4Usb;hn~BQk zN)r*-`8J7ITU=y|9z7RzU{Y8Z>cHUn!$WOFw#LEn!O0^dPzOdWZXVsYePH*3;da+n z@o2)60z=b!w5H=WsTN=zGs-y^dCM^^z1M=Sd6>CNe(1J;0irzbkoEYi?uohg_M@!} z9u@6+XD0M3Xl1Vz(QDN7j(s}^+SsN#ol@%zxcAMO9T&WPNAEsMwojSUcTsv&WUB>r z+BUB%-fh=Ezi)%6NjSO+%D>cWZ$%#m%H+$*_> zz2nU28?u9D_aAgKzGF3v8Yb&!^)?}0Fwz#?P?bnR_nh;*;JLYRK6RVdyQ6vAjsI#J z8BL{gH)?Af_iTnuvAa&aPu16(V57UyXQuWALm$}Om0lPx9jQb=R*h7u*In5x^1QIo zO#^Cm?U*gt z(YYJ4+Xl;p{<$ySo)Uli2X`IZ#%k>vTalL#^*9c>>C|Py;$F!&j0h*cg?w4)>ydny z`99#~upf1hVU(o!ajMw2kv%v-ZT)5Cp-?=9>b=m$!_urp>&)DEjqi-AGv1Qyg=lY@Rom*Y0W2NN4cKf*kAq^Iw2{{9GG^!9DZ$+x||==#NP z-=2(ft1*KE^5n^KfG>BHUzD0-m_Y|{RH!cWRwze4Tpt_ciqh-qQgKDd?*zEyTfKbD z_H+96%pcS-X3B~&_Y5E2F0NC9t>I&D8`5{)s4&yJnwN8Q>-flaelzCZT&HcB$miJ?s(CdRRD zGWYRMJwD+!1Mg(G*8gyg(N0``_-63D&HC9Y#tHv>hqg6VSmZ(&YNBpQRm+gQ7c*E`t{D2@Eo@s zJiwy|>MX`W&?Uz_*2}J2k}HR5vg}75*}lC-!{#`z+nd+w65JuROUqrm9(~lK2UaBQ zTIt-@KD@EFHx8=zZ<3fhko8-+>mCM$QI?46X1=GL2g;l-{-=wXPm`V(t9qi#A8}$5NiSaTxTNoGJXU2 z)+FaFw%Ga^c*G8|*|P`m=nIhio0(h(cQHO6+sRkq<6ZQtjTvruPZvJZD3o~X9oT;g z@rR`(f9qbNe-Mt@*$tm>G$s1qfVX){{)&FJl}7kif$!xh`73;;HG=p+PIHK-v>R#> z_!k*(k=^ED&CCE#X=i*pCB1%Q(a`H+d_KF~4Ik~IUv0eVhHvG<7a1?I*h)UO3Ku@p zc%A4MAzw!RfG=2-?*~*~7vuABs-P@)g_m+F`qjqrDm<0D!e?S_qol{TRkJ4XM+^ji zSuPS!vC+c`J_$NsOvJeiKA&NZLnYp3XnLEm8k0y|cn^mQUzBRP;rF`mnM2*^ZKGWI zt~Z`Cd|mvph_XOT%#Lrj!FT_iItC2i} zC;1iqYNLOSb};qlI$k?*fygmN!g9|Fekmx1tx#Eh2*>#pU>)6 z;Ylw^k8gmp3>Z|aX{T03JQw^tlhY_DjdtQjIvM1pwUqxSOPem{J zE4;R+(Gq(D1rh&I;151V3CXGOl3wC%Mkc;mO8HT1&3xM_;8mQ=LEP&Gyz<+fz{>)( z899US*}9V6)89qE*4W6RT=bv1=+_Qpcn;@pI{TaXXeXLt){J~3$HaO1I4r+N(z_-; zPU1)de7C_|>2>T-V56|M^&7Wr)ZX8xZi2mKx1feS`pt0Gneh_)cs9H1EqQQ9{jlgR z&6~HW<#j{#CiO#lc8XsRjWz2_a9YL`zCz}i=j>1YktD3dFj~w02)$RxPj!FTAGw@h zZRC&&9q&k;lxMtrdF{}yJ=@A|O5~KHDK`!sjww6!FX*N;zeN7->!{;0Mo#ZX*Tthw z*MP=hf%V!BC`?UVGA=4VeNdy|t}Qy}kBV+JVE(9zldAV}v668McGqheRG(pqU}{)s zLc3b9`CP=bV9zwzT(uqfEQbvPUcSRlAs)6mLdXGK8EB@<@Pu%FM_^&Z`vf-8Txba^T1K$8%wh=X{O$kJXp2iwu0ZRZL zb;^7k&3K@ZEb(lTm{CbDHrswfzHNv;2W?y*(5u)YeO1MloCM{os;zA3qF-xFC;p0F z`l_N|8}E__ZLaB}Ux!aZvTarLQeR2$3AuknioHJJXPe>Ms5zLzhGjUHb8dM9AckRT z_VDhPct>pSiv7Z)VjIpAeyHO7x{Hgw`@ATRE$f|_(*VDo;LN0V)(9gGevS3%m&-3$ zxZa=fCR@1|pFEGvvpK#(ib+k!_PVZpv)UKbvB02__hm%7-flN6zA>m*Y*;<#cfqM$ zTAAz#Q8y^%?)Lra)eR1fXyR7&!ZSLV-Dho`HRqnaH%7Ye(#Ll;?m2r@{q9*Q?IF4< zYuHxyA5__`F>bCZ3-S$B7Hfv7vXH*o(Np?TJF@v|w6oH;>Ajigdjk(&l|zldEBa0@ z`nASN@;##WkY%mt*J|HW^wPH#|8=ZS6@T(=NiWOVq4?uau8!2c5Its`r#V-;S;8j1W$QsC!f!_ms zQ;!qCt9Gr(ibEe-(MMBVQ1m(IkD)FQeOr$mF8UlR$*=+cG5B=!lyyPTueF9q`&)Z~ zZ;W@MO8#rDM978n#;|r`G<>_EoZosmKf~OR(U%6hxYXw_cH#Ji(H@V3CpW5t=Rmx- zHj+MYd9HY=612cm%?Du#)h|tXWXE?j3_-Wq=WsI(`&9(WcXY(C``9q&ufX5zOcJ+||KhWp#2eo@ zOM$-^{git>rT+#KpM0Y(3zhURTp+zSq-wkmTS5H21@E4Lh(FPT zzd?8z3*G4_vA3)(pkD_5t0>kg`blgY>3b2qv5rlz*sJLas_23DtJopsq5i&n-%|bk zeD(nKf63peEt35&*{`Xs_&dGj-qDrxkbg1Bxy0#>Il{6ZO7xK5St&o>CuDzI@n2&c zrG5wTCw(Qo%~&&r;)nH(?DyHY=3`@%o;A2^5o!sq6hG*A1B)o)nCi$ ztJ)CtUQ)wFzZUg4#zimVilSfJN5w5gALXKdh}r4=L-CjWR!Q$^JY?*yw6ocS-W#x@ zmh2N=X*a%s>^4N^M>b?Q_4kXqo5Y{!ssFC%bMT%j`|pZg`m>_1>=P;evj48=*BbYeKPYlKv)oZ&UOS89VVDGZr~-G%**1 zW>U+wFqiGq(2D{-Q0d7_5j9QL8V7>aYumKe1>KltEj_P)WOmYyz@+rpSnS1!oj;sI zZ=KY$ZrzR{_Qr1gmf(>cLb9K{(d557(`F<#Zj3Q%Q#Jt1xCwo_F<9A+DBS#V&0gi$ zW~DTdQTQcNFKMN^_A%Qp7%u0EY-!XXs?qQ%jkjLhR`r+{b$wK9Q2K+}m}{HRdu&wQ z)OgYS_cy6r(Hrvkiu?xO%3$BsdYmc@an?zGJVN1(?}%QFKgjr~#vkPPj~suX_dcRm z?|rLl;W6Nep2jg0y&M;k^q>--Q9Od@QatKR`0IfWqxwHu;f=3}57FCxLB5K99c$r6 zFZ;}jex0$eik|dR^lOYI>;V(1m*!prf5pGba%m+~w6)g9gFNlt~&3?aPr6e?FL@!0_Wa-64t_{>8) z)YOH?I1g9!Ux5AuHuDW+ihi{fBk8S2K;M!0D}1Ka)g{kvo3xwkYhs*dhO!&2?IiwB zsCwWxkRg$3D~ra&j{%Xg9Q$U2Q!(yR&}M7Aj+d`?GY z8}eljX&Z%K+rgb)<}2~?UGNLUO{~R+&E$G>*!rsP{b~_<Oa_yVGB2C4?xeB_*1coSi}bBW zN%z%gkEG8nc6tb`s|S9g#MArOM&M_me$^!(eT?|zpI3YqJ3R%~u7h6UCH*nyCT%Ns z{3JHddDo?Q*t|`J?Eguh+fDpsypr!l-L*VIVBI?S6CP#J$+^KrFXdPCYcN9I40wu5 zWOEgNa;7MsR(NT1g2a#IJgWcwpeLMx$bc3Go7wEg3 z>?!f6WAa>d$V2P2iOE*opQD0&rdW!zTrvna6z@h3dlP2qETDZ44Ww41`O z?di@(wzCp1`@4@&J1gmLu}OO>{6oge6eDt-1+>N+{YYBlec66(u()v9ccak6b`8VY zTz5gIwne)^ODA=9TL~VQJv;&X07P{OaO=^ArU$X`jO7z9SRM|$bd~G9$u8SS?$yS5 zDi76uNc+n61Le_9l?UOey;1ngAcaqbeTP%IK1X~i+Z)1DeN*^##^=Oe(M$dk5C7=u z@(_^K9-{KV=nTF?bVt7pQ5E!$*GGcbVF6#m)*bIjZ6->)KW_CRdSBpo z+2Vk2ukl0VxR_B5_TFvl0elCIA4>hgXpARLBtD^ah`;O}f;~oU%tFF&j zQG|aE^fKS+ME|n&1D|OtfSj*@fv53=HOz7#Uy>j1kv1tmt}z}W&-B7|E7vu~ig69j zxKI6Nx{j^9Z(@xA?zg9FL@7D`hHG$E{AfJMCdZT1wFlNP;C`pdYZ_0n$?*}~r*R0p zXWQhPm3}^e=qxW>Mtcpd|+u+yuE;g|c)OV3^A zJwmRHIbiDyJE2vO_G7KB-@$hx-UG+kVu0VJ@W!{+Z@}N~Oczs${w0lf68%fCcXeB9 zZEyHRvr>|8A@~$hIlKvaoAE?LHBO81KJkp%8FDWrIvRJuxQI=TyC9$YG1qMh-7lbP z)K7u44RC)rUE6VubGLClQeIo1BmapWTV3UyX%$j=-zM`Xyvjc_TIEmqksfNC=W*jV z(u3$p4@nPu7++g*+;1k{VCxz)SzxOyAYvFQC`o?d94Pv4-AyS0}w+d^D9Su0XBxUSojAtRSfj_xvT&DbfA$e;hvpX4|z#${puj`SS#m1}jl zO`hwi>|&HEUf>LuBe@`F7q?M~OKo=5n?B<9W$62e5KZW^!b6 znwPxDH79e>&0{ey**1Ap<&4bw;r*ir-aOWxxNz6ZIWu3lDKP?PxX+#)Hfmx2IRkDQ zrQ#EfQ&7D_WJEb!R1XdH4NiW)hJMhe@_Y9(#HCN@`^dLcKKaHvs-HC8M|!0ZKa8Hr zZx66nUwQpU^98K$uqHK*=u+sp2Vlo-9^WBfhvxsQbrSNa@9A>94Dw3*)?`Ev=`e01 z$H7q(;h#7gn#MyAbxkLYpN!CW)h=92pN~(}avbJj`h50m6@QAiihm|k<2H(3+DGxv zG*o$0e0H0c5^pGZl>APY{PF!D7V@2JHa99T4r7zMt>F4Lvleej*Ct)BwSE*>CT0Yh zXlD#hGlcz2_$1hAANE%al)DW;?^I6X)%1PD*X{er8f%jE8Tjgb_))JX(eqTFNKUk8 zvR-2@p0vZwu;&7@TYrs5#0I{DbE=$I0QqHq!P9t{K>^_NoKxkuf8bFsB;G*(7v((_ z?f(GVBf!Jo&~JRtdCn*XJ>>Q%sgj#5Q*ukZZLka9#^@#SQZJ7hmGWM8e%7NDFXXtf ziWl+Bm&U7<|4Mr+|E-+&q3Y=g;AK69zZega|H5m{EQ%M~DZf$9w&pUbA8*q&yvGc- zm7#xChn{;(EJaIW$+d#0_pbq8SK}kB1Hg}U_Vo-!y{`QJFv?WrIS=^X>3bL1#TaG2 zPyB~C2a0_ZKMqMgteB0kc7o3+=ODcM_Jh19G`_a=0`PO41KsDbfqpg7j{_gKc}2iC zBK*bujV_2o7=R3e& z`PVvc1^N&@)idQ^mGk@5yck)}q<E8^ob;9Lx!IS#KPx}aG4|73 z4CT)oKrj6n<4@QBKyng2^=A})rg4zuQS?$CMV~nyaTan?`+1ppeCj)zlxLulM}`H^ z=b(O5+{SpCymqy7`g zrr$>M31t6u1li*^MIVg>e5n6H_V|qGbBx=_9xBet?=Y&J$f@O3MNjrn^qIz;WDi9z z^;7hf^R!g|M$Q{h^bZ*oF8Tp94le2C`~0oMe<{kR4e>7_e5UaX(Ptt)#8bZ&d_caPsE2~)#WKG9ZdLEAVZMJH$MF-yr`<#2JQ@DIVi} z0rBDkp~}II@9C>iuLEU&TH<*U$tUfeP3=lDU3bItI7<_B=;zV%>j@tLd?$Jy?HN6P znD8B(4_^@fH80baEi8^z~1VMNvc zC7$am>DhzETIQ|j%}%x~O>bil_B=@ZF{*(0vf4$z3iIOXBQ6v}&n#Ppi+uifPN zz(v0w^wN){JbP@C55*U@f8ahh`ok{z1E9CLzOzVu+hG0)<};%_ zFR&ARZ;|-~(mYdn7uIsi?;}@!CC2-#mn*-uuKY@FQ03f#^grODUu}HIM!M)RzN7V7 zJr^w(@I>z=+es;(Cp!XqSs$r9JTYFQ>5t6ybfd59qTdbrq)K|*Q5XI0xo}^}pY)gC zIhFo2Pw`^?sb8Y>m-7|f^_W>EVx)SY5^6 z3?P3bdiG#6`J;tejsD3-7yT;CeQO1OdZtA0hiL1O6%7BH-`P_+rB!a@^^BlBsy4=r@TWhOED{oSPXI8-czr z(Qgvnsa)s5Uj`6f^@BE<81Vr8Sd{k$DsS1|NQs6Jp4unRm%vBSZ!~*R{h;=Q%3INI z6bGriCH-2@qDp#{-*zVFV}ssoOXVl&5l?!kc+wg80iLp+5r4J{^G+I~{N6BAB=%U{bdO02@<$00HPtou1qsmXwm$>K;fZj{fZ?MVoQ}hS=e5mx5_VJ9? z^s@Xg51;JeW+y5?`5ej*=GE4s=W$Mq`8LgOT26M%XY*-(lhnU1_3t0hc-8)1OdpSV z2Xa2t#q{yUU2goJgM5nrMzbr;Qy_XO55>PSzAOH+eOL5F#uhoBOY@iYPtv3Q>3Q~( zq5s=9slTG%WIj##j&(k0)-`4SMe*Nc4x)MUi$ITg4Zuf{UYktZ2mhPkPs6D_8>aDU z9*vqeA=@WKztL<$@j%V9knNMAuZ$m{_eiF3pcUF~3#gq2y*Y{AhgWKRLu#KdrjIwu zFH0Yf(+K5wrlObiP4VAocBA@6{B6^LSNu1M&#dze6n(W!zObY;alSSO%T~r^?x>* zFIy8Jk9zNw_UuA-knvcy_td{4e^B%r#Tu%gie8SxDS8=?J6F=v`Ta|D$Q4j}Vu+r6i?e9uuKL)fU+v+qmd@Jhn*I+z?A?A&+JKwKM%c&RGH~Fm z_WSm2eYk>W&*_8J)MIE|HVSZ6WiujWX%VejIE=$@!?aVWWoxWCc4%EZYx=+~G!H-XoecLNM&TEtYx}5yGGwgC&_z>cMM$t2j z$bvo*eB}F4pd3$@`3k((0B;BVVxm|5!(v`Q_@$tKiRh{S3i_uAp9%WIW*6}JLGj@# zo=JK+UL7dcJCI(pUG(wp^bGYE`ECTCHAKHz(HqAJzYM#beM0hltMTf6xTEty+f79O zvBG=g5q)dtgC3)ap5CWevDuIC1D$E|EO*$S{0Vk`(0U04aN0Rso}UhUtm4DATdzVM zyd`43q8xYW13b6z)?r?Uah7_r|H4|?Y^^5Y2+XLd>oT0J zckFn6D-bx)xlyB-5#7xJXS+^cmp%>~R+|G>zVlASXB9_+Q!}EX(tFFY{wwoha(8@b zclu7_S~nMYi*ffnzbjDWP0W+hFA9b!VovyLuHduvAU;kzOK zpNXDg2Kc{D_z2*`iT-;-Mwuto;Yhwez`m z#n0S(rKnNSnty&CO#mJ-^q7x)9_KL88d4_D<6`0btCzQKS?m0K`?15%I*)Gjbxvgu ztQ1e5uMpz=AbK_t<%{|*_YOp1V(V%AiJ+pD+4ow^#((B4bAJ07n=o&NbL$~iht>MT zxos9-UooCXSG>*FujDsYe8ht*ZdS6`QO@}8Q^`;6BnN&%ih~0yKDv*2?|XIkd(7*$ z`9JO3@j~%0x3Xi-X6yk7c5Efv<1A!Lo!w*^)AucmkJ;q+EnH)`MBGm{ZHtWL{IYwT z3xL1mj8n8J7+YnNpp#ImYQ=?9;Zy!qZPzPu*1Mee&eoW9e|svZYuBKlE;7JilbSxT zsQT9oiTW+;4rW>qn!{r{>E8n9Dn;twCU#JiCql@79*8$n^luw>t6Zpmd*Z9)O8wg# zt>A0=w=e4RTl%*j&La9y|E`AllgIUMf1^FdTonIWMt#IRVK5V;%SJagME_<+09&Si zbHkr))4zog&35bGrV+w^(Z4;6j=Zh@Z8L&-B_B^?2w$Y}-i9APq<{Mwb@*5Mx1SNn zf6~9J8KZF$nv%!g7$RmT=jIdyOiV9G515cU{f4}($(aQKJ#%v>XJ-V2g@oD%<&MuS z$PGxy&6${ylbeK(KvaxCvdsA$~H1^ z6^1X_p@tp4nQM#(6aWG+Dj<1H1Vs+!sAS;RApD(d6ym9LaC7I;`Kr%$zUEv4F3M*p za?OJTStO5?HW>2C|1sF-JOsVS%WH6{{6QCSzM8%P$TJ_@r4Tid4oVKGWdZV&R!_mb32v4TfYnu5k{s!sNko|P}XH9{PF7wZn-3tyXfyie=eDuOsFCTnE@k3w3A5pjl+Jjn%Yjv<6 zP(8%M`q*=$A=WQ7M!&x)B5MHRdkgf?T47vWj{LO6chmNGBj^Yjf+3gm;4qvgYsdVg zNW9ra!#g^|H)1g_r<>8;=mBfRL-IsOos3fI1wHy;WFiG;6{i~gu?A)!%3(0pXr#ez z!!So-1jbQEVNUfJ<9cJPF%A}b1bxSwG3#grW^CPpQ^uBJ?!e>52ICGUPZzo$CpDhK zJMv15N1K?xcm^|(deVB2CK3>oV-A&FbTP+lH(W zYmB3~o3dssfMHu)<6me}Td~$GkhNiLSv&L$I$#Y|kg;JL|#XFw-G{C9))z%zCn3tT$Hd^<^onA4_HZ*#I_>4Pt}Y5SAua zsj}g01RII5>(OisR`ic$<5)Ty&nB>mIC*;#&XLJvS!@bU#LH&Wuxd7!O~?HDJeJQ2 z@I7@Vo5g0c8`vCnBb&?SVWeUKTZr#Xi?FTt5_U7Yh26?-!~O(!u%(z?eiy^}#q3_p z)LX{xXUnnfX$4!!R0W$V~__Age%9%2vUSfLHwuY zCqX^Kwy>>i8+(>*XV0-6?0L46y}+=0KYNM2%wA!yvfb=8wuimW-e7y#o9r$2HhTx} zeEZmYtQaTgJD~#*@aIn5p!t@e=!xeZ&s1gY08= zh<$>$!aLb#>@fSBm0;|36~=QO#2enDSP!<=c+9v5qZ|(yFR(AzQT8PcF+aw>Vqdf4 z>>F0fzGY?XJ9dJdWDfQ{JH<}3a(0HDW#`xr>__$!`bB6^wDt z1vj||w{cJI#l5)?_vL=P8u!Oe<286qUW?b}b$DG~4`+qf=M8v6-iSBmO*pptPO;7!T)m9>F7d6p!XHyfg2@V|iEJjd$lg zcpQ(%ArFZ>i6`@(ych4y`|!TTW}d?P8Q<|#-k%S^{s`}&FY`3onhAU$;>AA1ueY&^ z=L6$Cqu6*KQT2eaA3dCB5Q7dG2k~7k6W^?+AQnwU1kE;bxQv)H5V2&tP>5(Y6ESQy z&i}i?xDlt0&ovg{B*2AOm*6mV@xgouPvb-RFh1O`B*-V zr}OcA0-wk;_#{3V$D(BMDaJ3xuY4-c=F@l%&*jtk44%jHc>yovGx;n&8>c7E;WzTR zd>)_A7x0DrCccO-=1cg^{1$#Izm4C{@4!ywck;XV-TWSYFTam3^j{^goscPCVTB7LPUxv5iMdwXB_<#E4t$R5a#Lwav@vHbv{4UOm3gHx%X_yR0FACE%JxrVFX?mI7rjO}s`kB>Cf3vz- z!>no6GHaW4Frr(}yw0p|HZU8Sjm*Yo6SJw=%nUG_n=MS7RBE<11I;#OTeF?n-t1s@ zG=t1we5DLAL(MR}Dcj8m<7YF{j54DQ(@afENwG~!pOBZE<3BwkFDrK1pO85#U0o%Idr!_wpP7L!|9J28355mfS3y?xMEYfB=H^Z%((sUEuZg(@<1?~z zXL%Il=H%vAo0tW0^6{P^ue{T9atkuDGqTb>dZtgCmhO?5kzJ7PF(fmiAl;UdK5hKO zbUr+b56JQuoHcn`x)_j|B?jbYd8B7g&rCPRgUVwvJvUK4=b14*KMUHJb8th*n|R+S zNH?=`!7W>Ho1G={GIMSDl3l0=C88j`(6dlIDyAa`{Pf73mN8kW8=e@dbV&@;X(Xlg z5Or-2vFqy?oyO@jUZ=?_4OM*Xp_)Ea^9ha8_oH>Hp9>3D*I}AIOw)&H`Y=r&rt=Nc z`G!?KpP-*l)M=7VwLIZko^Y*4xXv$J=NGQ?3)lID>-@rXKH)l_aGg)M&L>>+w`;z3 z&Cjm+*)>1A=4aRP+cjUi=4;n{?V7J$%Wv2GBQ*aA%|Al(iO_r^G@l4f9~q+bkJNfc zYJDU1^N|tyzLpawG)w2VM`}4EHUCJ>KT`9L)N)2@IU}{4kviWfEoYR@FG}YZrSpr@ z{Gv3!D9tZQ^NZ5_qBOr~tw*%hBUEkqgoX$T^+cQqf5vS#d*Yxq4K3?CCue`7A6R-1) z*ZC%BeG~Na37UU`em+sBNm{-nEnl+cm#pj^5u)x#==vNHqWDJWdL0p>TLigeZ9$k>V_0m4+&@LPI0HGcejSExjOPqIYgiMur@~%JeJ9 zL=&Ta=lf2|npyeVFCQ7_=o>y0auKJ4vvUfkd6QHSZ?-SmlWFPc6J(Pmvr0}%CQBtJ zCzB7$aqDoIgEKb54aq`yiAsAQl@ z2B~DQN`|N;O(jEBGE61IRWd>)BPsD#W`W>dC<#J&70iO6fbpRcQDl>H3-k0Zl#HUw z&zi01sDRW@DkepklcgCd)43XXPs*rpx+mpRINe)kQ#jpAWgJWKF11`CArzcE+RvKX*i} zDo>F2Wgo?3a&UTf0a-?RoSR=%X)_@+OA>ig&w_qYmqPyX7({>j(%-4_uZ@0(+2|rn z8OG&e)yTyv^VTX$Ha+Q4cvOB!qz%p^6F8Pk;1V){FCZa7b0H`dq5PqXQ2z8L8&O74aY7?i zbogN=22aQ_2g*O`_*1R2JjfEVDkCN(+7eN~=>=vcir5??{}kYlPn@f?ebQY&J>yg- z)-zqDwm4#COIIA@awo(4rh2BU)Hk83%zY@eGsR2~_W_#~mh7KPOkc`FpAq_wK{9rug=$ zV(dGm>bGBCH%a_t&8dvW=!(l;KKjry@k?>L<(KVtVM|fw$fm?hLB?h_{@7C0^EvAI zRJTX`a@;O#sp|P0WzL-R>ACp@dAZXwGd%lim2)-cb-ZHtEciQ@f}=cCExt2-&C++p{gGc7OMIIVWFxY z5EiQX0iltqe-;`UZX2SQ7pNpn6>6a>)HJPOq1G@>X;?^!N1Ch~9)6S9j?Wy|PtUj{y6c&qp{&zCKRZ1? zQ~l0$`>iUxYGslNGF5vbYd-z*jiY8*|E8zuca69zar8|x5dHR#t9*Z?OBFrnXZ5N; zLf6$2CS*)RlaWqWzDaJGDe(zkBk7{d{F5%oz_+*CbG_Y!?0xZby)S$&wMu5+{%$<_ zyYc9M5f9(~RS)_1zmQ*=8;>+M9%&cx@K3w&xe-;gembZsgQ$o~zx{MPRW}lAX)KerwSO{Iz zbPuJ3so@qv)w3#gs%LfN)HmFi>YzzCs#ir!x~}0CFbPr9JyI%ODnhEe?(tFItDpS3Op9h+EWDOjTG@zg1A9-+nrz=^Itn_MvD-=vo&9GyRyGThwq1V05>JTjU~y z|A-4cUPUmvRlO>H(Y5c$DmAL(?O_@Q!p3Lk(>eQiuDVEbBlhVphm8ndQ;s@SN=6tD%E64sYn7+Y!5oPTfgDW9+@o*$^y%rm zUm;H|M1x0ph(VdTVh9GPbT%R(Gs{mBSF*0IZ&Y6UP!Cp#rpLqR!V5Xk4{s?L{i>q} zy(%9iq{mb#glDeGo?5u@_ynF)D9}arb62YRMUVUGXNZlTzDXB8G@3>~iJ@J+>W0|$ ztF~RgV%zmAwq3ts+x089T{o%r5IqE-U#0Ep6*|Nos)s<-yD6^KE4y7c$@WnFT&Ny8 z2-QO#p?b(e_s#5KdWaxQ^HZ-%>7yj>4X*fo8G#z$y; zL?vDijYR07iwHer5uxRcNU{y1z;BzSl3^5_ZL=ux9#&a$-m@xy*+wYB8&onaD@S(R z@-Z%(GtoO^_5=)r!sTTtB**IkkI-Z#eV7_x2~AR3AtmdCCaD1mq@+b?vKo-X^P~+@ zJpiKzQtW!b!ycin5}~agrLUv3HKMfkQCj;bZPh4kg_z1z-^O~Bkt?`<8}V=I{(W0pavX4r}K~3`73`5O;Y}bROhb-CULFxPtf@%=={|{CGKne z6LkIwI{yTne}dLOLF=EO^H=^Hnxy<0sn%clGp@D%%Aawq^H=_iYpuT;AjP%LU->t# zb^gk)ajo-LevNCbzZzH#O;Q7^NVWdT&vC8wSALFbt-tbfTxT7Tu| zxYqhBKMze(evVY@ulyR#U8DP@P0vJ0`RVnnK|s}cv*O5cys^fCHcxfh<-)mXVF=S@QspX0xv*21k7p?V()_N%Sf*cyJ+zHqEIpvNuclL@u^|!a zI~L{}l9@4lt>nS@GtIp8)03Y#W;nfz{|xhTTH)_dmX5zO*-ZS!To?SE&*tOr{n(9^ zVQ$HLdfujdoB@0=>#3u`5|dMgfRicFn9C~fu&Eh&Ilw78hI?}Em1+2=dJSn<@TI}# zj+XRnBfe~p##ii2eAzuNe!{oaFf-P?-dt$jVjlG19<4l*J+eKPd91Q6vfXBT+IG-0 z((`T46JB0kExbB{7d{xs~gp8Rc~B9vU+UwLDh?@@2Y;V`iUBTHG*sOs*ze_ zdW~f@w$}`-IiTjun#*fGU2A%+Ikn!dU9WaP?ZDa{Ylqd2uHCKn#M(KvXV+d)dsFRQ zwco3KsCIcBUZ-uH)H(%qR@Yrp_osT9^$uT`a@{NSL+U?Ve|!CR>wj7QCmf3%++aY1 zyavk~>}XKZkT-1GFtuSp!#NEXHoT?bosF6{ifuHq(djM@BJRI;wz`M=sH&1R}(EQ=%`G7S5KfTBf!f-EvCH*{#O6P6><*j17zr>=l?AI3#dn;KDYw+Jv;( z)8=?vTidp6SGV2L_M^5xv}@RIbNi<4+qUo4eq8%S?KiYP+o4W}$PS}BEb5ru(HS%@ zXi;#T;HJU7f+q#v8@#boW~VzkZSJ%UlPFU|R)zY6)(Jfn>Im}>3ke$CDA{{)QPzzW<$)bm^WhHkNLE7=gvJkPwISc=Utr-c4^ur zw#zMDHgq`^>ld37TM%2?)$BU6>+){4Zmqhl=(fFkVE4rCJGvk2k=$cqk3&6vh?^9* zB<`p9I`Ox}Z%C+@U{C0iFeG70LP5eE3Ck0nNZ6k6Zog`Xts#Y@cXP9GW;g zaed<3iKmk4Cv{88Ou9R1XVMqRUdh49!;|MHZ%Y0s`P1YtdQR_ocdvk6-Fofsb*gu4 z@9X>Y>hnaOEq(L)&h7g}-{XBxrPN6|)UQ>)&b{Cjie_Z?P@b8Mf6bX4^o!-FgF)yZj7aP?n;8`{HkR z>j$ikIt^amV>aaiNU_B_XKb^|jaPAc%RyWpv%UoVmu#)|J$u&r5pyqlLCz7@3Ggik z-|xY<9Pwj_RSKHjh$;s$|FR4_qDNcDA?r7g^*Chw8Zv$bPRFl-f`QXXXg8MZ z@h^-$DF1`jCZi1HnGBn)wccchV0BmoRGkfBeF{rI2VLGWraE^TbF8*_wx6-Yy4$$b zdI;8f+Sp~yH(s$O8?RZnf?o!#x88UQvufYA@{M<_>%sp~%n7Xyiyk*hts>-AV4ScP z!n)gxU#xl9nPj1H-ns!RQs=?i3t;V4u=Zir#=42M!|x#AJ6X@NaI*efl<#WzPc}-S z6f#dmNi0K2JjDjUPX`;-Q6e~h0k&RiJph^jiM{6KXQRQ{ma2deKt z^{uP?>%%q&jhEr)s&0J=n|uqKd;^=Dg3s21J-&ktK7nqZz^e{GuS3vFde^tCw^0py zhx% zV1<3K;yGCH9ISX6RxE==r{KjSpx?9f^l^AlH9Yk_o;r!A9C*rsS=47xi%nR+5uWXY zv=7o0*lvh*0JE(3Lb5V&I%93YT?eoZ$sP6mj9mX>$@MR)jB1gF62F`9m;2?T`RxSN z3FKOiT+e{-N#yz?@diimKXHYe1?F8>N1X{nG_48wd%Th8x|x1ANnJI>Eg-v*(+dBDG3Mt$pTlsTQKZ?(Za6ZOp>^{qDQneG4L?Zr zv@hb}V6?zP5U0IC{W_>W0M+}T`WD`K6qFyLwReE32vi?lBb66;y#roHk@NS+`6PHA z1;6ifbola`TIFLXlQY(SEl(L_`4+N#4_Qhf%YNv05D^-^8uU?WlU_0C-NZt_IONnD zIrg=_0QFHB=dp(5-`#3>7!8omF+{B1Xe0Xq2IKnby^E_;)I#KW8j+_Kq7JmhuI?w$ zuKa>N-FcKAht}7j%-W!5*bY6jAY6w7Vqk?>wD!r?%ZMmP5m9RXDbo1qzHF)S75bcI zkm?LdrV}6<8(} zA)WO5aoA1UOrUP%7Z=sL=soX^ZZ{l0gI&VV{le?mXCw`sA6Xkf~Mg7F{p!pb2 zY{!C#XYj;Uv=q;R*LL(DB<4F{PJ-qPFy9d7EYW~7FsEcbs*xKMRR4G0fdBe<_D_!gjuE$itorY;>ZK9u^5c^KeeBiy*?$*` zKQqq$^}N)G-=%;5exqtv9y9w-yjwMzclBRtbnn{xzW*tdSMGgZ`R-pIFRxDfccD-%$)EcM`2Y6}@$W-@^)mVYDdGPb zZPioPR%@=k-T1rnyYP$Em9GBpyxsnz>HpSm_LuhH-7#_`^y=U0|BikBD}87F`^kIt zFaLiA#b4jgynJ8j>h0UrDXy&*`TLdhUtb1QbIAUvG_E%5~9@19rpgR4{gJKl5u z+}Qf(%|rR0Z0r8>z3uX~=;|JJb&5Z;<-2qw?*C3(`0sCdt~@R(W4xNxd+o9LkLRUa zIr^*FQdK!t&91oebJz9;`Dar7{o3LyTj~y+Y0Lcd>jAO_5A9Q;O`gNS?CJ6^BeZTsE@NQSBZDcUgkFQ z2kdnbiCrR!0Uu)hYA^uTd^unRV3qZ$=xKdw`rv+DoSRt(Cui2e$(i+79h~Lc%&5mV z8nyT)q)!<2L`^^dpe100QA>;hi~)?rb%9Yw%th)n>OqWpCI_^^X`b&H{#HGs2B4)i z)adB^1t)aYF%qz2QW93zCj)u{dIJUm1_Op+ee7`TR5J>2AFdw&tOV{UJpT+}2d;PG z-s?!;0KAEN#o+lN;4H44SXJv~4P~{F*2V4w4Ujeg1RHf&1XASBkSFT}7zCJX)niiu zxq#_bJ?>!*gX{Edi|ntpS06Hr7er7SImR9?$_03J3#) z1MC3g&m*l9JPHsEhyirA%6Jz*EckZ?pKeIIBkh4S4rv0Ofvq@X=CBj*3+M;v4}i@$ zY{t_7!vG@yqX1(7Q=Px?1xRlKECwt`iLL;w0<1y4>j3`(JOp?I@F?JMt4#P=Lq#1x zE9<0aYn>3#MRWwd6Ml!_cPP?m=Pv^Cik>L--qshQ5AZ2~R6u{wLN0+a6ypF{pqm1k z>A)4@dM45v0rT*C5$-Lxk#PX5z_#0fRFXDi5*37 z?rtRZhKk0n7+tXEN-=(ah@GA4V5f{=q_~Hi_ao;m$axEL-hy2BBiH@Nbw6_5k6ia7 z*Dc6tKXUpWIqgSI`;pUrKGSurb)ax?T>oU~qGSta3 z)X6f`$uiW*GSta3)X6f`$uiW*GSta3)X6f`$uiW*GSta3)X6f`sWQ}+GSm}UN6JLH zQA3OeAWzf}SvSg1H_A{C%1{r=P!Gyb2c*xJ!6(b$lV$M9GWcW}e6kEaSq7ghgHM*h z?{HEh;3VKQ^kf}Wi_pdxj_&;4^ zc}<_1CAFP(w%2P|@8ESKuiIIFPW|!*yg|o?^Bcd^_=_e#G|g+ew&|PAQgEhn68th5 z&=b%bFc@$j-~qr6!0UiF0A~SC?0C=s&;$?xz%#J61J-uHvJP0*0n0jISqCiZfMp%9 ztOJ&Hz_Jcl)&a{pU|9z&>wsk)u&e`?b-=O?Sk?i{I$&7`EbD+}9k8qe)^xy{4p`Fx zYdT;}2dwFUH65^~1J-oFnhsdg0c$#7O$V&$fHfVkrUTY=z?u$N(*bKba4I#pqD^ri zraKVR9f;`;#B>K@x&v|6fjH|xoOK{xIuIuvh=&fuFbCq71M$Lvc;P_2a3Eed5HB2v z7Y@V=oT>@#HnfsU&`K^rYqSKd(Gs*qOVAnthg#x5EpechI8aL*s3i{65(jFD1GU6~ zTH-)0aiEqsP)i)BB@WaQ2Wp7}wZwrlv`y?B;SCs$9U?~oc4DWvx_}Jqa4`vx3CIFW zvCg73I)~Qi99n{Ni2COc&Cel{pF<=+C(^C6VmtuPh(cV?17J@^MCNmd%;ylv&LNVW zLnJ!~FKLax?Es;GaKKG~djZP-*=E``>m z(7F^_mqP1OXk7}eOQCfsv@V6#rO>(*T9-oWQfOTYtxKVGDYPzy)}_$86k3-;>r!Z4 z3av|_bt$wih1R9ex)fTMLhDj!T?(yBp>-*=E``>m(7F^_mqP1OXk7}eOQCfsv@V6# zrO>(*T9-oWQfOTYtxKVGDYPzy)}_$86k3-;>r!Z4iXL4{v{s$1kI-fuKtJs``f10F zkFi&kmvtQdspIHR9Y=raIQmn^(Vsew{?u{wr;ej7Ie>o8arAkPqrY<;ZOH+&B?r(4 zIga+^0Qw=v(WV>_&8?5nt{gz0Kt6?b89%&-%!$184(X0#PrUqFy$IhQ-jV7@8GB zt76pCrl_Y)QBRwqo;HP+#n7@CS{6ggVrW?mEsLRLF*GcOhQ-jZ7@8GBt72$U3=N7Q zc`+m}hQ!5?xEK-_L*imcTnveeA#pJzE{4R#khmBU7enG=Vk^2>QfF&?i2ENO%mbONj_X9dC2@cxX91v>YB<4v#E{N1ld9mcS!R;F0C<$Z~k( zX?SEgJhBAdSPpM2hc}*v*OkM=%Hdfh@T_upRyn+?9Ntt8Zz_j3m9q@&csB`<3CIFW zu@1w-%Hd(<@UU`tSUEhb9G-LUG`Du*YP!;{M4N#*dQa(GfXJgFSsavI)p8s2gm-f|k=avI)p8s1U@Zz+eToQ9W_ zz)McULr%j(%Hb8|@QM<6MLE2o1l~}BHuW&t)Wc{~55p_U;SnY9h;n#DIXt2S9#IaD zD2GRs!wbsc0VVK&5_mufO1~VXUyjl*N9mWN^vhBD6}5S z?1lA*~>gw*QQ|FvI=XCdND4m4TNhqC!(n%;?2&D_5SQ3gQp;!`%C81an ziY1{~A=FAjtwN}kgjz|cR0xF%p->?dS^251#YjFAx6m;4csU^58EIKJwrr4?gnXBM(0E;3E${^57#6KJwrr4?gnX zBM(0E;3E%S@!$;)-tgcH4<7Ise~MuRd??Zj2PWTutQ_yKx;FM572dVVi@o*0PAFeic^=vSe~_oB!5qQ{A0 zs0^rDiJsmogUAnIYkjT>Y^~oli8AYZ(QlanE>mHAurNMY80uHb9LiFD*e&Fn`eOHU z4(pFCXZtYwR)Ce@yZC3@Ic5jg2};0jPzuUHQ{QbLzwzJ1R~aDBd)lL>v&Cvg(rfL}NO~<&T#FRfnl)e@Gba{2XR|&+Ez(-+&dTvfY%Nk+irUI;6S{SE= z6|}Ab`=yu|#TH@|Td+54)pmORId+Xld5n5hY`+BiK^!DN4X6WOfv>?o_|IDfI`c2N zSy>qvwjyb4BR6BJ^AldalUXu0#A{C{qDtD$Gsf=Ysj*7I3e> zg&4^eVkBFfUAu-l*0!~FZD7;ZI-9nyUknv1JQ0XknCW1+nPewD-cWj7a zbYg|GeP^(}%r8PO7NHl5uqleMCyI%;dHxe zh-*E}{zurZVEZUr{&Qa*b9O~BHnbh7xV4KJtqNxwYqr)t#(QDzFJ|s9CYG}Wd)ba+ zJk$=GpgrhBd1uP9DCia3y*Q|7y~PBNyfm+ToT&vhwl5K`F`kK39YRhCZV+l zojqvm(dr85YGpGCT`Qq$B{a2inuLy?TB`aG891624*)~KFff9D3myshCug;Y-*9n9IJ00V*exHQDF56UpAo!33`yA2MKzRbh^XpilhBHTAkp_ z0DbtEi9lK__}Alh@NxzG8-aHtPGUcz%tOS_@!q-0kjG7KQJ5BDS z7#?j0KStok2>cjE)~PEW`B+iq@S`&Df=bAXS1CT7E*RAzkdhrApa2c9|4bo$NX|x#kf9B`4eC*b=H9m zAPSxW&wx$fdGI252^4@=!Rz3l)6P~iR|Hx^wSzCpLlLJn%Haz%2W3ZtzA6HhE7V{p zTnb;5L)|i{S_)s3L)B9Fq8z>`hc99ZJA}_p?S(f=;f+#wqZ~?=L7h@~qZHmKg*VEe zj*ZpWI87P6Q4Uqg;Efm*DTO!6p@_ZPPzGO=!x!c7MGU@(!51<3q8z>`m$leD2mLa5 zql})E(UVemqa2-A4sVo)`uclmd6_zjmhYkEw$*!Rbs4SRL#xYZbye6c4;ytu@4=vt93sbGzL+fm-Y}BaikXDt^sxn$tMN9V3k}_ISMoY?QNfoi+5v<{V zT2Vy{?A5rh$UU~6SVi};<=z!ntAai?(5D9a)IgsaXk%rj3YyeFlN$P5L!WEta}8Ij zqK`Fvw}SZ%izkl76KAGMVCBTIXyVLH2`rj87EK(BCXPiD$D)a2(ZsQ6;#f3sESfkL zO&p6RjujKff{A0n#EG!P%}rn~m=Eln*%zDzCW6UGF4x1#h+|E}u_ofoS_x*X1Xe>F zt07LrA|Q4qf*GKB#JP@{zK)r`j+wrWnZAyhzK)r`j+wp=Kc^NeW)=2t1a!a> zY>Q1lkGl#Bc6Cv9RxmKAaXHA=YK}=%A@*N!1?gXqj=>}?%ieLe`ex;X5xQl z;(umxzdphJ`ULmu6Wp&)aKApm{rUv=>l2Jn6fZuC7azrokK)BgO-nJzly7=6$D9gI z1EZ)*pYZmhc>7Vj{V3jk6mLIjrU3e8&I1>KX<$0I1T>8|27YQ3Kb3eQvw@8zj$FexMp;k&jo?Y}Gsu{1Hq5MD8RK0 z^$gcBd`-$s1e3rNz;(@e-~uoWOb3?`OZX8O56%YElk356z&x-F+y-t34}ewv0a?R# zt;!L;0V8jNcfot$1Mm?j2A=>A#6T5@t1whK096h^m7E42K7rP)MeADsJ%J?EAVKz? zUo$@*ZJYAlZ9MW&-#yU%&3$*qfmy4$|DJIApXj*Lw_DM-ThX^$(YIUCw_DM-ThX^$ z(YIUCw_DM-Tfc{9K1z*Oz0^c-HkiT}&d&4iMi=BGtNCcteBwy?#F6reBjqDs`DPJV z3~ux9Hg|x#z&+qk{@uu0K5~|ieC5kI{Jx*8K$~Tt z$qs#LDaJferS1XtNu^C7^<+}&X{1j4*MI6MB>Mys764i+c>3rUXtXQ9Rp6K4YNBBM zm?sW@k|;)RWArvgZ)5Z}h8Fr^PX;aI*hOG57MOj?XCT`lAb5%=hUTea?x-R%mVvg( zK-*-XX{wkLNk2ZlQS_W9fQ&_C>?{+F(@5_(lKfN zaz>eq-q2oUewB4T)?as?aO>cI$hWaN`dB>vQoq*U>@Q>n5BqEUm3)Qhdo5VHEIwa| zVO{et4(-7Ha=xe2uwW~@#V^C|R6H}+WM4xiGI-X9EcMsi%QHQ8f0e)2hjxclYVl|4 znl0{ZR)~$?uwVx%)fubou*L0ZR_ed!Kkv`?7q~tt{~>&;_Wq-M>#9A8#eWj?1rPa8 z`#Juf{Dgm(f4k2<|BwC+e%O!jr8HY_G+(W0?VsiUp63x;yOL9sIyl$v@vlBO(;wy+ z`-A*`c2BVI{GnTTUf~E!OMCon{$rfe(YT(jEl|=@!+*6ojs1D{GX5)m(ZML&Umx5@ z#8LTE{9qhA9ib5lPKi)&d$9j-p7DR_jF&$9ukGr*h5ADQ}f*6nPrad8xK=WSBvM#3-U4iI#L zzdQKb@wGaVSp1bL(?7=U@nin`j6=eI&VS3+ZN9j%Y1fp~EZ_S}0HX$Hu@J4OU+Txu zaWArO_gU^uEtx?k*pn)>TcXB_c5DvD*zuriCA)&w{sr#4hB|Pkzsz6G`koYxh=$ZJ z0q>@MeV=VGKHvQa#}n1Iexpn`wxjVphnF?sD|dWj-S3|BANcNdZB5$>tO%RC$*%1Z z{0{P|_2J{Mxd;Z>d%)%2dZI|jZi1?t<+I! zG*6L^RcG@3%JHNgYLc3YWqK~D4<6rzd~fw4?l>OJ`If4F>d&P9YMqLz0qQCB4AH4g zq@nnMFYv9<&FUrM_XX-z&i=Z3o9EL%Ae~D5db|3m+Ce%??NlXd0^iFk6yYwzKPw&yCYQEt!PHKS>BP!pdnZ9a~>5o_Om>FV@Rgaq!%;{>q8Er(UM15iYVE&*=%rdh~?K1cB zO!#hdKTm}d8#526QnTDFS7qiw^Pnm>51WTog;`-%D9@}kD^;agWmc(}`77@P>@};+ zT2*D%oAoMgHkyqpAz|JRNJ?kk4mcovrLS%+17)C2mq9W}w~-+-M7Nb;GF)fK2su?} z%4sr6cabqNUgyaKnW%foB$=vv%Y`yc_m$}~UH6wu|PmsrDwLVAI z$*1}}*(zK00@)_zdZFx-efkbbNJ8H!)l#kRl7k`9cZXVqTIu^k>7jJ}AECCPw)%lk zIFzaX9O@X#(*GIC3FYWVLV2OCdPS&vsJmVnIx2LOek{}{)JLxh^$YdWe?dxGBOPtw z?_qH9$;gC;<0tYJ+-Y#*pW*qZ)YI_%W;py6c)Sn}e@DFwhZn0))Te5z`absy>xbW z(%HjFXKyE+eUQ$JkpK5Pn}$z?&NZmlgrUg zF2_2#9Pi}vEGL%}kjq(WqP|XFug-PScD|Fg3!Jn~bJ8{)Y5TFd*vZ*qyfG8KU-C8B+VL3?XyKkov~Tkos?AXsQ+`J#C%zgq`$cI_YWWq^F~ko*XAVxlVfW zke(&Fo0FUVPHqM|xf$%_W{8uUp-yf_I=MN)$<5E5++6PD<_0G>H#)hQ?c`>Tlbd-? zZst3=xy8xN0w*{5PHukZL<+;D$8g+WQd_um2<1ab0+;>-AASU>75sS|HAj*% z;m_ka_X)urCpa_$f1bqrHj31V`E0bxauKJ_PI9u{yw(NDnQWg6C*?5bOr?&UgnXlIJs(vT-mSuZYOng z(q)`<87Eymopkkd(v|L{tE-c)EGJ#Pkgl&)FC^?6+GgjzUQWh(Azht_f_2uNiIZkA z1Lh)W{Zy9juluXkdVn6F(w)?`aZ=aDNnN^|4ZG_r^_8lJn-jb1S;!&Jz#@k|oE(On z9Ey`e<~$>+l?j`$3YkpPUZt51CQBKUZSs_uuBHc(vYxzU7BRh;89SMN#NRr*`7s;0 z9iqCJq0EvwNbiX%*PLulrp~G6RMw}N(^#KwPUp;{%qWhsb7;tnAyU`b&7>hS*6?Y#oEb;n&Z>eIm_SP=62r?jXPdLhPa>9=Z6=$^tmlAmYhk)LmFA-}*Zpv?=-Lg&!aU&CU27%m%Z8yq)(um?)a7n`BC+N|SaHQAW7qu0%Ru4@4wOvXqu=$!2dC z>7qJFj^t7&Px4e7=_=jGcbD$e?;$;iGxe07s+IKOJ;R6` zi8)Ru<~p62gH9aA`G=z!Tca6|qy9)4NqqEpIf1L3C@1ok;>mI{EjdL_q0Xsj&os2> z>C_yB4i$9h7_NSXoS{N8R>snXGv!R~$&Qn8s*{XI!)BvlClH^VC=*qdoGoYb?%O0H z^tm!wCabP8Mc^EnDpOTDTKGcBr^z&;*H|*Fv1C|Z%Da*gnISXSdzs8s-O)tQ- z(^G6G)(^^q^!Fj|Tz8a*dFm}!9^nplM_C~&$Un-R?2fWhR+4{Q?49h@vYPX(m-Sq0 zqikgTq&&&`X?dFUv+^wK=j1uoFUSk5H_K+$FU!lUUy)Z>zb3D-enZ}1{ieK0YYT~r zXUkji7Wub{j%Uj|@(%fTiIQhakra`Ck7#+eyf5#Q|A44@wtOfblK+V4dA58kACoU8 zik>Z7WDEIEh^A-Dr-B7#XEoN_WE*|oF5Bt#XYv{O9kPS`=khuEowAes7xD%95-B0S zOLmdpExXC@kv-%~rIdV`l#wr&a`M=gtg$WOMr=#g2YE*}B0l##azjjE+>_Tl=a(BY zyfYgK3D5iG+8I=}u`{SLb_P|gm_ftb!Osk3s;_;mvSELQqF^2${M?r*-fiZXrOA1FBdG0xlYVzM~r@@s=KX?l%>^| z1lw*6`|WRwT;|_a%&%>jyV~(?W78#%A6YKhZR3)|Y?=;iSyzz3?8h6$tiz3!{+GE_ zyIVd@T77$hZAQzLS}g5AuPt2~7uyTle!JuZoBFlwyX{@mr7g!ZO+&R{38GjU+r%zJ z9$Q%KS+jwqTga_#NftSAzw9BlB)EE(t7FR=Y0$jIcAwpw&bS#@%hDkj(Wc`R)H`$? zv^=<$JucOgruBlow#4QFIt2S|-|dnbf#6q5>n`xAecQb?+-lc$8!Vj~axESA|Di0c zel!|K@cZ=2(k->v7*1nq>3sHDL2890+tdyVw`mGwxalZb`Aww^INT;oLavn8fPkkg zUj+zsfaR~|NbOH;Q!PJy+o*jG-DkNhKn~YSZ$Q&}x#*fhVR<)&R`j7Iw4sjmx2<*y zH^82`C2HF8|GP^{52Vo>y9B?RYVDv;?Ob%Wof|1jSF6L)L7?X{$T!z&!N|0)KOYs{ z5}Ydy3U`DrtiB4gKK~ryep%gbmmJP(shonPww3o_vD+NSRgLtv=dz2{UxDTdG>Sda z-Vw0cGR2FwUW(_k>i5}_fL{V`vFEV;Q|MtESqTt9zuJ2CeAu|?)zmq^>o#@WBX8YB z8~C*;?>6QeWhm9!6rTnoW5=Qq0k2wqZ8|IEI6k*MvAt^Av!Dgd*8y#8-)*m(-b?CI zKYI;VZz(w8INy&k(#NlRyR<`)|(NW z!DI)&O|SZG??Zm~sQ=xqew+H8sz0K>e02Tx4E(T_bv59x=AHLuW*>XrI2y-NSZ z#+>zPy@sgsS{rlL8;Cha^^^K3{j`2YKl?+DkqooRJPV#9J#StxFPhEfCG)Z=Ft3d$^M-lT6q>ip+vXkft|>C_nfJ{H=0o$5`PdYjEkEoiX>C3seM_xNoAyRQU%E)Rgz+6FR6<3C21dNKPgU1kdmZoQVpq=R7d)X zbb$0$pzn zq^{OAx|Y4K6Pfu^m+K1c=}H~bdvz71*VbRdaOXtySNecHKxroN-;?0iQAD5e)MC9!}G?BRh#N37vI~&7uTH}b4P30LaOP!7!-x-~mjSXk# OTq~7h)i|A0>VE)w&S2#L diff --git a/QKSMS/src/main/java/android/annotation/SdkConstant.java b/QKSMS/src/main/java/android/annotation/SdkConstant.java deleted file mode 100644 index 8fcefb571..000000000 --- a/QKSMS/src/main/java/android/annotation/SdkConstant.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2008 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.annotation; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * Indicates a constant field value should be exported to be used in the SDK tools. - * - * @hide - */ -@Target({ElementType.FIELD}) -@Retention(RetentionPolicy.SOURCE) -public @interface SdkConstant { - public enum SdkConstantType { - ACTIVITY_INTENT_ACTION, BROADCAST_INTENT_ACTION, SERVICE_ACTION, INTENT_CATEGORY, FEATURE - } - - SdkConstantType value(); -} diff --git a/QKSMS/src/main/java/android/database/sqlite/SqliteWrapper.java b/QKSMS/src/main/java/android/database/sqlite/SqliteWrapper.java deleted file mode 100644 index f0ed1a714..000000000 --- a/QKSMS/src/main/java/android/database/sqlite/SqliteWrapper.java +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Copyright (C) 2008 Esmertec AG. - * Copyright (C) 2008 The Android Open Source Project - * Copyright (C) 2015 QK Labs - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.database.sqlite; - -import android.content.ContentResolver; -import android.content.ContentValues; -import android.content.Context; -import android.database.Cursor; -import android.net.Uri; -import android.util.Log; -import android.widget.Toast; - -/** - * @hide - */ - -public final class SqliteWrapper { - private static final String TAG = "SqliteWrapper"; - private static final String SQLITE_EXCEPTION_DETAIL_MESSAGE - = "unable to open database file"; - - private SqliteWrapper() { - // Forbidden being instantiated. - } - - // FIXME: need to optimize this method. - private static boolean isLowMemory(SQLiteException e) { - return e.getMessage().equals(SQLITE_EXCEPTION_DETAIL_MESSAGE); - } - - public static void checkSQLiteException(Context context, SQLiteException e) { - if (isLowMemory(e)) { - Toast.makeText(context, "Low Memory", - Toast.LENGTH_SHORT).show(); - } else { - throw e; - } - } - - public static Cursor query(Context context, ContentResolver resolver, Uri uri, - String[] projection, String selection, String[] selectionArgs, String sortOrder) { - try { - return resolver.query(uri, projection, selection, selectionArgs, sortOrder); - } catch (SQLiteException e) { - Log.e(TAG, "Catch a SQLiteException when query: ", e); - checkSQLiteException(context, e); - return null; - } - } - - @SuppressWarnings("deprecation") - public static boolean requery(Context context, Cursor cursor) { - try { - return cursor.requery(); - } catch (SQLiteException e) { - Log.e(TAG, "Catch a SQLiteException when requery: ", e); - checkSQLiteException(context, e); - return false; - } - } - - public static int update(Context context, ContentResolver resolver, Uri uri, - ContentValues values, String where, String[] selectionArgs) { - try { - return resolver.update(uri, values, where, selectionArgs); - } catch (SQLiteException e) { - Log.e(TAG, "Catch a SQLiteException when update: ", e); - checkSQLiteException(context, e); - return -1; - } - } - - public static int delete(Context context, ContentResolver resolver, Uri uri, - String where, String[] selectionArgs) { - try { - return resolver.delete(uri, where, selectionArgs); - } catch (SQLiteException e) { - Log.e(TAG, "Catch a SQLiteException when delete: ", e); - checkSQLiteException(context, e); - return -1; - } - } - - public static Uri insert(Context context, ContentResolver resolver, - Uri uri, ContentValues values) { - try { - return resolver.insert(uri, values); - } catch (SQLiteException e) { - Log.e(TAG, "Catch a SQLiteException when insert: ", e); - checkSQLiteException(context, e); - return null; - } - } -} diff --git a/QKSMS/src/main/java/android/location/Country.java b/QKSMS/src/main/java/android/location/Country.java deleted file mode 100644 index 7c1485d88..000000000 --- a/QKSMS/src/main/java/android/location/Country.java +++ /dev/null @@ -1,202 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License - */ - -package android.location; - -import android.os.Parcel; -import android.os.Parcelable; -import android.os.SystemClock; - -import java.util.Locale; - -/** - * This class wraps the country information. - * - * @hide - */ -public class Country implements Parcelable { - /** - * The country code came from the mobile network - */ - public static final int COUNTRY_SOURCE_NETWORK = 0; - - /** - * The country code came from the location service - */ - public static final int COUNTRY_SOURCE_LOCATION = 1; - - /** - * The country code was read from the SIM card - */ - public static final int COUNTRY_SOURCE_SIM = 2; - - /** - * The country code came from the system locale setting - */ - public static final int COUNTRY_SOURCE_LOCALE = 3; - - /** - * The ISO 3166-1 two letters country code. - */ - private final String mCountryIso; - - /** - * Where the country code came from. - */ - private final int mSource; - - private int mHashCode; - - /** - * Time that this object was created (which we assume to be the time that the source was - * consulted). This time is in milliseconds since boot up. - */ - private final long mTimestamp; - - /** - * @param countryIso the ISO 3166-1 two letters country code. - * @param source where the countryIso came from, could be one of below - * values - *

- *

- */ - public Country(final String countryIso, final int source) { - if (countryIso == null || source < COUNTRY_SOURCE_NETWORK - || source > COUNTRY_SOURCE_LOCALE) { - throw new IllegalArgumentException(); - } - mCountryIso = countryIso.toUpperCase(Locale.US); - mSource = source; - mTimestamp = SystemClock.elapsedRealtime(); - } - - private Country(final String countryIso, final int source, long timestamp) { - if (countryIso == null || source < COUNTRY_SOURCE_NETWORK - || source > COUNTRY_SOURCE_LOCALE) { - throw new IllegalArgumentException(); - } - mCountryIso = countryIso.toUpperCase(Locale.US); - mSource = source; - mTimestamp = timestamp; - } - - public Country(Country country) { - mCountryIso = country.mCountryIso; - mSource = country.mSource; - mTimestamp = country.mTimestamp; - } - - /** - * @return the ISO 3166-1 two letters country code - */ - public final String getCountryIso() { - return mCountryIso; - } - - /** - * @return where the country code came from, could be one of below values - *

- *

    - *
  • {@link #COUNTRY_SOURCE_NETWORK}
  • - *
  • {@link #COUNTRY_SOURCE_LOCATION}
  • - *
  • {@link #COUNTRY_SOURCE_SIM}
  • - *
  • {@link #COUNTRY_SOURCE_LOCALE}
  • - *
- */ - public final int getSource() { - return mSource; - } - - /** - * Returns the time that this object was created (which we assume to be the time that the source - * was consulted). - */ - public final long getTimestamp() { - return mTimestamp; - } - - public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { - public Country createFromParcel(Parcel in) { - return new Country(in.readString(), in.readInt(), in.readLong()); - } - - public Country[] newArray(int size) { - return new Country[size]; - } - }; - - public int describeContents() { - return 0; - } - - public void writeToParcel(Parcel parcel, int flags) { - parcel.writeString(mCountryIso); - parcel.writeInt(mSource); - parcel.writeLong(mTimestamp); - } - - /** - * Returns true if this {@link Country} is equivalent to the given object. This ignores - * the timestamp value and just checks for equivalence of countryIso and source values. - * Returns false otherwise. - */ - @Override - public boolean equals(Object object) { - if (object == this) { - return true; - } - if (object instanceof Country) { - Country c = (Country) object; - // No need to check the equivalence of the timestamp - return mCountryIso.equals(c.getCountryIso()) && mSource == c.getSource(); - } - return false; - } - - @Override - public int hashCode() { - int hash = mHashCode; - if (hash == 0) { - hash = 17; - hash = hash * 13 + mCountryIso.hashCode(); - hash = hash * 13 + mSource; - mHashCode = hash; - } - return mHashCode; - } - - /** - * Compare the specified country to this country object ignoring the source - * and timestamp fields, return true if the countryIso fields are equal - * - * @param country the country to compare - * @return true if the specified country's countryIso field is equal to this - * country's, false otherwise. - */ - public boolean equalsIgnoreSource(Country country) { - return country != null && mCountryIso.equals(country.getCountryIso()); - } - - @Override - public String toString() { - return "Country {ISO=" + mCountryIso + ", source=" + mSource + ", time=" + mTimestamp + "}"; - } -} diff --git a/QKSMS/src/main/java/android/location/CountryDetector.java b/QKSMS/src/main/java/android/location/CountryDetector.java deleted file mode 100644 index a90a31855..000000000 --- a/QKSMS/src/main/java/android/location/CountryDetector.java +++ /dev/null @@ -1,137 +0,0 @@ -/* - * Copyright (C) 2010, The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.location; - -import android.os.Handler; -import android.os.Looper; - -import java.util.HashMap; - -/** - * This class provides access to the system country detector service. This - * service allows applications to obtain the country that the user is in. - *

- * The country will be detected in order of reliability, like - *

    - *
  • Mobile network
  • - *
  • Location
  • - *
  • SIM's country
  • - *
  • Phone's locale
  • - *
- *

- * Call the {@link #detectCountry()} to get the available country immediately. - *

- * To be notified of the future country change, use the - * {@link #addCountryListener} - *

- *

- * You do not instantiate this class directly; instead, retrieve it through - * {@link android.content.Context#getSystemService - * Context.getSystemService(Context.COUNTRY_DETECTOR)}. - *

- * Both ACCESS_FINE_LOCATION and ACCESS_COARSE_LOCATION permissions are needed. - * - * @hide - */ -public class CountryDetector { - - /** - * The class to wrap the ICountryListener.Stub and CountryListener objects - * together. The CountryListener will be notified through the specific - * looper once the country changed and detected. - */ - private final static class ListenerTransport implements ICountryListener { - - private final CountryListener mListener; - - private final Handler mHandler; - - public ListenerTransport(CountryListener listener, Looper looper) { - mListener = listener; - if (looper != null) { - mHandler = new Handler(looper); - } else { - mHandler = new Handler(); - } - } - - public void onCountryDetected(final Country country) { - mHandler.post(new Runnable() { - public void run() { - mListener.onCountryDetected(country); - } - }); - } - } - - private final static String TAG = "CountryDetector"; - private final ICountryDetector mService; - private final HashMap mListeners; - - /** - * @hide - hide this constructor because it has a parameter of type - * ICountryDetector, which is a system private class. The right way to - * create an instance of this class is using the factory - * Context.getSystemService. - */ - public CountryDetector(ICountryDetector service) { - mService = service; - mListeners = new HashMap<>(); - } - - /** - * Start detecting the country that the user is in. - * - * @return the country if it is available immediately, otherwise null will - * be returned. - */ - public Country detectCountry() { - return mService.detectCountry(); - } - - /** - * Add a listener to receive the notification when the country is detected - * or changed. - * - * @param listener will be called when the country is detected or changed. - * @param looper a Looper object whose message queue will be used to - * implement the callback mechanism. If looper is null then the - * callbacks will be called on the main thread. - */ - public void addCountryListener(CountryListener listener, Looper looper) { - synchronized (mListeners) { - if (!mListeners.containsKey(listener)) { - ListenerTransport transport = new ListenerTransport(listener, looper); - mService.addCountryListener(transport); - mListeners.put(listener, transport); - } - } - } - - /** - * Remove the listener - */ - public void removeCountryListener(CountryListener listener) { - synchronized (mListeners) { - ListenerTransport transport = mListeners.get(listener); - if (transport != null) { - mListeners.remove(listener); - mService.removeCountryListener(transport); - } - } - } -} diff --git a/QKSMS/src/main/java/android/location/CountryListener.java b/QKSMS/src/main/java/android/location/CountryListener.java deleted file mode 100644 index e36db412e..000000000 --- a/QKSMS/src/main/java/android/location/CountryListener.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License - */ - -package android.location; - -/** - * The listener for receiving the notification when the country is detected or - * changed - * - * @hide - */ -public interface CountryListener { - /** - * @param country the changed or detected country. - */ - void onCountryDetected(Country country); -} diff --git a/QKSMS/src/main/java/android/location/ICountryDetector.java b/QKSMS/src/main/java/android/location/ICountryDetector.java deleted file mode 100644 index 99aca8647..000000000 --- a/QKSMS/src/main/java/android/location/ICountryDetector.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (C) 2010, The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.location; - -/** - * The API for detecting the country where the user is. - * - * {@hide} - */ -interface ICountryDetector -{ - /** - * Start detecting the country that the user is in. - * @return the country if it is available immediately, otherwise null will be returned. - */ - Country detectCountry(); - - /** - * Add a listener to receive the notification when the country is detected or changed. - */ - void addCountryListener(ICountryListener listener); - - /** - * Remove the listener - */ - void removeCountryListener(ICountryListener listener); -} diff --git a/QKSMS/src/main/java/android/location/ICountryListener.java b/QKSMS/src/main/java/android/location/ICountryListener.java deleted file mode 100644 index d211b4db9..000000000 --- a/QKSMS/src/main/java/android/location/ICountryListener.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (C) 2010, The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.location; - -/** - * {@hide} - */ - -interface ICountryListener -{ - void onCountryDetected(Country country); -} diff --git a/QKSMS/src/main/java/android/net/ConnectivityManager.java b/QKSMS/src/main/java/android/net/ConnectivityManager.java deleted file mode 100644 index 671ea25eb..000000000 --- a/QKSMS/src/main/java/android/net/ConnectivityManager.java +++ /dev/null @@ -1,989 +0,0 @@ -/* - * Copyright (C) 2008 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.net; - -import android.annotation.SdkConstant; -import android.annotation.SdkConstant.SdkConstantType; -import android.content.Context; -import android.os.Binder; -import android.os.Build.VERSION_CODES; -import android.os.RemoteException; -import android.provider.Settings; - -import java.net.InetAddress; - -import static com.android.internal.util.Preconditions.checkNotNull; - -/** - * Class that answers queries about the state of network connectivity. It also - * notifies applications when network connectivity changes. Get an instance - * of this class by calling - * {@link android.content.Context#getSystemService(String) Context.getSystemService(Context.CONNECTIVITY_SERVICE)}. - *

- * The primary responsibilities of this class are to: - *

    - *
  1. Monitor network connections (Wi-Fi, GPRS, UMTS, etc.)
  2. - *
  3. Send broadcast intents when network connectivity changes
  4. - *
  5. Attempt to "fail over" to another network when connectivity to a network - * is lost
  6. - *
  7. Provide an API that allows applications to query the coarse-grained or fine-grained - * state of the available networks
  8. - *
- */ -public class ConnectivityManager { - /** - * A change in network connectivity has occurred. A connection has either - * been established or lost. The NetworkInfo for the affected network is - * sent as an extra; it should be consulted to see what kind of - * connectivity event occurred. - *

- * If this is a connection that was the result of failing over from a - * disconnected network, then the FAILOVER_CONNECTION boolean extra is - * set to true. - *

- * For a loss of connectivity, if the connectivity manager is attempting - * to connect (or has already connected) to another network, the - * NetworkInfo for the new network is also passed as an extra. This lets - * any receivers of the broadcast know that they should not necessarily - * tell the user that no data traffic will be possible. Instead, the - * reciever should expect another broadcast soon, indicating either that - * the failover attempt succeeded (and so there is still overall data - * connectivity), or that the failover attempt failed, meaning that all - * connectivity has been lost. - *

- * For a disconnect event, the boolean extra EXTRA_NO_CONNECTIVITY - * is set to {@code true} if there are no connected networks at all. - */ - public static final String CONNECTIVITY_ACTION = "android.net.conn.CONNECTIVITY_CHANGE"; - - /** - * Identical to {@link #CONNECTIVITY_ACTION} broadcast, but sent without any - * applicable {@link Settings.Secure#CONNECTIVITY_CHANGE_DELAY}. - * - * @hide - */ - public static final String CONNECTIVITY_ACTION_IMMEDIATE = - "android.net.conn.CONNECTIVITY_CHANGE_IMMEDIATE"; - - /** - * The lookup key for a {@link NetworkInfo} object. Retrieve with - * {@link android.content.Intent#getParcelableExtra(String)}. - * - * @see #EXTRA_NETWORK_TYPE - * @deprecated Since {@link NetworkInfo} can vary based on UID, applications - * should always obtain network information through - * {@link #getActiveNetworkInfo()} or - * {@link #getAllNetworkInfo()}. - */ - @Deprecated - public static final String EXTRA_NETWORK_INFO = "networkInfo"; - - /** - * Network type which triggered a {@link #CONNECTIVITY_ACTION} broadcast. - * Can be used with {@link #getNetworkInfo(int)} to get {@link NetworkInfo} - * state based on the calling application. - * - * @see android.content.Intent#getIntExtra(String, int) - */ - public static final String EXTRA_NETWORK_TYPE = "networkType"; - - /** - * The lookup key for a boolean that indicates whether a connect event - * is for a network to which the connectivity manager was failing over - * following a disconnect on another network. - * Retrieve it with {@link android.content.Intent#getBooleanExtra(String, boolean)}. - */ - public static final String EXTRA_IS_FAILOVER = "isFailover"; - /** - * The lookup key for a {@link NetworkInfo} object. This is supplied when - * there is another network that it may be possible to connect to. Retrieve with - * {@link android.content.Intent#getParcelableExtra(String)}. - */ - public static final String EXTRA_OTHER_NETWORK_INFO = "otherNetwork"; - /** - * The lookup key for a boolean that indicates whether there is a - * complete lack of connectivity, i.e., no network is available. - * Retrieve it with {@link android.content.Intent#getBooleanExtra(String, boolean)}. - */ - public static final String EXTRA_NO_CONNECTIVITY = "noConnectivity"; - /** - * The lookup key for a string that indicates why an attempt to connect - * to a network failed. The string has no particular structure. It is - * intended to be used in notifications presented to users. Retrieve - * it with {@link android.content.Intent#getStringExtra(String)}. - */ - public static final String EXTRA_REASON = "reason"; - /** - * The lookup key for a string that provides optionally supplied - * extra information about the network state. The information - * may be passed up from the lower networking layers, and its - * meaning may be specific to a particular network type. Retrieve - * it with {@link android.content.Intent#getStringExtra(String)}. - */ - public static final String EXTRA_EXTRA_INFO = "extraInfo"; - /** - * The lookup key for an int that provides information about - * our connection to the internet at large. 0 indicates no connection, - * 100 indicates a great connection. Retrieve it with - * {@link android.content.Intent#getIntExtra(String, int)}. - * {@hide} - */ - public static final String EXTRA_INET_CONDITION = "inetCondition"; - - /** - * Broadcast action to indicate the change of data activity status - * (idle or active) on a network in a recent period. - * The network becomes active when data transimission is started, or - * idle if there is no data transimition for a period of time. - * {@hide} - */ - @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) - public static final String ACTION_DATA_ACTIVITY_CHANGE = "android.net.conn.DATA_ACTIVITY_CHANGE"; - /** - * The lookup key for an enum that indicates the network device type on which this data activity - * change happens. - * {@hide} - */ - public static final String EXTRA_DEVICE_TYPE = "deviceType"; - /** - * The lookup key for a boolean that indicates the device is active or not. {@code true} means - * it is actively sending or receiving data and {@code false} means it is idle. - * {@hide} - */ - public static final String EXTRA_IS_ACTIVE = "isActive"; - - /** - * Broadcast Action: The setting for background data usage has changed - * values. Use {@link #getBackgroundDataSetting()} to get the current value. - *

- * If an application uses the network in the background, it should listen - * for this broadcast and stop using the background data if the value is - * {@code false}. - *

- * - * @deprecated As of {@link VERSION_CODES#ICE_CREAM_SANDWICH}, availability - * of background data depends on several combined factors, and - * this broadcast is no longer sent. Instead, when background - * data is unavailable, {@link #getActiveNetworkInfo()} will now - * appear disconnected. During first boot after a platform - * upgrade, this broadcast will be sent once if - * {@link #getBackgroundDataSetting()} was {@code false} before - * the upgrade. - */ - @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) - @Deprecated - public static final String ACTION_BACKGROUND_DATA_SETTING_CHANGED = - "android.net.conn.BACKGROUND_DATA_SETTING_CHANGED"; - - /** - * Broadcast Action: The network connection may not be good - * uses {@code ConnectivityManager.EXTRA_INET_CONDITION} and - * {@code ConnectivityManager.EXTRA_NETWORK_INFO} to specify - * the network and it's condition. - * - * @hide - */ - public static final String INET_CONDITION_ACTION = - "android.net.conn.INET_CONDITION_ACTION"; - - /** - * Broadcast Action: A tetherable connection has come or gone - * TODO - finish the doc - * - * @hide - */ - public static final String ACTION_TETHER_STATE_CHANGED = - "android.net.conn.TETHER_STATE_CHANGED"; - - /** - * @hide gives a String[] - */ - public static final String EXTRA_AVAILABLE_TETHER = "availableArray"; - - /** - * @hide gives a String[] - */ - public static final String EXTRA_ACTIVE_TETHER = "activeArray"; - - /** - * @hide gives a String[] - */ - public static final String EXTRA_ERRORED_TETHER = "erroredArray"; - - /** - * The absence of APN.. - * - * @hide - */ - public static final int TYPE_NONE = -1; - - /** - * The Default Mobile data connection. When active, all data traffic - * will use this connection by default. - */ - public static final int TYPE_MOBILE = 0; - /** - * The Default WIFI data connection. When active, all data traffic - * will use this connection by default. - */ - public static final int TYPE_WIFI = 1; - /** - * An MMS-specific Mobile data connection. This connection may be the - * same as {@link #TYPE_MOBILE} but it may be different. This is used - * by applications needing to talk to the carrier's Multimedia Messaging - * Service servers. It may coexist with default data connections. - */ - public static final int TYPE_MOBILE_MMS = 2; - /** - * A SUPL-specific Mobile data connection. This connection may be the - * same as {@link #TYPE_MOBILE} but it may be different. This is used - * by applications needing to talk to the carrier's Secure User Plane - * Location servers for help locating the device. It may coexist with - * default data connections. - */ - public static final int TYPE_MOBILE_SUPL = 3; - /** - * A DUN-specific Mobile data connection. This connection may be the - * same as {@link #TYPE_MOBILE} but it may be different. This is used - * by applicaitons performing a Dial Up Networking bridge so that - * the carrier is aware of DUN traffic. It may coexist with default data - * connections. - */ - public static final int TYPE_MOBILE_DUN = 4; - /** - * A High Priority Mobile data connection. This connection is typically - * the same as {@link #TYPE_MOBILE} but the routing setup is different. - * Only requesting processes will have access to the Mobile DNS servers - * and only IP's explicitly requested via {@link #requestRouteToHost} - * will route over this interface if a default route exists. - */ - public static final int TYPE_MOBILE_HIPRI = 5; - /** - * The Default WiMAX data connection. When active, all data traffic - * will use this connection by default. - */ - public static final int TYPE_WIMAX = 6; - - /** - * The Default Bluetooth data connection. When active, all data traffic - * will use this connection by default. - */ - public static final int TYPE_BLUETOOTH = 7; - - /** - * Dummy data connection. This should not be used on shipping devices. - */ - public static final int TYPE_DUMMY = 8; - - /** - * The Default Ethernet data connection. When active, all data traffic - * will use this connection by default. - */ - public static final int TYPE_ETHERNET = 9; - - /** - * Over the air Adminstration. - * {@hide} - */ - public static final int TYPE_MOBILE_FOTA = 10; - - /** - * IP Multimedia Subsystem - * {@hide} - */ - public static final int TYPE_MOBILE_IMS = 11; - - /** - * Carrier Branded Services - * {@hide} - */ - public static final int TYPE_MOBILE_CBS = 12; - - /** - * A Wi-Fi p2p connection. Only requesting processes will have access to - * the peers connected. - * {@hide} - */ - public static final int TYPE_WIFI_P2P = 13; - - /** - * {@hide} - */ - public static final int MAX_RADIO_TYPE = TYPE_WIFI_P2P; - - /** - * {@hide} - */ - public static final int MAX_NETWORK_TYPE = TYPE_WIFI_P2P; - - public static final int DEFAULT_NETWORK_PREFERENCE = TYPE_WIFI; - - /** - * Default value for {@link Settings.Global#CONNECTIVITY_CHANGE_DELAY} in - * milliseconds. - * - * @hide - */ - public static final int CONNECTIVITY_CHANGE_DELAY_DEFAULT = 3000; - - private final IConnectivityManager mService; - - public static boolean isNetworkTypeValid(int networkType) { - return networkType >= 0 && networkType <= MAX_NETWORK_TYPE; - } - - - /** - * {@hide} - */ - public static String getNetworkTypeName(int type) { - switch (type) { - case TYPE_MOBILE: - return "MOBILE"; - case TYPE_WIFI: - return "WIFI"; - case TYPE_MOBILE_MMS: - return "MOBILE_MMS"; - case TYPE_MOBILE_SUPL: - return "MOBILE_SUPL"; - case TYPE_MOBILE_DUN: - return "MOBILE_DUN"; - case TYPE_MOBILE_HIPRI: - return "MOBILE_HIPRI"; - case TYPE_WIMAX: - return "WIMAX"; - case TYPE_BLUETOOTH: - return "BLUETOOTH"; - case TYPE_DUMMY: - return "DUMMY"; - case TYPE_ETHERNET: - return "ETHERNET"; - case TYPE_MOBILE_FOTA: - return "MOBILE_FOTA"; - case TYPE_MOBILE_IMS: - return "MOBILE_IMS"; - case TYPE_MOBILE_CBS: - return "MOBILE_CBS"; - case TYPE_WIFI_P2P: - return "WIFI_P2P"; - default: - return Integer.toString(type); - } - } - - /** - * {@hide} - */ - public static boolean isNetworkTypeMobile(int networkType) { - switch (networkType) { - case TYPE_MOBILE: - case TYPE_MOBILE_MMS: - case TYPE_MOBILE_SUPL: - case TYPE_MOBILE_DUN: - case TYPE_MOBILE_HIPRI: - case TYPE_MOBILE_FOTA: - case TYPE_MOBILE_IMS: - case TYPE_MOBILE_CBS: - return true; - default: - return false; - } - } - - public void setNetworkPreference(int preference) { - try { - mService.setNetworkPreference(preference); - } catch (RemoteException e) { - } - } - - public int getNetworkPreference() { - try { - return mService.getNetworkPreference(); - } catch (RemoteException e) { - return -1; - } - } - - /** - * Returns details about the currently active data network. When connected, - * this network is the default route for outgoing connections. You should - * always check {@link NetworkInfo#isConnected()} before initiating network - * traffic. This may return {@code null} when no networks are available. - *

This method requires the caller to hold the permission - * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. - */ - public NetworkInfo getActiveNetworkInfo() { - try { - return mService.getActiveNetworkInfo(); - } catch (RemoteException e) { - return null; - } - } - - /** - * {@hide} - */ - public NetworkInfo getActiveNetworkInfoForUid(int uid) { - try { - return mService.getActiveNetworkInfoForUid(uid); - } catch (RemoteException e) { - return null; - } - } - - public NetworkInfo getNetworkInfo(int networkType) { - try { - return mService.getNetworkInfo(networkType); - } catch (RemoteException e) { - return null; - } - } - - public NetworkInfo[] getAllNetworkInfo() { - try { - return mService.getAllNetworkInfo(); - } catch (RemoteException e) { - return null; - } - } - - /** - * {@hide} - */ - public LinkProperties getActiveLinkProperties() { - try { - return mService.getActiveLinkProperties(); - } catch (RemoteException e) { - return null; - } - } - - /** - * {@hide} - */ - public LinkProperties getLinkProperties(int networkType) { - try { - return mService.getLinkProperties(networkType); - } catch (RemoteException e) { - return null; - } - } - - /** - * {@hide} - */ - public boolean setRadios(boolean turnOn) { - try { - return mService.setRadios(turnOn); - } catch (RemoteException e) { - return false; - } - } - - /** - * {@hide} - */ - public boolean setRadio(int networkType, boolean turnOn) { - try { - return mService.setRadio(networkType, turnOn); - } catch (RemoteException e) { - return false; - } - } - - /** - * Tells the underlying networking system that the caller wants to - * begin using the named feature. The interpretation of {@code feature} - * is completely up to each networking implementation. - *

This method requires the caller to hold the permission - * {@link android.Manifest.permission#CHANGE_NETWORK_STATE}. - * - * @param networkType specifies which network the request pertains to - * @param feature the name of the feature to be used - * @return an integer value representing the outcome of the request. - * The interpretation of this value is specific to each networking - * implementation+feature combination, except that the value {@code -1} - * always indicates failure. - */ - public int startUsingNetworkFeature(int networkType, String feature) { - try { - return mService.startUsingNetworkFeature(networkType, feature, - new Binder()); - } catch (RemoteException e) { - return -1; - } - } - - /** - * Tells the underlying networking system that the caller is finished - * using the named feature. The interpretation of {@code feature} - * is completely up to each networking implementation. - *

This method requires the caller to hold the permission - * {@link android.Manifest.permission#CHANGE_NETWORK_STATE}. - * - * @param networkType specifies which network the request pertains to - * @param feature the name of the feature that is no longer needed - * @return an integer value representing the outcome of the request. - * The interpretation of this value is specific to each networking - * implementation+feature combination, except that the value {@code -1} - * always indicates failure. - */ - public int stopUsingNetworkFeature(int networkType, String feature) { - try { - return mService.stopUsingNetworkFeature(networkType, feature); - } catch (RemoteException e) { - return -1; - } - } - - /** - * Ensure that a network route exists to deliver traffic to the specified - * host via the specified network interface. An attempt to add a route that - * already exists is ignored, but treated as successful. - *

This method requires the caller to hold the permission - * {@link android.Manifest.permission#CHANGE_NETWORK_STATE}. - * - * @param networkType the type of the network over which traffic to the specified - * host is to be routed - * @param hostAddress the IP address of the host to which the route is desired - * @return {@code true} on success, {@code false} on failure - */ - public boolean requestRouteToHost(int networkType, int hostAddress) { - InetAddress inetAddress = NetworkUtils.intToInetAddress(hostAddress); - - return inetAddress != null && requestRouteToHostAddress(networkType, inetAddress); - - } - - /** - * Ensure that a network route exists to deliver traffic to the specified - * host via the specified network interface. An attempt to add a route that - * already exists is ignored, but treated as successful. - * - * @param networkType the type of the network over which traffic to the specified - * host is to be routed - * @param hostAddress the IP address of the host to which the route is desired - * @return {@code true} on success, {@code false} on failure - * @hide - */ - public boolean requestRouteToHostAddress(int networkType, InetAddress hostAddress) { - byte[] address = hostAddress.getAddress(); - try { - return mService.requestRouteToHostAddress(networkType, address); - } catch (RemoteException e) { - return false; - } - } - - /** - * Returns the value of the setting for background data usage. If false, - * applications should not use the network if the application is not in the - * foreground. Developers should respect this setting, and check the value - * of this before performing any background data operations. - *

- * All applications that have background services that use the network - * should listen to {@link #ACTION_BACKGROUND_DATA_SETTING_CHANGED}. - *

- * - * @return Whether background data usage is allowed. - * @deprecated As of {@link VERSION_CODES#ICE_CREAM_SANDWICH}, availability of - * background data depends on several combined factors, and this method will - * always return {@code true}. Instead, when background data is unavailable, - * {@link #getActiveNetworkInfo()} will now appear disconnected. - */ - @Deprecated - public boolean getBackgroundDataSetting() { - // assume that background data is allowed; final authority is - // NetworkInfo which may be blocked. - return true; - } - - /** - * Sets the value of the setting for background data usage. - * - * @param allowBackgroundData Whether an application should use data while - * it is in the background. - * @attr ref android.Manifest.permission#CHANGE_BACKGROUND_DATA_SETTING - * @hide - * @see #getBackgroundDataSetting() - */ - @Deprecated - public void setBackgroundDataSetting(boolean allowBackgroundData) { - // ignored - } - - /** - * Return quota status for the current active network, or {@code null} if no - * network is active. Quota status can change rapidly, so these values - * shouldn't be cached. - * - * @hide - */ - public NetworkQuotaInfo getActiveNetworkQuotaInfo() { - try { - return mService.getActiveNetworkQuotaInfo(); - } catch (RemoteException e) { - return null; - } - } - - /** - * Gets the value of the setting for enabling Mobile data. - * - * @return Whether mobile data is enabled. - * @hide - */ - public boolean getMobileDataEnabled() { - try { - return mService.getMobileDataEnabled(); - } catch (RemoteException e) { - return true; - } - } - - /** - * Sets the persisted value for enabling/disabling Mobile data. - * - * @param enabled Whether the mobile data connection should be - * used or not. - * @hide - */ - public void setMobileDataEnabled(boolean enabled) { - try { - mService.setMobileDataEnabled(enabled); - } catch (RemoteException e) { - } - } - - /** - * {@hide} - */ - public ConnectivityManager(IConnectivityManager service) { - mService = checkNotNull(service, "missing IConnectivityManager"); - } - - /** - * {@hide} - */ - public static ConnectivityManager from(Context context) { - return (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); - } - - /** - * {@hide} - */ - public String[] getTetherableIfaces() { - try { - return mService.getTetherableIfaces(); - } catch (RemoteException e) { - return new String[0]; - } - } - - /** - * {@hide} - */ - public String[] getTetheredIfaces() { - try { - return mService.getTetheredIfaces(); - } catch (RemoteException e) { - return new String[0]; - } - } - - /** - * {@hide} - */ - public String[] getTetheringErroredIfaces() { - try { - return mService.getTetheringErroredIfaces(); - } catch (RemoteException e) { - return new String[0]; - } - } - - /** - * @return error A TETHER_ERROR value indicating success or failure type - * {@hide} - */ - public int tether(String iface) { - try { - return mService.tether(iface); - } catch (RemoteException e) { - return TETHER_ERROR_SERVICE_UNAVAIL; - } - } - - /** - * @return error A TETHER_ERROR value indicating success or failure type - * {@hide} - */ - public int untether(String iface) { - try { - return mService.untether(iface); - } catch (RemoteException e) { - return TETHER_ERROR_SERVICE_UNAVAIL; - } - } - - /** - * {@hide} - */ - public boolean isTetheringSupported() { - try { - return mService.isTetheringSupported(); - } catch (RemoteException e) { - return false; - } - } - - /** - * {@hide} - */ - public String[] getTetherableUsbRegexs() { - try { - return mService.getTetherableUsbRegexs(); - } catch (RemoteException e) { - return new String[0]; - } - } - - /** - * {@hide} - */ - public String[] getTetherableWifiRegexs() { - try { - return mService.getTetherableWifiRegexs(); - } catch (RemoteException e) { - return new String[0]; - } - } - - /** - * {@hide} - */ - public String[] getTetherableBluetoothRegexs() { - try { - return mService.getTetherableBluetoothRegexs(); - } catch (RemoteException e) { - return new String[0]; - } - } - - /** - * {@hide} - */ - public int setUsbTethering(boolean enable) { - try { - return mService.setUsbTethering(enable); - } catch (RemoteException e) { - return TETHER_ERROR_SERVICE_UNAVAIL; - } - } - - /** - * {@hide} - */ - public static final int TETHER_ERROR_NO_ERROR = 0; - /** - * {@hide} - */ - public static final int TETHER_ERROR_UNKNOWN_IFACE = 1; - /** - * {@hide} - */ - public static final int TETHER_ERROR_SERVICE_UNAVAIL = 2; - /** - * {@hide} - */ - public static final int TETHER_ERROR_UNSUPPORTED = 3; - /** - * {@hide} - */ - public static final int TETHER_ERROR_UNAVAIL_IFACE = 4; - /** - * {@hide} - */ - public static final int TETHER_ERROR_MASTER_ERROR = 5; - /** - * {@hide} - */ - public static final int TETHER_ERROR_TETHER_IFACE_ERROR = 6; - /** - * {@hide} - */ - public static final int TETHER_ERROR_UNTETHER_IFACE_ERROR = 7; - /** - * {@hide} - */ - public static final int TETHER_ERROR_ENABLE_NAT_ERROR = 8; - /** - * {@hide} - */ - public static final int TETHER_ERROR_DISABLE_NAT_ERROR = 9; - /** - * {@hide} - */ - public static final int TETHER_ERROR_IFACE_CFG_ERROR = 10; - - /** - * @param iface The name of the interface we're interested in - * @return error The error code of the last error tethering or untethering the named - * interface - * {@hide} - */ - public int getLastTetherError(String iface) { - try { - return mService.getLastTetherError(iface); - } catch (RemoteException e) { - return TETHER_ERROR_SERVICE_UNAVAIL; - } - } - - /** - * Ensure the device stays awake until we connect with the next network - * - * @param forWhome The name of the network going down for logging purposes - * @return {@code true} on success, {@code false} on failure - * {@hide} - */ - public boolean requestNetworkTransitionWakelock(String forWhom) { - try { - mService.requestNetworkTransitionWakelock(forWhom); - return true; - } catch (RemoteException e) { - return false; - } - } - - /** - * @param networkType The type of network you want to report on - * @param percentage The quality of the connection 0 is bad, 100 is good - * {@hide} - */ - public void reportInetCondition(int networkType, int percentage) { - try { - mService.reportInetCondition(networkType, percentage); - } catch (RemoteException e) { - } - } - - /** - * @param proxyProperties The definition for the new global http proxy - * {@hide} - */ - public void setGlobalProxy(ProxyProperties p) { - try { - mService.setGlobalProxy(p); - } catch (RemoteException e) { - } - } - - /** - * @return proxyProperties for the current global proxy - * {@hide} - */ - public ProxyProperties getGlobalProxy() { - try { - return mService.getGlobalProxy(); - } catch (RemoteException e) { - return null; - } - } - - /** - * @return proxyProperties for the current proxy (global if set, network specific if not) - * {@hide} - */ - public ProxyProperties getProxy() { - try { - return mService.getProxy(); - } catch (RemoteException e) { - return null; - } - } - - /** - * @param networkType The network who's dependence has changed - * @param met Boolean - true if network use is ok, false if not - * {@hide} - */ - public void setDataDependency(int networkType, boolean met) { - try { - mService.setDataDependency(networkType, met); - } catch (RemoteException e) { - } - } - - /** - * Returns true if the hardware supports the given network type - * else it returns false. This doesn't indicate we have coverage - * or are authorized onto a network, just whether or not the - * hardware supports it. For example a gsm phone without a sim - * should still return true for mobile data, but a wifi only tablet - * would return false. - * - * @param networkType The nework type we'd like to check - * @return true if supported, else false - * @hide - */ - public boolean isNetworkSupported(int networkType) { - try { - return mService.isNetworkSupported(networkType); - } catch (RemoteException e) { - } - return false; - } - - /** - * Returns if the currently active data network is metered. A network is - * classified as metered when the user is sensitive to heavy data usage on - * that connection. You should check this before doing large data transfers, - * and warn the user or delay the operation until another network is - * available. - */ - public boolean isActiveNetworkMetered() { - try { - return mService.isActiveNetworkMetered(); - } catch (RemoteException e) { - return false; - } - } - - /** - * {@hide} - */ - public boolean updateLockdownVpn() { - try { - return mService.updateLockdownVpn(); - } catch (RemoteException e) { - return false; - } - } - - /** - * {@hide} - */ - public void captivePortalCheckComplete(NetworkInfo info) { - try { - mService.captivePortalCheckComplete(info); - } catch (RemoteException e) { - } - } - -} diff --git a/QKSMS/src/main/java/android/net/DhcpInfoInternal.java b/QKSMS/src/main/java/android/net/DhcpInfoInternal.java deleted file mode 100644 index 1e383dbaa..000000000 --- a/QKSMS/src/main/java/android/net/DhcpInfoInternal.java +++ /dev/null @@ -1,167 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * Copyright (C) 2015 QK Labs - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.net; - -import android.text.TextUtils; -import android.util.Log; - -import java.net.Inet4Address; -import java.net.InetAddress; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; - -/** - * A simple object for retrieving the results of a DHCP request. - * Replaces (internally) the IPv4-only DhcpInfo class. - * - * @hide - */ -public class DhcpInfoInternal { - private static final String TAG = "DhcpInfoInternal"; - - private static final boolean LOCAL_LOGV = false; - public String ipAddress; - public int prefixLength; - - public String dns1; - public String dns2; - - public String serverAddress; - public int leaseDuration; - - /** - * Vendor specific information (from RFC 2132). - */ - public String vendorInfo; - - private Collection mRoutes; - - public DhcpInfoInternal() { - mRoutes = new ArrayList<>(); - } - - public void addRoute(RouteInfo routeInfo) { - mRoutes.add(routeInfo); - } - - public Collection getRoutes() { - return Collections.unmodifiableCollection(mRoutes); - } - - private int convertToInt(String addr) { - if (addr != null) { - try { - InetAddress inetAddress = NetworkUtils.numericToInetAddress(addr); - if (inetAddress instanceof Inet4Address) { - return NetworkUtils.inetAddressToInt(inetAddress); - } - } catch (IllegalArgumentException e) { - } - } - return 0; - } - - public DhcpInfo makeDhcpInfo() { - DhcpInfo info = new DhcpInfo(); - info.ipAddress = convertToInt(ipAddress); - for (RouteInfo route : mRoutes) { - if (route.isDefaultRoute()) { - info.gateway = convertToInt(route.getGateway().getHostAddress()); - break; - } - } - try { - info.netmask = NetworkUtils.prefixLengthToNetmaskInt(prefixLength); - } catch (IllegalArgumentException e) { - } - info.dns1 = convertToInt(dns1); - info.dns2 = convertToInt(dns2); - info.serverAddress = convertToInt(serverAddress); - info.leaseDuration = leaseDuration; - return info; - } - - public LinkAddress makeLinkAddress() { - if (TextUtils.isEmpty(ipAddress)) { - Log.e(TAG, "makeLinkAddress with empty ipAddress"); - return null; - } - return new LinkAddress(NetworkUtils.numericToInetAddress(ipAddress), prefixLength); - } - - public LinkProperties makeLinkProperties() { - LinkProperties p = new LinkProperties(); - p.addLinkAddress(makeLinkAddress()); - for (RouteInfo route : mRoutes) { - p.addRoute(route); - } - //if empty, connectivity configures default DNS - if (!TextUtils.isEmpty(dns1)) { - p.addDns(NetworkUtils.numericToInetAddress(dns1)); - } else { - if (LOCAL_LOGV) Log.v(TAG, "makeLinkProperties with empty dns1!"); - } - if (!TextUtils.isEmpty(dns2)) { - p.addDns(NetworkUtils.numericToInetAddress(dns2)); - } else { - if (LOCAL_LOGV) Log.v(TAG, "makeLinkProperties with empty dns2!"); - } - return p; - } - - /* Updates the DHCP fields that need to be retained from - * original DHCP request if the DHCP renewal shows them as - * being empty - */ - public void updateFromDhcpRequest(DhcpInfoInternal orig) { - if (orig == null) return; - - if (TextUtils.isEmpty(dns1)) { - dns1 = orig.dns1; - } - - if (TextUtils.isEmpty(dns2)) { - dns2 = orig.dns2; - } - - if (mRoutes.isEmpty()) { - for (RouteInfo route : orig.getRoutes()) { - addRoute(route); - } - } - } - - /** - * Test if this DHCP lease includes vendor hint that network link is - * metered, and sensitive to heavy data transfers. - */ - public boolean hasMeteredHint() { - return vendorInfo != null && vendorInfo.contains("ANDROID_METERED"); - } - - public String toString() { - String routeString = ""; - for (RouteInfo route : mRoutes) routeString += route.toString() + " | "; - return "addr: " + ipAddress + "/" + prefixLength + - " mRoutes: " + routeString + - " dns: " + dns1 + "," + dns2 + - " dhcpServer: " + serverAddress + - " leaseDuration: " + leaseDuration; - } -} diff --git a/QKSMS/src/main/java/android/net/IConnectivityManager.java b/QKSMS/src/main/java/android/net/IConnectivityManager.java deleted file mode 100644 index 906c2fb44..000000000 --- a/QKSMS/src/main/java/android/net/IConnectivityManager.java +++ /dev/null @@ -1,1536 +0,0 @@ -/* - * This file is auto-generated. DO NOT MODIFY. - * Original file: frameworks/base/core/java/android/net/IConnectivityManager.aidl - */ -package android.net; -/** - * Interface that answers queries about, and allows changing, the - * state of network connectivity. - */ - -/** - * {@hide} - */ -public interface IConnectivityManager extends android.os.IInterface { - /** - * Local-side IPC implementation stub class. - */ - public abstract static class Stub extends android.os.Binder implements android.net.IConnectivityManager { - private static final String DESCRIPTOR = "android.net.IConnectivityManager"; - - /** - * Construct the stub at attach it to the interface. - */ - public Stub() { - this.attachInterface(this, DESCRIPTOR); - } - - /** - * Cast an IBinder object into an android.net.IConnectivityManager interface, - * generating a proxy if needed. - */ - public static android.net.IConnectivityManager asInterface(android.os.IBinder obj) { - if ((obj == null)) { - return null; - } - android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR); - if (((iin != null) && (iin instanceof android.net.IConnectivityManager))) { - return ((android.net.IConnectivityManager) iin); - } - return new android.net.IConnectivityManager.Stub.Proxy(obj); - } - - @Override - public android.os.IBinder asBinder() { - return this; - } - - @Override - public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException { - switch (code) { - case INTERFACE_TRANSACTION: { - reply.writeString(DESCRIPTOR); - return true; - } - case TRANSACTION_setNetworkPreference: { - data.enforceInterface(DESCRIPTOR); - int _arg0; - _arg0 = data.readInt(); - this.setNetworkPreference(_arg0); - reply.writeNoException(); - return true; - } - case TRANSACTION_getNetworkPreference: { - data.enforceInterface(DESCRIPTOR); - int _result = this.getNetworkPreference(); - reply.writeNoException(); - reply.writeInt(_result); - return true; - } - case TRANSACTION_getActiveNetworkInfo: { - data.enforceInterface(DESCRIPTOR); - android.net.NetworkInfo _result = this.getActiveNetworkInfo(); - reply.writeNoException(); - if ((_result != null)) { - reply.writeInt(1); - _result.writeToParcel(reply, android.os.Parcelable.PARCELABLE_WRITE_RETURN_VALUE); - } else { - reply.writeInt(0); - } - return true; - } - case TRANSACTION_getActiveNetworkInfoForUid: { - data.enforceInterface(DESCRIPTOR); - int _arg0; - _arg0 = data.readInt(); - android.net.NetworkInfo _result = this.getActiveNetworkInfoForUid(_arg0); - reply.writeNoException(); - if ((_result != null)) { - reply.writeInt(1); - _result.writeToParcel(reply, android.os.Parcelable.PARCELABLE_WRITE_RETURN_VALUE); - } else { - reply.writeInt(0); - } - return true; - } - case TRANSACTION_getNetworkInfo: { - data.enforceInterface(DESCRIPTOR); - int _arg0; - _arg0 = data.readInt(); - android.net.NetworkInfo _result = this.getNetworkInfo(_arg0); - reply.writeNoException(); - if ((_result != null)) { - reply.writeInt(1); - _result.writeToParcel(reply, android.os.Parcelable.PARCELABLE_WRITE_RETURN_VALUE); - } else { - reply.writeInt(0); - } - return true; - } - case TRANSACTION_getAllNetworkInfo: { - data.enforceInterface(DESCRIPTOR); - android.net.NetworkInfo[] _result = this.getAllNetworkInfo(); - reply.writeNoException(); - reply.writeTypedArray(_result, android.os.Parcelable.PARCELABLE_WRITE_RETURN_VALUE); - return true; - } - case TRANSACTION_isNetworkSupported: { - data.enforceInterface(DESCRIPTOR); - int _arg0; - _arg0 = data.readInt(); - boolean _result = this.isNetworkSupported(_arg0); - reply.writeNoException(); - reply.writeInt(((_result) ? (1) : (0))); - return true; - } - case TRANSACTION_getActiveLinkProperties: { - data.enforceInterface(DESCRIPTOR); - android.net.LinkProperties _result = this.getActiveLinkProperties(); - reply.writeNoException(); - if ((_result != null)) { - reply.writeInt(1); - _result.writeToParcel(reply, android.os.Parcelable.PARCELABLE_WRITE_RETURN_VALUE); - } else { - reply.writeInt(0); - } - return true; - } - case TRANSACTION_getLinkProperties: { - data.enforceInterface(DESCRIPTOR); - int _arg0; - _arg0 = data.readInt(); - android.net.LinkProperties _result = this.getLinkProperties(_arg0); - reply.writeNoException(); - if ((_result != null)) { - reply.writeInt(1); - _result.writeToParcel(reply, android.os.Parcelable.PARCELABLE_WRITE_RETURN_VALUE); - } else { - reply.writeInt(0); - } - return true; - } - case TRANSACTION_getAllNetworkState: { - data.enforceInterface(DESCRIPTOR); - android.net.NetworkState[] _result = this.getAllNetworkState(); - reply.writeNoException(); - reply.writeTypedArray(_result, android.os.Parcelable.PARCELABLE_WRITE_RETURN_VALUE); - return true; - } - case TRANSACTION_getActiveNetworkQuotaInfo: { - data.enforceInterface(DESCRIPTOR); - android.net.NetworkQuotaInfo _result = this.getActiveNetworkQuotaInfo(); - reply.writeNoException(); - if ((_result != null)) { - reply.writeInt(1); - _result.writeToParcel(reply, android.os.Parcelable.PARCELABLE_WRITE_RETURN_VALUE); - } else { - reply.writeInt(0); - } - return true; - } - case TRANSACTION_isActiveNetworkMetered: { - data.enforceInterface(DESCRIPTOR); - boolean _result = this.isActiveNetworkMetered(); - reply.writeNoException(); - reply.writeInt(((_result) ? (1) : (0))); - return true; - } - case TRANSACTION_setRadios: { - data.enforceInterface(DESCRIPTOR); - boolean _arg0; - _arg0 = (0 != data.readInt()); - boolean _result = this.setRadios(_arg0); - reply.writeNoException(); - reply.writeInt(((_result) ? (1) : (0))); - return true; - } - case TRANSACTION_setRadio: { - data.enforceInterface(DESCRIPTOR); - int _arg0; - _arg0 = data.readInt(); - boolean _arg1; - _arg1 = (0 != data.readInt()); - boolean _result = this.setRadio(_arg0, _arg1); - reply.writeNoException(); - reply.writeInt(((_result) ? (1) : (0))); - return true; - } - case TRANSACTION_startUsingNetworkFeature: { - data.enforceInterface(DESCRIPTOR); - int _arg0; - _arg0 = data.readInt(); - String _arg1; - _arg1 = data.readString(); - android.os.IBinder _arg2; - _arg2 = data.readStrongBinder(); - int _result = this.startUsingNetworkFeature(_arg0, _arg1, _arg2); - reply.writeNoException(); - reply.writeInt(_result); - return true; - } - case TRANSACTION_stopUsingNetworkFeature: { - data.enforceInterface(DESCRIPTOR); - int _arg0; - _arg0 = data.readInt(); - String _arg1; - _arg1 = data.readString(); - int _result = this.stopUsingNetworkFeature(_arg0, _arg1); - reply.writeNoException(); - reply.writeInt(_result); - return true; - } - case TRANSACTION_requestRouteToHost: { - data.enforceInterface(DESCRIPTOR); - int _arg0; - _arg0 = data.readInt(); - int _arg1; - _arg1 = data.readInt(); - boolean _result = this.requestRouteToHost(_arg0, _arg1); - reply.writeNoException(); - reply.writeInt(((_result) ? (1) : (0))); - return true; - } - case TRANSACTION_requestRouteToHostAddress: { - data.enforceInterface(DESCRIPTOR); - int _arg0; - _arg0 = data.readInt(); - byte[] _arg1; - _arg1 = data.createByteArray(); - boolean _result = this.requestRouteToHostAddress(_arg0, _arg1); - reply.writeNoException(); - reply.writeInt(((_result) ? (1) : (0))); - return true; - } - case TRANSACTION_getMobileDataEnabled: { - data.enforceInterface(DESCRIPTOR); - boolean _result = this.getMobileDataEnabled(); - reply.writeNoException(); - reply.writeInt(((_result) ? (1) : (0))); - return true; - } - case TRANSACTION_setMobileDataEnabled: { - data.enforceInterface(DESCRIPTOR); - boolean _arg0; - _arg0 = (0 != data.readInt()); - this.setMobileDataEnabled(_arg0); - reply.writeNoException(); - return true; - } - case TRANSACTION_setPolicyDataEnable: { - data.enforceInterface(DESCRIPTOR); - int _arg0; - _arg0 = data.readInt(); - boolean _arg1; - _arg1 = (0 != data.readInt()); - this.setPolicyDataEnable(_arg0, _arg1); - reply.writeNoException(); - return true; - } - case TRANSACTION_tether: { - data.enforceInterface(DESCRIPTOR); - String _arg0; - _arg0 = data.readString(); - int _result = this.tether(_arg0); - reply.writeNoException(); - reply.writeInt(_result); - return true; - } - case TRANSACTION_untether: { - data.enforceInterface(DESCRIPTOR); - String _arg0; - _arg0 = data.readString(); - int _result = this.untether(_arg0); - reply.writeNoException(); - reply.writeInt(_result); - return true; - } - case TRANSACTION_getLastTetherError: { - data.enforceInterface(DESCRIPTOR); - String _arg0; - _arg0 = data.readString(); - int _result = this.getLastTetherError(_arg0); - reply.writeNoException(); - reply.writeInt(_result); - return true; - } - case TRANSACTION_isTetheringSupported: { - data.enforceInterface(DESCRIPTOR); - boolean _result = this.isTetheringSupported(); - reply.writeNoException(); - reply.writeInt(((_result) ? (1) : (0))); - return true; - } - case TRANSACTION_getTetherableIfaces: { - data.enforceInterface(DESCRIPTOR); - String[] _result = this.getTetherableIfaces(); - reply.writeNoException(); - reply.writeStringArray(_result); - return true; - } - case TRANSACTION_getTetheredIfaces: { - data.enforceInterface(DESCRIPTOR); - String[] _result = this.getTetheredIfaces(); - reply.writeNoException(); - reply.writeStringArray(_result); - return true; - } - case TRANSACTION_getTetheredIfacePairs: { - data.enforceInterface(DESCRIPTOR); - String[] _result = this.getTetheredIfacePairs(); - reply.writeNoException(); - reply.writeStringArray(_result); - return true; - } - case TRANSACTION_getTetheringErroredIfaces: { - data.enforceInterface(DESCRIPTOR); - String[] _result = this.getTetheringErroredIfaces(); - reply.writeNoException(); - reply.writeStringArray(_result); - return true; - } - case TRANSACTION_getTetherableUsbRegexs: { - data.enforceInterface(DESCRIPTOR); - String[] _result = this.getTetherableUsbRegexs(); - reply.writeNoException(); - reply.writeStringArray(_result); - return true; - } - case TRANSACTION_getTetherableWifiRegexs: { - data.enforceInterface(DESCRIPTOR); - String[] _result = this.getTetherableWifiRegexs(); - reply.writeNoException(); - reply.writeStringArray(_result); - return true; - } - case TRANSACTION_getTetherableBluetoothRegexs: { - data.enforceInterface(DESCRIPTOR); - String[] _result = this.getTetherableBluetoothRegexs(); - reply.writeNoException(); - reply.writeStringArray(_result); - return true; - } - case TRANSACTION_setUsbTethering: { - data.enforceInterface(DESCRIPTOR); - boolean _arg0; - _arg0 = (0 != data.readInt()); - int _result = this.setUsbTethering(_arg0); - reply.writeNoException(); - reply.writeInt(_result); - return true; - } - case TRANSACTION_requestNetworkTransitionWakelock: { - data.enforceInterface(DESCRIPTOR); - String _arg0; - _arg0 = data.readString(); - this.requestNetworkTransitionWakelock(_arg0); - reply.writeNoException(); - return true; - } - case TRANSACTION_reportInetCondition: { - data.enforceInterface(DESCRIPTOR); - int _arg0; - _arg0 = data.readInt(); - int _arg1; - _arg1 = data.readInt(); - this.reportInetCondition(_arg0, _arg1); - reply.writeNoException(); - return true; - } - case TRANSACTION_getGlobalProxy: { - data.enforceInterface(DESCRIPTOR); - android.net.ProxyProperties _result = this.getGlobalProxy(); - reply.writeNoException(); - if ((_result != null)) { - reply.writeInt(1); - _result.writeToParcel(reply, android.os.Parcelable.PARCELABLE_WRITE_RETURN_VALUE); - } else { - reply.writeInt(0); - } - return true; - } - case TRANSACTION_setGlobalProxy: { - data.enforceInterface(DESCRIPTOR); - android.net.ProxyProperties _arg0; - if ((0 != data.readInt())) { - _arg0 = android.net.ProxyProperties.CREATOR.createFromParcel(data); - } else { - _arg0 = null; - } - this.setGlobalProxy(_arg0); - reply.writeNoException(); - return true; - } - case TRANSACTION_getProxy: { - data.enforceInterface(DESCRIPTOR); - android.net.ProxyProperties _result = this.getProxy(); - reply.writeNoException(); - if ((_result != null)) { - reply.writeInt(1); - _result.writeToParcel(reply, android.os.Parcelable.PARCELABLE_WRITE_RETURN_VALUE); - } else { - reply.writeInt(0); - } - return true; - } - case TRANSACTION_setDataDependency: { - data.enforceInterface(DESCRIPTOR); - int _arg0; - _arg0 = data.readInt(); - boolean _arg1; - _arg1 = (0 != data.readInt()); - this.setDataDependency(_arg0, _arg1); - reply.writeNoException(); - return true; - } - case TRANSACTION_protectVpn: { - data.enforceInterface(DESCRIPTOR); - android.os.ParcelFileDescriptor _arg0; - if ((0 != data.readInt())) { - _arg0 = android.os.ParcelFileDescriptor.CREATOR.createFromParcel(data); - } else { - _arg0 = null; - } - boolean _result = this.protectVpn(_arg0); - reply.writeNoException(); - reply.writeInt(((_result) ? (1) : (0))); - return true; - } - case TRANSACTION_prepareVpn: { - data.enforceInterface(DESCRIPTOR); - String _arg0; - _arg0 = data.readString(); - String _arg1; - _arg1 = data.readString(); - boolean _result = this.prepareVpn(_arg0, _arg1); - reply.writeNoException(); - reply.writeInt(((_result) ? (1) : (0))); - return true; - } - case TRANSACTION_establishVpn: { - data.enforceInterface(DESCRIPTOR); - com.android.internal.net.VpnConfig _arg0; - if ((0 != data.readInt())) { - _arg0 = com.android.internal.net.VpnConfig.CREATOR.createFromParcel(data); - } else { - _arg0 = null; - } - android.os.ParcelFileDescriptor _result = this.establishVpn(_arg0); - reply.writeNoException(); - if ((_result != null)) { - reply.writeInt(1); - _result.writeToParcel(reply, android.os.Parcelable.PARCELABLE_WRITE_RETURN_VALUE); - } else { - reply.writeInt(0); - } - return true; - } - case TRANSACTION_startLegacyVpn: { - data.enforceInterface(DESCRIPTOR); - com.android.internal.net.VpnProfile _arg0; - if ((0 != data.readInt())) { - _arg0 = com.android.internal.net.VpnProfile.CREATOR.createFromParcel(data); - } else { - _arg0 = null; - } - this.startLegacyVpn(_arg0); - reply.writeNoException(); - return true; - } - case TRANSACTION_getLegacyVpnInfo: { - data.enforceInterface(DESCRIPTOR); - com.android.internal.net.LegacyVpnInfo _result = this.getLegacyVpnInfo(); - reply.writeNoException(); - if ((_result != null)) { - reply.writeInt(1); - _result.writeToParcel(reply, android.os.Parcelable.PARCELABLE_WRITE_RETURN_VALUE); - } else { - reply.writeInt(0); - } - return true; - } - case TRANSACTION_updateLockdownVpn: { - data.enforceInterface(DESCRIPTOR); - boolean _result = this.updateLockdownVpn(); - reply.writeNoException(); - reply.writeInt(((_result) ? (1) : (0))); - return true; - } - case TRANSACTION_captivePortalCheckComplete: { - data.enforceInterface(DESCRIPTOR); - android.net.NetworkInfo _arg0; - if ((0 != data.readInt())) { - _arg0 = null; - } else { - _arg0 = null; - } - this.captivePortalCheckComplete(_arg0); - reply.writeNoException(); - return true; - } - } - return super.onTransact(code, data, reply, flags); - } - - private static class Proxy implements android.net.IConnectivityManager { - private android.os.IBinder mRemote; - - Proxy(android.os.IBinder remote) { - mRemote = remote; - } - - @Override - public android.os.IBinder asBinder() { - return mRemote; - } - - @Override - public void setNetworkPreference(int pref) throws android.os.RemoteException { - android.os.Parcel _data = android.os.Parcel.obtain(); - android.os.Parcel _reply = android.os.Parcel.obtain(); - try { - _data.writeInterfaceToken(DESCRIPTOR); - _data.writeInt(pref); - mRemote.transact(Stub.TRANSACTION_setNetworkPreference, _data, _reply, 0); - _reply.readException(); - } finally { - _reply.recycle(); - _data.recycle(); - } - } - - @Override - public int getNetworkPreference() throws android.os.RemoteException { - android.os.Parcel _data = android.os.Parcel.obtain(); - android.os.Parcel _reply = android.os.Parcel.obtain(); - int _result; - try { - _data.writeInterfaceToken(DESCRIPTOR); - mRemote.transact(Stub.TRANSACTION_getNetworkPreference, _data, _reply, 0); - _reply.readException(); - _result = _reply.readInt(); - } finally { - _reply.recycle(); - _data.recycle(); - } - return _result; - } - - @Override - public android.net.NetworkInfo getActiveNetworkInfo() throws android.os.RemoteException { - android.os.Parcel _data = android.os.Parcel.obtain(); - android.os.Parcel _reply = android.os.Parcel.obtain(); - android.net.NetworkInfo _result; - try { - _data.writeInterfaceToken(DESCRIPTOR); - mRemote.transact(Stub.TRANSACTION_getActiveNetworkInfo, _data, _reply, 0); - _reply.readException(); - if ((0 != _reply.readInt())) { - _result = null; - } else { - _result = null; - } - } finally { - _reply.recycle(); - _data.recycle(); - } - return _result; - } - - @Override - public android.net.NetworkInfo getActiveNetworkInfoForUid(int uid) throws android.os.RemoteException { - android.os.Parcel _data = android.os.Parcel.obtain(); - android.os.Parcel _reply = android.os.Parcel.obtain(); - android.net.NetworkInfo _result; - try { - _data.writeInterfaceToken(DESCRIPTOR); - _data.writeInt(uid); - mRemote.transact(Stub.TRANSACTION_getActiveNetworkInfoForUid, _data, _reply, 0); - _reply.readException(); - if ((0 != _reply.readInt())) { - _result = null; - } else { - _result = null; - } - } finally { - _reply.recycle(); - _data.recycle(); - } - return _result; - } - - @Override - public android.net.NetworkInfo getNetworkInfo(int networkType) throws android.os.RemoteException { - android.os.Parcel _data = android.os.Parcel.obtain(); - android.os.Parcel _reply = android.os.Parcel.obtain(); - android.net.NetworkInfo _result; - try { - _data.writeInterfaceToken(DESCRIPTOR); - _data.writeInt(networkType); - mRemote.transact(Stub.TRANSACTION_getNetworkInfo, _data, _reply, 0); - _reply.readException(); - if ((0 != _reply.readInt())) { - _result = null; - } else { - _result = null; - } - } finally { - _reply.recycle(); - _data.recycle(); - } - return _result; - } - - @Override - public android.net.NetworkInfo[] getAllNetworkInfo() throws android.os.RemoteException { - android.os.Parcel _data = android.os.Parcel.obtain(); - android.os.Parcel _reply = android.os.Parcel.obtain(); - android.net.NetworkInfo[] _result; - try { - _data.writeInterfaceToken(DESCRIPTOR); - mRemote.transact(Stub.TRANSACTION_getAllNetworkInfo, _data, _reply, 0); - _reply.readException(); - _result = null; - } finally { - _reply.recycle(); - _data.recycle(); - } - return _result; - } - - @Override - public boolean isNetworkSupported(int networkType) throws android.os.RemoteException { - android.os.Parcel _data = android.os.Parcel.obtain(); - android.os.Parcel _reply = android.os.Parcel.obtain(); - boolean _result; - try { - _data.writeInterfaceToken(DESCRIPTOR); - _data.writeInt(networkType); - mRemote.transact(Stub.TRANSACTION_isNetworkSupported, _data, _reply, 0); - _reply.readException(); - _result = (0 != _reply.readInt()); - } finally { - _reply.recycle(); - _data.recycle(); - } - return _result; - } - - @Override - public android.net.LinkProperties getActiveLinkProperties() throws android.os.RemoteException { - android.os.Parcel _data = android.os.Parcel.obtain(); - android.os.Parcel _reply = android.os.Parcel.obtain(); - android.net.LinkProperties _result; - try { - _data.writeInterfaceToken(DESCRIPTOR); - mRemote.transact(Stub.TRANSACTION_getActiveLinkProperties, _data, _reply, 0); - _reply.readException(); - if ((0 != _reply.readInt())) { - _result = android.net.LinkProperties.CREATOR.createFromParcel(_reply); - } else { - _result = null; - } - } finally { - _reply.recycle(); - _data.recycle(); - } - return _result; - } - - @Override - public android.net.LinkProperties getLinkProperties(int networkType) throws android.os.RemoteException { - android.os.Parcel _data = android.os.Parcel.obtain(); - android.os.Parcel _reply = android.os.Parcel.obtain(); - android.net.LinkProperties _result; - try { - _data.writeInterfaceToken(DESCRIPTOR); - _data.writeInt(networkType); - mRemote.transact(Stub.TRANSACTION_getLinkProperties, _data, _reply, 0); - _reply.readException(); - if ((0 != _reply.readInt())) { - _result = android.net.LinkProperties.CREATOR.createFromParcel(_reply); - } else { - _result = null; - } - } finally { - _reply.recycle(); - _data.recycle(); - } - return _result; - } - - @Override - public android.net.NetworkState[] getAllNetworkState() throws android.os.RemoteException { - android.os.Parcel _data = android.os.Parcel.obtain(); - android.os.Parcel _reply = android.os.Parcel.obtain(); - android.net.NetworkState[] _result; - try { - _data.writeInterfaceToken(DESCRIPTOR); - mRemote.transact(Stub.TRANSACTION_getAllNetworkState, _data, _reply, 0); - _reply.readException(); - _result = _reply.createTypedArray(android.net.NetworkState.CREATOR); - } finally { - _reply.recycle(); - _data.recycle(); - } - return _result; - } - - @Override - public android.net.NetworkQuotaInfo getActiveNetworkQuotaInfo() throws android.os.RemoteException { - android.os.Parcel _data = android.os.Parcel.obtain(); - android.os.Parcel _reply = android.os.Parcel.obtain(); - android.net.NetworkQuotaInfo _result; - try { - _data.writeInterfaceToken(DESCRIPTOR); - mRemote.transact(Stub.TRANSACTION_getActiveNetworkQuotaInfo, _data, _reply, 0); - _reply.readException(); - if ((0 != _reply.readInt())) { - _result = android.net.NetworkQuotaInfo.CREATOR.createFromParcel(_reply); - } else { - _result = null; - } - } finally { - _reply.recycle(); - _data.recycle(); - } - return _result; - } - - @Override - public boolean isActiveNetworkMetered() throws android.os.RemoteException { - android.os.Parcel _data = android.os.Parcel.obtain(); - android.os.Parcel _reply = android.os.Parcel.obtain(); - boolean _result; - try { - _data.writeInterfaceToken(DESCRIPTOR); - mRemote.transact(Stub.TRANSACTION_isActiveNetworkMetered, _data, _reply, 0); - _reply.readException(); - _result = (0 != _reply.readInt()); - } finally { - _reply.recycle(); - _data.recycle(); - } - return _result; - } - - @Override - public boolean setRadios(boolean onOff) throws android.os.RemoteException { - android.os.Parcel _data = android.os.Parcel.obtain(); - android.os.Parcel _reply = android.os.Parcel.obtain(); - boolean _result; - try { - _data.writeInterfaceToken(DESCRIPTOR); - _data.writeInt(((onOff) ? (1) : (0))); - mRemote.transact(Stub.TRANSACTION_setRadios, _data, _reply, 0); - _reply.readException(); - _result = (0 != _reply.readInt()); - } finally { - _reply.recycle(); - _data.recycle(); - } - return _result; - } - - @Override - public boolean setRadio(int networkType, boolean turnOn) throws android.os.RemoteException { - android.os.Parcel _data = android.os.Parcel.obtain(); - android.os.Parcel _reply = android.os.Parcel.obtain(); - boolean _result; - try { - _data.writeInterfaceToken(DESCRIPTOR); - _data.writeInt(networkType); - _data.writeInt(((turnOn) ? (1) : (0))); - mRemote.transact(Stub.TRANSACTION_setRadio, _data, _reply, 0); - _reply.readException(); - _result = (0 != _reply.readInt()); - } finally { - _reply.recycle(); - _data.recycle(); - } - return _result; - } - - @Override - public int startUsingNetworkFeature(int networkType, String feature, android.os.IBinder binder) throws android.os.RemoteException { - android.os.Parcel _data = android.os.Parcel.obtain(); - android.os.Parcel _reply = android.os.Parcel.obtain(); - int _result; - try { - _data.writeInterfaceToken(DESCRIPTOR); - _data.writeInt(networkType); - _data.writeString(feature); - _data.writeStrongBinder(binder); - mRemote.transact(Stub.TRANSACTION_startUsingNetworkFeature, _data, _reply, 0); - _reply.readException(); - _result = _reply.readInt(); - } finally { - _reply.recycle(); - _data.recycle(); - } - return _result; - } - - @Override - public int stopUsingNetworkFeature(int networkType, String feature) throws android.os.RemoteException { - android.os.Parcel _data = android.os.Parcel.obtain(); - android.os.Parcel _reply = android.os.Parcel.obtain(); - int _result; - try { - _data.writeInterfaceToken(DESCRIPTOR); - _data.writeInt(networkType); - _data.writeString(feature); - mRemote.transact(Stub.TRANSACTION_stopUsingNetworkFeature, _data, _reply, 0); - _reply.readException(); - _result = _reply.readInt(); - } finally { - _reply.recycle(); - _data.recycle(); - } - return _result; - } - - @Override - public boolean requestRouteToHost(int networkType, int hostAddress) throws android.os.RemoteException { - android.os.Parcel _data = android.os.Parcel.obtain(); - android.os.Parcel _reply = android.os.Parcel.obtain(); - boolean _result; - try { - _data.writeInterfaceToken(DESCRIPTOR); - _data.writeInt(networkType); - _data.writeInt(hostAddress); - mRemote.transact(Stub.TRANSACTION_requestRouteToHost, _data, _reply, 0); - _reply.readException(); - _result = (0 != _reply.readInt()); - } finally { - _reply.recycle(); - _data.recycle(); - } - return _result; - } - - @Override - public boolean requestRouteToHostAddress(int networkType, byte[] hostAddress) throws android.os.RemoteException { - android.os.Parcel _data = android.os.Parcel.obtain(); - android.os.Parcel _reply = android.os.Parcel.obtain(); - boolean _result; - try { - _data.writeInterfaceToken(DESCRIPTOR); - _data.writeInt(networkType); - _data.writeByteArray(hostAddress); - mRemote.transact(Stub.TRANSACTION_requestRouteToHostAddress, _data, _reply, 0); - _reply.readException(); - _result = (0 != _reply.readInt()); - } finally { - _reply.recycle(); - _data.recycle(); - } - return _result; - } - - @Override - public boolean getMobileDataEnabled() throws android.os.RemoteException { - android.os.Parcel _data = android.os.Parcel.obtain(); - android.os.Parcel _reply = android.os.Parcel.obtain(); - boolean _result; - try { - _data.writeInterfaceToken(DESCRIPTOR); - mRemote.transact(Stub.TRANSACTION_getMobileDataEnabled, _data, _reply, 0); - _reply.readException(); - _result = (0 != _reply.readInt()); - } finally { - _reply.recycle(); - _data.recycle(); - } - return _result; - } - - @Override - public void setMobileDataEnabled(boolean enabled) throws android.os.RemoteException { - android.os.Parcel _data = android.os.Parcel.obtain(); - android.os.Parcel _reply = android.os.Parcel.obtain(); - try { - _data.writeInterfaceToken(DESCRIPTOR); - _data.writeInt(((enabled) ? (1) : (0))); - mRemote.transact(Stub.TRANSACTION_setMobileDataEnabled, _data, _reply, 0); - _reply.readException(); - } finally { - _reply.recycle(); - _data.recycle(); - } - } - - /** - * Policy control over specific {@link NetworkStateTracker}. - */ - @Override - public void setPolicyDataEnable(int networkType, boolean enabled) throws android.os.RemoteException { - android.os.Parcel _data = android.os.Parcel.obtain(); - android.os.Parcel _reply = android.os.Parcel.obtain(); - try { - _data.writeInterfaceToken(DESCRIPTOR); - _data.writeInt(networkType); - _data.writeInt(((enabled) ? (1) : (0))); - mRemote.transact(Stub.TRANSACTION_setPolicyDataEnable, _data, _reply, 0); - _reply.readException(); - } finally { - _reply.recycle(); - _data.recycle(); - } - } - - @Override - public int tether(String iface) throws android.os.RemoteException { - android.os.Parcel _data = android.os.Parcel.obtain(); - android.os.Parcel _reply = android.os.Parcel.obtain(); - int _result; - try { - _data.writeInterfaceToken(DESCRIPTOR); - _data.writeString(iface); - mRemote.transact(Stub.TRANSACTION_tether, _data, _reply, 0); - _reply.readException(); - _result = _reply.readInt(); - } finally { - _reply.recycle(); - _data.recycle(); - } - return _result; - } - - @Override - public int untether(String iface) throws android.os.RemoteException { - android.os.Parcel _data = android.os.Parcel.obtain(); - android.os.Parcel _reply = android.os.Parcel.obtain(); - int _result; - try { - _data.writeInterfaceToken(DESCRIPTOR); - _data.writeString(iface); - mRemote.transact(Stub.TRANSACTION_untether, _data, _reply, 0); - _reply.readException(); - _result = _reply.readInt(); - } finally { - _reply.recycle(); - _data.recycle(); - } - return _result; - } - - @Override - public int getLastTetherError(String iface) throws android.os.RemoteException { - android.os.Parcel _data = android.os.Parcel.obtain(); - android.os.Parcel _reply = android.os.Parcel.obtain(); - int _result; - try { - _data.writeInterfaceToken(DESCRIPTOR); - _data.writeString(iface); - mRemote.transact(Stub.TRANSACTION_getLastTetherError, _data, _reply, 0); - _reply.readException(); - _result = _reply.readInt(); - } finally { - _reply.recycle(); - _data.recycle(); - } - return _result; - } - - @Override - public boolean isTetheringSupported() throws android.os.RemoteException { - android.os.Parcel _data = android.os.Parcel.obtain(); - android.os.Parcel _reply = android.os.Parcel.obtain(); - boolean _result; - try { - _data.writeInterfaceToken(DESCRIPTOR); - mRemote.transact(Stub.TRANSACTION_isTetheringSupported, _data, _reply, 0); - _reply.readException(); - _result = (0 != _reply.readInt()); - } finally { - _reply.recycle(); - _data.recycle(); - } - return _result; - } - - @Override - public String[] getTetherableIfaces() throws android.os.RemoteException { - android.os.Parcel _data = android.os.Parcel.obtain(); - android.os.Parcel _reply = android.os.Parcel.obtain(); - String[] _result; - try { - _data.writeInterfaceToken(DESCRIPTOR); - mRemote.transact(Stub.TRANSACTION_getTetherableIfaces, _data, _reply, 0); - _reply.readException(); - _result = _reply.createStringArray(); - } finally { - _reply.recycle(); - _data.recycle(); - } - return _result; - } - - @Override - public String[] getTetheredIfaces() throws android.os.RemoteException { - android.os.Parcel _data = android.os.Parcel.obtain(); - android.os.Parcel _reply = android.os.Parcel.obtain(); - String[] _result; - try { - _data.writeInterfaceToken(DESCRIPTOR); - mRemote.transact(Stub.TRANSACTION_getTetheredIfaces, _data, _reply, 0); - _reply.readException(); - _result = _reply.createStringArray(); - } finally { - _reply.recycle(); - _data.recycle(); - } - return _result; - } - - /** - * Return list of interface pairs that are actively tethered. Even indexes are - * remote interface, and odd indexes are corresponding local interfaces. - */ - @Override - public String[] getTetheredIfacePairs() throws android.os.RemoteException { - android.os.Parcel _data = android.os.Parcel.obtain(); - android.os.Parcel _reply = android.os.Parcel.obtain(); - String[] _result; - try { - _data.writeInterfaceToken(DESCRIPTOR); - mRemote.transact(Stub.TRANSACTION_getTetheredIfacePairs, _data, _reply, 0); - _reply.readException(); - _result = _reply.createStringArray(); - } finally { - _reply.recycle(); - _data.recycle(); - } - return _result; - } - - @Override - public String[] getTetheringErroredIfaces() throws android.os.RemoteException { - android.os.Parcel _data = android.os.Parcel.obtain(); - android.os.Parcel _reply = android.os.Parcel.obtain(); - String[] _result; - try { - _data.writeInterfaceToken(DESCRIPTOR); - mRemote.transact(Stub.TRANSACTION_getTetheringErroredIfaces, _data, _reply, 0); - _reply.readException(); - _result = _reply.createStringArray(); - } finally { - _reply.recycle(); - _data.recycle(); - } - return _result; - } - - @Override - public String[] getTetherableUsbRegexs() throws android.os.RemoteException { - android.os.Parcel _data = android.os.Parcel.obtain(); - android.os.Parcel _reply = android.os.Parcel.obtain(); - String[] _result; - try { - _data.writeInterfaceToken(DESCRIPTOR); - mRemote.transact(Stub.TRANSACTION_getTetherableUsbRegexs, _data, _reply, 0); - _reply.readException(); - _result = _reply.createStringArray(); - } finally { - _reply.recycle(); - _data.recycle(); - } - return _result; - } - - @Override - public String[] getTetherableWifiRegexs() throws android.os.RemoteException { - android.os.Parcel _data = android.os.Parcel.obtain(); - android.os.Parcel _reply = android.os.Parcel.obtain(); - String[] _result; - try { - _data.writeInterfaceToken(DESCRIPTOR); - mRemote.transact(Stub.TRANSACTION_getTetherableWifiRegexs, _data, _reply, 0); - _reply.readException(); - _result = _reply.createStringArray(); - } finally { - _reply.recycle(); - _data.recycle(); - } - return _result; - } - - @Override - public String[] getTetherableBluetoothRegexs() throws android.os.RemoteException { - android.os.Parcel _data = android.os.Parcel.obtain(); - android.os.Parcel _reply = android.os.Parcel.obtain(); - String[] _result; - try { - _data.writeInterfaceToken(DESCRIPTOR); - mRemote.transact(Stub.TRANSACTION_getTetherableBluetoothRegexs, _data, _reply, 0); - _reply.readException(); - _result = _reply.createStringArray(); - } finally { - _reply.recycle(); - _data.recycle(); - } - return _result; - } - - @Override - public int setUsbTethering(boolean enable) throws android.os.RemoteException { - android.os.Parcel _data = android.os.Parcel.obtain(); - android.os.Parcel _reply = android.os.Parcel.obtain(); - int _result; - try { - _data.writeInterfaceToken(DESCRIPTOR); - _data.writeInt(((enable) ? (1) : (0))); - mRemote.transact(Stub.TRANSACTION_setUsbTethering, _data, _reply, 0); - _reply.readException(); - _result = _reply.readInt(); - } finally { - _reply.recycle(); - _data.recycle(); - } - return _result; - } - - @Override - public void requestNetworkTransitionWakelock(String forWhom) throws android.os.RemoteException { - android.os.Parcel _data = android.os.Parcel.obtain(); - android.os.Parcel _reply = android.os.Parcel.obtain(); - try { - _data.writeInterfaceToken(DESCRIPTOR); - _data.writeString(forWhom); - mRemote.transact(Stub.TRANSACTION_requestNetworkTransitionWakelock, _data, _reply, 0); - _reply.readException(); - } finally { - _reply.recycle(); - _data.recycle(); - } - } - - @Override - public void reportInetCondition(int networkType, int percentage) throws android.os.RemoteException { - android.os.Parcel _data = android.os.Parcel.obtain(); - android.os.Parcel _reply = android.os.Parcel.obtain(); - try { - _data.writeInterfaceToken(DESCRIPTOR); - _data.writeInt(networkType); - _data.writeInt(percentage); - mRemote.transact(Stub.TRANSACTION_reportInetCondition, _data, _reply, 0); - _reply.readException(); - } finally { - _reply.recycle(); - _data.recycle(); - } - } - - @Override - public android.net.ProxyProperties getGlobalProxy() throws android.os.RemoteException { - android.os.Parcel _data = android.os.Parcel.obtain(); - android.os.Parcel _reply = android.os.Parcel.obtain(); - android.net.ProxyProperties _result; - try { - _data.writeInterfaceToken(DESCRIPTOR); - mRemote.transact(Stub.TRANSACTION_getGlobalProxy, _data, _reply, 0); - _reply.readException(); - if ((0 != _reply.readInt())) { - _result = android.net.ProxyProperties.CREATOR.createFromParcel(_reply); - } else { - _result = null; - } - } finally { - _reply.recycle(); - _data.recycle(); - } - return _result; - } - - @Override - public void setGlobalProxy(android.net.ProxyProperties p) throws android.os.RemoteException { - android.os.Parcel _data = android.os.Parcel.obtain(); - android.os.Parcel _reply = android.os.Parcel.obtain(); - try { - _data.writeInterfaceToken(DESCRIPTOR); - if ((p != null)) { - _data.writeInt(1); - p.writeToParcel(_data, 0); - } else { - _data.writeInt(0); - } - mRemote.transact(Stub.TRANSACTION_setGlobalProxy, _data, _reply, 0); - _reply.readException(); - } finally { - _reply.recycle(); - _data.recycle(); - } - } - - @Override - public android.net.ProxyProperties getProxy() throws android.os.RemoteException { - android.os.Parcel _data = android.os.Parcel.obtain(); - android.os.Parcel _reply = android.os.Parcel.obtain(); - android.net.ProxyProperties _result; - try { - _data.writeInterfaceToken(DESCRIPTOR); - mRemote.transact(Stub.TRANSACTION_getProxy, _data, _reply, 0); - _reply.readException(); - if ((0 != _reply.readInt())) { - _result = android.net.ProxyProperties.CREATOR.createFromParcel(_reply); - } else { - _result = null; - } - } finally { - _reply.recycle(); - _data.recycle(); - } - return _result; - } - - @Override - public void setDataDependency(int networkType, boolean met) throws android.os.RemoteException { - android.os.Parcel _data = android.os.Parcel.obtain(); - android.os.Parcel _reply = android.os.Parcel.obtain(); - try { - _data.writeInterfaceToken(DESCRIPTOR); - _data.writeInt(networkType); - _data.writeInt(((met) ? (1) : (0))); - mRemote.transact(Stub.TRANSACTION_setDataDependency, _data, _reply, 0); - _reply.readException(); - } finally { - _reply.recycle(); - _data.recycle(); - } - } - - @Override - public boolean protectVpn(android.os.ParcelFileDescriptor socket) throws android.os.RemoteException { - android.os.Parcel _data = android.os.Parcel.obtain(); - android.os.Parcel _reply = android.os.Parcel.obtain(); - boolean _result; - try { - _data.writeInterfaceToken(DESCRIPTOR); - if ((socket != null)) { - _data.writeInt(1); - socket.writeToParcel(_data, 0); - } else { - _data.writeInt(0); - } - mRemote.transact(Stub.TRANSACTION_protectVpn, _data, _reply, 0); - _reply.readException(); - _result = (0 != _reply.readInt()); - } finally { - _reply.recycle(); - _data.recycle(); - } - return _result; - } - - @Override - public boolean prepareVpn(String oldPackage, String newPackage) throws android.os.RemoteException { - android.os.Parcel _data = android.os.Parcel.obtain(); - android.os.Parcel _reply = android.os.Parcel.obtain(); - boolean _result; - try { - _data.writeInterfaceToken(DESCRIPTOR); - _data.writeString(oldPackage); - _data.writeString(newPackage); - mRemote.transact(Stub.TRANSACTION_prepareVpn, _data, _reply, 0); - _reply.readException(); - _result = (0 != _reply.readInt()); - } finally { - _reply.recycle(); - _data.recycle(); - } - return _result; - } - - @Override - public android.os.ParcelFileDescriptor establishVpn(com.android.internal.net.VpnConfig config) throws android.os.RemoteException { - android.os.Parcel _data = android.os.Parcel.obtain(); - android.os.Parcel _reply = android.os.Parcel.obtain(); - android.os.ParcelFileDescriptor _result; - try { - _data.writeInterfaceToken(DESCRIPTOR); - if ((config != null)) { - _data.writeInt(1); - config.writeToParcel(_data, 0); - } else { - _data.writeInt(0); - } - mRemote.transact(Stub.TRANSACTION_establishVpn, _data, _reply, 0); - _reply.readException(); - if ((0 != _reply.readInt())) { - _result = android.os.ParcelFileDescriptor.CREATOR.createFromParcel(_reply); - } else { - _result = null; - } - } finally { - _reply.recycle(); - _data.recycle(); - } - return _result; - } - - @Override - public void startLegacyVpn(com.android.internal.net.VpnProfile profile) throws android.os.RemoteException { - android.os.Parcel _data = android.os.Parcel.obtain(); - android.os.Parcel _reply = android.os.Parcel.obtain(); - try { - _data.writeInterfaceToken(DESCRIPTOR); - if ((profile != null)) { - _data.writeInt(1); - profile.writeToParcel(_data, 0); - } else { - _data.writeInt(0); - } - mRemote.transact(Stub.TRANSACTION_startLegacyVpn, _data, _reply, 0); - _reply.readException(); - } finally { - _reply.recycle(); - _data.recycle(); - } - } - - @Override - public com.android.internal.net.LegacyVpnInfo getLegacyVpnInfo() throws android.os.RemoteException { - android.os.Parcel _data = android.os.Parcel.obtain(); - android.os.Parcel _reply = android.os.Parcel.obtain(); - com.android.internal.net.LegacyVpnInfo _result; - try { - _data.writeInterfaceToken(DESCRIPTOR); - mRemote.transact(Stub.TRANSACTION_getLegacyVpnInfo, _data, _reply, 0); - _reply.readException(); - if ((0 != _reply.readInt())) { - _result = com.android.internal.net.LegacyVpnInfo.CREATOR.createFromParcel(_reply); - } else { - _result = null; - } - } finally { - _reply.recycle(); - _data.recycle(); - } - return _result; - } - - @Override - public boolean updateLockdownVpn() throws android.os.RemoteException { - android.os.Parcel _data = android.os.Parcel.obtain(); - android.os.Parcel _reply = android.os.Parcel.obtain(); - boolean _result; - try { - _data.writeInterfaceToken(DESCRIPTOR); - mRemote.transact(Stub.TRANSACTION_updateLockdownVpn, _data, _reply, 0); - _reply.readException(); - _result = (0 != _reply.readInt()); - } finally { - _reply.recycle(); - _data.recycle(); - } - return _result; - } - - @Override - public void captivePortalCheckComplete(android.net.NetworkInfo info) throws android.os.RemoteException { - android.os.Parcel _data = android.os.Parcel.obtain(); - android.os.Parcel _reply = android.os.Parcel.obtain(); - try { - _data.writeInterfaceToken(DESCRIPTOR); - if ((info != null)) { - _data.writeInt(1); - info.writeToParcel(_data, 0); - } else { - _data.writeInt(0); - } - mRemote.transact(Stub.TRANSACTION_captivePortalCheckComplete, _data, _reply, 0); - _reply.readException(); - } finally { - _reply.recycle(); - _data.recycle(); - } - } - } - - static final int TRANSACTION_setNetworkPreference = (android.os.IBinder.FIRST_CALL_TRANSACTION); - static final int TRANSACTION_getNetworkPreference = (android.os.IBinder.FIRST_CALL_TRANSACTION + 1); - static final int TRANSACTION_getActiveNetworkInfo = (android.os.IBinder.FIRST_CALL_TRANSACTION + 2); - static final int TRANSACTION_getActiveNetworkInfoForUid = (android.os.IBinder.FIRST_CALL_TRANSACTION + 3); - static final int TRANSACTION_getNetworkInfo = (android.os.IBinder.FIRST_CALL_TRANSACTION + 4); - static final int TRANSACTION_getAllNetworkInfo = (android.os.IBinder.FIRST_CALL_TRANSACTION + 5); - static final int TRANSACTION_isNetworkSupported = (android.os.IBinder.FIRST_CALL_TRANSACTION + 6); - static final int TRANSACTION_getActiveLinkProperties = (android.os.IBinder.FIRST_CALL_TRANSACTION + 7); - static final int TRANSACTION_getLinkProperties = (android.os.IBinder.FIRST_CALL_TRANSACTION + 8); - static final int TRANSACTION_getAllNetworkState = (android.os.IBinder.FIRST_CALL_TRANSACTION + 9); - static final int TRANSACTION_getActiveNetworkQuotaInfo = (android.os.IBinder.FIRST_CALL_TRANSACTION + 10); - static final int TRANSACTION_isActiveNetworkMetered = (android.os.IBinder.FIRST_CALL_TRANSACTION + 11); - static final int TRANSACTION_setRadios = (android.os.IBinder.FIRST_CALL_TRANSACTION + 12); - static final int TRANSACTION_setRadio = (android.os.IBinder.FIRST_CALL_TRANSACTION + 13); - static final int TRANSACTION_startUsingNetworkFeature = (android.os.IBinder.FIRST_CALL_TRANSACTION + 14); - static final int TRANSACTION_stopUsingNetworkFeature = (android.os.IBinder.FIRST_CALL_TRANSACTION + 15); - static final int TRANSACTION_requestRouteToHost = (android.os.IBinder.FIRST_CALL_TRANSACTION + 16); - static final int TRANSACTION_requestRouteToHostAddress = (android.os.IBinder.FIRST_CALL_TRANSACTION + 17); - static final int TRANSACTION_getMobileDataEnabled = (android.os.IBinder.FIRST_CALL_TRANSACTION + 18); - static final int TRANSACTION_setMobileDataEnabled = (android.os.IBinder.FIRST_CALL_TRANSACTION + 19); - static final int TRANSACTION_setPolicyDataEnable = (android.os.IBinder.FIRST_CALL_TRANSACTION + 20); - static final int TRANSACTION_tether = (android.os.IBinder.FIRST_CALL_TRANSACTION + 21); - static final int TRANSACTION_untether = (android.os.IBinder.FIRST_CALL_TRANSACTION + 22); - static final int TRANSACTION_getLastTetherError = (android.os.IBinder.FIRST_CALL_TRANSACTION + 23); - static final int TRANSACTION_isTetheringSupported = (android.os.IBinder.FIRST_CALL_TRANSACTION + 24); - static final int TRANSACTION_getTetherableIfaces = (android.os.IBinder.FIRST_CALL_TRANSACTION + 25); - static final int TRANSACTION_getTetheredIfaces = (android.os.IBinder.FIRST_CALL_TRANSACTION + 26); - static final int TRANSACTION_getTetheredIfacePairs = (android.os.IBinder.FIRST_CALL_TRANSACTION + 27); - static final int TRANSACTION_getTetheringErroredIfaces = (android.os.IBinder.FIRST_CALL_TRANSACTION + 28); - static final int TRANSACTION_getTetherableUsbRegexs = (android.os.IBinder.FIRST_CALL_TRANSACTION + 29); - static final int TRANSACTION_getTetherableWifiRegexs = (android.os.IBinder.FIRST_CALL_TRANSACTION + 30); - static final int TRANSACTION_getTetherableBluetoothRegexs = (android.os.IBinder.FIRST_CALL_TRANSACTION + 31); - static final int TRANSACTION_setUsbTethering = (android.os.IBinder.FIRST_CALL_TRANSACTION + 32); - static final int TRANSACTION_requestNetworkTransitionWakelock = (android.os.IBinder.FIRST_CALL_TRANSACTION + 33); - static final int TRANSACTION_reportInetCondition = (android.os.IBinder.FIRST_CALL_TRANSACTION + 34); - static final int TRANSACTION_getGlobalProxy = (android.os.IBinder.FIRST_CALL_TRANSACTION + 35); - static final int TRANSACTION_setGlobalProxy = (android.os.IBinder.FIRST_CALL_TRANSACTION + 36); - static final int TRANSACTION_getProxy = (android.os.IBinder.FIRST_CALL_TRANSACTION + 37); - static final int TRANSACTION_setDataDependency = (android.os.IBinder.FIRST_CALL_TRANSACTION + 38); - static final int TRANSACTION_protectVpn = (android.os.IBinder.FIRST_CALL_TRANSACTION + 39); - static final int TRANSACTION_prepareVpn = (android.os.IBinder.FIRST_CALL_TRANSACTION + 40); - static final int TRANSACTION_establishVpn = (android.os.IBinder.FIRST_CALL_TRANSACTION + 41); - static final int TRANSACTION_startLegacyVpn = (android.os.IBinder.FIRST_CALL_TRANSACTION + 42); - static final int TRANSACTION_getLegacyVpnInfo = (android.os.IBinder.FIRST_CALL_TRANSACTION + 43); - static final int TRANSACTION_updateLockdownVpn = (android.os.IBinder.FIRST_CALL_TRANSACTION + 44); - static final int TRANSACTION_captivePortalCheckComplete = (android.os.IBinder.FIRST_CALL_TRANSACTION + 45); - } - - public void setNetworkPreference(int pref) throws android.os.RemoteException; - - public int getNetworkPreference() throws android.os.RemoteException; - - public android.net.NetworkInfo getActiveNetworkInfo() throws android.os.RemoteException; - - public android.net.NetworkInfo getActiveNetworkInfoForUid(int uid) throws android.os.RemoteException; - - public android.net.NetworkInfo getNetworkInfo(int networkType) throws android.os.RemoteException; - - public android.net.NetworkInfo[] getAllNetworkInfo() throws android.os.RemoteException; - - public boolean isNetworkSupported(int networkType) throws android.os.RemoteException; - - public android.net.LinkProperties getActiveLinkProperties() throws android.os.RemoteException; - - public android.net.LinkProperties getLinkProperties(int networkType) throws android.os.RemoteException; - - public android.net.NetworkState[] getAllNetworkState() throws android.os.RemoteException; - - public android.net.NetworkQuotaInfo getActiveNetworkQuotaInfo() throws android.os.RemoteException; - - public boolean isActiveNetworkMetered() throws android.os.RemoteException; - - public boolean setRadios(boolean onOff) throws android.os.RemoteException; - - public boolean setRadio(int networkType, boolean turnOn) throws android.os.RemoteException; - - public int startUsingNetworkFeature(int networkType, String feature, android.os.IBinder binder) throws android.os.RemoteException; - - public int stopUsingNetworkFeature(int networkType, String feature) throws android.os.RemoteException; - - public boolean requestRouteToHost(int networkType, int hostAddress) throws android.os.RemoteException; - - public boolean requestRouteToHostAddress(int networkType, byte[] hostAddress) throws android.os.RemoteException; - - public boolean getMobileDataEnabled() throws android.os.RemoteException; - - public void setMobileDataEnabled(boolean enabled) throws android.os.RemoteException; - - /** - * Policy control over specific {@link NetworkStateTracker}. - */ - public void setPolicyDataEnable(int networkType, boolean enabled) throws android.os.RemoteException; - - public int tether(String iface) throws android.os.RemoteException; - - public int untether(String iface) throws android.os.RemoteException; - - public int getLastTetherError(String iface) throws android.os.RemoteException; - - public boolean isTetheringSupported() throws android.os.RemoteException; - - public String[] getTetherableIfaces() throws android.os.RemoteException; - - public String[] getTetheredIfaces() throws android.os.RemoteException; - - /** - * Return list of interface pairs that are actively tethered. Even indexes are - * remote interface, and odd indexes are corresponding local interfaces. - */ - public String[] getTetheredIfacePairs() throws android.os.RemoteException; - - public String[] getTetheringErroredIfaces() throws android.os.RemoteException; - - public String[] getTetherableUsbRegexs() throws android.os.RemoteException; - - public String[] getTetherableWifiRegexs() throws android.os.RemoteException; - - public String[] getTetherableBluetoothRegexs() throws android.os.RemoteException; - - public int setUsbTethering(boolean enable) throws android.os.RemoteException; - - public void requestNetworkTransitionWakelock(String forWhom) throws android.os.RemoteException; - - public void reportInetCondition(int networkType, int percentage) throws android.os.RemoteException; - - public android.net.ProxyProperties getGlobalProxy() throws android.os.RemoteException; - - public void setGlobalProxy(android.net.ProxyProperties p) throws android.os.RemoteException; - - public android.net.ProxyProperties getProxy() throws android.os.RemoteException; - - public void setDataDependency(int networkType, boolean met) throws android.os.RemoteException; - - public boolean protectVpn(android.os.ParcelFileDescriptor socket) throws android.os.RemoteException; - - public boolean prepareVpn(String oldPackage, String newPackage) throws android.os.RemoteException; - - public android.os.ParcelFileDescriptor establishVpn(com.android.internal.net.VpnConfig config) throws android.os.RemoteException; - - public void startLegacyVpn(com.android.internal.net.VpnProfile profile) throws android.os.RemoteException; - - public com.android.internal.net.LegacyVpnInfo getLegacyVpnInfo() throws android.os.RemoteException; - - public boolean updateLockdownVpn() throws android.os.RemoteException; - - public void captivePortalCheckComplete(android.net.NetworkInfo info) throws android.os.RemoteException; -} diff --git a/QKSMS/src/main/java/android/net/INetworkPolicyListener.java b/QKSMS/src/main/java/android/net/INetworkPolicyListener.java deleted file mode 100644 index 1e98ae57e..000000000 --- a/QKSMS/src/main/java/android/net/INetworkPolicyListener.java +++ /dev/null @@ -1,138 +0,0 @@ -/* - * This file is auto-generated. DO NOT MODIFY. - * Original file: frameworks/base/core/java/android/net/INetworkPolicyListener.aidl - */ -package android.net; - -/** - * {@hide} - */ -public interface INetworkPolicyListener extends android.os.IInterface { - /** - * Local-side IPC implementation stub class. - */ - public abstract static class Stub extends android.os.Binder implements android.net.INetworkPolicyListener { - private static final String DESCRIPTOR = "android.net.INetworkPolicyListener"; - - /** - * Construct the stub at attach it to the interface. - */ - public Stub() { - this.attachInterface(this, DESCRIPTOR); - } - - /** - * Cast an IBinder object into an android.net.INetworkPolicyListener interface, - * generating a proxy if needed. - */ - public static android.net.INetworkPolicyListener asInterface(android.os.IBinder obj) { - if ((obj == null)) { - return null; - } - android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR); - if (((iin != null) && (iin instanceof android.net.INetworkPolicyListener))) { - return ((android.net.INetworkPolicyListener) iin); - } - return new android.net.INetworkPolicyListener.Stub.Proxy(obj); - } - - @Override - public android.os.IBinder asBinder() { - return this; - } - - @Override - public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException { - switch (code) { - case INTERFACE_TRANSACTION: { - reply.writeString(DESCRIPTOR); - return true; - } - case TRANSACTION_onUidRulesChanged: { - data.enforceInterface(DESCRIPTOR); - int _arg0; - _arg0 = data.readInt(); - int _arg1; - _arg1 = data.readInt(); - this.onUidRulesChanged(_arg0, _arg1); - return true; - } - case TRANSACTION_onMeteredIfacesChanged: { - data.enforceInterface(DESCRIPTOR); - String[] _arg0; - _arg0 = data.createStringArray(); - this.onMeteredIfacesChanged(_arg0); - return true; - } - case TRANSACTION_onRestrictBackgroundChanged: { - data.enforceInterface(DESCRIPTOR); - boolean _arg0; - _arg0 = (0 != data.readInt()); - this.onRestrictBackgroundChanged(_arg0); - return true; - } - } - return super.onTransact(code, data, reply, flags); - } - - private static class Proxy implements android.net.INetworkPolicyListener { - private android.os.IBinder mRemote; - - Proxy(android.os.IBinder remote) { - mRemote = remote; - } - - @Override - public android.os.IBinder asBinder() { - return mRemote; - } - - @Override - public void onUidRulesChanged(int uid, int uidRules) throws android.os.RemoteException { - android.os.Parcel _data = android.os.Parcel.obtain(); - try { - _data.writeInterfaceToken(DESCRIPTOR); - _data.writeInt(uid); - _data.writeInt(uidRules); - mRemote.transact(Stub.TRANSACTION_onUidRulesChanged, _data, null, android.os.IBinder.FLAG_ONEWAY); - } finally { - _data.recycle(); - } - } - - @Override - public void onMeteredIfacesChanged(String[] meteredIfaces) throws android.os.RemoteException { - android.os.Parcel _data = android.os.Parcel.obtain(); - try { - _data.writeInterfaceToken(DESCRIPTOR); - _data.writeStringArray(meteredIfaces); - mRemote.transact(Stub.TRANSACTION_onMeteredIfacesChanged, _data, null, android.os.IBinder.FLAG_ONEWAY); - } finally { - _data.recycle(); - } - } - - @Override - public void onRestrictBackgroundChanged(boolean restrictBackground) throws android.os.RemoteException { - android.os.Parcel _data = android.os.Parcel.obtain(); - try { - _data.writeInterfaceToken(DESCRIPTOR); - _data.writeInt(((restrictBackground) ? (1) : (0))); - mRemote.transact(Stub.TRANSACTION_onRestrictBackgroundChanged, _data, null, android.os.IBinder.FLAG_ONEWAY); - } finally { - _data.recycle(); - } - } - } - - static final int TRANSACTION_onUidRulesChanged = (android.os.IBinder.FIRST_CALL_TRANSACTION); - static final int TRANSACTION_onMeteredIfacesChanged = (android.os.IBinder.FIRST_CALL_TRANSACTION + 1); - static final int TRANSACTION_onRestrictBackgroundChanged = (android.os.IBinder.FIRST_CALL_TRANSACTION + 2); - } - - public void onUidRulesChanged(int uid, int uidRules) throws android.os.RemoteException; - - public void onMeteredIfacesChanged(String[] meteredIfaces) throws android.os.RemoteException; - - public void onRestrictBackgroundChanged(boolean restrictBackground) throws android.os.RemoteException; -} diff --git a/QKSMS/src/main/java/android/net/INetworkPolicyManager.java b/QKSMS/src/main/java/android/net/INetworkPolicyManager.java deleted file mode 100644 index 09dd0fce4..000000000 --- a/QKSMS/src/main/java/android/net/INetworkPolicyManager.java +++ /dev/null @@ -1,494 +0,0 @@ -/* - * This file is auto-generated. DO NOT MODIFY. - * Original file: frameworks/base/core/java/android/net/INetworkPolicyManager.aidl - */ -package android.net; - -/** - * Interface that creates and modifies network policy rules. - *

- * {@hide} - */ -public interface INetworkPolicyManager extends android.os.IInterface { - /** - * Local-side IPC implementation stub class. - */ - public abstract static class Stub extends android.os.Binder implements android.net.INetworkPolicyManager { - private static final String DESCRIPTOR = "android.net.INetworkPolicyManager"; - - /** - * Construct the stub at attach it to the interface. - */ - public Stub() { - this.attachInterface(this, DESCRIPTOR); - } - - /** - * Cast an IBinder object into an android.net.INetworkPolicyManager interface, - * generating a proxy if needed. - */ - public static android.net.INetworkPolicyManager asInterface(android.os.IBinder obj) { - if ((obj == null)) { - return null; - } - android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR); - if (((iin != null) && (iin instanceof android.net.INetworkPolicyManager))) { - return ((android.net.INetworkPolicyManager) iin); - } - return new android.net.INetworkPolicyManager.Stub.Proxy(obj); - } - - @Override - public android.os.IBinder asBinder() { - return this; - } - - @Override - public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException { - switch (code) { - case INTERFACE_TRANSACTION: { - reply.writeString(DESCRIPTOR); - return true; - } - case TRANSACTION_setUidPolicy: { - data.enforceInterface(DESCRIPTOR); - int _arg0; - _arg0 = data.readInt(); - int _arg1; - _arg1 = data.readInt(); - this.setUidPolicy(_arg0, _arg1); - reply.writeNoException(); - return true; - } - case TRANSACTION_getUidPolicy: { - data.enforceInterface(DESCRIPTOR); - int _arg0; - _arg0 = data.readInt(); - int _result = this.getUidPolicy(_arg0); - reply.writeNoException(); - reply.writeInt(_result); - return true; - } - case TRANSACTION_getUidsWithPolicy: { - data.enforceInterface(DESCRIPTOR); - int _arg0; - _arg0 = data.readInt(); - int[] _result = this.getUidsWithPolicy(_arg0); - reply.writeNoException(); - reply.writeIntArray(_result); - return true; - } - case TRANSACTION_isUidForeground: { - data.enforceInterface(DESCRIPTOR); - int _arg0; - _arg0 = data.readInt(); - boolean _result = this.isUidForeground(_arg0); - reply.writeNoException(); - reply.writeInt(((_result) ? (1) : (0))); - return true; - } - case TRANSACTION_registerListener: { - data.enforceInterface(DESCRIPTOR); - android.net.INetworkPolicyListener _arg0; - _arg0 = android.net.INetworkPolicyListener.Stub.asInterface(data.readStrongBinder()); - this.registerListener(_arg0); - reply.writeNoException(); - return true; - } - case TRANSACTION_unregisterListener: { - data.enforceInterface(DESCRIPTOR); - android.net.INetworkPolicyListener _arg0; - _arg0 = android.net.INetworkPolicyListener.Stub.asInterface(data.readStrongBinder()); - this.unregisterListener(_arg0); - reply.writeNoException(); - return true; - } - case TRANSACTION_setNetworkPolicies: { - data.enforceInterface(DESCRIPTOR); - android.net.NetworkPolicy[] _arg0; - _arg0 = data.createTypedArray(android.net.NetworkPolicy.CREATOR); - this.setNetworkPolicies(_arg0); - reply.writeNoException(); - return true; - } - case TRANSACTION_getNetworkPolicies: { - data.enforceInterface(DESCRIPTOR); - android.net.NetworkPolicy[] _result = this.getNetworkPolicies(); - reply.writeNoException(); - reply.writeTypedArray(_result, android.os.Parcelable.PARCELABLE_WRITE_RETURN_VALUE); - return true; - } - case TRANSACTION_snoozeLimit: { - data.enforceInterface(DESCRIPTOR); - android.net.NetworkTemplate _arg0; - if ((0 != data.readInt())) { - _arg0 = android.net.NetworkTemplate.CREATOR.createFromParcel(data); - } else { - _arg0 = null; - } - this.snoozeLimit(_arg0); - reply.writeNoException(); - return true; - } - case TRANSACTION_setRestrictBackground: { - data.enforceInterface(DESCRIPTOR); - boolean _arg0; - _arg0 = (0 != data.readInt()); - this.setRestrictBackground(_arg0); - reply.writeNoException(); - return true; - } - case TRANSACTION_getRestrictBackground: { - data.enforceInterface(DESCRIPTOR); - boolean _result = this.getRestrictBackground(); - reply.writeNoException(); - reply.writeInt(((_result) ? (1) : (0))); - return true; - } - case TRANSACTION_getNetworkQuotaInfo: { - data.enforceInterface(DESCRIPTOR); - android.net.NetworkState _arg0; - if ((0 != data.readInt())) { - _arg0 = android.net.NetworkState.CREATOR.createFromParcel(data); - } else { - _arg0 = null; - } - android.net.NetworkQuotaInfo _result = this.getNetworkQuotaInfo(_arg0); - reply.writeNoException(); - if ((_result != null)) { - reply.writeInt(1); - _result.writeToParcel(reply, android.os.Parcelable.PARCELABLE_WRITE_RETURN_VALUE); - } else { - reply.writeInt(0); - } - return true; - } - case TRANSACTION_isNetworkMetered: { - data.enforceInterface(DESCRIPTOR); - android.net.NetworkState _arg0; - if ((0 != data.readInt())) { - _arg0 = android.net.NetworkState.CREATOR.createFromParcel(data); - } else { - _arg0 = null; - } - boolean _result = this.isNetworkMetered(_arg0); - reply.writeNoException(); - reply.writeInt(((_result) ? (1) : (0))); - return true; - } - } - return super.onTransact(code, data, reply, flags); - } - - private static class Proxy implements android.net.INetworkPolicyManager { - private android.os.IBinder mRemote; - - Proxy(android.os.IBinder remote) { - mRemote = remote; - } - - @Override - public android.os.IBinder asBinder() { - return mRemote; - } - - /** - * Control UID policies. - */ - @Override - public void setUidPolicy(int uid, int policy) throws android.os.RemoteException { - android.os.Parcel _data = android.os.Parcel.obtain(); - android.os.Parcel _reply = android.os.Parcel.obtain(); - try { - _data.writeInterfaceToken(DESCRIPTOR); - _data.writeInt(uid); - _data.writeInt(policy); - mRemote.transact(Stub.TRANSACTION_setUidPolicy, _data, _reply, 0); - _reply.readException(); - } finally { - _reply.recycle(); - _data.recycle(); - } - } - - @Override - public int getUidPolicy(int uid) throws android.os.RemoteException { - android.os.Parcel _data = android.os.Parcel.obtain(); - android.os.Parcel _reply = android.os.Parcel.obtain(); - int _result; - try { - _data.writeInterfaceToken(DESCRIPTOR); - _data.writeInt(uid); - mRemote.transact(Stub.TRANSACTION_getUidPolicy, _data, _reply, 0); - _reply.readException(); - _result = _reply.readInt(); - } finally { - _reply.recycle(); - _data.recycle(); - } - return _result; - } - - @Override - public int[] getUidsWithPolicy(int policy) throws android.os.RemoteException { - android.os.Parcel _data = android.os.Parcel.obtain(); - android.os.Parcel _reply = android.os.Parcel.obtain(); - int[] _result; - try { - _data.writeInterfaceToken(DESCRIPTOR); - _data.writeInt(policy); - mRemote.transact(Stub.TRANSACTION_getUidsWithPolicy, _data, _reply, 0); - _reply.readException(); - _result = _reply.createIntArray(); - } finally { - _reply.recycle(); - _data.recycle(); - } - return _result; - } - - @Override - public boolean isUidForeground(int uid) throws android.os.RemoteException { - android.os.Parcel _data = android.os.Parcel.obtain(); - android.os.Parcel _reply = android.os.Parcel.obtain(); - boolean _result; - try { - _data.writeInterfaceToken(DESCRIPTOR); - _data.writeInt(uid); - mRemote.transact(Stub.TRANSACTION_isUidForeground, _data, _reply, 0); - _reply.readException(); - _result = (0 != _reply.readInt()); - } finally { - _reply.recycle(); - _data.recycle(); - } - return _result; - } - - @Override - public void registerListener(android.net.INetworkPolicyListener listener) throws android.os.RemoteException { - android.os.Parcel _data = android.os.Parcel.obtain(); - android.os.Parcel _reply = android.os.Parcel.obtain(); - try { - _data.writeInterfaceToken(DESCRIPTOR); - _data.writeStrongBinder((((listener != null)) ? (listener.asBinder()) : (null))); - mRemote.transact(Stub.TRANSACTION_registerListener, _data, _reply, 0); - _reply.readException(); - } finally { - _reply.recycle(); - _data.recycle(); - } - } - - @Override - public void unregisterListener(android.net.INetworkPolicyListener listener) throws android.os.RemoteException { - android.os.Parcel _data = android.os.Parcel.obtain(); - android.os.Parcel _reply = android.os.Parcel.obtain(); - try { - _data.writeInterfaceToken(DESCRIPTOR); - _data.writeStrongBinder((((listener != null)) ? (listener.asBinder()) : (null))); - mRemote.transact(Stub.TRANSACTION_unregisterListener, _data, _reply, 0); - _reply.readException(); - } finally { - _reply.recycle(); - _data.recycle(); - } - } - - /** - * Control network policies atomically. - */ - @Override - public void setNetworkPolicies(android.net.NetworkPolicy[] policies) throws android.os.RemoteException { - android.os.Parcel _data = android.os.Parcel.obtain(); - android.os.Parcel _reply = android.os.Parcel.obtain(); - try { - _data.writeInterfaceToken(DESCRIPTOR); - _data.writeTypedArray(policies, 0); - mRemote.transact(Stub.TRANSACTION_setNetworkPolicies, _data, _reply, 0); - _reply.readException(); - } finally { - _reply.recycle(); - _data.recycle(); - } - } - - @Override - public android.net.NetworkPolicy[] getNetworkPolicies() throws android.os.RemoteException { - android.os.Parcel _data = android.os.Parcel.obtain(); - android.os.Parcel _reply = android.os.Parcel.obtain(); - android.net.NetworkPolicy[] _result; - try { - _data.writeInterfaceToken(DESCRIPTOR); - mRemote.transact(Stub.TRANSACTION_getNetworkPolicies, _data, _reply, 0); - _reply.readException(); - _result = _reply.createTypedArray(android.net.NetworkPolicy.CREATOR); - } finally { - _reply.recycle(); - _data.recycle(); - } - return _result; - } - - /** - * Snooze limit on policy matching given template. - */ - @Override - public void snoozeLimit(android.net.NetworkTemplate template) throws android.os.RemoteException { - android.os.Parcel _data = android.os.Parcel.obtain(); - android.os.Parcel _reply = android.os.Parcel.obtain(); - try { - _data.writeInterfaceToken(DESCRIPTOR); - if ((template != null)) { - _data.writeInt(1); - template.writeToParcel(_data, 0); - } else { - _data.writeInt(0); - } - mRemote.transact(Stub.TRANSACTION_snoozeLimit, _data, _reply, 0); - _reply.readException(); - } finally { - _reply.recycle(); - _data.recycle(); - } - } - - /** - * Control if background data is restricted system-wide. - */ - @Override - public void setRestrictBackground(boolean restrictBackground) throws android.os.RemoteException { - android.os.Parcel _data = android.os.Parcel.obtain(); - android.os.Parcel _reply = android.os.Parcel.obtain(); - try { - _data.writeInterfaceToken(DESCRIPTOR); - _data.writeInt(((restrictBackground) ? (1) : (0))); - mRemote.transact(Stub.TRANSACTION_setRestrictBackground, _data, _reply, 0); - _reply.readException(); - } finally { - _reply.recycle(); - _data.recycle(); - } - } - - @Override - public boolean getRestrictBackground() throws android.os.RemoteException { - android.os.Parcel _data = android.os.Parcel.obtain(); - android.os.Parcel _reply = android.os.Parcel.obtain(); - boolean _result; - try { - _data.writeInterfaceToken(DESCRIPTOR); - mRemote.transact(Stub.TRANSACTION_getRestrictBackground, _data, _reply, 0); - _reply.readException(); - _result = (0 != _reply.readInt()); - } finally { - _reply.recycle(); - _data.recycle(); - } - return _result; - } - - @Override - public android.net.NetworkQuotaInfo getNetworkQuotaInfo(android.net.NetworkState state) throws android.os.RemoteException { - android.os.Parcel _data = android.os.Parcel.obtain(); - android.os.Parcel _reply = android.os.Parcel.obtain(); - android.net.NetworkQuotaInfo _result; - try { - _data.writeInterfaceToken(DESCRIPTOR); - if ((state != null)) { - _data.writeInt(1); - state.writeToParcel(_data, 0); - } else { - _data.writeInt(0); - } - mRemote.transact(Stub.TRANSACTION_getNetworkQuotaInfo, _data, _reply, 0); - _reply.readException(); - if ((0 != _reply.readInt())) { - _result = android.net.NetworkQuotaInfo.CREATOR.createFromParcel(_reply); - } else { - _result = null; - } - } finally { - _reply.recycle(); - _data.recycle(); - } - return _result; - } - - @Override - public boolean isNetworkMetered(android.net.NetworkState state) throws android.os.RemoteException { - android.os.Parcel _data = android.os.Parcel.obtain(); - android.os.Parcel _reply = android.os.Parcel.obtain(); - boolean _result; - try { - _data.writeInterfaceToken(DESCRIPTOR); - if ((state != null)) { - _data.writeInt(1); - state.writeToParcel(_data, 0); - } else { - _data.writeInt(0); - } - mRemote.transact(Stub.TRANSACTION_isNetworkMetered, _data, _reply, 0); - _reply.readException(); - _result = (0 != _reply.readInt()); - } finally { - _reply.recycle(); - _data.recycle(); - } - return _result; - } - } - - static final int TRANSACTION_setUidPolicy = (android.os.IBinder.FIRST_CALL_TRANSACTION); - static final int TRANSACTION_getUidPolicy = (android.os.IBinder.FIRST_CALL_TRANSACTION + 1); - static final int TRANSACTION_getUidsWithPolicy = (android.os.IBinder.FIRST_CALL_TRANSACTION + 2); - static final int TRANSACTION_isUidForeground = (android.os.IBinder.FIRST_CALL_TRANSACTION + 3); - static final int TRANSACTION_registerListener = (android.os.IBinder.FIRST_CALL_TRANSACTION + 4); - static final int TRANSACTION_unregisterListener = (android.os.IBinder.FIRST_CALL_TRANSACTION + 5); - static final int TRANSACTION_setNetworkPolicies = (android.os.IBinder.FIRST_CALL_TRANSACTION + 6); - static final int TRANSACTION_getNetworkPolicies = (android.os.IBinder.FIRST_CALL_TRANSACTION + 7); - static final int TRANSACTION_snoozeLimit = (android.os.IBinder.FIRST_CALL_TRANSACTION + 8); - static final int TRANSACTION_setRestrictBackground = (android.os.IBinder.FIRST_CALL_TRANSACTION + 9); - static final int TRANSACTION_getRestrictBackground = (android.os.IBinder.FIRST_CALL_TRANSACTION + 10); - static final int TRANSACTION_getNetworkQuotaInfo = (android.os.IBinder.FIRST_CALL_TRANSACTION + 11); - static final int TRANSACTION_isNetworkMetered = (android.os.IBinder.FIRST_CALL_TRANSACTION + 12); - } - - /** - * Control UID policies. - */ - public void setUidPolicy(int uid, int policy) throws android.os.RemoteException; - - public int getUidPolicy(int uid) throws android.os.RemoteException; - - public int[] getUidsWithPolicy(int policy) throws android.os.RemoteException; - - public boolean isUidForeground(int uid) throws android.os.RemoteException; - - public void registerListener(android.net.INetworkPolicyListener listener) throws android.os.RemoteException; - - public void unregisterListener(android.net.INetworkPolicyListener listener) throws android.os.RemoteException; - - /** - * Control network policies atomically. - */ - public void setNetworkPolicies(android.net.NetworkPolicy[] policies) throws android.os.RemoteException; - - public android.net.NetworkPolicy[] getNetworkPolicies() throws android.os.RemoteException; - - /** - * Snooze limit on policy matching given template. - */ - public void snoozeLimit(android.net.NetworkTemplate template) throws android.os.RemoteException; - - /** - * Control if background data is restricted system-wide. - */ - public void setRestrictBackground(boolean restrictBackground) throws android.os.RemoteException; - - public boolean getRestrictBackground() throws android.os.RemoteException; - - public android.net.NetworkQuotaInfo getNetworkQuotaInfo(android.net.NetworkState state) throws android.os.RemoteException; - - public boolean isNetworkMetered(android.net.NetworkState state) throws android.os.RemoteException; -} diff --git a/QKSMS/src/main/java/android/net/LinkAddress.java b/QKSMS/src/main/java/android/net/LinkAddress.java deleted file mode 100644 index 21a5fe3fb..000000000 --- a/QKSMS/src/main/java/android/net/LinkAddress.java +++ /dev/null @@ -1,152 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.net; - -import android.os.Parcel; -import android.os.Parcelable; - -import java.net.Inet4Address; -import java.net.InetAddress; -import java.net.InterfaceAddress; -import java.net.UnknownHostException; - -/** - * Identifies an address of a network link - * - * @hide - */ -public class LinkAddress implements Parcelable { - /** - * IPv4 or IPv6 address. - */ - private final InetAddress address; - - /** - * Network prefix length - */ - private final int prefixLength; - - public LinkAddress(InetAddress address, int prefixLength) { - if (address == null || prefixLength < 0 || - ((address instanceof Inet4Address) && prefixLength > 32) || - (prefixLength > 128)) { - throw new IllegalArgumentException("Bad LinkAddress haloParams " + address + - prefixLength); - } - this.address = address; - this.prefixLength = prefixLength; - } - - public LinkAddress(InterfaceAddress interfaceAddress) { - this.address = interfaceAddress.getAddress(); - this.prefixLength = interfaceAddress.getNetworkPrefixLength(); - } - - @Override - public String toString() { - return (address == null ? "" : (address.getHostAddress() + "/" + prefixLength)); - } - - /** - * Compares this {@code LinkAddress} instance against the specified address - * in {@code obj}. Two addresses are equal if their InetAddress and prefixLength - * are equal - * - * @param obj the object to be tested for equality. - * @return {@code true} if both objects are equal, {@code false} otherwise. - */ - @Override - public boolean equals(Object obj) { - if (!(obj instanceof LinkAddress)) { - return false; - } - LinkAddress linkAddress = (LinkAddress) obj; - return this.address.equals(linkAddress.address) && - this.prefixLength == linkAddress.prefixLength; - } - - @Override - /* - * generate hashcode based on significant fields - */ - public int hashCode() { - return ((null == address) ? 0 : address.hashCode()) + prefixLength; - } - - /** - * Returns the InetAddress for this address. - */ - public InetAddress getAddress() { - return address; - } - - /** - * Get network prefix length - */ - public int getNetworkPrefixLength() { - return prefixLength; - } - - /** - * Implement the Parcelable interface - * - * @hide - */ - public int describeContents() { - return 0; - } - - /** - * Implement the Parcelable interface. - * - * @hide - */ - public void writeToParcel(Parcel dest, int flags) { - if (address != null) { - dest.writeByte((byte) 1); - dest.writeByteArray(address.getAddress()); - dest.writeInt(prefixLength); - } else { - dest.writeByte((byte) 0); - } - } - - /** - * Implement the Parcelable interface. - * - * @hide - */ - public static final Creator CREATOR = - new Creator() { - public LinkAddress createFromParcel(Parcel in) { - InetAddress address = null; - int prefixLength = 0; - if (in.readByte() == 1) { - try { - address = InetAddress.getByAddress(in.createByteArray()); - prefixLength = in.readInt(); - } catch (UnknownHostException e) { - } - } - return new LinkAddress(address, prefixLength); - } - - public LinkAddress[] newArray(int size) { - return new LinkAddress[size]; - } - }; -} diff --git a/QKSMS/src/main/java/android/net/LinkCapabilities.java b/QKSMS/src/main/java/android/net/LinkCapabilities.java deleted file mode 100644 index ad17464e5..000000000 --- a/QKSMS/src/main/java/android/net/LinkCapabilities.java +++ /dev/null @@ -1,393 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * Copyright (C) 2015 QK Labs - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.net; - -import android.os.Parcel; -import android.os.Parcelable; -import android.util.Log; - -import java.util.Collection; -import java.util.HashMap; -import java.util.Map.Entry; -import java.util.Set; - -/** - * A class representing the capabilities of a link - * - * @hide - */ -public class LinkCapabilities implements Parcelable { - private static final String TAG = "LinkCapabilities"; - private static final boolean LOCAL_LOGV = false; - - /** - * The Map of Keys to Values - */ - private HashMap mCapabilities; - - - /** - * The set of keys defined for a links capabilities. - *

- * Keys starting with RW are read + write, i.e. the application - * can request for a certain requirement corresponding to that key. - * Keys starting with RO are read only, i.e. the the application - * can read the value of that key from the socket but cannot request - * a corresponding requirement. - *

- * TODO: Provide a documentation technique for concisely and precisely - * define the syntax for each value string associated with a key. - */ - public static final class Key { - /** - * No constructor - */ - private Key() { - } - - /** - * An integer representing the network type. - * - * @see ConnectivityManager - */ - public static final int RO_NETWORK_TYPE = 1; - - /** - * Desired minimum forward link (download) bandwidth for the - * in kilobits per second (kbps). Values should be strings such - * "50", "100", "1500", etc. - */ - public static final int RW_DESIRED_FWD_BW = 2; - - /** - * Required minimum forward link (download) bandwidth, in - * per second (kbps), below which the socket cannot function. - * Values should be strings such as "50", "100", "1500", etc. - */ - public static final int RW_REQUIRED_FWD_BW = 3; - - /** - * Available forward link (download) bandwidth for the socket. - * This value is in kilobits per second (kbps). - * Values will be strings such as "50", "100", "1500", etc. - */ - public static final int RO_AVAILABLE_FWD_BW = 4; - - /** - * Desired minimum reverse link (upload) bandwidth for the socket - * in kilobits per second (kbps). - * Values should be strings such as "50", "100", "1500", etc. - *

- * This key is set via the needs map. - */ - public static final int RW_DESIRED_REV_BW = 5; - - /** - * Required minimum reverse link (upload) bandwidth, in kilobits - * per second (kbps), below which the socket cannot function. - * If a rate is not specified, the default rate of kbps will be - * Values should be strings such as "50", "100", "1500", etc. - */ - public static final int RW_REQUIRED_REV_BW = 6; - - /** - * Available reverse link (upload) bandwidth for the socket. - * This value is in kilobits per second (kbps). - * Values will be strings such as "50", "100", "1500", etc. - */ - public static final int RO_AVAILABLE_REV_BW = 7; - - /** - * Maximum latency for the socket, in milliseconds, above which - * socket cannot function. - * Values should be strings such as "50", "300", "500", etc. - */ - public static final int RW_MAX_ALLOWED_LATENCY = 8; - - /** - * Interface that the socket is bound to. This can be a virtual - * interface (e.g. VPN or Mobile IP) or a physical interface - * (e.g. wlan0 or rmnet0). - * Values will be strings such as "wlan0", "rmnet0" - */ - public static final int RO_BOUND_INTERFACE = 9; - - /** - * Physical interface that the socket is routed on. - * This can be different from BOUND_INTERFACE in cases such as - * VPN or Mobile IP. The physical interface may change over time - * if seamless mobility is supported. - * Values will be strings such as "wlan0", "rmnet0" - */ - public static final int RO_PHYSICAL_INTERFACE = 10; - } - - /** - * Role informs the LinkSocket about the data usage patterns of your - * application. - *

- * {@code Role.DEFAULT} is the default role, and is used whenever - * a role isn't set. - */ - public static final class Role { - /** - * No constructor - */ - private Role() { - } - - // examples only, discuss which roles should be defined, and then - // code these to match - - /** - * Default Role - */ - public static final String DEFAULT = "default"; - /** - * Bulk down load - */ - public static final String BULK_DOWNLOAD = "bulk.download"; - /** - * Bulk upload - */ - public static final String BULK_UPLOAD = "bulk.upload"; - - /** - * VoIP Application at 24kbps - */ - public static final String VOIP_24KBPS = "voip.24k"; - /** - * VoIP Application at 32kbps - */ - public static final String VOIP_32KBPS = "voip.32k"; - - /** - * Video Streaming at 480p - */ - public static final String VIDEO_STREAMING_480P = "video.streaming.480p"; - /** - * Video Streaming at 720p - */ - public static final String VIDEO_STREAMING_720I = "video.streaming.720i"; - - /** - * Video Chat Application at 360p - */ - public static final String VIDEO_CHAT_360P = "video.chat.360p"; - /** - * Video Chat Application at 480p - */ - public static final String VIDEO_CHAT_480P = "video.chat.480i"; - } - - /** - * Constructor - */ - public LinkCapabilities() { - mCapabilities = new HashMap<>(); - } - - /** - * Copy constructor. - * - * @param source - */ - public LinkCapabilities(LinkCapabilities source) { - if (source != null) { - mCapabilities = new HashMap<>(source.mCapabilities); - } else { - mCapabilities = new HashMap<>(); - } - } - - /** - * Create the {@code LinkCapabilities} with values depending on role type. - * - * @param applicationRole a {@code LinkSocket.Role} - * @return the {@code LinkCapabilities} associated with the applicationRole, empty if none - */ - public static LinkCapabilities createNeedsMap(String applicationRole) { - log("createNeededCapabilities(applicationRole) EX"); - return new LinkCapabilities(); - } - - /** - * Remove all capabilities - */ - public void clear() { - mCapabilities.clear(); - } - - /** - * Returns whether this map is empty. - */ - public boolean isEmpty() { - return mCapabilities.isEmpty(); - } - - /** - * Returns the number of elements in this map. - * - * @return the number of elements in this map. - */ - public int size() { - return mCapabilities.size(); - } - - /** - * Given the key return the capability string - * - * @param key - * @return the capability string - */ - public String get(int key) { - return mCapabilities.get(key); - } - - /** - * Store the key/value capability pair - * - * @param key - * @param value - */ - public void put(int key, String value) { - mCapabilities.put(key, value); - } - - /** - * Returns whether this map contains the specified key. - * - * @param key to search for. - * @return {@code true} if this map contains the specified key, - * {@code false} otherwise. - */ - public boolean containsKey(int key) { - return mCapabilities.containsKey(key); - } - - /** - * Returns whether this map contains the specified value. - * - * @param value to search for. - * @return {@code true} if this map contains the specified value, - * {@code false} otherwise. - */ - public boolean containsValue(String value) { - return mCapabilities.containsValue(value); - } - - /** - * Returns a set containing all of the mappings in this map. Each mapping is - * an instance of {@link java.util.Map.Entry}. As the set is backed by this map, - * changes in one will be reflected in the other. - * - * @return a set of the mappings. - */ - public Set> entrySet() { - return mCapabilities.entrySet(); - } - - /** - * @return the set of the keys. - */ - public Set keySet() { - return mCapabilities.keySet(); - } - - /** - * @return the set of values - */ - public Collection values() { - return mCapabilities.values(); - } - - /** - * Implement the Parcelable interface - * - * @hide - */ - public int describeContents() { - return 0; - } - - /** - * Convert to string for debugging - */ - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append("{"); - boolean firstTime = true; - for (Entry entry : mCapabilities.entrySet()) { - if (firstTime) { - firstTime = false; - } else { - sb.append(","); - } - sb.append(entry.getKey()); - sb.append(":\""); - sb.append(entry.getValue()); - sb.append("\""); - return mCapabilities.toString(); - } - return sb.toString(); - } - - /** - * Implement the Parcelable interface. - * - * @hide - */ - public void writeToParcel(Parcel dest, int flags) { - dest.writeInt(mCapabilities.size()); - for (Entry entry : mCapabilities.entrySet()) { - dest.writeInt(entry.getKey()); - dest.writeString(entry.getValue()); - } - } - - /** - * Implement the Parcelable interface. - * - * @hide - */ - public static final Creator CREATOR = - new Creator() { - public LinkCapabilities createFromParcel(Parcel in) { - LinkCapabilities capabilities = new LinkCapabilities(); - int size = in.readInt(); - while (size-- != 0) { - int key = in.readInt(); - String value = in.readString(); - capabilities.mCapabilities.put(key, value); - } - return capabilities; - } - - public LinkCapabilities[] newArray(int size) { - return new LinkCapabilities[size]; - } - }; - - /** - * Debug logging - */ - protected static void log(String s) { - if (LOCAL_LOGV) Log.v(TAG, s); - } -} diff --git a/QKSMS/src/main/java/android/net/LinkProperties.java b/QKSMS/src/main/java/android/net/LinkProperties.java deleted file mode 100644 index bc0ec65d6..000000000 --- a/QKSMS/src/main/java/android/net/LinkProperties.java +++ /dev/null @@ -1,438 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.net; - -import android.os.Parcel; -import android.os.Parcelable; -import android.text.TextUtils; - -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; - -/** - * Describes the properties of a network link. - *

- * A link represents a connection to a network. - * It may have multiple addresses and multiple gateways, - * multiple dns servers but only one http proxy. - *

- * Because it's a single network, the dns's - * are interchangeable and don't need associating with - * particular addresses. The gateways similarly don't - * need associating with particular addresses. - *

- * A dual stack interface works fine in this model: - * each address has it's own prefix length to describe - * the local network. The dns servers all return - * both v4 addresses and v6 addresses regardless of the - * address family of the server itself (rfc4213) and we - * don't care which is used. The gateways will be - * selected based on the destination address and the - * source address has no relavence. - * - * @hide - */ -public class LinkProperties implements Parcelable { - - String mIfaceName; - private Collection mLinkAddresses = new ArrayList<>(); - private Collection mDnses = new ArrayList<>(); - private Collection mRoutes = new ArrayList<>(); - private ProxyProperties mHttpProxy; - - public static class CompareResult { - public Collection removed = new ArrayList<>(); - public Collection added = new ArrayList<>(); - - @Override - public String toString() { - String retVal = "removed=["; - for (T addr : removed) retVal += addr.toString() + ","; - retVal += "] added=["; - for (T addr : added) retVal += addr.toString() + ","; - retVal += "]"; - return retVal; - } - } - - public LinkProperties() { - clear(); - } - - // copy constructor instead of clone - public LinkProperties(LinkProperties source) { - if (source != null) { - mIfaceName = source.getInterfaceName(); - for (LinkAddress l : source.getLinkAddresses()) mLinkAddresses.add(l); - for (InetAddress i : source.getDnses()) mDnses.add(i); - for (RouteInfo r : source.getRoutes()) mRoutes.add(r); - mHttpProxy = (source.getHttpProxy() == null) ? - null : new ProxyProperties(source.getHttpProxy()); - } - } - - public void setInterfaceName(String iface) { - mIfaceName = iface; - } - - public String getInterfaceName() { - return mIfaceName; - } - - public Collection getAddresses() { - Collection addresses = new ArrayList<>(); - for (LinkAddress linkAddress : mLinkAddresses) { - addresses.add(linkAddress.getAddress()); - } - return Collections.unmodifiableCollection(addresses); - } - - public void addLinkAddress(LinkAddress address) { - if (address != null) mLinkAddresses.add(address); - } - - public Collection getLinkAddresses() { - return Collections.unmodifiableCollection(mLinkAddresses); - } - - public void addDns(InetAddress dns) { - if (dns != null) mDnses.add(dns); - } - - public Collection getDnses() { - return Collections.unmodifiableCollection(mDnses); - } - - public void addRoute(RouteInfo route) { - if (route != null) mRoutes.add(route); - } - - public Collection getRoutes() { - return Collections.unmodifiableCollection(mRoutes); - } - - public void setHttpProxy(ProxyProperties proxy) { - mHttpProxy = proxy; - } - - public ProxyProperties getHttpProxy() { - return mHttpProxy; - } - - public void clear() { - mIfaceName = null; - mLinkAddresses.clear(); - mDnses.clear(); - mRoutes.clear(); - mHttpProxy = null; - } - - /** - * Implement the Parcelable interface - * - * @hide - */ - public int describeContents() { - return 0; - } - - @Override - public String toString() { - String ifaceName = (mIfaceName == null ? "" : "InterfaceName: " + mIfaceName + " "); - - String linkAddresses = "LinkAddresses: ["; - for (LinkAddress addr : mLinkAddresses) linkAddresses += addr.toString() + ","; - linkAddresses += "] "; - - String dns = "DnsAddresses: ["; - for (InetAddress addr : mDnses) dns += addr.getHostAddress() + ","; - dns += "] "; - - String routes = "Routes: ["; - for (RouteInfo route : mRoutes) routes += route.toString() + ","; - routes += "] "; - String proxy = (mHttpProxy == null ? "" : "HttpProxy: " + mHttpProxy.toString() + " "); - - return ifaceName + linkAddresses + routes + dns + proxy; - } - - /** - * Compares this {@code LinkProperties} interface name against the target - * - * @param target LinkProperties to compare. - * @return {@code true} if both are identical, {@code false} otherwise. - */ - public boolean isIdenticalInterfaceName(LinkProperties target) { - return TextUtils.equals(getInterfaceName(), target.getInterfaceName()); - } - - /** - * Compares this {@code LinkProperties} interface name against the target - * - * @param target LinkProperties to compare. - * @return {@code true} if both are identical, {@code false} otherwise. - */ - public boolean isIdenticalAddresses(LinkProperties target) { - Collection targetAddresses = target.getAddresses(); - Collection sourceAddresses = getAddresses(); - return (sourceAddresses.size() == targetAddresses.size()) && sourceAddresses.containsAll(targetAddresses); - } - - /** - * Compares this {@code LinkProperties} DNS addresses against the target - * - * @param target LinkProperties to compare. - * @return {@code true} if both are identical, {@code false} otherwise. - */ - public boolean isIdenticalDnses(LinkProperties target) { - Collection targetDnses = target.getDnses(); - return (mDnses.size() == targetDnses.size()) && mDnses.containsAll(targetDnses); - } - - /** - * Compares this {@code LinkProperties} Routes against the target - * - * @param target LinkProperties to compare. - * @return {@code true} if both are identical, {@code false} otherwise. - */ - public boolean isIdenticalRoutes(LinkProperties target) { - Collection targetRoutes = target.getRoutes(); - return (mRoutes.size() == targetRoutes.size()) && mRoutes.containsAll(targetRoutes); - } - - /** - * Compares this {@code LinkProperties} HttpProxy against the target - * - * @param target LinkProperties to compare. - * @return {@code true} if both are identical, {@code false} otherwise. - */ - public boolean isIdenticalHttpProxy(LinkProperties target) { - return getHttpProxy() == null ? target.getHttpProxy() == null : - getHttpProxy().equals(target.getHttpProxy()); - } - - @Override - /** - * Compares this {@code LinkProperties} instance against the target - * LinkProperties in {@code obj}. Two LinkPropertieses are equal if - * all their fields are equal in values. - * - * For collection fields, such as mDnses, containsAll() is used to check - * if two collections contains the same elements, independent of order. - * There are two thoughts regarding containsAll() - * 1. Duplicated elements. eg, (A, B, B) and (A, A, B) are equal. - * 2. Worst case performance is O(n^2). - * - * @param obj the object to be tested for equality. - * @return {@code true} if both objects are equal, {@code false} otherwise. - */ - public boolean equals(Object obj) { - if (this == obj) return true; - - if (!(obj instanceof LinkProperties)) return false; - - LinkProperties target = (LinkProperties) obj; - - return isIdenticalInterfaceName(target) && - isIdenticalAddresses(target) && - isIdenticalDnses(target) && - isIdenticalRoutes(target) && - isIdenticalHttpProxy(target); - } - - /** - * Return two lists, a list of addresses that would be removed from - * mLinkAddresses and a list of addresses that would be added to - * mLinkAddress which would then result in target and mLinkAddresses - * being the same list. - * - * @param target is a LinkProperties with the new list of addresses - * @return the removed and added lists. - */ - public CompareResult compareAddresses(LinkProperties target) { - /* - * Duplicate the LinkAddresses into removed, we will be removing - * address which are common between mLinkAddresses and target - * leaving the addresses that are different. And address which - * are in target but not in mLinkAddresses are placed in the - * addedAddresses. - */ - CompareResult result = new CompareResult<>(); - result.removed = new ArrayList<>(mLinkAddresses); - result.added.clear(); - if (target != null) { - for (LinkAddress newAddress : target.getLinkAddresses()) { - if (!result.removed.remove(newAddress)) { - result.added.add(newAddress); - } - } - } - return result; - } - - /** - * Return two lists, a list of dns addresses that would be removed from - * mDnses and a list of addresses that would be added to - * mDnses which would then result in target and mDnses - * being the same list. - * - * @param target is a LinkProperties with the new list of dns addresses - * @return the removed and added lists. - */ - public CompareResult compareDnses(LinkProperties target) { - /* - * Duplicate the InetAddresses into removed, we will be removing - * dns address which are common between mDnses and target - * leaving the addresses that are different. And dns address which - * are in target but not in mDnses are placed in the - * addedAddresses. - */ - CompareResult result = new CompareResult<>(); - - result.removed = new ArrayList<>(mDnses); - result.added.clear(); - if (target != null) { - for (InetAddress newAddress : target.getDnses()) { - if (!result.removed.remove(newAddress)) { - result.added.add(newAddress); - } - } - } - return result; - } - - /** - * Return two lists, a list of routes that would be removed from - * mRoutes and a list of routes that would be added to - * mRoutes which would then result in target and mRoutes - * being the same list. - * - * @param target is a LinkProperties with the new list of routes - * @return the removed and added lists. - */ - public CompareResult compareRoutes(LinkProperties target) { - /* - * Duplicate the RouteInfos into removed, we will be removing - * routes which are common between mDnses and target - * leaving the routes that are different. And route address which - * are in target but not in mRoutes are placed in added. - */ - CompareResult result = new CompareResult<>(); - - result.removed = new ArrayList<>(mRoutes); - result.added.clear(); - if (target != null) { - for (RouteInfo r : target.getRoutes()) { - if (!result.removed.remove(r)) { - result.added.add(r); - } - } - } - return result; - } - - - @Override - /** - * generate hashcode based on significant fields - * Equal objects must produce the same hash code, while unequal objects - * may have the same hash codes. - */ - public int hashCode() { - return ((null == mIfaceName) ? 0 : mIfaceName.hashCode() - + mLinkAddresses.size() * 31 - + mDnses.size() * 37 - + mRoutes.size() * 41 - + ((null == mHttpProxy) ? 0 : mHttpProxy.hashCode())); - } - - /** - * Implement the Parcelable interface. - * - * @hide - */ - public void writeToParcel(Parcel dest, int flags) { - dest.writeString(getInterfaceName()); - dest.writeInt(mLinkAddresses.size()); - for (LinkAddress linkAddress : mLinkAddresses) { - dest.writeParcelable(linkAddress, flags); - } - - dest.writeInt(mDnses.size()); - for (InetAddress d : mDnses) { - dest.writeByteArray(d.getAddress()); - } - - dest.writeInt(mRoutes.size()); - for (RouteInfo route : mRoutes) { - dest.writeParcelable(route, flags); - } - - if (mHttpProxy != null) { - dest.writeByte((byte) 1); - dest.writeParcelable(mHttpProxy, flags); - } else { - dest.writeByte((byte) 0); - } - } - - /** - * Implement the Parcelable interface. - * - * @hide - */ - public static final Creator CREATOR = - new Creator() { - public LinkProperties createFromParcel(Parcel in) { - LinkProperties netProp = new LinkProperties(); - String iface = in.readString(); - if (iface != null) { - try { - netProp.setInterfaceName(iface); - } catch (Exception e) { - return null; - } - } - int addressCount = in.readInt(); - for (int i = 0; i < addressCount; i++) { - netProp.addLinkAddress((LinkAddress) in.readParcelable(null)); - } - addressCount = in.readInt(); - for (int i = 0; i < addressCount; i++) { - try { - netProp.addDns(InetAddress.getByAddress(in.createByteArray())); - } catch (UnknownHostException e) { - } - } - addressCount = in.readInt(); - for (int i = 0; i < addressCount; i++) { - netProp.addRoute((RouteInfo) in.readParcelable(null)); - } - if (in.readByte() == 1) { - netProp.setHttpProxy((ProxyProperties) in.readParcelable(null)); - } - return netProp; - } - - public LinkProperties[] newArray(int size) { - return new LinkProperties[size]; - } - }; -} diff --git a/QKSMS/src/main/java/android/net/NetworkIdentity.java b/QKSMS/src/main/java/android/net/NetworkIdentity.java deleted file mode 100644 index 430a60e97..000000000 --- a/QKSMS/src/main/java/android/net/NetworkIdentity.java +++ /dev/null @@ -1,229 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * Copyright (C) 2015 QK Labs - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.net; - -import android.content.Context; -import android.net.wifi.WifiInfo; -import android.net.wifi.WifiManager; -import android.os.Build; -import android.telephony.TelephonyManager; - -import com.android.internal.util.Objects; - -import static android.net.ConnectivityManager.TYPE_WIFI; - -/** - * Network definition that includes strong identity. Analogous to combining - * {@link NetworkInfo} and an IMSI. - * - * @hide - */ -public class NetworkIdentity { - /** - * When enabled, combine all {@link #mSubType} together under - * {@link #SUBTYPE_COMBINED}. - */ - public static final boolean COMBINE_SUBTYPE_ENABLED = true; - - public static final int SUBTYPE_COMBINED = -1; - - final int mType; - final int mSubType; - final String mSubscriberId; - final String mNetworkId; - final boolean mRoaming; - - public NetworkIdentity( - int type, int subType, String subscriberId, String networkId, boolean roaming) { - mType = type; - mSubType = COMBINE_SUBTYPE_ENABLED ? SUBTYPE_COMBINED : subType; - mSubscriberId = subscriberId; - mNetworkId = networkId; - mRoaming = roaming; - } - - /** - * {@hide} - */ - public static String getNetworkTypeName(int type) { - switch (type) { - case 0: - return "MOBILE"; - case TYPE_WIFI: - return "WIFI"; - case 2: - return "MOBILE_MMS"; - case 3: - return "MOBILE_SUPL"; - case 4: - return "MOBILE_DUN"; - case 5: - return "MOBILE_HIPRI"; - case 6: - return "WIMAX"; - case 7: - return "BLUETOOTH"; - case 8: - return "DUMMY"; - case 9: - return "ETHERNET"; - case 10: - return "MOBILE_FOTA"; - case 11: - return "MOBILE_IMS"; - case 12: - return "MOBILE_CBS"; - case 13: - return "WIFI_P2P"; - default: - return Integer.toString(type); - } - } - - /** - * {@hide} - */ - public static boolean isNetworkTypeMobile(int networkType) { - switch (networkType) { - case 0: - case 2: - case 3: - case 4: - case 5: - case 10: - case 11: - case 12: - return true; - default: - return false; - } - } - - @Override - public int hashCode() { - return Objects.hashCode(mType, mSubType, mSubscriberId, mNetworkId, mRoaming); - } - - @Override - public boolean equals(Object obj) { - if (obj instanceof NetworkIdentity) { - final NetworkIdentity ident = (NetworkIdentity) obj; - return mType == ident.mType && mSubType == ident.mSubType && mRoaming == ident.mRoaming - && Objects.equal(mSubscriberId, ident.mSubscriberId) - && Objects.equal(mNetworkId, ident.mNetworkId); - } - return false; - } - - @Override - public String toString() { - final StringBuilder builder = new StringBuilder("["); - builder.append("type=").append(getNetworkTypeName(mType)); - builder.append(", subType="); - if (COMBINE_SUBTYPE_ENABLED) { - builder.append("COMBINED"); - } else if (isNetworkTypeMobile(mType)) { - builder.append(getNetworkTypeName(mSubType)); - } else { - builder.append(mSubType); - } - if (mSubscriberId != null) { - builder.append(", subscriberId=").append(scrubSubscriberId(mSubscriberId)); - } - if (mNetworkId != null) { - builder.append(", networkId=").append(mNetworkId); - } - if (mRoaming) { - builder.append(", ROAMING"); - } - return builder.append("]").toString(); - } - - public int getType() { - return mType; - } - - public int getSubType() { - return mSubType; - } - - public String getSubscriberId() { - return mSubscriberId; - } - - public String getNetworkId() { - return mNetworkId; - } - - public boolean getRoaming() { - return mRoaming; - } - - /** - * Scrub given IMSI on production builds. - */ - public static String scrubSubscriberId(String subscriberId) { - if ("eng".equals(Build.TYPE)) { - return subscriberId; - } else if (subscriberId != null) { - // TODO: parse this as MCC+MNC instead of hard-coding - return subscriberId.substring(0, Math.min(6, subscriberId.length())) + "..."; - } else { - return "null"; - } - } - - /** - * Build a {@link android.net.NetworkIdentity} from the given {@link NetworkState}, - * assuming that any mobile networks are using the current IMSI. - */ - public static NetworkIdentity buildNetworkIdentity(Context context, NetworkState state) { - final int type = state.networkInfo.getType(); - final int subType = state.networkInfo.getSubtype(); - - // TODO: consider moving subscriberId over to LinkCapabilities, so it - // comes from an authoritative source. - - String subscriberId = null; - String networkId = null; - boolean roaming = false; - - if (isNetworkTypeMobile(type)) { - final TelephonyManager telephony = (TelephonyManager) context.getSystemService( - Context.TELEPHONY_SERVICE); - roaming = telephony.isNetworkRoaming(); - if (state.subscriberId != null) { - subscriberId = state.subscriberId; - } else { - subscriberId = telephony.getSubscriberId(); - } - - } else if (type == TYPE_WIFI) { - if (state.networkId != null) { - networkId = state.networkId; - } else { - final WifiManager wifi = (WifiManager) context.getSystemService( - Context.WIFI_SERVICE); - final WifiInfo info = wifi.getConnectionInfo(); - networkId = info != null ? info.getSSID() : null; - } - } - - return new NetworkIdentity(type, subType, subscriberId, networkId, roaming); - } -} diff --git a/QKSMS/src/main/java/android/net/NetworkPolicy.java b/QKSMS/src/main/java/android/net/NetworkPolicy.java deleted file mode 100644 index 9d46b7974..000000000 --- a/QKSMS/src/main/java/android/net/NetworkPolicy.java +++ /dev/null @@ -1,185 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * Copyright (C) 2015 QK Labs - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.net; - -import android.os.Parcel; -import android.os.Parcelable; - -import com.android.internal.util.Objects; - -import static com.android.internal.util.Preconditions.checkNotNull; - -/** - * Policy for networks matching a {@link NetworkTemplate}, including usage cycle - * and limits to be enforced. - * - * @hide - */ -public class NetworkPolicy implements Parcelable, Comparable { - public static final int CYCLE_NONE = -1; - public static final long WARNING_DISABLED = -1; - public static final long LIMIT_DISABLED = -1; - public static final long SNOOZE_NEVER = -1; - - public final NetworkTemplate template; - public int cycleDay; - public String cycleTimezone; - public long warningBytes; - public long limitBytes; - public long lastWarningSnooze; - public long lastLimitSnooze; - public boolean metered; - public boolean inferred; - - private static final long DEFAULT_MTU = 1500; - - @Deprecated - public NetworkPolicy(NetworkTemplate template, int cycleDay, String cycleTimezone, - long warningBytes, long limitBytes, boolean metered) { - this(template, cycleDay, cycleTimezone, warningBytes, limitBytes, SNOOZE_NEVER, - SNOOZE_NEVER, metered, false); - } - - public NetworkPolicy(NetworkTemplate template, int cycleDay, String cycleTimezone, - long warningBytes, long limitBytes, long lastWarningSnooze, long lastLimitSnooze, - boolean metered, boolean inferred) { - this.template = checkNotNull(template, "missing NetworkTemplate"); - this.cycleDay = cycleDay; - this.cycleTimezone = checkNotNull(cycleTimezone, "missing cycleTimezone"); - this.warningBytes = warningBytes; - this.limitBytes = limitBytes; - this.lastWarningSnooze = lastWarningSnooze; - this.lastLimitSnooze = lastLimitSnooze; - this.metered = metered; - this.inferred = inferred; - } - - public NetworkPolicy(Parcel in) { - template = in.readParcelable(null); - cycleDay = in.readInt(); - cycleTimezone = in.readString(); - warningBytes = in.readLong(); - limitBytes = in.readLong(); - lastWarningSnooze = in.readLong(); - lastLimitSnooze = in.readLong(); - metered = in.readInt() != 0; - inferred = in.readInt() != 0; - } - - @Override - public void writeToParcel(Parcel dest, int flags) { - dest.writeParcelable(template, flags); - dest.writeInt(cycleDay); - dest.writeString(cycleTimezone); - dest.writeLong(warningBytes); - dest.writeLong(limitBytes); - dest.writeLong(lastWarningSnooze); - dest.writeLong(lastLimitSnooze); - dest.writeInt(metered ? 1 : 0); - dest.writeInt(inferred ? 1 : 0); - } - - @Override - public int describeContents() { - return 0; - } - - /** - * Test if given measurement is over {@link #warningBytes}. - */ - public boolean isOverWarning(long totalBytes) { - return warningBytes != WARNING_DISABLED && totalBytes >= warningBytes; - } - - /** - * Test if given measurement is near enough to {@link #limitBytes} to be - * considered over-limit. - */ - public boolean isOverLimit(long totalBytes) { - // over-estimate, since kernel will trigger limit once first packet - // trips over limit. - totalBytes += 2 * DEFAULT_MTU; - return limitBytes != LIMIT_DISABLED && totalBytes >= limitBytes; - } - - /** - * Clear any existing snooze values, setting to {@link #SNOOZE_NEVER}. - */ - public void clearSnooze() { - lastWarningSnooze = SNOOZE_NEVER; - lastLimitSnooze = SNOOZE_NEVER; - } - - /** - * Test if this policy has a cycle defined, after which usage should reset. - */ - public boolean hasCycle() { - return cycleDay != CYCLE_NONE; - } - - @Override - public int compareTo(NetworkPolicy another) { - if (another == null || another.limitBytes == LIMIT_DISABLED) { - // other value is missing or disabled; we win - return -1; - } - if (limitBytes == LIMIT_DISABLED || another.limitBytes < limitBytes) { - // we're disabled or other limit is smaller; they win - return 1; - } - return 0; - } - - @Override - public int hashCode() { - return Objects.hashCode(template, cycleDay, cycleTimezone, warningBytes, limitBytes, - lastWarningSnooze, lastLimitSnooze, metered, inferred); - } - - @Override - public boolean equals(Object obj) { - if (obj instanceof NetworkPolicy) { - final NetworkPolicy other = (NetworkPolicy) obj; - return cycleDay == other.cycleDay && warningBytes == other.warningBytes - && limitBytes == other.limitBytes - && lastWarningSnooze == other.lastWarningSnooze - && lastLimitSnooze == other.lastLimitSnooze && metered == other.metered - && inferred == other.inferred - && Objects.equal(cycleTimezone, other.cycleTimezone) - && Objects.equal(template, other.template); - } - return false; - } - - @Override - public String toString() { - return "NetworkPolicy" + "[" + template + "]:" + " cycleDay=" + cycleDay + ", cycleTimezone=" + cycleTimezone + ", warningBytes=" + warningBytes + ", limitBytes=" + limitBytes + ", lastWarningSnooze=" + lastWarningSnooze + ", lastLimitSnooze=" + lastLimitSnooze + ", metered=" + metered + ", inferred=" + inferred; - } - - public static final Creator CREATOR = new Creator() { - @Override - public NetworkPolicy createFromParcel(Parcel in) { - return new NetworkPolicy(in); - } - - @Override - public NetworkPolicy[] newArray(int size) { - return new NetworkPolicy[size]; - } - }; -} diff --git a/QKSMS/src/main/java/android/net/NetworkPolicyManager.java b/QKSMS/src/main/java/android/net/NetworkPolicyManager.java deleted file mode 100644 index c734cd5e6..000000000 --- a/QKSMS/src/main/java/android/net/NetworkPolicyManager.java +++ /dev/null @@ -1,299 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * Copyright (C) 2015 QK Labs - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.net; - -import android.content.Context; -import android.content.Intent; -import android.content.pm.PackageManager; -import android.content.pm.PackageManager.NameNotFoundException; -import android.content.pm.Signature; -import android.os.RemoteException; -import android.text.format.Time; - -import com.google.android.collect.Sets; - -import java.io.PrintWriter; -import java.util.HashSet; - -import static android.content.pm.PackageManager.GET_SIGNATURES; -import static android.net.NetworkPolicy.CYCLE_NONE; -import static android.text.format.Time.MONTH_DAY; - -/** - * Manager for creating and modifying network policy rules. - *

- * {@hide} - */ -public class NetworkPolicyManager { - - /** - * No specific network policy, use system default. - */ - public static final int POLICY_NONE = 0x0; - /** - * Reject network usage on metered networks when application in background. - */ - public static final int POLICY_REJECT_METERED_BACKGROUND = 0x1; - - /** - * All network traffic should be allowed. - */ - public static final int RULE_ALLOW_ALL = 0x0; - /** - * Reject traffic on metered networks. - */ - public static final int RULE_REJECT_METERED = 0x1; - - private static final boolean ALLOW_PLATFORM_APP_POLICY = true; - - /** - * {@link Intent} extra that indicates which {@link NetworkTemplate} rule it - * applies to. - */ - public static final String EXTRA_NETWORK_TEMPLATE = "android.net.NETWORK_TEMPLATE"; - - private INetworkPolicyManager mService; - - public NetworkPolicyManager(INetworkPolicyManager service) { - if (service == null) { - throw new IllegalArgumentException("missing INetworkPolicyManager"); - } - mService = service; - } - - public static NetworkPolicyManager from(Context context) { - return (NetworkPolicyManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); - } - - /** - * Set policy flags for specific UID. - * - * @param policy {@link #POLICY_NONE} or combination of flags like - * {@link #POLICY_REJECT_METERED_BACKGROUND}. - */ - public void setUidPolicy(int uid, int policy) { - try { - mService.setUidPolicy(uid, policy); - } catch (RemoteException e) { - } - } - - public int getUidPolicy(int uid) { - try { - return mService.getUidPolicy(uid); - } catch (RemoteException e) { - return POLICY_NONE; - } - } - - public int[] getUidsWithPolicy(int policy) { - try { - return mService.getUidsWithPolicy(policy); - } catch (RemoteException e) { - return new int[0]; - } - } - - public void registerListener(INetworkPolicyListener listener) { - try { - mService.registerListener(listener); - } catch (RemoteException e) { - } - } - - public void unregisterListener(INetworkPolicyListener listener) { - try { - mService.unregisterListener(listener); - } catch (RemoteException e) { - } - } - - public void setNetworkPolicies(NetworkPolicy[] policies) { - try { - mService.setNetworkPolicies(policies); - } catch (RemoteException e) { - } - } - - public NetworkPolicy[] getNetworkPolicies() { - try { - return mService.getNetworkPolicies(); - } catch (RemoteException e) { - return null; - } - } - - public void setRestrictBackground(boolean restrictBackground) { - try { - mService.setRestrictBackground(restrictBackground); - } catch (RemoteException e) { - } - } - - public boolean getRestrictBackground() { - try { - return mService.getRestrictBackground(); - } catch (RemoteException e) { - return false; - } - } - - /** - * Compute the last cycle boundary for the given {@link NetworkPolicy}. For - * example, if cycle day is 20th, and today is June 15th, it will return May - * 20th. When cycle day doesn't exist in current month, it snaps to the 1st - * of following month. - * - * @hide - */ - public static long computeLastCycleBoundary(long currentTime, NetworkPolicy policy) { - if (policy.cycleDay == CYCLE_NONE) { - throw new IllegalArgumentException("Unable to compute boundary without cycleDay"); - } - - final Time now = new Time(policy.cycleTimezone); - now.set(currentTime); - - // first, find cycle boundary for current month - final Time cycle = new Time(now); - cycle.hour = cycle.minute = cycle.second = 0; - snapToCycleDay(cycle, policy.cycleDay); - - if (Time.compare(cycle, now) >= 0) { - // cycle boundary is beyond now, use last cycle boundary; start by - // pushing ourselves squarely into last month. - final Time lastMonth = new Time(now); - lastMonth.hour = lastMonth.minute = lastMonth.second = 0; - lastMonth.monthDay = 1; - lastMonth.month -= 1; - lastMonth.normalize(true); - - cycle.set(lastMonth); - snapToCycleDay(cycle, policy.cycleDay); - } - - return cycle.toMillis(true); - } - - /** - * {@hide} - */ - public static long computeNextCycleBoundary(long currentTime, NetworkPolicy policy) { - if (policy.cycleDay == CYCLE_NONE) { - throw new IllegalArgumentException("Unable to compute boundary without cycleDay"); - } - - final Time now = new Time(policy.cycleTimezone); - now.set(currentTime); - - // first, find cycle boundary for current month - final Time cycle = new Time(now); - cycle.hour = cycle.minute = cycle.second = 0; - snapToCycleDay(cycle, policy.cycleDay); - - if (Time.compare(cycle, now) <= 0) { - // cycle boundary is before now, use next cycle boundary; start by - // pushing ourselves squarely into next month. - final Time nextMonth = new Time(now); - nextMonth.hour = nextMonth.minute = nextMonth.second = 0; - nextMonth.monthDay = 1; - nextMonth.month += 1; - nextMonth.normalize(true); - - cycle.set(nextMonth); - snapToCycleDay(cycle, policy.cycleDay); - } - - return cycle.toMillis(true); - } - - /** - * Snap to the cycle day for the current month given; when cycle day doesn't - * exist, it snaps to last second of current month. - * - * @hide - */ - public static void snapToCycleDay(Time time, int cycleDay) { - if (cycleDay > time.getActualMaximum(MONTH_DAY)) { - // cycle day isn't valid this month; snap to last second of month - time.month += 1; - time.monthDay = 1; - time.second = -1; - } else { - time.monthDay = cycleDay; - } - time.normalize(true); - } - - /** - * Check if given UID can have a {@link #setUidPolicy(int, int)} defined, - * usually to protect critical system services. - */ - @Deprecated - public static boolean isUidValidForPolicy(Context context, int uid) { - - if (!ALLOW_PLATFORM_APP_POLICY) { - final PackageManager pm = context.getPackageManager(); - final HashSet systemSignature; - try { - systemSignature = Sets.newHashSet( - pm.getPackageInfo("android", GET_SIGNATURES).signatures); - } catch (NameNotFoundException e) { - throw new RuntimeException("problem finding system signature", e); - } - - try { - // reject apps signed with platform cert - for (String packageName : pm.getPackagesForUid(uid)) { - final HashSet packageSignature = Sets.newHashSet( - pm.getPackageInfo(packageName, GET_SIGNATURES).signatures); - if (packageSignature.containsAll(systemSignature)) { - return false; - } - } - } catch (NameNotFoundException e) { - } - } - - // nothing found above; we can apply policy to UID - return true; - } - - /** - * {@hide} - */ - public static void dumpPolicy(PrintWriter fout, int policy) { - fout.write("["); - if ((policy & POLICY_REJECT_METERED_BACKGROUND) != 0) { - fout.write("REJECT_METERED_BACKGROUND"); - } - fout.write("]"); - } - - /** - * {@hide} - */ - public static void dumpRules(PrintWriter fout, int rules) { - fout.write("["); - if ((rules & RULE_REJECT_METERED) != 0) { - fout.write("REJECT_METERED"); - } - fout.write("]"); - } - -} diff --git a/QKSMS/src/main/java/android/net/NetworkQuotaInfo.java b/QKSMS/src/main/java/android/net/NetworkQuotaInfo.java deleted file mode 100644 index b67d41c7b..000000000 --- a/QKSMS/src/main/java/android/net/NetworkQuotaInfo.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.net; - -import android.os.Parcel; -import android.os.Parcelable; - -/** - * Information about quota status on a specific network. - * - * @hide - */ -public class NetworkQuotaInfo implements Parcelable { - private final long mEstimatedBytes; - private final long mSoftLimitBytes; - private final long mHardLimitBytes; - - public static final long NO_LIMIT = -1; - - /** - * {@hide} - */ - public NetworkQuotaInfo(long estimatedBytes, long softLimitBytes, long hardLimitBytes) { - mEstimatedBytes = estimatedBytes; - mSoftLimitBytes = softLimitBytes; - mHardLimitBytes = hardLimitBytes; - } - - /** - * {@hide} - */ - public NetworkQuotaInfo(Parcel in) { - mEstimatedBytes = in.readLong(); - mSoftLimitBytes = in.readLong(); - mHardLimitBytes = in.readLong(); - } - - public long getEstimatedBytes() { - return mEstimatedBytes; - } - - public long getSoftLimitBytes() { - return mSoftLimitBytes; - } - - public long getHardLimitBytes() { - return mHardLimitBytes; - } - - @Override - public int describeContents() { - return 0; - } - - @Override - public void writeToParcel(Parcel out, int flags) { - out.writeLong(mEstimatedBytes); - out.writeLong(mSoftLimitBytes); - out.writeLong(mHardLimitBytes); - } - - public static final Creator CREATOR = new Creator() { - @Override - public NetworkQuotaInfo createFromParcel(Parcel in) { - return new NetworkQuotaInfo(in); - } - - @Override - public NetworkQuotaInfo[] newArray(int size) { - return new NetworkQuotaInfo[size]; - } - }; -} diff --git a/QKSMS/src/main/java/android/net/NetworkState.java b/QKSMS/src/main/java/android/net/NetworkState.java deleted file mode 100644 index 30f137010..000000000 --- a/QKSMS/src/main/java/android/net/NetworkState.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.net; - -import android.os.Parcel; -import android.os.Parcelable; - -/** - * Snapshot of network state. - * - * @hide - */ -public class NetworkState implements Parcelable { - - public final NetworkInfo networkInfo; - public final LinkProperties linkProperties; - public final LinkCapabilities linkCapabilities; - /** - * Currently only used by testing. - */ - public final String subscriberId; - public final String networkId; - - public NetworkState(NetworkInfo networkInfo, LinkProperties linkProperties, - LinkCapabilities linkCapabilities) { - this(networkInfo, linkProperties, linkCapabilities, null, null); - } - - public NetworkState(NetworkInfo networkInfo, LinkProperties linkProperties, - LinkCapabilities linkCapabilities, String subscriberId, String networkId) { - this.networkInfo = networkInfo; - this.linkProperties = linkProperties; - this.linkCapabilities = linkCapabilities; - this.subscriberId = subscriberId; - this.networkId = networkId; - } - - public NetworkState(Parcel in) { - networkInfo = in.readParcelable(null); - linkProperties = in.readParcelable(null); - linkCapabilities = in.readParcelable(null); - subscriberId = in.readString(); - networkId = in.readString(); - } - - @Override - public int describeContents() { - return 0; - } - - @Override - public void writeToParcel(Parcel out, int flags) { - out.writeParcelable(networkInfo, flags); - out.writeParcelable(linkProperties, flags); - out.writeParcelable(linkCapabilities, flags); - out.writeString(subscriberId); - out.writeString(networkId); - } - - public static final Creator CREATOR = new Creator() { - @Override - public NetworkState createFromParcel(Parcel in) { - return new NetworkState(in); - } - - @Override - public NetworkState[] newArray(int size) { - return new NetworkState[size]; - } - }; - -} diff --git a/QKSMS/src/main/java/android/net/NetworkTemplate.java b/QKSMS/src/main/java/android/net/NetworkTemplate.java deleted file mode 100644 index 8a2cd6261..000000000 --- a/QKSMS/src/main/java/android/net/NetworkTemplate.java +++ /dev/null @@ -1,445 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * Copyright (C) 2015 QK Labs - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.net; - -import android.os.Parcel; -import android.os.Parcelable; - -import com.android.internal.annotations.VisibleForTesting; -import com.android.internal.util.Objects; - -import static android.net.ConnectivityManager.TYPE_ETHERNET; -import static android.net.ConnectivityManager.TYPE_WIFI; -import static android.net.ConnectivityManager.TYPE_WIMAX; -import static android.net.NetworkIdentity.COMBINE_SUBTYPE_ENABLED; -import static android.net.NetworkIdentity.scrubSubscriberId; -import static com.android.internal.util.ArrayUtils.contains; - -/** - * Template definition used to generically match {@link NetworkIdentity}, - * usually when collecting statistics. - * - * @hide - */ -public class NetworkTemplate implements Parcelable { - - public static final int MATCH_MOBILE_ALL = 1; - public static final int MATCH_MOBILE_3G_LOWER = 2; - public static final int MATCH_MOBILE_4G = 3; - public static final int MATCH_WIFI = 4; - public static final int MATCH_ETHERNET = 5; - public static final int MATCH_MOBILE_WILDCARD = 6; - public static final int MATCH_WIFI_WILDCARD = 7; - - /** - * Network type is unknown - */ - public static final int NETWORK_TYPE_UNKNOWN = 0; - /** - * Current network is GPRS - */ - public static final int NETWORK_TYPE_GPRS = 1; - /** - * Current network is EDGE - */ - public static final int NETWORK_TYPE_EDGE = 2; - /** - * Current network is UMTS - */ - public static final int NETWORK_TYPE_UMTS = 3; - /** - * Current network is CDMA: Either IS95A or IS95B - */ - public static final int NETWORK_TYPE_CDMA = 4; - /** - * Current network is EVDO revision 0 - */ - public static final int NETWORK_TYPE_EVDO_0 = 5; - /** - * Current network is EVDO revision A - */ - public static final int NETWORK_TYPE_EVDO_A = 6; - /** - * Current network is 1xRTT - */ - public static final int NETWORK_TYPE_1xRTT = 7; - /** - * Current network is HSDPA - */ - public static final int NETWORK_TYPE_HSDPA = 8; - /** - * Current network is HSUPA - */ - public static final int NETWORK_TYPE_HSUPA = 9; - /** - * Current network is HSPA - */ - public static final int NETWORK_TYPE_HSPA = 10; - /** - * Current network is iDen - */ - public static final int NETWORK_TYPE_IDEN = 11; - /** - * Current network is EVDO revision B - */ - public static final int NETWORK_TYPE_EVDO_B = 12; - /** - * Current network is LTE - */ - public static final int NETWORK_TYPE_LTE = 13; - /** - * Current network is eHRPD - */ - public static final int NETWORK_TYPE_EHRPD = 14; - /** - * Current network is HSPA+ - */ - public static final int NETWORK_TYPE_HSPAP = 15; - - /** - * Unknown network class. {@hide} - */ - public static final int NETWORK_CLASS_UNKNOWN = 0; - /** - * Class of broadly defined "2G" networks. {@hide} - */ - public static final int NETWORK_CLASS_2_G = 1; - /** - * Class of broadly defined "3G" networks. {@hide} - */ - public static final int NETWORK_CLASS_3_G = 2; - /** - * Class of broadly defined "4G" networks. {@hide} - */ - public static final int NETWORK_CLASS_4_G = 3; - - /** - * Return general class of network type, such as "3G" or "4G". In cases - * where classification is contentious, this method is conservative. - * - * @hide - */ - public static int getNetworkClass(int networkType) { - switch (networkType) { - case NETWORK_TYPE_GPRS: - case NETWORK_TYPE_EDGE: - case NETWORK_TYPE_CDMA: - case NETWORK_TYPE_1xRTT: - case NETWORK_TYPE_IDEN: - return NETWORK_CLASS_2_G; - case NETWORK_TYPE_UMTS: - case NETWORK_TYPE_EVDO_0: - case NETWORK_TYPE_EVDO_A: - case NETWORK_TYPE_HSDPA: - case NETWORK_TYPE_HSUPA: - case NETWORK_TYPE_HSPA: - case NETWORK_TYPE_EVDO_B: - case NETWORK_TYPE_EHRPD: - case NETWORK_TYPE_HSPAP: - return NETWORK_CLASS_3_G; - case NETWORK_TYPE_LTE: - return NETWORK_CLASS_4_G; - default: - return NETWORK_CLASS_UNKNOWN; - } - } - - /** - * Set of {@link NetworkInfo#getType()} that reflect data usage. - */ - private static final int[] DATA_USAGE_NETWORK_TYPES = {0}; - - private static boolean sForceAllNetworkTypes = false; - - @VisibleForTesting - public static void forceAllNetworkTypes() { - sForceAllNetworkTypes = true; - } - - /** - * Template to match {@link ConnectivityManager#TYPE_MOBILE} networks with - * the given IMSI. - */ - public static NetworkTemplate buildTemplateMobileAll(String subscriberId) { - return new NetworkTemplate(MATCH_MOBILE_ALL, subscriberId, null); - } - - /** - * Template to match {@link ConnectivityManager#TYPE_MOBILE} networks with - * the given IMSI that roughly meet a "3G" definition, or lower. - */ - @Deprecated - public static NetworkTemplate buildTemplateMobile3gLower(String subscriberId) { - return new NetworkTemplate(MATCH_MOBILE_3G_LOWER, subscriberId, null); - } - - /** - * Template to match {@link ConnectivityManager#TYPE_MOBILE} networks with - * the given IMSI that roughly meet a "4G" definition. - */ - @Deprecated - public static NetworkTemplate buildTemplateMobile4g(String subscriberId) { - return new NetworkTemplate(MATCH_MOBILE_4G, subscriberId, null); - } - - /** - * Template to match {@link ConnectivityManager#TYPE_MOBILE} networks, - * regardless of IMSI. - */ - public static NetworkTemplate buildTemplateMobileWildcard() { - return new NetworkTemplate(MATCH_MOBILE_WILDCARD, null, null); - } - - /** - * Template to match all {@link ConnectivityManager#TYPE_WIFI} networks, - * regardless of SSID. - */ - public static NetworkTemplate buildTemplateWifiWildcard() { - return new NetworkTemplate(MATCH_WIFI_WILDCARD, null, null); - } - - @Deprecated - public static NetworkTemplate buildTemplateWifi() { - return buildTemplateWifiWildcard(); - } - - /** - * Template to match {@link ConnectivityManager#TYPE_WIFI} networks with the - * given SSID. - */ - public static NetworkTemplate buildTemplateWifi(String networkId) { - return new NetworkTemplate(MATCH_WIFI, null, networkId); - } - - /** - * Template to combine all {@link ConnectivityManager#TYPE_ETHERNET} style - * networks together. - */ - public static NetworkTemplate buildTemplateEthernet() { - return new NetworkTemplate(MATCH_ETHERNET, null, null); - } - - private final int mMatchRule; - private final String mSubscriberId; - private final String mNetworkId; - - public NetworkTemplate(int matchRule, String subscriberId, String networkId) { - mMatchRule = matchRule; - mSubscriberId = subscriberId; - mNetworkId = networkId; - } - - private NetworkTemplate(Parcel in) { - mMatchRule = in.readInt(); - mSubscriberId = in.readString(); - mNetworkId = in.readString(); - } - - @Override - public void writeToParcel(Parcel dest, int flags) { - dest.writeInt(mMatchRule); - dest.writeString(mSubscriberId); - dest.writeString(mNetworkId); - } - - @Override - public int describeContents() { - return 0; - } - - @Override - public String toString() { - final StringBuilder builder = new StringBuilder("NetworkTemplate: "); - builder.append("matchRule=").append(getMatchRuleName(mMatchRule)); - if (mSubscriberId != null) { - builder.append(", subscriberId=").append(scrubSubscriberId(mSubscriberId)); - } - if (mNetworkId != null) { - builder.append(", networkId=").append(mNetworkId); - } - return builder.toString(); - } - - @Override - public int hashCode() { - return Objects.hashCode(mMatchRule, mSubscriberId, mNetworkId); - } - - @Override - public boolean equals(Object obj) { - if (obj instanceof NetworkTemplate) { - final NetworkTemplate other = (NetworkTemplate) obj; - return mMatchRule == other.mMatchRule - && Objects.equal(mSubscriberId, other.mSubscriberId) - && Objects.equal(mNetworkId, other.mNetworkId); - } - return false; - } - - public int getMatchRule() { - return mMatchRule; - } - - public String getSubscriberId() { - return mSubscriberId; - } - - public String getNetworkId() { - return mNetworkId; - } - - /** - * Test if given {@link NetworkIdentity} matches this template. - */ - public boolean matches(NetworkIdentity ident) { - switch (mMatchRule) { - case MATCH_MOBILE_ALL: - return matchesMobile(ident); - case MATCH_MOBILE_3G_LOWER: - return matchesMobile3gLower(ident); - case MATCH_MOBILE_4G: - return matchesMobile4g(ident); - case MATCH_WIFI: - return matchesWifi(ident); - case MATCH_ETHERNET: - return matchesEthernet(ident); - case MATCH_MOBILE_WILDCARD: - return matchesMobileWildcard(ident); - case MATCH_WIFI_WILDCARD: - return matchesWifiWildcard(ident); - default: - throw new IllegalArgumentException("unknown network template"); - } - } - - /** - * Check if mobile network with matching IMSI. - */ - private boolean matchesMobile(NetworkIdentity ident) { - // TODO: consider matching against WiMAX subscriber identity - return ident.mType == TYPE_WIMAX || ((sForceAllNetworkTypes || contains(DATA_USAGE_NETWORK_TYPES, ident.mType)) && Objects.equal(mSubscriberId, ident.mSubscriberId)); - } - - /** - * Check if mobile network classified 3G or lower with matching IMSI. - */ - private boolean matchesMobile3gLower(NetworkIdentity ident) { - ensureSubtypeAvailable(); - if (ident.mType == TYPE_WIMAX) { - return false; - } else if (matchesMobile(ident)) { - switch (getNetworkClass(ident.mSubType)) { - case 0: - case 1: - case 2: - return true; - } - } - return false; - } - - /** - * Check if mobile network classified 4G with matching IMSI. - */ - private boolean matchesMobile4g(NetworkIdentity ident) { - ensureSubtypeAvailable(); - if (ident.mType == TYPE_WIMAX) { - // TODO: consider matching against WiMAX subscriber identity - return true; - } else if (matchesMobile(ident)) { - switch (getNetworkClass(ident.mSubType)) { - case 3: - return true; - } - } - return false; - } - - /** - * Check if matches Wi-Fi network template. - */ - private boolean matchesWifi(NetworkIdentity ident) { - switch (ident.mType) { - case TYPE_WIFI: - return Objects.equal(mNetworkId, ident.mNetworkId); - default: - return false; - } - } - - /** - * Check if matches Ethernet network template. - */ - private boolean matchesEthernet(NetworkIdentity ident) { - return ident.mType == TYPE_ETHERNET; - } - - private boolean matchesMobileWildcard(NetworkIdentity ident) { - return ident.mType == TYPE_WIMAX || sForceAllNetworkTypes || contains(DATA_USAGE_NETWORK_TYPES, ident.mType); - } - - private boolean matchesWifiWildcard(NetworkIdentity ident) { - switch (ident.mType) { - case TYPE_WIFI: - case 13: - return true; - default: - return false; - } - } - - private static String getMatchRuleName(int matchRule) { - switch (matchRule) { - case MATCH_MOBILE_3G_LOWER: - return "MOBILE_3G_LOWER"; - case MATCH_MOBILE_4G: - return "MOBILE_4G"; - case MATCH_MOBILE_ALL: - return "MOBILE_ALL"; - case MATCH_WIFI: - return "WIFI"; - case MATCH_ETHERNET: - return "ETHERNET"; - case MATCH_MOBILE_WILDCARD: - return "MOBILE_WILDCARD"; - case MATCH_WIFI_WILDCARD: - return "WIFI_WILDCARD"; - default: - return "UNKNOWN"; - } - } - - private static void ensureSubtypeAvailable() { - if (COMBINE_SUBTYPE_ENABLED) { - throw new IllegalArgumentException( - "Unable to enforce 3G_LOWER template on combined data."); - } - } - - public static final Creator CREATOR = new Creator() { - @Override - public NetworkTemplate createFromParcel(Parcel in) { - return new NetworkTemplate(in); - } - - @Override - public NetworkTemplate[] newArray(int size) { - return new NetworkTemplate[size]; - } - }; -} diff --git a/QKSMS/src/main/java/android/net/NetworkUtils.java b/QKSMS/src/main/java/android/net/NetworkUtils.java deleted file mode 100644 index 7beb6a3cc..000000000 --- a/QKSMS/src/main/java/android/net/NetworkUtils.java +++ /dev/null @@ -1,307 +0,0 @@ -/* - * Copyright (C) 2008 The Android Open Source Project - * Copyright (C) 2015 QK Labs - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.net; - -import android.util.Log; - -import java.net.Inet4Address; -import java.net.Inet6Address; -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.util.Collection; - -/** - * Native methods for managing network interfaces. - *

- * {@hide} - */ -public class NetworkUtils { - - private static final String TAG = "NetworkUtils"; - - /** - * Bring the named network interface up. - */ - public native static int enableInterface(String interfaceName); - - /** - * Bring the named network interface down. - */ - public native static int disableInterface(String interfaceName); - - /** - * Setting bit 0 indicates reseting of IPv4 addresses required - */ - public static final int RESET_IPV4_ADDRESSES = 0x01; - - /** - * Setting bit 1 indicates reseting of IPv4 addresses required - */ - public static final int RESET_IPV6_ADDRESSES = 0x02; - - /** - * Reset all addresses - */ - public static final int RESET_ALL_ADDRESSES = RESET_IPV4_ADDRESSES | RESET_IPV6_ADDRESSES; - - /** - * Reset IPv6 or IPv4 sockets that are connected via the named interface. - * - * @param interfaceName is the interface to reset - * @param mask {@see #RESET_IPV4_ADDRESSES} and {@see #RESET_IPV6_ADDRESSES} - */ - public native static int resetConnections(String interfaceName, int mask); - - /** - * Start the DHCP client daemon, in order to have it request addresses - * for the named interface, and then configure the interface with those - * addresses. This call blocks until it obtains a result (either success - * or failure) from the daemon. - * - * @param interfaceName the name of the interface to configure - * @param ipInfo if the request succeeds, this object is filled in with - * the IP address information. - * @return {@code true} for success, {@code false} for failure - */ - public native static boolean runDhcp(String interfaceName, DhcpInfoInternal ipInfo); - - /** - * Initiate renewal on the Dhcp client daemon. This call blocks until it obtains - * a result (either success or failure) from the daemon. - * - * @param interfaceName the name of the interface to configure - * @param ipInfo if the request succeeds, this object is filled in with - * the IP address information. - * @return {@code true} for success, {@code false} for failure - */ - public native static boolean runDhcpRenew(String interfaceName, DhcpInfoInternal ipInfo); - - /** - * Shut down the DHCP client daemon. - * - * @param interfaceName the name of the interface for which the daemon - * should be stopped - * @return {@code true} for success, {@code false} for failure - */ - public native static boolean stopDhcp(String interfaceName); - - /** - * Release the current DHCP lease. - * - * @param interfaceName the name of the interface for which the lease should - * be released - * @return {@code true} for success, {@code false} for failure - */ - public native static boolean releaseDhcpLease(String interfaceName); - - /** - * Return the last DHCP-related error message that was recorded. - *

NOTE: This string is not localized, but currently it is only - * used in logging. - * - * @return the most recent error message, if any - */ - public native static String getDhcpError(); - - /** - * Convert a IPv4 address from an integer to an InetAddress. - * - * @param hostAddress an int corresponding to the IPv4 address in network byte order - */ - public static InetAddress intToInetAddress(int hostAddress) { - byte[] addressBytes = {(byte) (0xff & hostAddress), - (byte) (0xff & (hostAddress >> 8)), - (byte) (0xff & (hostAddress >> 16)), - (byte) (0xff & (hostAddress >> 24))}; - - try { - return InetAddress.getByAddress(addressBytes); - } catch (UnknownHostException e) { - throw new AssertionError(); - } - } - - /** - * Convert a IPv4 address from an InetAddress to an integer - * - * @param inetAddr is an InetAddress corresponding to the IPv4 address - * @return the IP address as an integer in network byte order - */ - public static int inetAddressToInt(InetAddress inetAddr) - throws IllegalArgumentException { - byte[] addr = inetAddr.getAddress(); - if (addr.length != 4) { - throw new IllegalArgumentException("Not an IPv4 address"); - } - return ((addr[3] & 0xff) << 24) | ((addr[2] & 0xff) << 16) | - ((addr[1] & 0xff) << 8) | (addr[0] & 0xff); - } - - /** - * Convert a network prefix length to an IPv4 netmask integer - * - * @param prefixLength - * @return the IPv4 netmask as an integer in network byte order - */ - public static int prefixLengthToNetmaskInt(int prefixLength) - throws IllegalArgumentException { - if (prefixLength < 0 || prefixLength > 32) { - throw new IllegalArgumentException("Invalid prefix length (0 <= prefix <= 32)"); - } - int value = 0xffffffff << (32 - prefixLength); - return Integer.reverseBytes(value); - } - - /** - * Convert a IPv4 netmask integer to a prefix length - * - * @param netmask as an integer in network byte order - * @return the network prefix length - */ - public static int netmaskIntToPrefixLength(int netmask) { - return Integer.bitCount(netmask); - } - - /** - * Create an InetAddress from a string where the string must be a standard - * representation of a V4 or V6 address. Avoids doing a DNS lookup on failure - * but it will throw an IllegalArgumentException in that case. - * - * @param addrString - * @return the InetAddress - * @hide - */ - public static InetAddress numericToInetAddress(String addrString) - throws IllegalArgumentException { - return null; - } - - /** - * Get InetAddress masked with prefixLength. Will never return null. - * - * @param IP address which will be masked with specified prefixLength - * @param prefixLength the prefixLength used to mask the IP - */ - public static InetAddress getNetworkPart(InetAddress address, int prefixLength) { - if (address == null) { - throw new RuntimeException("getNetworkPart doesn't accept null address"); - } - - byte[] array = address.getAddress(); - - if (prefixLength < 0 || prefixLength > array.length * 8) { - throw new RuntimeException("getNetworkPart - bad prefixLength"); - } - - int offset = prefixLength / 8; - int reminder = prefixLength % 8; - byte mask = (byte) (0xFF << (8 - reminder)); - - if (offset < array.length) array[offset] = (byte) (array[offset] & mask); - - offset++; - - for (; offset < array.length; offset++) { - array[offset] = 0; - } - - InetAddress netPart = null; - try { - netPart = InetAddress.getByAddress(array); - } catch (UnknownHostException e) { - throw new RuntimeException("getNetworkPart error - " + e.toString()); - } - return netPart; - } - - /** - * Check if IP address type is consistent between two InetAddress. - * - * @return true if both are the same type. False otherwise. - */ - public static boolean addressTypeMatches(InetAddress left, InetAddress right) { - return (((left instanceof Inet4Address) && (right instanceof Inet4Address)) || - ((left instanceof Inet6Address) && (right instanceof Inet6Address))); - } - - /** - * Convert a 32 char hex string into a Inet6Address. - * throws a runtime exception if the string isn't 32 chars, isn't hex or can't be - * made into an Inet6Address - * - * @param addrHexString a 32 character hex string representing an IPv6 addr - * @return addr an InetAddress representation for the string - */ - public static InetAddress hexToInet6Address(String addrHexString) - throws IllegalArgumentException { - try { - return numericToInetAddress(String.format("%s:%s:%s:%s:%s:%s:%s:%s", - addrHexString.substring(0, 4), addrHexString.substring(4, 8), - addrHexString.substring(8, 12), addrHexString.substring(12, 16), - addrHexString.substring(16, 20), addrHexString.substring(20, 24), - addrHexString.substring(24, 28), addrHexString.substring(28, 32))); - } catch (Exception e) { - Log.e("NetworkUtils", "error in hexToInet6Address(" + addrHexString + "): " + e); - throw new IllegalArgumentException(e); - } - } - - /** - * Create a string array of host addresses from a collection of InetAddresses - * - * @param addrs a Collection of InetAddresses - * @return an array of Strings containing their host addresses - */ - public static String[] makeStrings(Collection addrs) { - String[] result = new String[addrs.size()]; - int i = 0; - for (InetAddress addr : addrs) { - result[i++] = addr.getHostAddress(); - } - return result; - } - - /** - * Trim leading zeros from IPv4 address strings - * Our base libraries will interpret that as octel.. - * Must leave non v4 addresses and host names alone. - * For example, 192.168.000.010 -> 192.168.0.10 - * TODO - fix base libraries and remove this function - * - * @param addr a string representing an ip addr - * @return a string propertly trimmed - */ - public static String trimV4AddrZeros(String addr) { - if (addr == null) return null; - String[] octets = addr.split("\\."); - if (octets.length != 4) return addr; - StringBuilder builder = new StringBuilder(16); - String result = null; - for (int i = 0; i < 4; i++) { - try { - if (octets[i].length() > 3) return addr; - builder.append(Integer.parseInt(octets[i])); - } catch (NumberFormatException e) { - return addr; - } - if (i < 3) builder.append('.'); - } - result = builder.toString(); - return result; - } -} diff --git a/QKSMS/src/main/java/android/net/ProxyProperties.java b/QKSMS/src/main/java/android/net/ProxyProperties.java deleted file mode 100644 index 962a46c97..000000000 --- a/QKSMS/src/main/java/android/net/ProxyProperties.java +++ /dev/null @@ -1,220 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.net; - - -import android.annotation.SuppressLint; -import android.os.Parcel; -import android.os.Parcelable; -import android.text.TextUtils; - -import java.net.InetSocketAddress; - -/** - * A container class for the http proxy info - * - * @hide - */ -public class ProxyProperties implements Parcelable { - - private String mHost; - private int mPort; - private String mExclusionList; - private String[] mParsedExclusionList; - - public ProxyProperties(String host, int port, String exclList) { - mHost = host; - mPort = port; - setExclusionList(exclList); - } - - private ProxyProperties(String host, int port, String exclList, String[] parsedExclList) { - mHost = host; - mPort = port; - mExclusionList = exclList; - mParsedExclusionList = parsedExclList; - } - - // copy constructor instead of clone - public ProxyProperties(ProxyProperties source) { - if (source != null) { - mHost = source.getHost(); - mPort = source.getPort(); - mExclusionList = source.getExclusionList(); - mParsedExclusionList = source.mParsedExclusionList; - } - } - - public InetSocketAddress getSocketAddress() { - InetSocketAddress inetSocketAddress = null; - try { - inetSocketAddress = new InetSocketAddress(mHost, mPort); - } catch (IllegalArgumentException e) { - } - return inetSocketAddress; - } - - public String getHost() { - return mHost; - } - - public int getPort() { - return mPort; - } - - // comma separated - public String getExclusionList() { - return mExclusionList; - } - - // comma separated - @SuppressLint("DefaultLocale") - private void setExclusionList(String exclusionList) { - mExclusionList = exclusionList; - if (mExclusionList == null) { - mParsedExclusionList = new String[0]; - } else { - String splitExclusionList[] = exclusionList.toLowerCase().split(","); - mParsedExclusionList = new String[splitExclusionList.length * 2]; - for (int i = 0; i < splitExclusionList.length; i++) { - String s = splitExclusionList[i].trim(); - if (s.startsWith(".")) s = s.substring(1); - mParsedExclusionList[i * 2] = s; - mParsedExclusionList[(i * 2) + 1] = "." + s; - } - } - } - - public boolean isExcluded(String url) { - if (TextUtils.isEmpty(url) || mParsedExclusionList == null || - mParsedExclusionList.length == 0) return false; - - Uri u = Uri.parse(url); - String urlDomain = u.getHost(); - if (urlDomain == null) return false; - for (int i = 0; i < mParsedExclusionList.length; i += 2) { - if (urlDomain.equals(mParsedExclusionList[i]) || - urlDomain.endsWith(mParsedExclusionList[i + 1])) { - return true; - } - } - return false; - } - - public java.net.Proxy makeProxy() { - java.net.Proxy proxy = java.net.Proxy.NO_PROXY; - if (mHost != null) { - try { - InetSocketAddress inetSocketAddress = new InetSocketAddress(mHost, mPort); - proxy = new java.net.Proxy(java.net.Proxy.Type.HTTP, inetSocketAddress); - } catch (IllegalArgumentException e) { - } - } - return proxy; - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - if (mHost != null) { - sb.append("["); - sb.append(mHost); - sb.append("] "); - sb.append(Integer.toString(mPort)); - if (mExclusionList != null) { - sb.append(" xl=").append(mExclusionList); - } - } else { - sb.append("[ProxyProperties.mHost == null]"); - } - return sb.toString(); - } - - @Override - public boolean equals(Object o) { - if (!(o instanceof ProxyProperties)) return false; - ProxyProperties p = (ProxyProperties) o; - if (mExclusionList != null && !mExclusionList.equals(p.getExclusionList())) return false; - if (mHost != null && p.getHost() != null && !mHost.equals(p.getHost())) { - return false; - } - if (mHost != null && p.mHost == null) return false; - return !(mHost == null && p.mHost != null) && mPort == p.mPort; - } - - /** - * Implement the Parcelable interface - * - * @hide - */ - public int describeContents() { - return 0; - } - - @Override - /* - * generate hashcode based on significant fields - */ - public int hashCode() { - return ((null == mHost) ? 0 : mHost.hashCode()) - + ((null == mExclusionList) ? 0 : mExclusionList.hashCode()) - + mPort; - } - - /** - * Implement the Parcelable interface. - * - * @hide - */ - public void writeToParcel(Parcel dest, int flags) { - if (mHost != null) { - dest.writeByte((byte) 1); - dest.writeString(mHost); - dest.writeInt(mPort); - } else { - dest.writeByte((byte) 0); - } - dest.writeString(mExclusionList); - dest.writeStringArray(mParsedExclusionList); - } - - /** - * Implement the Parcelable interface. - * - * @hide - */ - public static final Creator CREATOR = - new Creator() { - public ProxyProperties createFromParcel(Parcel in) { - String host = null; - int port = 0; - if (in.readByte() == 1) { - host = in.readString(); - port = in.readInt(); - } - String exclList = in.readString(); - //String[] parsedExclList = in.readStringArray(); - ProxyProperties proxyProperties = - new ProxyProperties(host, port, exclList, null); - return proxyProperties; - } - - public ProxyProperties[] newArray(int size) { - return new ProxyProperties[size]; - } - }; -} diff --git a/QKSMS/src/main/java/android/net/RouteInfo.java b/QKSMS/src/main/java/android/net/RouteInfo.java deleted file mode 100644 index 6f67e39a3..000000000 --- a/QKSMS/src/main/java/android/net/RouteInfo.java +++ /dev/null @@ -1,287 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * Copyright (C) 2015 QK Labs - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.net; - -import android.os.Parcel; -import android.os.Parcelable; -import android.util.Log; - -import java.net.Inet4Address; -import java.net.Inet6Address; -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.util.Collection; - -/** - * A simple container for route information. - * - * @hide - */ -public class RouteInfo implements Parcelable { - private static final String TAG = "RouteInfo"; - /** - * The IP destination address for this route. - */ - private final LinkAddress mDestination; - - /** - * The gateway address for this route. - */ - private final InetAddress mGateway; - - private final boolean mIsDefault; - private final boolean mIsHost; - - public RouteInfo(LinkAddress destination, InetAddress gateway) { - if (destination == null) { - if (gateway != null) { - if (gateway instanceof Inet4Address) { - try { - destination = new LinkAddress(Inet4Address.getLocalHost(), 0); - } catch (UnknownHostException e) { - // TODO Auto-generated catch block - Log.e(TAG, "exception thrown", e); - } - } else { - try { - destination = new LinkAddress(Inet6Address.getLocalHost(), 0); - } catch (UnknownHostException e) { - // TODO Auto-generated catch block - Log.e(TAG, "exception thrown", e); - } - } - } else { - // no destination, no gateway. invalid. - throw new RuntimeException("Invalid arguments passed in."); - } - } - if (gateway == null) { - if (destination.getAddress() instanceof Inet4Address) { - try { - gateway = Inet4Address.getLocalHost(); - } catch (UnknownHostException e) { - // TODO Auto-generated catch block - Log.e(TAG, "exception thrown", e); - } - } else { - try { - gateway = Inet6Address.getLocalHost(); - } catch (UnknownHostException e) { - // TODO Auto-generated catch block - Log.e(TAG, "exception thrown", e); - } - } - } - mDestination = new LinkAddress(NetworkUtils.getNetworkPart(destination.getAddress(), - destination.getNetworkPrefixLength()), destination.getNetworkPrefixLength()); - mGateway = gateway; - mIsDefault = isDefault(); - mIsHost = isHost(); - } - - public RouteInfo(InetAddress gateway) { - this(null, gateway); - } - - public static RouteInfo makeHostRoute(InetAddress host) { - return makeHostRoute(host, null); - } - - public static RouteInfo makeHostRoute(InetAddress host, InetAddress gateway) { - if (host == null) return null; - - if (host instanceof Inet4Address) { - return new RouteInfo(new LinkAddress(host, 32), gateway); - } else { - return new RouteInfo(new LinkAddress(host, 128), gateway); - } - } - - private boolean isHost() { - try { - return (mGateway.equals(Inet4Address.getLocalHost()) || mGateway.equals(Inet6Address.getLocalHost())); - } catch (UnknownHostException e) { - // TODO Auto-generated catch block - return false; - } - } - - private boolean isDefault() { - boolean val = false; - if (mGateway != null) { - if (mGateway instanceof Inet4Address) { - val = (mDestination == null || mDestination.getNetworkPrefixLength() == 0); - } else { - val = (mDestination == null || mDestination.getNetworkPrefixLength() == 0); - } - } - return val; - } - - - public LinkAddress getDestination() { - return mDestination; - } - - public InetAddress getGateway() { - return mGateway; - } - - public boolean isDefaultRoute() { - return mIsDefault; - } - - public boolean isHostRoute() { - return mIsHost; - } - - public String toString() { - String val = ""; - if (mDestination != null) val = mDestination.toString(); - if (mGateway != null) val += " -> " + mGateway.getHostAddress(); - return val; - } - - public int describeContents() { - return 0; - } - - public void writeToParcel(Parcel dest, int flags) { - if (mDestination == null) { - dest.writeByte((byte) 0); - } else { - dest.writeByte((byte) 1); - dest.writeByteArray(mDestination.getAddress().getAddress()); - dest.writeInt(mDestination.getNetworkPrefixLength()); - } - - if (mGateway == null) { - dest.writeByte((byte) 0); - } else { - dest.writeByte((byte) 1); - dest.writeByteArray(mGateway.getAddress()); - } - } - - @Override - public boolean equals(Object obj) { - if (this == obj) return true; - - if (!(obj instanceof RouteInfo)) return false; - - RouteInfo target = (RouteInfo) obj; - - boolean sameDestination = (mDestination == null) ? - target.getDestination() == null - : mDestination.equals(target.getDestination()); - - boolean sameAddress = (mGateway == null) ? - target.getGateway() == null - : mGateway.equals(target.getGateway()); - - return sameDestination && sameAddress - && mIsDefault == target.mIsDefault; - } - - @Override - public int hashCode() { - return (mDestination == null ? 0 : mDestination.hashCode()) - + (mGateway == null ? 0 : mGateway.hashCode()) - + (mIsDefault ? 3 : 7); - } - - public static final Creator CREATOR = - new Creator() { - public RouteInfo createFromParcel(Parcel in) { - InetAddress destAddr = null; - int prefix = 0; - InetAddress gateway = null; - - if (in.readByte() == 1) { - byte[] addr = in.createByteArray(); - prefix = in.readInt(); - - try { - destAddr = InetAddress.getByAddress(addr); - } catch (UnknownHostException e) { - } - } - - if (in.readByte() == 1) { - byte[] addr = in.createByteArray(); - - try { - gateway = InetAddress.getByAddress(addr); - } catch (UnknownHostException e) { - } - } - - LinkAddress dest = null; - - if (destAddr != null) { - dest = new LinkAddress(destAddr, prefix); - } - - return new RouteInfo(dest, gateway); - } - - public RouteInfo[] newArray(int size) { - return new RouteInfo[size]; - } - }; - - private boolean matches(InetAddress destination) { - if (destination == null) return false; - - // if the destination is present and the route is default. - // return true - if (isDefault()) return true; - - // match the route destination and destination with prefix length - InetAddress dstNet = NetworkUtils.getNetworkPart(destination, - mDestination.getNetworkPrefixLength()); - - return mDestination.getAddress().equals(dstNet); - } - - /** - * Find the route from a Collection of routes that best matches a given address. - * May return null if no routes are applicable. - * - * @param routes a Collection of RouteInfos to chose from - * @param dest the InetAddress your trying to get to - * @return the RouteInfo from the Collection that best fits the given address - */ - public static RouteInfo selectBestRoute(Collection routes, InetAddress dest) { - if ((routes == null) || (dest == null)) return null; - - RouteInfo bestRoute = null; - // pick a longest prefix match under same address type - for (RouteInfo route : routes) { - if (NetworkUtils.addressTypeMatches(route.mDestination.getAddress(), dest)) { - if ((bestRoute != null) && - (bestRoute.mDestination.getNetworkPrefixLength() >= - route.mDestination.getNetworkPrefixLength())) { - continue; - } - if (route.matches(dest)) bestRoute = route; - } - } - return bestRoute; - } -} diff --git a/QKSMS/src/main/java/android/provider/Downloads.java b/QKSMS/src/main/java/android/provider/Downloads.java deleted file mode 100644 index 8aca3b3dc..000000000 --- a/QKSMS/src/main/java/android/provider/Downloads.java +++ /dev/null @@ -1,835 +0,0 @@ -/* - * Copyright (C) 2008 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.provider; - -import android.app.DownloadManager; -import android.content.Context; -import android.net.NetworkPolicyManager; -import android.net.Uri; - -/** - * The Download Manager - * - * @pending - */ -public final class Downloads { - private Downloads() { - } - - /** - * Implementation details - *

- * Exposes constants used to interact with the download manager's - * content provider. - * The constants URI ... STATUS are the names of columns in the downloads table. - * - * @hide - */ - public static final class Impl implements BaseColumns { - private Impl() { - } - - /** - * The permission to access the download manager - */ - public static final String PERMISSION_ACCESS = "android.permission.ACCESS_DOWNLOAD_MANAGER"; - - /** - * The permission to access the download manager's advanced functions - */ - public static final String PERMISSION_ACCESS_ADVANCED = - "android.permission.ACCESS_DOWNLOAD_MANAGER_ADVANCED"; - - /** - * The permission to access the all the downloads in the manager. - */ - public static final String PERMISSION_ACCESS_ALL = - "android.permission.ACCESS_ALL_DOWNLOADS"; - - /** - * The permission to directly access the download manager's cache - * directory - */ - public static final String PERMISSION_CACHE = "android.permission.ACCESS_CACHE_FILESYSTEM"; - - /** - * The permission to send broadcasts on download completion - */ - public static final String PERMISSION_SEND_INTENTS = - "android.permission.SEND_DOWNLOAD_COMPLETED_INTENTS"; - - /** - * The permission to download files to the cache partition that won't be automatically - * purged when space is needed. - */ - public static final String PERMISSION_CACHE_NON_PURGEABLE = - "android.permission.DOWNLOAD_CACHE_NON_PURGEABLE"; - - /** - * The permission to download files without any system notification being shown. - */ - public static final String PERMISSION_NO_NOTIFICATION = - "android.permission.DOWNLOAD_WITHOUT_NOTIFICATION"; - - /** - * The content:// URI to access downloads owned by the caller's UID. - */ - public static final Uri CONTENT_URI = - Uri.parse("content://downloads/my_downloads"); - - /** - * The content URI for accessing all downloads across all UIDs (requires the - * ACCESS_ALL_DOWNLOADS permission). - */ - public static final Uri ALL_DOWNLOADS_CONTENT_URI = - Uri.parse("content://downloads/all_downloads"); - - /** - * URI segment to access a publicly accessible downloaded file - */ - public static final String PUBLICLY_ACCESSIBLE_DOWNLOADS_URI_SEGMENT = "public_downloads"; - - /** - * The content URI for accessing publicly accessible downloads (i.e., it requires no - * permissions to access this downloaded file) - */ - public static final Uri PUBLICLY_ACCESSIBLE_DOWNLOADS_URI = - Uri.parse("content://downloads/" + PUBLICLY_ACCESSIBLE_DOWNLOADS_URI_SEGMENT); - - /** - * Broadcast Action: this is sent by the download manager to the app - * that had initiated a download when that download completes. The - * download's content: uri is specified in the intent's data. - */ - public static final String ACTION_DOWNLOAD_COMPLETED = - "android.intent.action.DOWNLOAD_COMPLETED"; - - /** - * Broadcast Action: this is sent by the download manager to the app - * that had initiated a download when the user selects the notification - * associated with that download. The download's content: uri is specified - * in the intent's data if the click is associated with a single download, - * or Downloads.CONTENT_URI if the notification is associated with - * multiple downloads. - * Note: this is not currently sent for downloads that have completed - * successfully. - */ - public static final String ACTION_NOTIFICATION_CLICKED = - "android.intent.action.DOWNLOAD_NOTIFICATION_CLICKED"; - - /** - * The name of the column containing the URI of the data being downloaded. - *

Type: TEXT

- *

Owner can Init/Read

- */ - public static final String COLUMN_URI = "uri"; - - /** - * The name of the column containing application-specific data. - *

Type: TEXT

- *

Owner can Init/Read/Write

- */ - public static final String COLUMN_APP_DATA = "entity"; - - /** - * The name of the column containing the flags that indicates whether - * the initiating application is capable of verifying the integrity of - * the downloaded file. When this flag is set, the download manager - * performs downloads and reports success even in some situations where - * it can't guarantee that the download has completed (e.g. when doing - * a byte-range request without an ETag, or when it can't determine - * whether a download fully completed). - *

Type: BOOLEAN

- *

Owner can Init

- */ - public static final String COLUMN_NO_INTEGRITY = "no_integrity"; - - /** - * The name of the column containing the filename that the initiating - * application recommends. When possible, the download manager will attempt - * to use this filename, or a variation, as the actual name for the file. - *

Type: TEXT

- *

Owner can Init

- */ - public static final String COLUMN_FILE_NAME_HINT = "hint"; - - /** - * The name of the column containing the filename where the downloaded data - * was actually stored. - *

Type: TEXT

- *

Owner can Read

- */ - public static final String _DATA = "_data"; - - /** - * The name of the column containing the MIME type of the downloaded data. - *

Type: TEXT

- *

Owner can Init/Read

- */ - public static final String COLUMN_MIME_TYPE = "mimetype"; - - /** - * The name of the column containing the flag that controls the destination - * of the download. See the DESTINATION_* constants for a list of legal values. - *

Type: INTEGER

- *

Owner can Init

- */ - public static final String COLUMN_DESTINATION = "destination"; - - /** - * The name of the column containing the flags that controls whether the - * download is displayed by the UI. See the VISIBILITY_* constants for - * a list of legal values. - *

Type: INTEGER

- *

Owner can Init/Read/Write

- */ - public static final String COLUMN_VISIBILITY = "visibility"; - - /** - * The name of the column containing the current control state of the download. - * Applications can write to this to control (pause/resume) the download. - * the CONTROL_* constants for a list of legal values. - *

Type: INTEGER

- *

Owner can Read

- */ - public static final String COLUMN_CONTROL = "control"; - - /** - * The name of the column containing the current status of the download. - * Applications can read this to follow the progress of each download. See - * the STATUS_* constants for a list of legal values. - *

Type: INTEGER

- *

Owner can Read

- */ - public static final String COLUMN_STATUS = "status"; - - /** - * The name of the column containing the date at which some interesting - * status changed in the download. Stored as a System.currentTimeMillis() - * value. - *

Type: BIGINT

- *

Owner can Read

- */ - public static final String COLUMN_LAST_MODIFICATION = "lastmod"; - - /** - * The name of the column containing the package name of the application - * that initiating the download. The download manager will send - * notifications to a component in this package when the download completes. - *

Type: TEXT

- *

Owner can Init/Read

- */ - public static final String COLUMN_NOTIFICATION_PACKAGE = "notificationpackage"; - - /** - * The name of the column containing the component name of the class that - * will receive notifications associated with the download. The - * package/class combination is passed to - * Intent.setClassName(String,String). - *

Type: TEXT

- *

Owner can Init/Read

- */ - public static final String COLUMN_NOTIFICATION_CLASS = "notificationclass"; - - /** - * If extras are specified when requesting a download they will be provided in the intent that - * is sent to the specified class and package when a download has finished. - *

Type: TEXT

- *

Owner can Init

- */ - public static final String COLUMN_NOTIFICATION_EXTRAS = "notificationextras"; - - /** - * The name of the column contain the values of the cookie to be used for - * the download. This is used directly as the value for the Cookie: HTTP - * header that gets sent with the request. - *

Type: TEXT

- *

Owner can Init

- */ - public static final String COLUMN_COOKIE_DATA = "cookiedata"; - - /** - * The name of the column containing the user agent that the initiating - * application wants the download manager to use for this download. - *

Type: TEXT

- *

Owner can Init

- */ - public static final String COLUMN_USER_AGENT = "useragent"; - - /** - * The name of the column containing the referer (sic) that the initiating - * application wants the download manager to use for this download. - *

Type: TEXT

- *

Owner can Init

- */ - public static final String COLUMN_REFERER = "referer"; - - /** - * The name of the column containing the total size of the file being - * downloaded. - *

Type: INTEGER

- *

Owner can Read

- */ - public static final String COLUMN_TOTAL_BYTES = "total_bytes"; - - /** - * The name of the column containing the size of the part of the file that - * has been downloaded so far. - *

Type: INTEGER

- *

Owner can Read

- */ - public static final String COLUMN_CURRENT_BYTES = "current_bytes"; - - /** - * The name of the column where the initiating application can provide the - * UID of another application that is allowed to access this download. If - * multiple applications share the same UID, all those applications will be - * allowed to access this download. This column can be updated after the - * download is initiated. This requires the permission - * android.permission.ACCESS_DOWNLOAD_MANAGER_ADVANCED. - *

Type: INTEGER

- *

Owner can Init

- */ - public static final String COLUMN_OTHER_UID = "otheruid"; - - /** - * The name of the column where the initiating application can provided the - * title of this download. The title will be displayed ito the user in the - * list of downloads. - *

Type: TEXT

- *

Owner can Init/Read/Write

- */ - public static final String COLUMN_TITLE = "title"; - - /** - * The name of the column where the initiating application can provide the - * description of this download. The description will be displayed to the - * user in the list of downloads. - *

Type: TEXT

- *

Owner can Init/Read/Write

- */ - public static final String COLUMN_DESCRIPTION = "description"; - - /** - * The name of the column indicating whether the download was requesting through the public - * API. This controls some differences in behavior. - *

Type: BOOLEAN

- *

Owner can Init/Read

- */ - public static final String COLUMN_IS_PUBLIC_API = "is_public_api"; - - /** - * The name of the column holding a bitmask of allowed network types. This is only used for - * public API downloads. - *

Type: INTEGER

- *

Owner can Init/Read

- */ - public static final String COLUMN_ALLOWED_NETWORK_TYPES = "allowed_network_types"; - - /** - * The name of the column indicating whether roaming connections can be used. This is only - * used for public API downloads. - *

Type: BOOLEAN

- *

Owner can Init/Read

- */ - public static final String COLUMN_ALLOW_ROAMING = "allow_roaming"; - - /** - * The name of the column indicating whether metered connections can be used. This is only - * used for public API downloads. - *

Type: BOOLEAN

- *

Owner can Init/Read

- */ - public static final String COLUMN_ALLOW_METERED = "allow_metered"; - - /** - * Whether or not this download should be displayed in the system's Downloads UI. Defaults - * to true. - *

Type: INTEGER

- *

Owner can Init/Read

- */ - public static final String COLUMN_IS_VISIBLE_IN_DOWNLOADS_UI = "is_visible_in_downloads_ui"; - - /** - * If true, the user has confirmed that this download can proceed over the mobile network - * even though it exceeds the recommended maximum size. - *

Type: BOOLEAN

- */ - public static final String COLUMN_BYPASS_RECOMMENDED_SIZE_LIMIT = - "bypass_recommended_size_limit"; - - /** - * Set to true if this download is deleted. It is completely removed from the database - * when MediaProvider database also deletes the metadata asociated with this downloaded file. - *

Type: BOOLEAN

- *

Owner can Read

- */ - public static final String COLUMN_DELETED = "deleted"; - - /** - * The URI to the corresponding entry in MediaProvider for this downloaded entry. It is - * used to delete the entries from MediaProvider database when it is deleted from the - * downloaded list. - *

Type: TEXT

- *

Owner can Read

- */ - public static final String COLUMN_MEDIAPROVIDER_URI = "mediaprovider_uri"; - - /** - * The column that is used to remember whether the media scanner was invoked. - * It can take the values: null or 0(not scanned), 1(scanned), 2 (not scannable). - *

Type: TEXT

- */ - public static final String COLUMN_MEDIA_SCANNED = "scanned"; - - /** - * The column with errorMsg for a failed downloaded. - * Used only for debugging purposes. - *

Type: TEXT

- */ - public static final String COLUMN_ERROR_MSG = "errorMsg"; - - /** - * This column stores the source of the last update to this row. - * This column is only for internal use. - * Valid values are indicated by LAST_UPDATESRC_* constants. - *

Type: INT

- */ - public static final String COLUMN_LAST_UPDATESRC = "lastUpdateSrc"; - - /** - * default value for {@link #COLUMN_LAST_UPDATESRC}. - * This value is used when this column's value is not relevant. - */ - public static final int LAST_UPDATESRC_NOT_RELEVANT = 0; - - /** - * One of the values taken by {@link #COLUMN_LAST_UPDATESRC}. - * This value is used when the update is NOT to be relayed to the DownloadService - * (and thus spare DownloadService from scanning the database when this change occurs) - */ - public static final int LAST_UPDATESRC_DONT_NOTIFY_DOWNLOADSVC = 1; - - /* - * Lists the destinations that an application can specify for a download. - */ - - /** - * This download will be saved to the external storage. This is the - * default behavior, and should be used for any file that the user - * can freely access, copy, delete. Even with that destination, - * unencrypted DRM files are saved in secure internal storage. - * Downloads to the external destination only write files for which - * there is a registered handler. The resulting files are accessible - * by filename to all applications. - */ - public static final int DESTINATION_EXTERNAL = 0; - - /** - * This download will be saved to the download manager's private - * partition. This is the behavior used by applications that want to - * download private files that are used and deleted soon after they - * get downloaded. All file types are allowed, and only the initiating - * application can access the file (indirectly through a content - * provider). This requires the - * android.permission.ACCESS_DOWNLOAD_MANAGER_ADVANCED permission. - */ - public static final int DESTINATION_CACHE_PARTITION = 1; - - /** - * This download will be saved to the download manager's private - * partition and will be purged as necessary to make space. This is - * for private files (similar to CACHE_PARTITION) that aren't deleted - * immediately after they are used, and are kept around by the download - * manager as long as space is available. - */ - public static final int DESTINATION_CACHE_PARTITION_PURGEABLE = 2; - - /** - * This download will be saved to the download manager's private - * partition, as with DESTINATION_CACHE_PARTITION, but the download - * will not proceed if the user is on a roaming data connection. - */ - public static final int DESTINATION_CACHE_PARTITION_NOROAMING = 3; - - /** - * This download will be saved to the location given by the file URI in - * {@link #COLUMN_FILE_NAME_HINT}. - */ - public static final int DESTINATION_FILE_URI = 4; - - /** - * This download will be saved to the system cache ("/cache") - * partition. This option is only used by system apps and so it requires - * android.permission.ACCESS_CACHE_FILESYSTEM permission. - */ - public static final int DESTINATION_SYSTEMCACHE_PARTITION = 5; - - /** - * This download was completed by the caller (i.e., NOT downloadmanager) - * and caller wants to have this download displayed in Downloads App. - */ - public static final int DESTINATION_NON_DOWNLOADMANAGER_DOWNLOAD = 6; - - /** - * This download is allowed to run. - */ - public static final int CONTROL_RUN = 0; - - /** - * This download must pause at the first opportunity. - */ - public static final int CONTROL_PAUSED = 1; - - /* - * Lists the states that the download manager can set on a download - * to notify applications of the download progress. - * The codes follow the HTTP families:
- * 1xx: informational
- * 2xx: success
- * 3xx: redirects (not used by the download manager)
- * 4xx: client errors
- * 5xx: server errors - */ - - /** - * Returns whether the status is informational (i.e. 1xx). - */ - public static boolean isStatusInformational(int status) { - return (status >= 100 && status < 200); - } - - /** - * Returns whether the status is a success (i.e. 2xx). - */ - public static boolean isStatusSuccess(int status) { - return (status >= 200 && status < 300); - } - - /** - * Returns whether the status is an error (i.e. 4xx or 5xx). - */ - public static boolean isStatusError(int status) { - return (status >= 400 && status < 600); - } - - /** - * Returns whether the status is a client error (i.e. 4xx). - */ - public static boolean isStatusClientError(int status) { - return (status >= 400 && status < 500); - } - - /** - * Returns whether the status is a server error (i.e. 5xx). - */ - public static boolean isStatusServerError(int status) { - return (status >= 500 && status < 600); - } - - /** - * this method determines if a notification should be displayed for a - * given {@link #COLUMN_VISIBILITY} value - * - * @param visibility the value of {@link #COLUMN_VISIBILITY}. - * @return true if the notification should be displayed. false otherwise. - */ - public static boolean isNotificationToBeDisplayed(int visibility) { - return visibility == DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED || - visibility == DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_ONLY_COMPLETION; - } - - /** - * Returns whether the download has completed (either with success or - * error). - */ - public static boolean isStatusCompleted(int status) { - return (status >= 200 && status < 300) || (status >= 400 && status < 600); - } - - /** - * This download hasn't stated yet - */ - public static final int STATUS_PENDING = 190; - - /** - * This download has started - */ - public static final int STATUS_RUNNING = 192; - - /** - * This download has been paused by the owning app. - */ - public static final int STATUS_PAUSED_BY_APP = 193; - - /** - * This download encountered some network error and is waiting before retrying the request. - */ - public static final int STATUS_WAITING_TO_RETRY = 194; - - /** - * This download is waiting for network connectivity to proceed. - */ - public static final int STATUS_WAITING_FOR_NETWORK = 195; - - /** - * This download exceeded a size limit for mobile networks and is waiting for a Wi-Fi - * connection to proceed. - */ - public static final int STATUS_QUEUED_FOR_WIFI = 196; - - /** - * This download couldn't be completed due to insufficient storage - * space. Typically, this is because the SD card is full. - */ - public static final int STATUS_INSUFFICIENT_SPACE_ERROR = 198; - - /** - * This download couldn't be completed because no external storage - * device was found. Typically, this is because the SD card is not - * mounted. - */ - public static final int STATUS_DEVICE_NOT_FOUND_ERROR = 199; - - /** - * This download has successfully completed. - * Warning: there might be other status values that indicate success - * in the future. - * Use isSucccess() to capture the entire category. - */ - public static final int STATUS_SUCCESS = 200; - - /** - * This request couldn't be parsed. This is also used when processing - * requests with unknown/unsupported URI schemes. - */ - public static final int STATUS_BAD_REQUEST = 400; - - /** - * This download can't be performed because the content type cannot be - * handled. - */ - public static final int STATUS_NOT_ACCEPTABLE = 406; - - /** - * This download cannot be performed because the length cannot be - * determined accurately. This is the code for the HTTP error "Length - * Required", which is typically used when making requests that require - * a content length but don't have one, and it is also used in the - * client when a response is received whose length cannot be determined - * accurately (therefore making it impossible to know when a download - * completes). - */ - public static final int STATUS_LENGTH_REQUIRED = 411; - - /** - * This download was interrupted and cannot be resumed. - * This is the code for the HTTP error "Precondition Failed", and it is - * also used in situations where the client doesn't have an ETag at all. - */ - public static final int STATUS_PRECONDITION_FAILED = 412; - - /** - * The lowest-valued error status that is not an actual HTTP status code. - */ - public static final int MIN_ARTIFICIAL_ERROR_STATUS = 488; - - /** - * The requested destination file already exists. - */ - public static final int STATUS_FILE_ALREADY_EXISTS_ERROR = 488; - - /** - * Some possibly transient error occurred, but we can't resume the download. - */ - public static final int STATUS_CANNOT_RESUME = 489; - - /** - * This download was canceled - */ - public static final int STATUS_CANCELED = 490; - - /** - * This download has completed with an error. - * Warning: there will be other status values that indicate errors in - * the future. Use isStatusError() to capture the entire category. - */ - public static final int STATUS_UNKNOWN_ERROR = 491; - - /** - * This download couldn't be completed because of a storage issue. - * Typically, that's because the filesystem is missing or full. - * Use the more specific {@link #STATUS_INSUFFICIENT_SPACE_ERROR} - * and {@link #STATUS_DEVICE_NOT_FOUND_ERROR} when appropriate. - */ - public static final int STATUS_FILE_ERROR = 492; - - /** - * This download couldn't be completed because of an HTTP - * redirect response that the download manager couldn't - * handle. - */ - public static final int STATUS_UNHANDLED_REDIRECT = 493; - - /** - * This download couldn't be completed because of an - * unspecified unhandled HTTP code. - */ - public static final int STATUS_UNHANDLED_HTTP_CODE = 494; - - /** - * This download couldn't be completed because of an - * error receiving or processing data at the HTTP level. - */ - public static final int STATUS_HTTP_DATA_ERROR = 495; - - /** - * This download couldn't be completed because of an - * HttpException while setting up the request. - */ - public static final int STATUS_HTTP_EXCEPTION = 496; - - /** - * This download couldn't be completed because there were - * too many redirects. - */ - public static final int STATUS_TOO_MANY_REDIRECTS = 497; - - /** - * This download has failed because requesting application has been - * blocked by {@link NetworkPolicyManager}. - * - * @hide - * @deprecated since behavior now uses - * {@link #STATUS_WAITING_FOR_NETWORK} - */ - @Deprecated - public static final int STATUS_BLOCKED = 498; - - /** - * {@hide} - */ - public static String statusToString(int status) { - switch (status) { - case STATUS_PENDING: - return "PENDING"; - case STATUS_RUNNING: - return "RUNNING"; - case STATUS_PAUSED_BY_APP: - return "PAUSED_BY_APP"; - case STATUS_WAITING_TO_RETRY: - return "WAITING_TO_RETRY"; - case STATUS_WAITING_FOR_NETWORK: - return "WAITING_FOR_NETWORK"; - case STATUS_QUEUED_FOR_WIFI: - return "QUEUED_FOR_WIFI"; - case STATUS_INSUFFICIENT_SPACE_ERROR: - return "INSUFFICIENT_SPACE_ERROR"; - case STATUS_DEVICE_NOT_FOUND_ERROR: - return "DEVICE_NOT_FOUND_ERROR"; - case STATUS_SUCCESS: - return "SUCCESS"; - case STATUS_BAD_REQUEST: - return "BAD_REQUEST"; - case STATUS_NOT_ACCEPTABLE: - return "NOT_ACCEPTABLE"; - case STATUS_LENGTH_REQUIRED: - return "LENGTH_REQUIRED"; - case STATUS_PRECONDITION_FAILED: - return "PRECONDITION_FAILED"; - case STATUS_FILE_ALREADY_EXISTS_ERROR: - return "FILE_ALREADY_EXISTS_ERROR"; - case STATUS_CANNOT_RESUME: - return "CANNOT_RESUME"; - case STATUS_CANCELED: - return "CANCELED"; - case STATUS_UNKNOWN_ERROR: - return "UNKNOWN_ERROR"; - case STATUS_FILE_ERROR: - return "FILE_ERROR"; - case STATUS_UNHANDLED_REDIRECT: - return "UNHANDLED_REDIRECT"; - case STATUS_UNHANDLED_HTTP_CODE: - return "UNHANDLED_HTTP_CODE"; - case STATUS_HTTP_DATA_ERROR: - return "HTTP_DATA_ERROR"; - case STATUS_HTTP_EXCEPTION: - return "HTTP_EXCEPTION"; - case STATUS_TOO_MANY_REDIRECTS: - return "TOO_MANY_REDIRECTS"; - case STATUS_BLOCKED: - return "BLOCKED"; - default: - return Integer.toString(status); - } - } - - /** - * This download is visible but only shows in the notifications - * while it's in progress. - */ - public static final int VISIBILITY_VISIBLE = DownloadManager.Request.VISIBILITY_VISIBLE; - - /** - * This download is visible and shows in the notifications while - * in progress and after completion. - */ - public static final int VISIBILITY_VISIBLE_NOTIFY_COMPLETED = - DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED; - - /** - * This download doesn't show in the UI or in the notifications. - */ - public static final int VISIBILITY_HIDDEN = DownloadManager.Request.VISIBILITY_HIDDEN; - - /** - * Constants related to HTTP request headers associated with each download. - */ - public static class RequestHeaders { - public static final String HEADERS_DB_TABLE = "request_headers"; - public static final String COLUMN_DOWNLOAD_ID = "download_id"; - public static final String COLUMN_HEADER = "header"; - public static final String COLUMN_VALUE = "value"; - - /** - * Path segment to add to a download URI to retrieve request headers - */ - public static final String URI_SEGMENT = "headers"; - - /** - * Prefix for ContentValues keys that contain HTTP header lines, to be passed to - * DownloadProvider.insert(). - */ - public static final String INSERT_KEY_PREFIX = "http_header_"; - } - } - - /** - * Query where clause for general querying. - */ - private static final String QUERY_WHERE_CLAUSE = Impl.COLUMN_NOTIFICATION_PACKAGE + "=? AND " - + Impl.COLUMN_NOTIFICATION_CLASS + "=?"; - - /** - * Delete all the downloads for a package/class pair. - */ - public static final void removeAllDownloadsByPackage( - Context context, String notification_package, String notification_class) { - context.getContentResolver().delete(Impl.CONTENT_URI, QUERY_WHERE_CLAUSE, - new String[]{notification_package, notification_class}); - } -} diff --git a/QKSMS/src/main/java/com/android/internal/annotations/VisibleForTesting.java b/QKSMS/src/main/java/com/android/internal/annotations/VisibleForTesting.java deleted file mode 100644 index f353d049b..000000000 --- a/QKSMS/src/main/java/com/android/internal/annotations/VisibleForTesting.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (C) 2012 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.internal.annotations; - -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; - -/** - * Denotes that the class, method or field has its visibility relaxed so - * that unit tests can access it. - *

- * The visibility argument can be used to specific what the original - * visibility should have been if it had not been made public or package-private for testing. - * The default is to consider the element private. - */ -@Retention(RetentionPolicy.SOURCE) -public @interface VisibleForTesting { - /** - * Intended visibility if the element had not been made public or package-private for - * testing. - */ - enum Visibility { - /** - * The element should be considered protected. - */ - PROTECTED, - /** - * The element should be considered package-private. - */ - PACKAGE, - /** - * The element should be considered private. - */ - PRIVATE - } - - /** - * Intended visibility if the element had not been made public or package-private for testing. - * If not specified, one should assume the element originally intended to be private. - */ - Visibility visibility() default Visibility.PRIVATE; -} diff --git a/QKSMS/src/main/java/com/android/internal/net/LegacyVpnInfo.java b/QKSMS/src/main/java/com/android/internal/net/LegacyVpnInfo.java deleted file mode 100644 index d852606c7..000000000 --- a/QKSMS/src/main/java/com/android/internal/net/LegacyVpnInfo.java +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * Copyright (C) 2015 QK Labs - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.internal.net; - -import android.app.PendingIntent; -import android.net.NetworkInfo; -import android.os.Parcel; -import android.os.Parcelable; -import android.util.Log; - -/** - * A simple container used to carry information of the ongoing legacy VPN. - * Internal use only. - * - * @hide - */ -public class LegacyVpnInfo implements Parcelable { - private static final String TAG = "LegacyVpnInfo"; - - public static final int STATE_DISCONNECTED = 0; - public static final int STATE_INITIALIZING = 1; - public static final int STATE_CONNECTING = 2; - public static final int STATE_CONNECTED = 3; - public static final int STATE_TIMEOUT = 4; - public static final int STATE_FAILED = 5; - - public String key; - public int state = -1; - public PendingIntent intent; - - @Override - public int describeContents() { - return 0; - } - - @Override - public void writeToParcel(Parcel out, int flags) { - out.writeString(key); - out.writeInt(state); - out.writeParcelable(intent, flags); - } - - public static final Parcelable.Creator CREATOR = - new Parcelable.Creator() { - @Override - public LegacyVpnInfo createFromParcel(Parcel in) { - LegacyVpnInfo info = new LegacyVpnInfo(); - info.key = in.readString(); - info.state = in.readInt(); - info.intent = in.readParcelable(null); - return info; - } - - @Override - public LegacyVpnInfo[] newArray(int size) { - return new LegacyVpnInfo[size]; - } - }; - - /** - * Return best matching {@link com.android.internal.net.LegacyVpnInfo} state based on given - * {@link NetworkInfo}. - */ - public static int stateFromNetworkInfo(NetworkInfo info) { - switch (info.getDetailedState()) { - case CONNECTING: - return STATE_CONNECTING; - case CONNECTED: - return STATE_CONNECTED; - case DISCONNECTED: - return STATE_DISCONNECTED; - case FAILED: - return STATE_FAILED; - default: - Log.w(TAG, "Unhandled state " + info.getDetailedState() - + " ; treating as disconnected"); - return STATE_DISCONNECTED; - } - } -} diff --git a/QKSMS/src/main/java/com/android/internal/net/VpnConfig.java b/QKSMS/src/main/java/com/android/internal/net/VpnConfig.java deleted file mode 100644 index 3ee916a76..000000000 --- a/QKSMS/src/main/java/com/android/internal/net/VpnConfig.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * Copyright (C) 2015 QK Labs - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.internal.net; - -import android.app.PendingIntent; -import android.content.Context; -import android.content.Intent; -import android.os.Parcel; -import android.os.Parcelable; - -import com.android.internal.util.Preconditions; - -import java.util.List; - -/** - * A simple container used to carry information in VpnBuilder, VpnDialogs, - * and com.android.server.connectivity.Vpn. Internal use only. - * - * @hide - */ -public class VpnConfig implements Parcelable { - - public static final String SERVICE_INTERFACE = "android.net.VpnService"; - - public static final String DIALOGS_PACKAGE = "com.android.vpndialogs"; - - public static final String LEGACY_VPN = "[Legacy VPN]"; - - public static Intent getIntentForConfirmation() { - Intent intent = new Intent(); - intent.setClassName(DIALOGS_PACKAGE, DIALOGS_PACKAGE + ".ConfirmDialog"); - return intent; - } - - public static PendingIntent getIntentForStatusPanel(Context context, VpnConfig config) { - Preconditions.checkNotNull(config); - - Intent intent = new Intent(); - intent.setClassName(DIALOGS_PACKAGE, DIALOGS_PACKAGE + ".ManageDialog"); - intent.putExtra("config", config); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_NO_HISTORY | - Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); - return PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT); - } - - public String user; - public String interfaze; - public String session; - public int mtu = -1; - public String addresses; - public String routes; - public List dnsServers; - public List searchDomains; - public PendingIntent configureIntent; - public long startTime = -1; - public boolean legacy; - - @Override - public int describeContents() { - return 0; - } - - @Override - public void writeToParcel(Parcel out, int flags) { - out.writeString(user); - out.writeString(interfaze); - out.writeString(session); - out.writeInt(mtu); - out.writeString(addresses); - out.writeString(routes); - out.writeStringList(dnsServers); - out.writeStringList(searchDomains); - out.writeParcelable(configureIntent, flags); - out.writeLong(startTime); - out.writeInt(legacy ? 1 : 0); - } - - public static final Parcelable.Creator CREATOR = - new Parcelable.Creator() { - @Override - public VpnConfig createFromParcel(Parcel in) { - VpnConfig config = new VpnConfig(); - config.user = in.readString(); - config.interfaze = in.readString(); - config.session = in.readString(); - config.mtu = in.readInt(); - config.addresses = in.readString(); - config.routes = in.readString(); - config.dnsServers = in.createStringArrayList(); - config.searchDomains = in.createStringArrayList(); - config.configureIntent = in.readParcelable(null); - config.startTime = in.readLong(); - config.legacy = in.readInt() != 0; - return config; - } - - @Override - public VpnConfig[] newArray(int size) { - return new VpnConfig[size]; - } - }; -} diff --git a/QKSMS/src/main/java/com/android/internal/net/VpnProfile.java b/QKSMS/src/main/java/com/android/internal/net/VpnProfile.java deleted file mode 100644 index 892e59b14..000000000 --- a/QKSMS/src/main/java/com/android/internal/net/VpnProfile.java +++ /dev/null @@ -1,203 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * Copyright (C) 2015 QK Labs - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.internal.net; - -import android.os.Parcel; -import android.os.Parcelable; -import android.util.Log; - -import java.nio.charset.Charset; - -/** - * Parcel-like entity class for VPN profiles. To keep things simple, all - * fields are package private. Methods are provided for serialization, so - * storage can be implemented easily. Two rules are set for this class. - * First, all fields must be kept non-null. Second, always make a copy - * using clone() before modifying. - * - * @hide - */ -public class VpnProfile implements Cloneable, Parcelable { - private static final String TAG = "VpnProfile"; - - // Match these constants with R.array.vpn_types. - public static final int TYPE_PPTP = 0; - public static final int TYPE_L2TP_IPSEC_PSK = 1; - public static final int TYPE_L2TP_IPSEC_RSA = 2; - public static final int TYPE_IPSEC_XAUTH_PSK = 3; - public static final int TYPE_IPSEC_XAUTH_RSA = 4; - public static final int TYPE_IPSEC_HYBRID_RSA = 5; - public static final int TYPE_MAX = 5; - - // Entity fields. - public final String key; // -1 - public String name = ""; // 0 - public int type = TYPE_PPTP; // 1 - public String server = ""; // 2 - public String username = ""; // 3 - public String password = ""; // 4 - public String dnsServers = ""; // 5 - public String searchDomains = ""; // 6 - public String routes = ""; // 7 - public boolean mppe = true; // 8 - public String l2tpSecret = ""; // 9 - public String ipsecIdentifier = "";// 10 - public String ipsecSecret = ""; // 11 - public String ipsecUserCert = ""; // 12 - public String ipsecCaCert = ""; // 13 - public String ipsecServerCert = "";// 14 - - // Helper fields. - public boolean saveLogin = false; - - public VpnProfile(String key) { - this.key = key; - } - - public VpnProfile(Parcel in) { - key = in.readString(); - name = in.readString(); - type = in.readInt(); - server = in.readString(); - username = in.readString(); - password = in.readString(); - dnsServers = in.readString(); - searchDomains = in.readString(); - routes = in.readString(); - mppe = in.readInt() != 0; - l2tpSecret = in.readString(); - ipsecIdentifier = in.readString(); - ipsecSecret = in.readString(); - ipsecUserCert = in.readString(); - ipsecCaCert = in.readString(); - ipsecServerCert = in.readString(); - saveLogin = in.readInt() != 0; - } - - @Override - public void writeToParcel(Parcel out, int flags) { - out.writeString(key); - out.writeString(name); - out.writeInt(type); - out.writeString(server); - out.writeString(username); - out.writeString(password); - out.writeString(dnsServers); - out.writeString(searchDomains); - out.writeString(routes); - out.writeInt(mppe ? 1 : 0); - out.writeString(l2tpSecret); - out.writeString(ipsecIdentifier); - out.writeString(ipsecSecret); - out.writeString(ipsecUserCert); - out.writeString(ipsecCaCert); - out.writeString(ipsecServerCert); - out.writeInt(saveLogin ? 1 : 0); - } - - public static VpnProfile decode(String key, byte[] value) { - try { - if (key == null) { - return null; - } - - String[] values = new String(value, Charset.forName("UTF-8")).split("\0", -1); - // There can be 14 or 15 values in ICS MR1. - if (values.length < 14 || values.length > 15) { - return null; - } - - VpnProfile profile = new VpnProfile(key); - profile.name = values[0]; - profile.type = Integer.valueOf(values[1]); - if (profile.type < 0 || profile.type > TYPE_MAX) { - return null; - } - profile.server = values[2]; - profile.username = values[3]; - profile.password = values[4]; - profile.dnsServers = values[5]; - profile.searchDomains = values[6]; - profile.routes = values[7]; - profile.mppe = Boolean.valueOf(values[8]); - profile.l2tpSecret = values[9]; - profile.ipsecIdentifier = values[10]; - profile.ipsecSecret = values[11]; - profile.ipsecUserCert = values[12]; - profile.ipsecCaCert = values[13]; - profile.ipsecServerCert = (values.length > 14) ? values[14] : ""; - - profile.saveLogin = !profile.username.isEmpty() || !profile.password.isEmpty(); - return profile; - } catch (Exception e) { - // ignore - } - return null; - } - - public byte[] encode() { - StringBuilder builder = new StringBuilder(name); - builder.append('\0').append(type); - builder.append('\0').append(server); - builder.append('\0').append(saveLogin ? username : ""); - builder.append('\0').append(saveLogin ? password : ""); - builder.append('\0').append(dnsServers); - builder.append('\0').append(searchDomains); - builder.append('\0').append(routes); - builder.append('\0').append(mppe); - builder.append('\0').append(l2tpSecret); - builder.append('\0').append(ipsecIdentifier); - builder.append('\0').append(ipsecSecret); - builder.append('\0').append(ipsecUserCert); - builder.append('\0').append(ipsecCaCert); - builder.append('\0').append(ipsecServerCert); - return builder.toString().getBytes(Charset.forName("UTF-8")); - } - - /** - * Test if profile is valid for lockdown, which requires IPv4 address for - * both server and DNS. Server hostnames would require using DNS before - * connection. - */ - public boolean isValidLockdownProfile() { - try { - return true; - - } catch (IllegalArgumentException e) { - Log.w(TAG, "Invalid address", e); - return false; - } - } - - public static final Creator CREATOR = new Creator() { - @Override - public VpnProfile createFromParcel(Parcel in) { - return new VpnProfile(in); - } - - @Override - public VpnProfile[] newArray(int size) { - return new VpnProfile[size]; - } - }; - - @Override - public int describeContents() { - return 0; - } -} diff --git a/QKSMS/src/main/java/com/android/internal/telephony/EncodeException.java b/QKSMS/src/main/java/com/android/internal/telephony/EncodeException.java deleted file mode 100644 index cd3280367..000000000 --- a/QKSMS/src/main/java/com/android/internal/telephony/EncodeException.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (C) 2006 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.internal.telephony; - -/** - * {@hide} - */ -@SuppressWarnings("serial") -public class EncodeException extends Exception { - public EncodeException() { - super(); - } - - public EncodeException(String s) { - super(s); - } - - public EncodeException(char c) { - super("Unencodable char: '" + c + "'"); - } -} - diff --git a/QKSMS/src/main/java/com/android/internal/telephony/GsmAlphabet.java b/QKSMS/src/main/java/com/android/internal/telephony/GsmAlphabet.java deleted file mode 100644 index 3ad4aecc5..000000000 --- a/QKSMS/src/main/java/com/android/internal/telephony/GsmAlphabet.java +++ /dev/null @@ -1,1500 +0,0 @@ -/* - * Copyright (C) 2006 The Android Open Source Project - * Copyright (C) 2015 QK Labs - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.internal.telephony; - -import android.text.TextUtils; -import android.util.Log; -import android.util.SparseIntArray; - -import java.nio.ByteBuffer; -import java.nio.charset.Charset; -import java.util.ArrayList; -import java.util.List; - -/** - * This class implements the character set mapping between - * the GSM SMS 7-bit alphabet specified in TS 23.038 6.2.1 - * and UTF-16 - *

- * {@hide} - */ -public class GsmAlphabet { - private static final String TAG = "GSM"; - - private GsmAlphabet() { - } - - /** - * This escapes extended characters, and when present indicates that the - * following character should be looked up in the "extended" table. - *

- * gsmToChar(GSM_EXTENDED_ESCAPE) returns 0xffff - */ - public static final byte GSM_EXTENDED_ESCAPE = 0x1B; - - /** - * User data header requires one octet for length. Count as one septet, because - * all combinations of header elements below will have at least one free bit - * when padding to the nearest septet boundary. - */ - public static final int UDH_SEPTET_COST_LENGTH = 1; - - /** - * Using a non-default language locking shift table OR single shift table - * requires a user data header of 3 octets, or 4 septets, plus UDH length. - */ - public static final int UDH_SEPTET_COST_ONE_SHIFT_TABLE = 4; - - /** - * Using a non-default language locking shift table AND single shift table - * requires a user data header of 6 octets, or 7 septets, plus UDH length. - */ - public static final int UDH_SEPTET_COST_TWO_SHIFT_TABLES = 7; - - /** - * Multi-part messages require a user data header of 5 octets, or 6 septets, - * plus UDH length. - */ - public static final int UDH_SEPTET_COST_CONCATENATED_MESSAGE = 6; - - /** - * For a specific text string, this object describes protocol - * properties of encoding it for transmission as message user - * data. - */ - public static class TextEncodingDetails { - /** - * The number of SMS's required to encode the text. - */ - public int msgCount; - - /** - * The number of code units consumed so far, where code units - * are basically characters in the encoding -- for example, - * septets for the standard ASCII and GSM encodings, and 16 - * bits for Unicode. - */ - public int codeUnitCount; - - /** - * How many code units are still available without spilling - * into an additional message. - */ - public int codeUnitsRemaining; - - /** - * The encoding code unit size (specified using - * android.telephony.SmsMessage ENCODING_*). - */ - public int codeUnitSize; - - /** - * The GSM national language table to use, or 0 for the default 7-bit alphabet. - */ - public int languageTable; - - /** - * The GSM national language shift table to use, or 0 for the default 7-bit extension table. - */ - public int languageShiftTable; - - @Override - public String toString() { - return "TextEncodingDetails " + - "{ msgCount=" + msgCount + - ", codeUnitCount=" + codeUnitCount + - ", codeUnitsRemaining=" + codeUnitsRemaining + - ", codeUnitSize=" + codeUnitSize + - ", languageTable=" + languageTable + - ", languageShiftTable=" + languageShiftTable + - " }"; - } - } - - /** - * Converts a char to a GSM 7 bit table index. - * Returns ' ' in GSM alphabet if there's no possible match. Returns - * GSM_EXTENDED_ESCAPE if this character is in the extended table. - * In this case, you must call charToGsmExtended() for the value - * that should follow GSM_EXTENDED_ESCAPE in the GSM alphabet string. - * - * @param c the character to convert - * @return the GSM 7 bit table index for the specified character - */ - public static int - charToGsm(char c) { - try { - return charToGsm(c, false); - } catch (EncodeException ex) { - // this should never happen - return sCharsToGsmTables[0].get(' ', ' '); - } - } - - /** - * Converts a char to a GSM 7 bit table index. - * Returns GSM_EXTENDED_ESCAPE if this character is in the extended table. - * In this case, you must call charToGsmExtended() for the value that - * should follow GSM_EXTENDED_ESCAPE in the GSM alphabet string. - * - * @param c the character to convert - * @param throwException If true, throws EncodeException on invalid char. - * If false, returns GSM alphabet ' ' char. - * @return the GSM 7 bit table index for the specified character - * @throws EncodeException encode error when throwException is true - */ - public static int - charToGsm(char c, boolean throwException) throws EncodeException { - int ret; - - ret = sCharsToGsmTables[0].get(c, -1); - - if (ret == -1) { - ret = sCharsToShiftTables[0].get(c, -1); - - if (ret == -1) { - if (throwException) { - throw new EncodeException(c); - } else { - return sCharsToGsmTables[0].get(' ', ' '); - } - } else { - return GSM_EXTENDED_ESCAPE; - } - } - - return ret; - } - - /** - * Converts a char to an extended GSM 7 bit table index. - * Extended chars should be escaped with GSM_EXTENDED_ESCAPE. - * Returns ' ' in GSM alphabet if there's no possible match. - * - * @param c the character to convert - * @return the GSM 7 bit extended table index for the specified character - */ - public static int - charToGsmExtended(char c) { - int ret; - - ret = sCharsToShiftTables[0].get(c, -1); - - if (ret == -1) { - return sCharsToGsmTables[0].get(' ', ' '); - } - - return ret; - } - - /** - * Converts a character in the GSM alphabet into a char. - *

- * If GSM_EXTENDED_ESCAPE is passed, 0xffff is returned. In this case, - * the following character in the stream should be decoded with - * gsmExtendedToChar(). - *

- * If an unmappable value is passed (one greater than 127), ' ' is returned. - * - * @param gsmChar the GSM 7 bit table index to convert - * @return the decoded character - */ - public static char - gsmToChar(int gsmChar) { - if (gsmChar >= 0 && gsmChar < 128) { - return sLanguageTables[0].charAt(gsmChar); - } else { - return ' '; - } - } - - /** - * Converts a character in the extended GSM alphabet into a char - *

- * if GSM_EXTENDED_ESCAPE is passed, ' ' is returned since no second - * extension page has yet been defined (see Note 1 in table 6.2.1.1 of - * TS 23.038 v7.00) - *

- * If an unmappable value is passed, the character from the GSM 7 bit - * default table will be used (table 6.2.1.1 of TS 23.038). - * - * @param gsmChar the GSM 7 bit extended table index to convert - * @return the decoded character - */ - public static char - gsmExtendedToChar(int gsmChar) { - if (gsmChar == GSM_EXTENDED_ESCAPE) { - return ' '; - } else if (gsmChar >= 0 && gsmChar < 128) { - char c = sLanguageShiftTables[0].charAt(gsmChar); - if (c == ' ') { - return sLanguageTables[0].charAt(gsmChar); - } else { - return c; - } - } else { - return ' '; // out of range - } - } - - /** - * Converts a String into a byte array containing the 7-bit packed - * GSM Alphabet representation of the string. If a header is provided, - * this is included in the returned byte array and padded to a septet - * boundary. This method is used by OEM code. - * - * @param data The text string to encode. - * @param header Optional header (including length byte) that precedes - * the encoded data, padded to septet boundary. - * @return Byte array containing header and encoded data. - * @throws EncodeException if String is too large to encode - * @see #stringToGsm7BitPackedWithHeader(String, byte[], int, int) - */ - public static byte[] stringToGsm7BitPackedWithHeader(String data, byte[] header) - throws EncodeException { - return stringToGsm7BitPackedWithHeader(data, header, 0, 0); - } - - /** - * Converts a String into a byte array containing the 7-bit packed - * GSM Alphabet representation of the string. If a header is provided, - * this is included in the returned byte array and padded to a septet - * boundary. - *

- * Unencodable chars are encoded as spaces - *

- * Byte 0 in the returned byte array is the count of septets used, - * including the header and header padding. The returned byte array is - * the minimum size required to store the packed septets. The returned - * array cannot contain more than 255 septets. - * - * @param data The text string to encode. - * @param header Optional header (including length byte) that precedes - * the encoded data, padded to septet boundary. - * @param languageTable the 7 bit language table, or 0 for the default GSM alphabet - * @param languageShiftTable the 7 bit single shift language table, or 0 for the default - * GSM extension table - * @return Byte array containing header and encoded data. - * @throws EncodeException if String is too large to encode - */ - public static byte[] stringToGsm7BitPackedWithHeader(String data, byte[] header, - int languageTable, int languageShiftTable) - throws EncodeException { - if (header == null || header.length == 0) { - return stringToGsm7BitPacked(data, languageTable, languageShiftTable); - } - - int headerBits = (header.length + 1) * 8; - int headerSeptets = (headerBits + 6) / 7; - - byte[] ret = stringToGsm7BitPacked(data, headerSeptets, true, languageTable, - languageShiftTable); - - // Paste in the header - ret[1] = (byte) header.length; - System.arraycopy(header, 0, ret, 2, header.length); - return ret; - } - - /** - * Converts a String into a byte array containing - * the 7-bit packed GSM Alphabet representation of the string. - *

- * Unencodable chars are encoded as spaces - *

- * Byte 0 in the returned byte array is the count of septets used - * The returned byte array is the minimum size required to store - * the packed septets. The returned array cannot contain more than 255 - * septets. - * - * @param data the data string to encode - * @return the encoded string - * @throws EncodeException if String is too large to encode - */ - public static byte[] stringToGsm7BitPacked(String data) - throws EncodeException { - return stringToGsm7BitPacked(data, 0, true, 0, 0); - } - - /** - * Converts a String into a byte array containing - * the 7-bit packed GSM Alphabet representation of the string. - *

- * Unencodable chars are encoded as spaces - *

- * Byte 0 in the returned byte array is the count of septets used - * The returned byte array is the minimum size required to store - * the packed septets. The returned array cannot contain more than 255 - * septets. - * - * @param data the data string to encode - * @param languageTable the 7 bit language table, or 0 for the default GSM alphabet - * @param languageShiftTable the 7 bit single shift language table, or 0 for the default - * GSM extension table - * @return the encoded string - * @throws EncodeException if String is too large to encode - */ - public static byte[] stringToGsm7BitPacked(String data, int languageTable, - int languageShiftTable) - throws EncodeException { - return stringToGsm7BitPacked(data, 0, true, languageTable, languageShiftTable); - } - - /** - * Converts a String into a byte array containing - * the 7-bit packed GSM Alphabet representation of the string. - *

- * Byte 0 in the returned byte array is the count of septets used - * The returned byte array is the minimum size required to store - * the packed septets. The returned array cannot contain more than 255 - * septets. - * - * @param data the text to convert to septets - * @param startingSeptetOffset the number of padding septets to put before - * the character data at the beginning of the array - * @param throwException If true, throws EncodeException on invalid char. - * If false, replaces unencodable char with GSM alphabet space char. - * @param languageTable the 7 bit language table, or 0 for the default GSM alphabet - * @param languageShiftTable the 7 bit single shift language table, or 0 for the default - * GSM extension table - * @return the encoded message - * @throws EncodeException if String is too large to encode - */ - public static byte[] stringToGsm7BitPacked(String data, int startingSeptetOffset, - boolean throwException, int languageTable, int languageShiftTable) - throws EncodeException { - int dataLen = data.length(); - int septetCount = countGsmSeptetsUsingTables(data, !throwException, - languageTable, languageShiftTable); - if (septetCount == -1) { - throw new EncodeException("countGsmSeptetsUsingTables(): unencodable char"); - } - septetCount += startingSeptetOffset; - if (septetCount > 255) { - throw new EncodeException("Payload cannot exceed 255 septets"); - } - int byteCount = ((septetCount * 7) + 7) / 8; - byte[] ret = new byte[byteCount + 1]; // Include space for one byte length prefix. - SparseIntArray charToLanguageTable = sCharsToGsmTables[languageTable]; - SparseIntArray charToShiftTable = sCharsToShiftTables[languageShiftTable]; - for (int i = 0, septets = startingSeptetOffset, bitOffset = startingSeptetOffset * 7; - i < dataLen && septets < septetCount; - i++, bitOffset += 7) { - char c = data.charAt(i); - int v = charToLanguageTable.get(c, -1); - if (v == -1) { - v = charToShiftTable.get(c, -1); // Lookup the extended char. - if (v == -1) { - if (throwException) { - throw new EncodeException("stringToGsm7BitPacked(): unencodable char"); - } else { - v = charToLanguageTable.get(' ', ' '); // should return ASCII space - } - } else { - packSmsChar(ret, bitOffset, GSM_EXTENDED_ESCAPE); - bitOffset += 7; - septets++; - } - } - packSmsChar(ret, bitOffset, v); - septets++; - } - ret[0] = (byte) (septetCount); // Validated by check above. - return ret; - } - - /** - * Pack a 7-bit char into its appropriate place in a byte array - * - * @param packedChars the destination byte array - * @param bitOffset the bit offset that the septet should be packed at - * (septet index * 7) - * @param value the 7-bit character to store - */ - private static void - packSmsChar(byte[] packedChars, int bitOffset, int value) { - int byteOffset = bitOffset / 8; - int shift = bitOffset % 8; - - packedChars[++byteOffset] |= value << shift; - - if (shift > 1) { - packedChars[++byteOffset] = (byte) (value >> (8 - shift)); - } - } - - /** - * Convert a GSM alphabet 7 bit packed string (SMS string) into a - * {@link String}. - *

- * See TS 23.038 6.1.2.1 for SMS Character Packing - * - * @param pdu the raw data from the pdu_alt - * @param offset the byte offset of - * @param lengthSeptets string length in septets, not bytes - * @return String representation or null on decoding exception - */ - public static String gsm7BitPackedToString(byte[] pdu, int offset, - int lengthSeptets) { - return gsm7BitPackedToString(pdu, offset, lengthSeptets, 0, 0, 0); - } - - /** - * Convert a GSM alphabet 7 bit packed string (SMS string) into a - * {@link String}. - *

- * See TS 23.038 6.1.2.1 for SMS Character Packing - * - * @param pdu the raw data from the pdu_alt - * @param offset the byte offset of - * @param lengthSeptets string length in septets, not bytes - * @param numPaddingBits the number of padding bits before the start of the - * string in the first byte - * @param languageTable the 7 bit language table, or 0 for the default GSM alphabet - * @param shiftTable the 7 bit single shift language table, or 0 for the default - * GSM extension table - * @return String representation or null on decoding exception - */ - public static String gsm7BitPackedToString(byte[] pdu, int offset, - int lengthSeptets, int numPaddingBits, int languageTable, int shiftTable) { - StringBuilder ret = new StringBuilder(lengthSeptets); - - if (languageTable < 0 || languageTable > sLanguageTables.length) { - Log.w(TAG, "unknown language table " + languageTable + ", using default"); - languageTable = 0; - } - if (shiftTable < 0 || shiftTable > sLanguageShiftTables.length) { - Log.w(TAG, "unknown single shift table " + shiftTable + ", using default"); - shiftTable = 0; - } - - try { - boolean prevCharWasEscape = false; - String languageTableToChar = sLanguageTables[languageTable]; - String shiftTableToChar = sLanguageShiftTables[shiftTable]; - - if (languageTableToChar.isEmpty()) { - Log.w(TAG, "no language table for code " + languageTable + ", using default"); - languageTableToChar = sLanguageTables[0]; - } - if (shiftTableToChar.isEmpty()) { - Log.w(TAG, "no single shift table for code " + shiftTable + ", using default"); - shiftTableToChar = sLanguageShiftTables[0]; - } - - for (int i = 0; i < lengthSeptets; i++) { - int bitOffset = (7 * i) + numPaddingBits; - - int byteOffset = bitOffset / 8; - int shift = bitOffset % 8; - int gsmVal; - - gsmVal = (0x7f & (pdu[offset + byteOffset] >> shift)); - - // if it crosses a byte boundary - if (shift > 1) { - // set msb bits to 0 - gsmVal &= 0x7f >> (shift - 1); - - gsmVal |= 0x7f & (pdu[offset + byteOffset + 1] << (8 - shift)); - } - - if (prevCharWasEscape) { - if (gsmVal == GSM_EXTENDED_ESCAPE) { - ret.append(' '); // display ' ' for reserved double escape sequence - } else { - char c = shiftTableToChar.charAt(gsmVal); - if (c == ' ') { - ret.append(languageTableToChar.charAt(gsmVal)); - } else { - ret.append(c); - } - } - prevCharWasEscape = false; - } else if (gsmVal == GSM_EXTENDED_ESCAPE) { - prevCharWasEscape = true; - } else { - ret.append(languageTableToChar.charAt(gsmVal)); - } - } - } catch (RuntimeException ex) { - Log.e(TAG, "Error GSM 7 bit packed: ", ex); - return null; - } - - return ret.toString(); - } - - - /** - * Convert a GSM alphabet string that's stored in 8-bit unpacked - * format (as it often appears in SIM records) into a String - *

- * Field may be padded with trailing 0xff's. The decode stops - * at the first 0xff encountered. - * - * @param data the byte array to decode - * @param offset array offset for the first character to decode - * @param length the number of bytes to decode - * @return the decoded string - */ - public static String - gsm8BitUnpackedToString(byte[] data, int offset, int length) { - return gsm8BitUnpackedToString(data, offset, length, ""); - } - - /** - * Convert a GSM alphabet string that's stored in 8-bit unpacked - * format (as it often appears in SIM records) into a String - *

- * Field may be padded with trailing 0xff's. The decode stops - * at the first 0xff encountered. - *

- * Additionally, in some country(ex. Korea), there are non-ASCII or MBCS characters. - * If a character set is given, characters in data are treat as MBCS. - */ - public static String - gsm8BitUnpackedToString(byte[] data, int offset, int length, String characterset) { - boolean isMbcs = false; - Charset charset = null; - ByteBuffer mbcsBuffer = null; - - if (!TextUtils.isEmpty(characterset) - && !characterset.equalsIgnoreCase("us-ascii") - && Charset.isSupported(characterset)) { - isMbcs = true; - charset = Charset.forName(characterset); - mbcsBuffer = ByteBuffer.allocate(2); - } - - // Always use GSM 7 bit default alphabet table for this method - String languageTableToChar = sLanguageTables[0]; - String shiftTableToChar = sLanguageShiftTables[0]; - - StringBuilder ret = new StringBuilder(length); - boolean prevWasEscape = false; - for (int i = offset; i < offset + length; i++) { - // Never underestimate the pain that can be caused - // by signed bytes - int c = data[i] & 0xff; - - if (c == 0xff) { - break; - } else if (c == GSM_EXTENDED_ESCAPE) { - if (prevWasEscape) { - // Two escape chars in a row - // We treat this as a space - // See Note 1 in table 6.2.1.1 of TS 23.038 v7.00 - ret.append(' '); - prevWasEscape = false; - } else { - prevWasEscape = true; - } - } else { - if (prevWasEscape) { - char shiftChar = shiftTableToChar.charAt(c); - if (shiftChar == ' ') { - // display character from main table if not present in shift table - ret.append(languageTableToChar.charAt(c)); - } else { - ret.append(shiftChar); - } - } else { - if (!isMbcs || c < 0x80 || i + 1 >= offset + length) { - ret.append(languageTableToChar.charAt(c)); - } else { - // isMbcs must be true. So both mbcsBuffer and charset are initialized. - mbcsBuffer.clear(); - mbcsBuffer.put(data, i++, 2); - mbcsBuffer.flip(); - ret.append(charset.decode(mbcsBuffer).toString()); - } - } - prevWasEscape = false; - } - } - - return ret.toString(); - } - - /** - * Convert a string into an 8-bit unpacked GSM alphabet byte array. - * Always uses GSM default 7-bit alphabet and extension table. - * - * @param s the string to encode - * @return the 8-bit GSM encoded byte array for the string - */ - public static byte[] - stringToGsm8BitPacked(String s) { - byte[] ret; - - int septets = countGsmSeptetsUsingTables(s, true, 0, 0); - - // Enough for all the septets and the length byte prefix - ret = new byte[septets]; - - stringToGsm8BitUnpackedField(s, ret, 0, ret.length); - - return ret; - } - - - /** - * Write a String into a GSM 8-bit unpacked field of - * Field is padded with 0xff's, string is truncated if necessary - * - * @param s the string to encode - * @param dest the destination byte array - * @param offset the starting offset for the encoded string - * @param length the maximum number of bytes to write - */ - public static void - stringToGsm8BitUnpackedField(String s, byte dest[], int offset, int length) { - int outByteIndex = offset; - SparseIntArray charToLanguageTable = sCharsToGsmTables[0]; - SparseIntArray charToShiftTable = sCharsToShiftTables[0]; - - // Septets are stored in byte-aligned octets - for (int i = 0, sz = s.length() - ; i < sz && (outByteIndex - offset) < length - ; i++ - ) { - char c = s.charAt(i); - - int v = charToLanguageTable.get(c, -1); - - if (v == -1) { - v = charToShiftTable.get(c, -1); - if (v == -1) { - v = charToLanguageTable.get(' ', ' '); // fall back to ASCII space - } else { - // make sure we can fit an escaped char - if (!(outByteIndex + 1 - offset < length)) { - break; - } - - dest[outByteIndex++] = GSM_EXTENDED_ESCAPE; - } - } - - dest[outByteIndex++] = (byte) v; - } - - // pad with 0xff's - while ((outByteIndex - offset) < length) { - dest[outByteIndex++] = (byte) 0xff; - } - } - - /** - * Returns the count of 7-bit GSM alphabet characters - * needed to represent this character. Counts unencodable char as 1 septet. - * - * @param c the character to examine - * @return the number of septets for this character - */ - public static int - countGsmSeptets(char c) { - try { - return countGsmSeptets(c, false); - } catch (EncodeException ex) { - // This should never happen. - return 0; - } - } - - /** - * Returns the count of 7-bit GSM alphabet characters - * needed to represent this character using the default 7 bit GSM alphabet. - * - * @param c the character to examine - * @param throwsException If true, throws EncodeException if unencodable - * char. Otherwise, counts invalid char as 1 septet. - * @return the number of septets for this character - * @throws EncodeException the character can't be encoded and throwsException is true - */ - public static int - countGsmSeptets(char c, boolean throwsException) throws EncodeException { - if (sCharsToGsmTables[0].get(c, -1) != -1) { - return 1; - } - - if (sCharsToShiftTables[0].get(c, -1) != -1) { - return 2; - } - - if (throwsException) { - throw new EncodeException(c); - } else { - // count as a space char - return 1; - } - } - - /** - * Returns the count of 7-bit GSM alphabet characters needed - * to represent this string, using the specified 7-bit language table - * and extension table (0 for GSM default tables). - * - * @param s the Unicode string that will be encoded - * @param use7bitOnly allow using space in place of unencodable character if true, - * otherwise, return -1 if any characters are unencodable - * @param languageTable the 7 bit language table, or 0 for the default GSM alphabet - * @param languageShiftTable the 7 bit single shift language table, or 0 for the default - * GSM extension table - * @return the septet count for s using the specified language tables, or -1 if any - * characters are unencodable and use7bitOnly is false - */ - public static int countGsmSeptetsUsingTables(CharSequence s, boolean use7bitOnly, - int languageTable, int languageShiftTable) { - int count = 0; - int sz = s.length(); - SparseIntArray charToLanguageTable = sCharsToGsmTables[languageTable]; - SparseIntArray charToShiftTable = sCharsToShiftTables[languageShiftTable]; - for (int i = 0; i < sz; i++) { - char c = s.charAt(i); - if (c == GSM_EXTENDED_ESCAPE) { - Log.w(TAG, "countGsmSeptets() string contains Escape character, skipping."); - continue; - } - if (charToLanguageTable.get(c, -1) != -1) { - count++; - } else if (charToShiftTable.get(c, -1) != -1) { - count += 2; // escape + shift table index - } else if (use7bitOnly) { - count++; // encode as space - } else { - return -1; // caller must check for this case - } - } - return count; - } - - /** - * Returns the count of 7-bit GSM alphabet characters - * needed to represent this string, and the language table and - * language shift table used to achieve this result. - * For multi-part text messages, each message part may use its - * own language table encoding as specified in the message header - * for that message. However, this method will only return the - * optimal encoding for the message as a whole. When the individual - * pieces are encoded, a more optimal encoding may be chosen for each - * piece of the message, but the message will be split into pieces - * based on the encoding chosen for the message as a whole. - * - * @param s the Unicode string that will be encoded - * @param use7bitOnly allow using space in place of unencodable character if true, - * using the language table pair with the fewest unencodable characters - * @return a TextEncodingDetails object containing the message and - * character counts for the most efficient 7-bit encoding, - * or null if there are no suitable language tables to encode the string. - */ - public static TextEncodingDetails - countGsmSeptets(CharSequence s, boolean use7bitOnly) { - // Load enabled language tables from config.xml, including any MCC overlays - if (!sDisableCountryEncodingCheck) { - enableCountrySpecificEncodings(); - } - // fast path for common case where no national language shift tables are enabled - if (sEnabledSingleShiftTables.length + sEnabledLockingShiftTables.length == 0) { - TextEncodingDetails ted = new TextEncodingDetails(); - int septets = GsmAlphabet.countGsmSeptetsUsingTables(s, use7bitOnly, 0, 0); - if (septets == -1) { - return null; - } - ted.codeUnitSize = SmsConstants.ENCODING_7BIT; - ted.codeUnitCount = septets; - if (septets > SmsConstants.MAX_USER_DATA_SEPTETS) { - ted.msgCount = (septets + (SmsConstants.MAX_USER_DATA_SEPTETS_WITH_HEADER - 1)) / - SmsConstants.MAX_USER_DATA_SEPTETS_WITH_HEADER; - ted.codeUnitsRemaining = (ted.msgCount * - SmsConstants.MAX_USER_DATA_SEPTETS_WITH_HEADER) - septets; - } else { - ted.msgCount = 1; - ted.codeUnitsRemaining = SmsConstants.MAX_USER_DATA_SEPTETS - septets; - } - ted.codeUnitSize = SmsConstants.ENCODING_7BIT; - return ted; - } - - int maxSingleShiftCode = sHighestEnabledSingleShiftCode; - List lpcList = new ArrayList( - sEnabledLockingShiftTables.length + 1); - - // Always add default GSM 7-bit alphabet table - lpcList.add(new LanguagePairCount(0)); - for (int i : sEnabledLockingShiftTables) { - // Avoid adding default table twice in case 0 is in the list of allowed tables - if (i != 0 && !sLanguageTables[i].isEmpty()) { - lpcList.add(new LanguagePairCount(i)); - } - } - - int sz = s.length(); - // calculate septet count for each valid table / shift table pair - for (int i = 0; i < sz && !lpcList.isEmpty(); i++) { - char c = s.charAt(i); - if (c == GSM_EXTENDED_ESCAPE) { - Log.w(TAG, "countGsmSeptets() string contains Escape character, ignoring!"); - continue; - } - // iterate through enabled locking shift tables - for (LanguagePairCount lpc : lpcList) { - int tableIndex = sCharsToGsmTables[lpc.languageCode].get(c, -1); - if (tableIndex == -1) { - // iterate through single shift tables for this locking table - for (int table = 0; table <= maxSingleShiftCode; table++) { - if (lpc.septetCounts[table] != -1) { - int shiftTableIndex = sCharsToShiftTables[table].get(c, -1); - if (shiftTableIndex == -1) { - if (use7bitOnly) { - // can't encode char, use space instead - lpc.septetCounts[table]++; - lpc.unencodableCounts[table]++; - } else { - // can't encode char, remove language pair from list - lpc.septetCounts[table] = -1; - } - } else { - // encode as Escape + index into shift table - lpc.septetCounts[table] += 2; - } - } - } - } else { - // encode as index into locking shift table for all pairs - for (int table = 0; table <= maxSingleShiftCode; table++) { - if (lpc.septetCounts[table] != -1) { - lpc.septetCounts[table]++; - } - } - } - } - } - - // find the least cost encoding (lowest message count and most code units remaining) - TextEncodingDetails ted = new TextEncodingDetails(); - ted.msgCount = Integer.MAX_VALUE; - ted.codeUnitSize = SmsConstants.ENCODING_7BIT; - int minUnencodableCount = Integer.MAX_VALUE; - for (LanguagePairCount lpc : lpcList) { - for (int shiftTable = 0; shiftTable <= maxSingleShiftCode; shiftTable++) { - int septets = lpc.septetCounts[shiftTable]; - if (septets == -1) { - continue; - } - int udhLength; - if (lpc.languageCode != 0 && shiftTable != 0) { - udhLength = UDH_SEPTET_COST_LENGTH + UDH_SEPTET_COST_TWO_SHIFT_TABLES; - } else if (lpc.languageCode != 0 || shiftTable != 0) { - udhLength = UDH_SEPTET_COST_LENGTH + UDH_SEPTET_COST_ONE_SHIFT_TABLE; - } else { - udhLength = 0; - } - int msgCount; - int septetsRemaining; - if (septets + udhLength > SmsConstants.MAX_USER_DATA_SEPTETS) { - if (udhLength == 0) { - udhLength = UDH_SEPTET_COST_LENGTH; - } - udhLength += UDH_SEPTET_COST_CONCATENATED_MESSAGE; - int septetsPerMessage = SmsConstants.MAX_USER_DATA_SEPTETS - udhLength; - msgCount = (septets + septetsPerMessage - 1) / septetsPerMessage; - septetsRemaining = (msgCount * septetsPerMessage) - septets; - } else { - msgCount = 1; - septetsRemaining = SmsConstants.MAX_USER_DATA_SEPTETS - udhLength - septets; - } - // for 7-bit only mode, use language pair with the least unencodable chars - int unencodableCount = lpc.unencodableCounts[shiftTable]; - if (use7bitOnly && unencodableCount > minUnencodableCount) { - continue; - } - if ((use7bitOnly && unencodableCount < minUnencodableCount) - || msgCount < ted.msgCount || (msgCount == ted.msgCount - && septetsRemaining > ted.codeUnitsRemaining)) { - minUnencodableCount = unencodableCount; - ted.msgCount = msgCount; - ted.codeUnitCount = septets; - ted.codeUnitsRemaining = septetsRemaining; - ted.languageTable = lpc.languageCode; - ted.languageShiftTable = shiftTable; - } - } - } - - if (ted.msgCount == Integer.MAX_VALUE) { - return null; - } - - return ted; - } - - /** - * Returns the index into s of the first character - * after limit septets have been reached, starting at - * index start. This is used when dividing messages - * into units within the SMS message size limit. - * - * @param s source string - * @param start index of where to start counting septets - * @param limit maximum septets to include, - * e.g. MAX_USER_DATA_SEPTETS - * @param langTable the 7 bit character table to use (0 for default GSM 7-bit alphabet) - * @param langShiftTable the 7 bit shift table to use (0 for default GSM extension table) - * @return index of first character that won't fit, or the length - * of the entire string if everything fits - */ - public static int - findGsmSeptetLimitIndex(String s, int start, int limit, int langTable, int langShiftTable) { - int accumulator = 0; - int size = s.length(); - - SparseIntArray charToLangTable = sCharsToGsmTables[langTable]; - SparseIntArray charToLangShiftTable = sCharsToShiftTables[langShiftTable]; - for (int i = start; i < size; i++) { - int encodedSeptet = charToLangTable.get(s.charAt(i), -1); - if (encodedSeptet == -1) { - encodedSeptet = charToLangShiftTable.get(s.charAt(i), -1); - if (encodedSeptet == -1) { - // char not found, assume we're replacing with space - accumulator++; - } else { - accumulator += 2; // escape character + shift table index - } - } else { - accumulator++; - } - if (accumulator > limit) { - return i; - } - } - return size; - } - - /** - * Modify the array of enabled national language single shift tables for SMS - * encoding. This is used for unit testing, but could also be used to - * modify the enabled encodings based on the active MCC/MNC, for example. - * - * @param tables the new list of enabled single shift tables - */ - static synchronized void setEnabledSingleShiftTables(int[] tables) { - sEnabledSingleShiftTables = tables; - sDisableCountryEncodingCheck = true; - - if (tables.length > 0) { - sHighestEnabledSingleShiftCode = tables[tables.length - 1]; - } else { - sHighestEnabledSingleShiftCode = 0; - } - } - - /** - * Modify the array of enabled national language locking shift tables for SMS - * encoding. This is used for unit testing, but could also be used to - * modify the enabled encodings based on the active MCC/MNC, for example. - * - * @param tables the new list of enabled locking shift tables - */ - static synchronized void setEnabledLockingShiftTables(int[] tables) { - sEnabledLockingShiftTables = tables; - sDisableCountryEncodingCheck = true; - } - - /** - * Return the array of enabled national language single shift tables for SMS - * encoding. This is used for unit testing. The returned array is not a copy, so - * the caller should be careful not to modify it. - * - * @return the list of enabled single shift tables - */ - static synchronized int[] getEnabledSingleShiftTables() { - return sEnabledSingleShiftTables; - } - - /** - * Return the array of enabled national language locking shift tables for SMS - * encoding. This is used for unit testing. The returned array is not a copy, so - * the caller should be careful not to modify it. - * - * @return the list of enabled locking shift tables - */ - static synchronized int[] getEnabledLockingShiftTables() { - return sEnabledLockingShiftTables; - } - - /** - * Enable country-specific language tables from MCC-specific overlays. - * - * @context the context to use to get the TelephonyManager - */ - private static void enableCountrySpecificEncodings() { - // See comments in frameworks/base/core/res/res/values/config.xml for allowed values - sEnabledSingleShiftTables = new int[1]; - sEnabledLockingShiftTables = new int[1]; - - if (sEnabledSingleShiftTables.length > 0) { - sHighestEnabledSingleShiftCode = - sEnabledSingleShiftTables[sEnabledSingleShiftTables.length - 1]; - } else { - sHighestEnabledSingleShiftCode = 0; - } - } - - /** - * Reverse mapping from Unicode characters to indexes into language tables. - */ - private static final SparseIntArray[] sCharsToGsmTables; - - /** - * Reverse mapping from Unicode characters to indexes into language shift tables. - */ - private static final SparseIntArray[] sCharsToShiftTables; - - /** - * OEM configured list of enabled national language single shift tables for encoding. - */ - private static int[] sEnabledSingleShiftTables; - - /** - * OEM configured list of enabled national language locking shift tables for encoding. - */ - private static int[] sEnabledLockingShiftTables; - - /** - * Highest language code to include in array of single shift counters. - */ - private static int sHighestEnabledSingleShiftCode; - - /** - * Flag to bypass check for country-specific overlays (for test cases only). - */ - private static boolean sDisableCountryEncodingCheck = false; - - /** - * Septet counter for a specific locking shift table and all of - * the single shift tables that it can be paired with. - */ - private static class LanguagePairCount { - final int languageCode; - final int[] septetCounts; - final int[] unencodableCounts; - - LanguagePairCount(int code) { - this.languageCode = code; - int maxSingleShiftCode = sHighestEnabledSingleShiftCode; - septetCounts = new int[maxSingleShiftCode + 1]; - unencodableCounts = new int[maxSingleShiftCode + 1]; - // set counters for disabled single shift tables to -1 - // (GSM default extension table index 0 is always enabled) - for (int i = 1, tableOffset = 0; i <= maxSingleShiftCode; i++) { - if (sEnabledSingleShiftTables[tableOffset] == i) { - tableOffset++; - } else { - septetCounts[i] = -1; // disabled - } - } - // exclude Turkish locking + Turkish single shift table and - // Portuguese locking + Spanish single shift table (these - // combinations will never be optimal for any input). - if (code == 1 && maxSingleShiftCode >= 1) { - septetCounts[1] = -1; // Turkish + Turkish - } else if (code == 3 && maxSingleShiftCode >= 2) { - septetCounts[2] = -1; // Portuguese + Spanish - } - } - } - - /** - * GSM default 7 bit alphabet plus national language locking shift character tables. - * Comment lines above strings indicate the lower four bits of the table position. - */ - private static final String[] sLanguageTables = { - /* 3GPP TS 23.038 V9.1.1 section 6.2.1 - GSM 7 bit Default Alphabet - 01.....23.....4.....5.....6.....7.....8.....9.....A.B.....C.....D.E.....F.....0.....1 */ - "@\u00a3$\u00a5\u00e8\u00e9\u00f9\u00ec\u00f2\u00c7\n\u00d8\u00f8\r\u00c5\u00e5\u0394_" - // 2.....3.....4.....5.....6.....7.....8.....9.....A.....B.....C.....D.....E..... - + "\u03a6\u0393\u039b\u03a9\u03a0\u03a8\u03a3\u0398\u039e\uffff\u00c6\u00e6\u00df" - // F.....012.34.....56789ABCDEF0123456789ABCDEF0.....123456789ABCDEF0123456789A - + "\u00c9 !\"#\u00a4%&'()*+,-./0123456789:;<=>?\u00a1ABCDEFGHIJKLMNOPQRSTUVWXYZ" - // B.....C.....D.....E.....F.....0.....123456789ABCDEF0123456789AB.....C.....D..... - + "\u00c4\u00d6\u00d1\u00dc\u00a7\u00bfabcdefghijklmnopqrstuvwxyz\u00e4\u00f6\u00f1" - // E.....F..... - + "\u00fc\u00e0", - - /* A.3.1 Turkish National Language Locking Shift Table - 01.....23.....4.....5.....6.....7.....8.....9.....A.B.....C.....D.E.....F.....0.....1 */ - "@\u00a3$\u00a5\u20ac\u00e9\u00f9\u0131\u00f2\u00c7\n\u011e\u011f\r\u00c5\u00e5\u0394_" - // 2.....3.....4.....5.....6.....7.....8.....9.....A.....B.....C.....D.....E..... - + "\u03a6\u0393\u039b\u03a9\u03a0\u03a8\u03a3\u0398\u039e\uffff\u015e\u015f\u00df" - // F.....012.34.....56789ABCDEF0123456789ABCDEF0.....123456789ABCDEF0123456789A - + "\u00c9 !\"#\u00a4%&'()*+,-./0123456789:;<=>?\u0130ABCDEFGHIJKLMNOPQRSTUVWXYZ" - // B.....C.....D.....E.....F.....0.....123456789ABCDEF0123456789AB.....C.....D..... - + "\u00c4\u00d6\u00d1\u00dc\u00a7\u00e7abcdefghijklmnopqrstuvwxyz\u00e4\u00f6\u00f1" - // E.....F..... - + "\u00fc\u00e0", - - /* A.3.2 Void (no locking shift table for Spanish) */ - "", - - /* A.3.3 Portuguese National Language Locking Shift Table - 01.....23.....4.....5.....6.....7.....8.....9.....A.B.....C.....D.E.....F.....0.....1 */ - "@\u00a3$\u00a5\u00ea\u00e9\u00fa\u00ed\u00f3\u00e7\n\u00d4\u00f4\r\u00c1\u00e1\u0394_" - // 2.....3.....4.....5.....67.8.....9.....AB.....C.....D.....E.....F.....012.34..... - + "\u00aa\u00c7\u00c0\u221e^\\\u20ac\u00d3|\uffff\u00c2\u00e2\u00ca\u00c9 !\"#\u00ba" - // 56789ABCDEF0123456789ABCDEF0.....123456789ABCDEF0123456789AB.....C.....D.....E..... - + "%&'()*+,-./0123456789:;<=>?\u00cdABCDEFGHIJKLMNOPQRSTUVWXYZ\u00c3\u00d5\u00da\u00dc" - // F.....0123456789ABCDEF0123456789AB.....C.....DE.....F..... - + "\u00a7~abcdefghijklmnopqrstuvwxyz\u00e3\u00f5`\u00fc\u00e0", - - /* A.3.4 Bengali National Language Locking Shift Table - 0.....1.....2.....3.....4.....5.....6.....7.....8.....9.....A.B.....CD.EF.....0..... */ - "\u0981\u0982\u0983\u0985\u0986\u0987\u0988\u0989\u098a\u098b\n\u098c \r \u098f\u0990" - // 123.....4.....5.....6.....7.....8.....9.....A.....B.....C.....D.....E.....F..... - + " \u0993\u0994\u0995\u0996\u0997\u0998\u0999\u099a\uffff\u099b\u099c\u099d\u099e" - // 012.....3.....4.....5.....6.....7.....89A.....B.....CD.....EF.....0123456789ABC - + " !\u099f\u09a0\u09a1\u09a2\u09a3\u09a4)(\u09a5\u09a6,\u09a7.\u09a80123456789:; " - // D.....E.....F0.....1.....2.....3.....4.....56.....789A.....B.....C.....D..... - + "\u09aa\u09ab?\u09ac\u09ad\u09ae\u09af\u09b0 \u09b2 \u09b6\u09b7\u09b8\u09b9" - // E.....F.....0.....1.....2.....3.....4.....5.....6.....789.....A.....BCD.....E..... - + "\u09bc\u09bd\u09be\u09bf\u09c0\u09c1\u09c2\u09c3\u09c4 \u09c7\u09c8 \u09cb\u09cc" - // F.....0.....123456789ABCDEF0123456789AB.....C.....D.....E.....F..... - + "\u09cd\u09ceabcdefghijklmnopqrstuvwxyz\u09d7\u09dc\u09dd\u09f0\u09f1", - - /* A.3.5 Gujarati National Language Locking Shift Table - 0.....1.....2.....3.....4.....5.....6.....7.....8.....9.....A.B.....C.....D.EF.....0.....*/ - "\u0a81\u0a82\u0a83\u0a85\u0a86\u0a87\u0a88\u0a89\u0a8a\u0a8b\n\u0a8c\u0a8d\r \u0a8f\u0a90" - // 1.....23.....4.....5.....6.....7.....8.....9.....A.....B.....C.....D.....E..... - + "\u0a91 \u0a93\u0a94\u0a95\u0a96\u0a97\u0a98\u0a99\u0a9a\uffff\u0a9b\u0a9c\u0a9d" - // F.....012.....3.....4.....5.....6.....7.....89A.....B.....CD.....EF.....0123456789AB - + "\u0a9e !\u0a9f\u0aa0\u0aa1\u0aa2\u0aa3\u0aa4)(\u0aa5\u0aa6,\u0aa7.\u0aa80123456789:;" - // CD.....E.....F0.....1.....2.....3.....4.....56.....7.....89.....A.....B.....C..... - + " \u0aaa\u0aab?\u0aac\u0aad\u0aae\u0aaf\u0ab0 \u0ab2\u0ab3 \u0ab5\u0ab6\u0ab7\u0ab8" - // D.....E.....F.....0.....1.....2.....3.....4.....5.....6.....7.....89.....A..... - + "\u0ab9\u0abc\u0abd\u0abe\u0abf\u0ac0\u0ac1\u0ac2\u0ac3\u0ac4\u0ac5 \u0ac7\u0ac8" - // B.....CD.....E.....F.....0.....123456789ABCDEF0123456789AB.....C.....D.....E..... - + "\u0ac9 \u0acb\u0acc\u0acd\u0ad0abcdefghijklmnopqrstuvwxyz\u0ae0\u0ae1\u0ae2\u0ae3" - // F..... - + "\u0af1", - - /* A.3.6 Hindi National Language Locking Shift Table - 0.....1.....2.....3.....4.....5.....6.....7.....8.....9.....A.B.....C.....D.E.....F.....*/ - "\u0901\u0902\u0903\u0905\u0906\u0907\u0908\u0909\u090a\u090b\n\u090c\u090d\r\u090e\u090f" - // 0.....1.....2.....3.....4.....5.....6.....7.....8.....9.....A.....B.....C.....D..... - + "\u0910\u0911\u0912\u0913\u0914\u0915\u0916\u0917\u0918\u0919\u091a\uffff\u091b\u091c" - // E.....F.....012.....3.....4.....5.....6.....7.....89A.....B.....CD.....EF.....012345 - + "\u091d\u091e !\u091f\u0920\u0921\u0922\u0923\u0924)(\u0925\u0926,\u0927.\u0928012345" - // 6789ABC.....D.....E.....F0.....1.....2.....3.....4.....5.....6.....7.....8..... - + "6789:;\u0929\u092a\u092b?\u092c\u092d\u092e\u092f\u0930\u0931\u0932\u0933\u0934" - // 9.....A.....B.....C.....D.....E.....F.....0.....1.....2.....3.....4.....5.....6..... - + "\u0935\u0936\u0937\u0938\u0939\u093c\u093d\u093e\u093f\u0940\u0941\u0942\u0943\u0944" - // 7.....8.....9.....A.....B.....C.....D.....E.....F.....0.....123456789ABCDEF012345678 - + "\u0945\u0946\u0947\u0948\u0949\u094a\u094b\u094c\u094d\u0950abcdefghijklmnopqrstuvwx" - // 9AB.....C.....D.....E.....F..... - + "yz\u0972\u097b\u097c\u097e\u097f", - - /* A.3.7 Kannada National Language Locking Shift Table - NOTE: TS 23.038 V9.1.1 shows code 0x24 as \u0caa, corrected to \u0ca1 (typo) - 01.....2.....3.....4.....5.....6.....7.....8.....9.....A.B.....CD.E.....F.....0.....1 */ - " \u0c82\u0c83\u0c85\u0c86\u0c87\u0c88\u0c89\u0c8a\u0c8b\n\u0c8c \r\u0c8e\u0c8f\u0c90 " - // 2.....3.....4.....5.....6.....7.....8.....9.....A.....B.....C.....D.....E.....F..... - + "\u0c92\u0c93\u0c94\u0c95\u0c96\u0c97\u0c98\u0c99\u0c9a\uffff\u0c9b\u0c9c\u0c9d\u0c9e" - // 012.....3.....4.....5.....6.....7.....89A.....B.....CD.....EF.....0123456789ABC - + " !\u0c9f\u0ca0\u0ca1\u0ca2\u0ca3\u0ca4)(\u0ca5\u0ca6,\u0ca7.\u0ca80123456789:; " - // D.....E.....F0.....1.....2.....3.....4.....5.....6.....7.....89.....A.....B..... - + "\u0caa\u0cab?\u0cac\u0cad\u0cae\u0caf\u0cb0\u0cb1\u0cb2\u0cb3 \u0cb5\u0cb6\u0cb7" - // C.....D.....E.....F.....0.....1.....2.....3.....4.....5.....6.....78.....9..... - + "\u0cb8\u0cb9\u0cbc\u0cbd\u0cbe\u0cbf\u0cc0\u0cc1\u0cc2\u0cc3\u0cc4 \u0cc6\u0cc7" - // A.....BC.....D.....E.....F.....0.....123456789ABCDEF0123456789AB.....C.....D..... - + "\u0cc8 \u0cca\u0ccb\u0ccc\u0ccd\u0cd5abcdefghijklmnopqrstuvwxyz\u0cd6\u0ce0\u0ce1" - // E.....F..... - + "\u0ce2\u0ce3", - - /* A.3.8 Malayalam National Language Locking Shift Table - 01.....2.....3.....4.....5.....6.....7.....8.....9.....A.B.....CD.E.....F.....0.....1 */ - " \u0d02\u0d03\u0d05\u0d06\u0d07\u0d08\u0d09\u0d0a\u0d0b\n\u0d0c \r\u0d0e\u0d0f\u0d10 " - // 2.....3.....4.....5.....6.....7.....8.....9.....A.....B.....C.....D.....E.....F..... - + "\u0d12\u0d13\u0d14\u0d15\u0d16\u0d17\u0d18\u0d19\u0d1a\uffff\u0d1b\u0d1c\u0d1d\u0d1e" - // 012.....3.....4.....5.....6.....7.....89A.....B.....CD.....EF.....0123456789ABC - + " !\u0d1f\u0d20\u0d21\u0d22\u0d23\u0d24)(\u0d25\u0d26,\u0d27.\u0d280123456789:; " - // D.....E.....F0.....1.....2.....3.....4.....5.....6.....7.....8.....9.....A..... - + "\u0d2a\u0d2b?\u0d2c\u0d2d\u0d2e\u0d2f\u0d30\u0d31\u0d32\u0d33\u0d34\u0d35\u0d36" - // B.....C.....D.....EF.....0.....1.....2.....3.....4.....5.....6.....78.....9..... - + "\u0d37\u0d38\u0d39 \u0d3d\u0d3e\u0d3f\u0d40\u0d41\u0d42\u0d43\u0d44 \u0d46\u0d47" - // A.....BC.....D.....E.....F.....0.....123456789ABCDEF0123456789AB.....C.....D..... - + "\u0d48 \u0d4a\u0d4b\u0d4c\u0d4d\u0d57abcdefghijklmnopqrstuvwxyz\u0d60\u0d61\u0d62" - // E.....F..... - + "\u0d63\u0d79", - - /* A.3.9 Oriya National Language Locking Shift Table - 0.....1.....2.....3.....4.....5.....6.....7.....8.....9.....A.B.....CD.EF.....0.....12 */ - "\u0b01\u0b02\u0b03\u0b05\u0b06\u0b07\u0b08\u0b09\u0b0a\u0b0b\n\u0b0c \r \u0b0f\u0b10 " - // 3.....4.....5.....6.....7.....8.....9.....A.....B.....C.....D.....E.....F.....01 - + "\u0b13\u0b14\u0b15\u0b16\u0b17\u0b18\u0b19\u0b1a\uffff\u0b1b\u0b1c\u0b1d\u0b1e !" - // 2.....3.....4.....5.....6.....7.....89A.....B.....CD.....EF.....0123456789ABCD..... - + "\u0b1f\u0b20\u0b21\u0b22\u0b23\u0b24)(\u0b25\u0b26,\u0b27.\u0b280123456789:; \u0b2a" - // E.....F0.....1.....2.....3.....4.....56.....7.....89.....A.....B.....C.....D..... - + "\u0b2b?\u0b2c\u0b2d\u0b2e\u0b2f\u0b30 \u0b32\u0b33 \u0b35\u0b36\u0b37\u0b38\u0b39" - // E.....F.....0.....1.....2.....3.....4.....5.....6.....789.....A.....BCD.....E..... - + "\u0b3c\u0b3d\u0b3e\u0b3f\u0b40\u0b41\u0b42\u0b43\u0b44 \u0b47\u0b48 \u0b4b\u0b4c" - // F.....0.....123456789ABCDEF0123456789AB.....C.....D.....E.....F..... - + "\u0b4d\u0b56abcdefghijklmnopqrstuvwxyz\u0b57\u0b60\u0b61\u0b62\u0b63", - - /* A.3.10 Punjabi National Language Locking Shift Table - 0.....1.....2.....3.....4.....5.....6.....7.....8.....9A.BCD.EF.....0.....123.....4.....*/ - "\u0a01\u0a02\u0a03\u0a05\u0a06\u0a07\u0a08\u0a09\u0a0a \n \r \u0a0f\u0a10 \u0a13\u0a14" - // 5.....6.....7.....8.....9.....A.....B.....C.....D.....E.....F.....012.....3..... - + "\u0a15\u0a16\u0a17\u0a18\u0a19\u0a1a\uffff\u0a1b\u0a1c\u0a1d\u0a1e !\u0a1f\u0a20" - // 4.....5.....6.....7.....89A.....B.....CD.....EF.....0123456789ABCD.....E.....F0..... - + "\u0a21\u0a22\u0a23\u0a24)(\u0a25\u0a26,\u0a27.\u0a280123456789:; \u0a2a\u0a2b?\u0a2c" - // 1.....2.....3.....4.....56.....7.....89.....A.....BC.....D.....E.....F0.....1..... - + "\u0a2d\u0a2e\u0a2f\u0a30 \u0a32\u0a33 \u0a35\u0a36 \u0a38\u0a39\u0a3c \u0a3e\u0a3f" - // 2.....3.....4.....56789.....A.....BCD.....E.....F.....0.....123456789ABCDEF012345678 - + "\u0a40\u0a41\u0a42 \u0a47\u0a48 \u0a4b\u0a4c\u0a4d\u0a51abcdefghijklmnopqrstuvwx" - // 9AB.....C.....D.....E.....F..... - + "yz\u0a70\u0a71\u0a72\u0a73\u0a74", - - /* A.3.11 Tamil National Language Locking Shift Table - 01.....2.....3.....4.....5.....6.....7.....8.....9A.BCD.E.....F.....0.....12.....3..... */ - " \u0b82\u0b83\u0b85\u0b86\u0b87\u0b88\u0b89\u0b8a \n \r\u0b8e\u0b8f\u0b90 \u0b92\u0b93" - // 4.....5.....6789.....A.....B.....CD.....EF.....012.....3456.....7.....89ABCDEF..... - + "\u0b94\u0b95 \u0b99\u0b9a\uffff \u0b9c \u0b9e !\u0b9f \u0ba3\u0ba4)( , .\u0ba8" - // 0123456789ABC.....D.....EF012.....3.....4.....5.....6.....7.....8.....9.....A..... - + "0123456789:;\u0ba9\u0baa ? \u0bae\u0baf\u0bb0\u0bb1\u0bb2\u0bb3\u0bb4\u0bb5\u0bb6" - // B.....C.....D.....EF0.....1.....2.....3.....4.....5678.....9.....A.....BC.....D..... - + "\u0bb7\u0bb8\u0bb9 \u0bbe\u0bbf\u0bc0\u0bc1\u0bc2 \u0bc6\u0bc7\u0bc8 \u0bca\u0bcb" - // E.....F.....0.....123456789ABCDEF0123456789AB.....C.....D.....E.....F..... - + "\u0bcc\u0bcd\u0bd0abcdefghijklmnopqrstuvwxyz\u0bd7\u0bf0\u0bf1\u0bf2\u0bf9", - - /* A.3.12 Telugu National Language Locking Shift Table - 0.....1.....2.....3.....4.....5.....6.....7.....8.....9.....A.B.....CD.E.....F.....0.....*/ - "\u0c01\u0c02\u0c03\u0c05\u0c06\u0c07\u0c08\u0c09\u0c0a\u0c0b\n\u0c0c \r\u0c0e\u0c0f\u0c10" - // 12.....3.....4.....5.....6.....7.....8.....9.....A.....B.....C.....D.....E..... - + " \u0c12\u0c13\u0c14\u0c15\u0c16\u0c17\u0c18\u0c19\u0c1a\uffff\u0c1b\u0c1c\u0c1d" - // F.....012.....3.....4.....5.....6.....7.....89A.....B.....CD.....EF.....0123456789AB - + "\u0c1e !\u0c1f\u0c20\u0c21\u0c22\u0c23\u0c24)(\u0c25\u0c26,\u0c27.\u0c280123456789:;" - // CD.....E.....F0.....1.....2.....3.....4.....5.....6.....7.....89.....A.....B..... - + " \u0c2a\u0c2b?\u0c2c\u0c2d\u0c2e\u0c2f\u0c30\u0c31\u0c32\u0c33 \u0c35\u0c36\u0c37" - // C.....D.....EF.....0.....1.....2.....3.....4.....5.....6.....78.....9.....A.....B - + "\u0c38\u0c39 \u0c3d\u0c3e\u0c3f\u0c40\u0c41\u0c42\u0c43\u0c44 \u0c46\u0c47\u0c48 " - // C.....D.....E.....F.....0.....123456789ABCDEF0123456789AB.....C.....D.....E..... - + "\u0c4a\u0c4b\u0c4c\u0c4d\u0c55abcdefghijklmnopqrstuvwxyz\u0c56\u0c60\u0c61\u0c62" - // F..... - + "\u0c63", - - /* A.3.13 Urdu National Language Locking Shift Table - 0.....1.....2.....3.....4.....5.....6.....7.....8.....9.....A.B.....C.....D.E.....F.....*/ - "\u0627\u0622\u0628\u067b\u0680\u067e\u06a6\u062a\u06c2\u067f\n\u0679\u067d\r\u067a\u067c" - // 0.....1.....2.....3.....4.....5.....6.....7.....8.....9.....A.....B.....C.....D..... - + "\u062b\u062c\u0681\u0684\u0683\u0685\u0686\u0687\u062d\u062e\u062f\uffff\u068c\u0688" - // E.....F.....012.....3.....4.....5.....6.....7.....89A.....B.....CD.....EF.....012345 - + "\u0689\u068a !\u068f\u068d\u0630\u0631\u0691\u0693)(\u0699\u0632,\u0696.\u0698012345" - // 6789ABC.....D.....E.....F0.....1.....2.....3.....4.....5.....6.....7.....8..... - + "6789:;\u069a\u0633\u0634?\u0635\u0636\u0637\u0638\u0639\u0641\u0642\u06a9\u06aa" - // 9.....A.....B.....C.....D.....E.....F.....0.....1.....2.....3.....4.....5.....6..... - + "\u06ab\u06af\u06b3\u06b1\u0644\u0645\u0646\u06ba\u06bb\u06bc\u0648\u06c4\u06d5\u06c1" - // 7.....8.....9.....A.....B.....C.....D.....E.....F.....0.....123456789ABCDEF012345678 - + "\u06be\u0621\u06cc\u06d0\u06d2\u064d\u0650\u064f\u0657\u0654abcdefghijklmnopqrstuvwx" - // 9AB.....C.....D.....E.....F..... - + "yz\u0655\u0651\u0653\u0656\u0670" - }; - - /** - * GSM default extension table plus national language single shift character tables. - */ - private static final String[] sLanguageShiftTables = new String[]{ - /* 6.2.1.1 GSM 7 bit Default Alphabet Extension Table - 0123456789A.....BCDEF0123456789ABCDEF0123456789ABCDEF.0123456789ABCDEF0123456789ABCDEF */ - " \u000c ^ {} \\ [~] | " - // 0123456789ABCDEF012345.....6789ABCDEF0123456789ABCDEF - + " \u20ac ", - - /* A.2.1 Turkish National Language Single Shift Table - 0123456789A.....BCDEF0123456789ABCDEF0123456789ABCDEF.0123456789ABCDEF01234567.....8 */ - " \u000c ^ {} \\ [~] | \u011e " - // 9.....ABCDEF0123.....456789ABCDEF0123.....45.....67.....89.....ABCDEF0123..... - + "\u0130 \u015e \u00e7 \u20ac \u011f \u0131 \u015f" - // 456789ABCDEF - + " ", - - /* A.2.2 Spanish National Language Single Shift Table - 0123456789.....A.....BCDEF0123456789ABCDEF0123456789ABCDEF.0123456789ABCDEF01.....23 */ - " \u00e7\u000c ^ {} \\ [~] |\u00c1 " - // 456789.....ABCDEF.....012345.....6789ABCDEF01.....2345.....6789.....ABCDEF.....012 - + " \u00cd \u00d3 \u00da \u00e1 \u20ac \u00ed \u00f3 " - // 345.....6789ABCDEF - + " \u00fa ", - - /* A.2.3 Portuguese National Language Single Shift Table - 012345.....6789.....A.....B.....C.....DE.....F.....012.....3.....45.....6.....7.....8....*/ - " \u00ea \u00e7\u000c\u00d4\u00f4 \u00c1\u00e1 \u03a6\u0393^\u03a9\u03a0\u03a8\u03a3" - // 9.....ABCDEF.....0123456789ABCDEF.0123456789ABCDEF01.....23456789.....ABCDE - + "\u0398 \u00ca {} \\ [~] |\u00c0 \u00cd " - // F.....012345.....6789AB.....C.....DEF01.....2345.....6789.....ABCDEF.....01234 - + "\u00d3 \u00da \u00c3\u00d5 \u00c2 \u20ac \u00ed \u00f3 " - // 5.....6789AB.....C.....DEF..... - + "\u00fa \u00e3\u00f5 \u00e2", - - /* A.2.4 Bengali National Language Single Shift Table - 01.....23.....4.....5.6.....789A.....BCDEF0123.....45.....6789.....A.....BC.....D..... */ - "@\u00a3$\u00a5\u00bf\"\u00a4%&'\u000c*+ -/<=>\u00a1^\u00a1_#*\u09e6\u09e7 \u09e8\u09e9" - // E.....F.....0.....1.....2.....3.....4.....5.....6.....7.....89A.....B.....C..... - + "\u09ea\u09eb\u09ec\u09ed\u09ee\u09ef\u09df\u09e0\u09e1\u09e2{}\u09e3\u09f2\u09f3" - // D.....E.....F.0.....1.....2.....3.....4.....56789ABCDEF0123456789ABCDEF - + "\u09f4\u09f5\\\u09f6\u09f7\u09f8\u09f9\u09fa [~] |ABCDEFGHIJKLMNO" - // 0123456789ABCDEF012345.....6789ABCDEF0123456789ABCDEF - + "PQRSTUVWXYZ \u20ac ", - - /* A.2.5 Gujarati National Language Single Shift Table - 01.....23.....4.....5.6.....789A.....BCDEF0123.....45.....6789.....A.....BC.....D..... */ - "@\u00a3$\u00a5\u00bf\"\u00a4%&'\u000c*+ -/<=>\u00a1^\u00a1_#*\u0964\u0965 \u0ae6\u0ae7" - // E.....F.....0.....1.....2.....3.....4.....5.....6789ABCDEF.0123456789ABCDEF - + "\u0ae8\u0ae9\u0aea\u0aeb\u0aec\u0aed\u0aee\u0aef {} \\ [~] " - // 0123456789ABCDEF0123456789ABCDEF012345.....6789ABCDEF0123456789ABCDEF - + "|ABCDEFGHIJKLMNOPQRSTUVWXYZ \u20ac ", - - /* A.2.6 Hindi National Language Single Shift Table - 01.....23.....4.....5.6.....789A.....BCDEF0123.....45.....6789.....A.....BC.....D..... */ - "@\u00a3$\u00a5\u00bf\"\u00a4%&'\u000c*+ -/<=>\u00a1^\u00a1_#*\u0964\u0965 \u0966\u0967" - // E.....F.....0.....1.....2.....3.....4.....5.....6.....7.....89A.....B.....C..... - + "\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f\u0951\u0952{}\u0953\u0954\u0958" - // D.....E.....F.0.....1.....2.....3.....4.....5.....6.....7.....8.....9.....A..... - + "\u0959\u095a\\\u095b\u095c\u095d\u095e\u095f\u0960\u0961\u0962\u0963\u0970\u0971" - // BCDEF0123456789ABCDEF0123456789ABCDEF012345.....6789ABCDEF0123456789ABCDEF - + " [~] |ABCDEFGHIJKLMNOPQRSTUVWXYZ \u20ac ", - - /* A.2.7 Kannada National Language Single Shift Table - 01.....23.....4.....5.6.....789A.....BCDEF0123.....45.....6789.....A.....BC.....D..... */ - "@\u00a3$\u00a5\u00bf\"\u00a4%&'\u000c*+ -/<=>\u00a1^\u00a1_#*\u0964\u0965 \u0ce6\u0ce7" - // E.....F.....0.....1.....2.....3.....4.....5.....6.....7.....89A.....BCDEF.01234567 - + "\u0ce8\u0ce9\u0cea\u0ceb\u0cec\u0ced\u0cee\u0cef\u0cde\u0cf1{}\u0cf2 \\ " - // 89ABCDEF0123456789ABCDEF0123456789ABCDEF012345.....6789ABCDEF0123456789ABCDEF - + " [~] |ABCDEFGHIJKLMNOPQRSTUVWXYZ \u20ac ", - - /* A.2.8 Malayalam National Language Single Shift Table - 01.....23.....4.....5.6.....789A.....BCDEF0123.....45.....6789.....A.....BC.....D..... */ - "@\u00a3$\u00a5\u00bf\"\u00a4%&'\u000c*+ -/<=>\u00a1^\u00a1_#*\u0964\u0965 \u0d66\u0d67" - // E.....F.....0.....1.....2.....3.....4.....5.....6.....7.....89A.....B.....C..... - + "\u0d68\u0d69\u0d6a\u0d6b\u0d6c\u0d6d\u0d6e\u0d6f\u0d70\u0d71{}\u0d72\u0d73\u0d74" - // D.....E.....F.0.....1.....2.....3.....4.....56789ABCDEF0123456789ABCDEF0123456789A - + "\u0d75\u0d7a\\\u0d7b\u0d7c\u0d7d\u0d7e\u0d7f [~] |ABCDEFGHIJKLMNOPQRSTUVWXYZ" - // BCDEF012345.....6789ABCDEF0123456789ABCDEF - + " \u20ac ", - - /* A.2.9 Oriya National Language Single Shift Table - 01.....23.....4.....5.6.....789A.....BCDEF0123.....45.....6789.....A.....BC.....D..... */ - "@\u00a3$\u00a5\u00bf\"\u00a4%&'\u000c*+ -/<=>\u00a1^\u00a1_#*\u0964\u0965 \u0b66\u0b67" - // E.....F.....0.....1.....2.....3.....4.....5.....6.....7.....89A.....B.....C.....DE - + "\u0b68\u0b69\u0b6a\u0b6b\u0b6c\u0b6d\u0b6e\u0b6f\u0b5c\u0b5d{}\u0b5f\u0b70\u0b71 " - // F.0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF012345.....6789ABCDEF0123456789A - + "\\ [~] |ABCDEFGHIJKLMNOPQRSTUVWXYZ \u20ac " - // BCDEF - + " ", - - /* A.2.10 Punjabi National Language Single Shift Table - 01.....23.....4.....5.6.....789A.....BCDEF0123.....45.....6789.....A.....BC.....D..... */ - "@\u00a3$\u00a5\u00bf\"\u00a4%&'\u000c*+ -/<=>\u00a1^\u00a1_#*\u0964\u0965 \u0a66\u0a67" - // E.....F.....0.....1.....2.....3.....4.....5.....6.....7.....89A.....B.....C..... - + "\u0a68\u0a69\u0a6a\u0a6b\u0a6c\u0a6d\u0a6e\u0a6f\u0a59\u0a5a{}\u0a5b\u0a5c\u0a5e" - // D.....EF.0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF012345.....6789ABCDEF01 - + "\u0a75 \\ [~] |ABCDEFGHIJKLMNOPQRSTUVWXYZ \u20ac " - // 23456789ABCDEF - + " ", - - /* A.2.11 Tamil National Language Single Shift Table - NOTE: TS 23.038 V9.1.1 shows code 0x24 as \u0bef, corrected to \u0bee (typo) - 01.....23.....4.....5.6.....789A.....BCDEF0123.....45.....6789.....A.....BC.....D..... */ - "@\u00a3$\u00a5\u00bf\"\u00a4%&'\u000c*+ -/<=>\u00a1^\u00a1_#*\u0964\u0965 \u0be6\u0be7" - // E.....F.....0.....1.....2.....3.....4.....5.....6.....7.....89A.....B.....C..... - + "\u0be8\u0be9\u0bea\u0beb\u0bec\u0bed\u0bee\u0bef\u0bf3\u0bf4{}\u0bf5\u0bf6\u0bf7" - // D.....E.....F.0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF012345.....6789ABC - + "\u0bf8\u0bfa\\ [~] |ABCDEFGHIJKLMNOPQRSTUVWXYZ \u20ac " - // DEF0123456789ABCDEF - + " ", - - /* A.2.12 Telugu National Language Single Shift Table - NOTE: TS 23.038 V9.1.1 shows code 0x22-0x23 as \u06cc\u06cd, corrected to \u0c6c\u0c6d - 01.....23.....4.....5.6.....789A.....BCDEF0123.....45.....6789ABC.....D.....E.....F..... */ - "@\u00a3$\u00a5\u00bf\"\u00a4%&'\u000c*+ -/<=>\u00a1^\u00a1_#* \u0c66\u0c67\u0c68\u0c69" - // 0.....1.....2.....3.....4.....5.....6.....7.....89A.....B.....C.....D.....E.....F. - + "\u0c6a\u0c6b\u0c6c\u0c6d\u0c6e\u0c6f\u0c58\u0c59{}\u0c78\u0c79\u0c7a\u0c7b\u0c7c\\" - // 0.....1.....2.....3456789ABCDEF0123456789ABCDEF0123456789ABCDEF012345.....6789ABCD - + "\u0c7d\u0c7e\u0c7f [~] |ABCDEFGHIJKLMNOPQRSTUVWXYZ \u20ac " - // EF0123456789ABCDEF - + " ", - - /* A.2.13 Urdu National Language Single Shift Table - 01.....23.....4.....5.6.....789A.....BCDEF0123.....45.....6789.....A.....BC.....D..... */ - "@\u00a3$\u00a5\u00bf\"\u00a4%&'\u000c*+ -/<=>\u00a1^\u00a1_#*\u0600\u0601 \u06f0\u06f1" - // E.....F.....0.....1.....2.....3.....4.....5.....6.....7.....89A.....B.....C..... - + "\u06f2\u06f3\u06f4\u06f5\u06f6\u06f7\u06f8\u06f9\u060c\u060d{}\u060e\u060f\u0610" - // D.....E.....F.0.....1.....2.....3.....4.....5.....6.....7.....8.....9.....A..... - + "\u0611\u0612\\\u0613\u0614\u061b\u061f\u0640\u0652\u0658\u066b\u066c\u0672\u0673" - // B.....CDEF.....0123456789ABCDEF0123456789ABCDEF012345.....6789ABCDEF0123456789ABCDEF - + "\u06cd[~]\u06d4|ABCDEFGHIJKLMNOPQRSTUVWXYZ \u20ac " - }; - - static { - enableCountrySpecificEncodings(); - int numTables = sLanguageTables.length; - int numShiftTables = sLanguageShiftTables.length; - if (numTables != numShiftTables) { - Log.e(TAG, "Error: language tables array length " + numTables + - " != shift tables array length " + numShiftTables); - } - - sCharsToGsmTables = new SparseIntArray[numTables]; - for (int i = 0; i < numTables; i++) { - String table = sLanguageTables[i]; - - int tableLen = table.length(); - if (tableLen != 0 && tableLen != 128) { - Log.e(TAG, "Error: language tables index " + i + - " length " + tableLen + " (expected 128 or 0)"); - } - - SparseIntArray charToGsmTable = new SparseIntArray(tableLen); - sCharsToGsmTables[i] = charToGsmTable; - for (int j = 0; j < tableLen; j++) { - char c = table.charAt(j); - charToGsmTable.put(c, j); - } - } - - sCharsToShiftTables = new SparseIntArray[numTables]; - for (int i = 0; i < numShiftTables; i++) { - String shiftTable = sLanguageShiftTables[i]; - - int shiftTableLen = shiftTable.length(); - if (shiftTableLen != 0 && shiftTableLen != 128) { - Log.e(TAG, "Error: language shift tables index " + i + - " length " + shiftTableLen + " (expected 128 or 0)"); - } - - SparseIntArray charToShiftTable = new SparseIntArray(shiftTableLen); - sCharsToShiftTables[i] = charToShiftTable; - for (int j = 0; j < shiftTableLen; j++) { - char c = shiftTable.charAt(j); - if (c != ' ') { - charToShiftTable.put(c, j); - } - } - } - } -} diff --git a/QKSMS/src/main/java/com/android/internal/telephony/IccUtils.java b/QKSMS/src/main/java/com/android/internal/telephony/IccUtils.java deleted file mode 100644 index 872f19518..000000000 --- a/QKSMS/src/main/java/com/android/internal/telephony/IccUtils.java +++ /dev/null @@ -1,519 +0,0 @@ -/* - * Copyright (C) 2006 The Android Open Source Project - * Copyright (C) 2015 QK Labs - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.internal.telephony; - -import android.content.res.Resources; -import android.graphics.Bitmap; -import android.graphics.Color; -import android.util.Log; - -import java.io.UnsupportedEncodingException; - -/** - * Various methods, useful for dealing with SIM data. - */ -public class IccUtils { - static final String LOG_TAG = "IccUtils"; - - /** - * Many fields in GSM SIM's are stored as nibble-swizzled BCD - *

- * Assumes left-justified field that may be padded right with 0xf - * values. - *

- * Stops on invalid BCD value, returning string so far - */ - public static String - bcdToString(byte[] data, int offset, int length) { - StringBuilder ret = new StringBuilder(length * 2); - - for (int i = offset; i < offset + length; i++) { - int v; - - v = data[i] & 0xf; - if (v > 9) break; - ret.append((char) ('0' + v)); - - v = (data[i] >> 4) & 0xf; - // Some PLMNs have 'f' as high nibble, ignore it - if (v == 0xf) continue; - if (v > 9) break; - ret.append((char) ('0' + v)); - } - - return ret.toString(); - } - - /** - * Decode cdma byte into String. - */ - public static String - cdmaBcdToString(byte[] data, int offset, int length) { - StringBuilder ret = new StringBuilder(length); - - int count = 0; - for (int i = offset; count < length; i++) { - int v; - v = data[i] & 0xf; - if (v > 9) v = 0; - ret.append((char) ('0' + v)); - - if (++count == length) break; - - v = (data[i] >> 4) & 0xf; - if (v > 9) v = 0; - ret.append((char) ('0' + v)); - ++count; - } - return ret.toString(); - } - - /** - * Decodes a GSM-style BCD byte, returning an int ranging from 0-99. - *

- * In GSM land, the least significant BCD digit is stored in the most - * significant nibble. - *

- * Out-of-range digits are treated as 0 for the sake of the time stamp, - * because of this: - *

- * TS 23.040 section 9.2.3.11 - * "if the MS receives a non-integer value in the SCTS, it shall - * assume the digit is set to 0 but shall store the entire field - * exactly as received" - */ - public static int - gsmBcdByteToInt(byte b) { - int ret = 0; - - // treat out-of-range BCD values as 0 - if ((b & 0xf0) <= 0x90) { - ret = (b >> 4) & 0xf; - } - - if ((b & 0x0f) <= 0x09) { - ret += (b & 0xf) * 10; - } - - return ret; - } - - /** - * Decodes a CDMA style BCD byte like {@link gsmBcdByteToInt}, but - * opposite nibble format. The least significant BCD digit - * is in the least significant nibble and the most significant - * is in the most significant nibble. - */ - public static int - cdmaBcdByteToInt(byte b) { - int ret = 0; - - // treat out-of-range BCD values as 0 - if ((b & 0xf0) <= 0x90) { - ret = ((b >> 4) & 0xf) * 10; - } - - if ((b & 0x0f) <= 0x09) { - ret += (b & 0xf); - } - - return ret; - } - - /** - * Decodes a string field that's formatted like the EF[ADN] alpha - * identifier - *

- * From TS 51.011 10.5.1: - * Coding: - * this alpha tagging shall use either - * - the SMS default 7 bit coded alphabet as defined in - * TS 23.038 [12] with bit 8 set to 0. The alpha identifier - * shall be left justified. Unused bytes shall be set to 'FF'; or - * - one of the UCS2 coded options as defined in annex B. - *

- * Annex B from TS 11.11 V8.13.0: - * 1) If the first octet in the alpha string is '80', then the - * remaining octets are 16 bit UCS2 characters ... - * 2) if the first octet in the alpha string is '81', then the - * second octet contains a value indicating the number of - * characters in the string, and the third octet contains an - * 8 bit number which defines bits 15 to 8 of a 16 bit - * base pointer, where bit 16 is set to zero and bits 7 to 1 - * are also set to zero. These sixteen bits constitute a - * base pointer to a "half page" in the UCS2 code space, to be - * used with some or all of the remaining octets in the string. - * The fourth and subsequent octets contain codings as follows: - * If bit 8 of the octet is set to zero, the remaining 7 bits - * of the octet contain a GSM Default Alphabet character, - * whereas if bit 8 of the octet is set to one, then the - * remaining seven bits are an offset value added to the - * 16 bit base pointer defined earlier... - * 3) If the first octet of the alpha string is set to '82', then - * the second octet contains a value indicating the number of - * characters in the string, and the third and fourth octets - * contain a 16 bit number which defines the complete 16 bit - * base pointer to a "half page" in the UCS2 code space... - */ - public static String - adnStringFieldToString(byte[] data, int offset, int length) { - if (length == 0) { - return ""; - } - if (length >= 1) { - if (data[offset] == (byte) 0x80) { - int ucslen = (length - 1) / 2; - String ret = null; - - try { - ret = new String(data, offset + 1, ucslen * 2, "utf-16be"); - } catch (UnsupportedEncodingException ex) { - Log.e(LOG_TAG, "implausible UnsupportedEncodingException", - ex); - } - - if (ret != null) { - // trim off trailing FFFF characters - - ucslen = ret.length(); - while (ucslen > 0 && ret.charAt(ucslen - 1) == '\uFFFF') - ucslen--; - - return ret.substring(0, ucslen); - } - } - } - - boolean isucs2 = false; - char base = '\0'; - int len = 0; - - if (length >= 3 && data[offset] == (byte) 0x81) { - len = data[offset + 1] & 0xFF; - if (len > length - 3) - len = length - 3; - - base = (char) ((data[offset + 2] & 0xFF) << 7); - offset += 3; - isucs2 = true; - } else if (length >= 4 && data[offset] == (byte) 0x82) { - len = data[offset + 1] & 0xFF; - if (len > length - 4) - len = length - 4; - - base = (char) (((data[offset + 2] & 0xFF) << 8) | - (data[offset + 3] & 0xFF)); - offset += 4; - isucs2 = true; - } - - if (isucs2) { - StringBuilder ret = new StringBuilder(); - - while (len > 0) { - // UCS2 subset case - - if (data[offset] < 0) { - ret.append((char) (base + (data[offset] & 0x7F))); - offset++; - len--; - } - - // GSM character set case - - int count = 0; - while (count < len && data[offset + count] >= 0) - count++; - - ret.append(GsmAlphabet.gsm8BitUnpackedToString(data, - offset, count)); - - offset += count; - len -= count; - } - - return ret.toString(); - } - - Resources resource = Resources.getSystem(); - String defaultCharset = ""; - return GsmAlphabet.gsm8BitUnpackedToString(data, offset, length, defaultCharset.trim()); - } - - static int - hexCharToInt(char c) { - if (c >= '0' && c <= '9') return (c - '0'); - if (c >= 'A' && c <= 'F') return (c - 'A' + 10); - if (c >= 'a' && c <= 'f') return (c - 'a' + 10); - - throw new RuntimeException("invalid hex char '" + c + "'"); - } - - /** - * Converts a hex String to a byte array. - * - * @param s A string of hexadecimal characters, must be an even number of - * chars long - * @return byte array representation - * @throws RuntimeException on invalid format - */ - public static byte[] - hexStringToBytes(String s) { - byte[] ret; - - if (s == null) return null; - - int sz = s.length(); - - ret = new byte[sz / 2]; - - for (int i = 0; i < sz; i += 2) { - ret[i / 2] = (byte) ((hexCharToInt(s.charAt(i)) << 4) - | hexCharToInt(s.charAt(i + 1))); - } - - return ret; - } - - - /** - * Converts a byte array into a String of hexadecimal characters. - * - * @param bytes an array of bytes - * @return hex string representation of bytes array - */ - public static String - bytesToHexString(byte[] bytes) { - if (bytes == null) return null; - - StringBuilder ret = new StringBuilder(2 * bytes.length); - - for (int i = 0; i < bytes.length; i++) { - int b; - - b = 0x0f & (bytes[i] >> 4); - - ret.append("0123456789abcdef".charAt(b)); - - b = 0x0f & bytes[i]; - - ret.append("0123456789abcdef".charAt(b)); - } - - return ret.toString(); - } - - - /** - * Convert a TS 24.008 Section 10.5.3.5a Network Name field to a string - * "offset" points to "octet 3", the coding scheme byte - * empty string returned on decode error - */ - public static String - networkNameToString(byte[] data, int offset, int length) { - String ret; - - if ((data[offset] & 0x80) != 0x80 || length < 1) { - return ""; - } - - switch ((data[offset] >>> 4) & 0x7) { - case 0: - // SMS character set - int countSeptets; - int unusedBits = data[offset] & 7; - countSeptets = (((length - 1) * 8) - unusedBits) / 7; - ret = GsmAlphabet.gsm7BitPackedToString(data, offset + 1, countSeptets); - break; - case 1: - // UCS2 - try { - ret = new String(data, - offset + 1, length - 1, "utf-16"); - } catch (UnsupportedEncodingException ex) { - ret = ""; - Log.e(LOG_TAG, "implausible UnsupportedEncodingException", ex); - } - break; - - // unsupported encoding - default: - ret = ""; - break; - } - - // "Add CI" - // "The MS should add the letters for the Country's Initials and - // a separator (e.g. a space) to the text string" - - if ((data[offset] & 0x40) != 0) { - // FIXME(mkf) add country initials here - - } - - return ret; - } - - /** - * Convert a TS 131.102 image instance of code scheme '11' into Bitmap - * - * @param data The raw data - * @param length The length of image body - * @return The bitmap - */ - public static Bitmap parseToBnW(byte[] data, int length) { - int valueIndex = 0; - int width = data[valueIndex++] & 0xFF; - int height = data[valueIndex++] & 0xFF; - int numOfPixels = width * height; - - int[] pixels = new int[numOfPixels]; - - int pixelIndex = 0; - int bitIndex = 7; - byte currentByte = 0x00; - while (pixelIndex < numOfPixels) { - // reassign data and index for every byte (8 bits). - if (pixelIndex % 8 == 0) { - currentByte = data[valueIndex++]; - bitIndex = 7; - } - pixels[pixelIndex++] = bitToRGB((currentByte >> bitIndex--) & 0x01); - } - ; - - if (pixelIndex != numOfPixels) { - Log.e(LOG_TAG, "parse end and size error"); - } - return Bitmap.createBitmap(pixels, width, height, Bitmap.Config.ARGB_8888); - } - - private static int bitToRGB(int bit) { - if (bit == 1) { - return Color.WHITE; - } else { - return Color.BLACK; - } - } - - /** - * a TS 131.102 image instance of code scheme '11' into color Bitmap - * - * @param data The raw data - * @param length the length of image body - * @param transparency with or without transparency - * @return The color bitmap - */ - public static Bitmap parseToRGB(byte[] data, int length, - boolean transparency) { - int valueIndex = 0; - int width = data[valueIndex++] & 0xFF; - int height = data[valueIndex++] & 0xFF; - int bits = data[valueIndex++] & 0xFF; - int colorNumber = data[valueIndex++] & 0xFF; - int clutOffset = ((data[valueIndex++] & 0xFF) << 8) - | (data[valueIndex++] & 0xFF); - - int[] colorIndexArray = getCLUT(data, clutOffset, colorNumber); - if (true == transparency) { - colorIndexArray[colorNumber - 1] = Color.TRANSPARENT; - } - - int[] resultArray = null; - if (0 == (8 % bits)) { - resultArray = mapTo2OrderBitColor(data, valueIndex, - (width * height), colorIndexArray, bits); - } else { - resultArray = mapToNon2OrderBitColor(data, valueIndex, - (width * height), colorIndexArray, bits); - } - - return Bitmap.createBitmap(resultArray, width, height, - Bitmap.Config.RGB_565); - } - - private static int[] mapTo2OrderBitColor(byte[] data, int valueIndex, - int length, int[] colorArray, int bits) { - if (0 != (8 % bits)) { - Log.e(LOG_TAG, "not event number of color"); - return mapToNon2OrderBitColor(data, valueIndex, length, colorArray, - bits); - } - - int mask = 0x01; - switch (bits) { - case 1: - mask = 0x01; - break; - case 2: - mask = 0x03; - break; - case 4: - mask = 0x0F; - break; - case 8: - mask = 0xFF; - break; - } - - int[] resultArray = new int[length]; - int resultIndex = 0; - int run = 8 / bits; - while (resultIndex < length) { - byte tempByte = data[valueIndex++]; - for (int runIndex = 0; runIndex < run; ++runIndex) { - int offset = run - runIndex - 1; - resultArray[resultIndex++] = colorArray[(tempByte >> (offset * bits)) - & mask]; - } - } - return resultArray; - } - - private static int[] mapToNon2OrderBitColor(byte[] data, int valueIndex, - int length, int[] colorArray, int bits) { - if (0 == (8 % bits)) { - Log.e(LOG_TAG, "not odd number of color"); - return mapTo2OrderBitColor(data, valueIndex, length, colorArray, - bits); - } - - int[] resultArray = new int[length]; - // TODO fix me: - return resultArray; - } - - private static int[] getCLUT(byte[] rawData, int offset, int number) { - if (null == rawData) { - return null; - } - - int[] result = new int[number]; - int endIndex = offset + (number * 3); // 1 color use 3 bytes - int valueIndex = offset; - int colorIndex = 0; - int alpha = 0xff << 24; - do { - result[colorIndex++] = alpha - | ((rawData[valueIndex++] & 0xFF) << 16) - | ((rawData[valueIndex++] & 0xFF) << 8) - | ((rawData[valueIndex++] & 0xFF)); - } while (valueIndex < endIndex); - return result; - } -} diff --git a/QKSMS/src/main/java/com/android/internal/telephony/PhoneConstants.java b/QKSMS/src/main/java/com/android/internal/telephony/PhoneConstants.java deleted file mode 100644 index ceae31319..000000000 --- a/QKSMS/src/main/java/com/android/internal/telephony/PhoneConstants.java +++ /dev/null @@ -1,190 +0,0 @@ -/* - * Copyright (C) 2012 The Android Open Source Project - * Copyright (C) 2015 QK Labs - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.android.internal.telephony; - -/** - * @hide - */ -public class PhoneConstants { - - /** - * The phone state. One of the following:

- *

    - *
  • IDLE = no phone activity
  • - *
  • RINGING = a phone call is ringing or call waiting. - * In the latter case, another call is active as well
  • - *
  • OFFHOOK = The phone is off hook. At least one call - * exists that is dialing, active or holding and no calls are - * ringing or waiting.
  • - *
- */ - public enum State { - IDLE, RINGING, OFFHOOK; - }; - - /** - * The state of a data connection. - *
    - *
  • CONNECTED = IP traffic should be available
  • - *
  • CONNECTING = Currently setting up data connection
  • - *
  • DISCONNECTED = IP not available
  • - *
  • SUSPENDED = connection is created but IP traffic is - * temperately not available. i.e. voice call is in place - * in 2G network
  • - *
- */ - public enum DataState { - CONNECTED, CONNECTING, DISCONNECTED, SUSPENDED; - }; - - public static final String STATE_KEY = "state"; - - // Radio Type - public static final int PHONE_TYPE_NONE = RILConstants.NO_PHONE; - public static final int PHONE_TYPE_GSM = RILConstants.GSM_PHONE; - public static final int PHONE_TYPE_CDMA = RILConstants.CDMA_PHONE; - public static final int PHONE_TYPE_SIP = RILConstants.SIP_PHONE; - public static final int PHONE_TYPE_THIRD_PARTY = RILConstants.THIRD_PARTY_PHONE; - public static final int PHONE_TYPE_IMS = RILConstants.IMS_PHONE; - - // Modes for LTE_ON_CDMA - public static final int LTE_ON_CDMA_UNKNOWN = RILConstants.LTE_ON_CDMA_UNKNOWN; - public static final int LTE_ON_CDMA_FALSE = RILConstants.LTE_ON_CDMA_FALSE; - public static final int LTE_ON_CDMA_TRUE = RILConstants.LTE_ON_CDMA_TRUE; - - // Number presentation type for caller id display (From internal/Connection.java) - public static final int PRESENTATION_ALLOWED = 1; // normal - public static final int PRESENTATION_RESTRICTED = 2; // block by user - public static final int PRESENTATION_UNKNOWN = 3; // no specified or unknown by network - public static final int PRESENTATION_PAYPHONE = 4; // show pay phone info - - - public static final String PHONE_NAME_KEY = "phoneName"; - public static final String FAILURE_REASON_KEY = "reason"; - public static final String STATE_CHANGE_REASON_KEY = "reason"; - public static final String DATA_NETWORK_TYPE_KEY = "networkType"; - public static final String DATA_FAILURE_CAUSE_KEY = "failCause"; - public static final String DATA_APN_TYPE_KEY = "apnType"; - public static final String DATA_APN_KEY = "apn"; - public static final String DATA_LINK_PROPERTIES_KEY = "linkProperties"; - public static final String DATA_NETWORK_CAPABILITIES_KEY = "networkCapabilities"; - - public static final String DATA_IFACE_NAME_KEY = "iface"; - public static final String NETWORK_UNAVAILABLE_KEY = "networkUnvailable"; - public static final String DATA_NETWORK_ROAMING_KEY = "networkRoaming"; - public static final String PHONE_IN_ECM_STATE = "phoneinECMState"; - - public static final String REASON_LINK_PROPERTIES_CHANGED = "linkPropertiesChanged"; - - /** - * Return codes for supplyPinReturnResult and - * supplyPukReturnResult APIs - */ - public static final int PIN_RESULT_SUCCESS = 0; - public static final int PIN_PASSWORD_INCORRECT = 1; - public static final int PIN_GENERAL_FAILURE = 2; - - /** - * Return codes for enableApnType() - */ - public static final int APN_ALREADY_ACTIVE = 0; - public static final int APN_REQUEST_STARTED = 1; - public static final int APN_TYPE_NOT_AVAILABLE = 2; - public static final int APN_REQUEST_FAILED = 3; - public static final int APN_ALREADY_INACTIVE = 4; - - /** - * APN types for data connections. These are usage categories for an APN - * entry. One APN entry may support multiple APN types, eg, a single APN - * may service regular internet traffic ("default") as well as MMS-specific - * connections.
- * APN_TYPE_ALL is a special type to indicate that this APN entry can - * service all data connections. - */ - public static final String APN_TYPE_ALL = "*"; - /** APN type for default data traffic */ - public static final String APN_TYPE_DEFAULT = "default"; - /** APN type for MMS traffic */ - public static final String APN_TYPE_MMS = "mms"; - /** APN type for SUPL assisted GPS */ - public static final String APN_TYPE_SUPL = "supl"; - /** APN type for DUN traffic */ - public static final String APN_TYPE_DUN = "dun"; - /** APN type for HiPri traffic */ - public static final String APN_TYPE_HIPRI = "hipri"; - /** APN type for FOTA */ - public static final String APN_TYPE_FOTA = "fota"; - /** APN type for IMS */ - public static final String APN_TYPE_IMS = "ims"; - /** APN type for CBS */ - public static final String APN_TYPE_CBS = "cbs"; - /** APN type for IA Initial Attach APN */ - public static final String APN_TYPE_IA = "ia"; - /** APN type for IA Emergency PDN */ - public static final String APN_TYPE_EMERGENCY = "emergency"; - - public static final int RIL_CARD_MAX_APPS = 8; - - public static final int DEFAULT_CARD_INDEX = 0; - - public static final int MAX_PHONE_COUNT_SINGLE_SIM = 1; - - public static final int MAX_PHONE_COUNT_DUAL_SIM = 2; - - public static final int MAX_PHONE_COUNT_TRI_SIM = 3; - - public static final String PHONE_KEY = "phone"; - - public static final String SLOT_KEY = "slot"; - - // FIXME: This is used to pass a subId via intents, we need to look at its usage, which is - // FIXME: extensive, and see if this should be an array of all active subId's or ...? - public static final String SUBSCRIPTION_KEY = "subscription"; - - public static final String SUB_SETTING = "subSettings"; - - public static final int SUB1 = 0; - public static final int SUB2 = 1; - public static final int SUB3 = 2; - - public static final int EVENT_SUBSCRIPTION_ACTIVATED = 500; - public static final int EVENT_SUBSCRIPTION_DEACTIVATED = 501; - - // TODO: Remove these constants and use an int instead. - public static final int SIM_ID_1 = 0; - public static final int SIM_ID_2 = 1; - public static final int SIM_ID_3 = 2; - public static final int SIM_ID_4 = 3; - - // ICC SIM Application Types - // TODO: Replace the IccCardApplicationStatus.AppType enums with these constants - public static final int APPTYPE_UNKNOWN = 0; - public static final int APPTYPE_SIM = 1; - public static final int APPTYPE_USIM = 2; - public static final int APPTYPE_RUIM = 3; - public static final int APPTYPE_CSIM = 4; - public static final int APPTYPE_ISIM = 5; - - public enum CardUnavailableReason { - REASON_CARD_REMOVED, - REASON_RADIO_UNAVAILABLE, - REASON_SIM_REFRESH_RESET - }; - - // Initial MTU value. - public static final int UNSET_MTU = 0; -} diff --git a/QKSMS/src/main/java/com/android/internal/telephony/RILConstants.java b/QKSMS/src/main/java/com/android/internal/telephony/RILConstants.java deleted file mode 100644 index 87657d5a0..000000000 --- a/QKSMS/src/main/java/com/android/internal/telephony/RILConstants.java +++ /dev/null @@ -1,338 +0,0 @@ -/* - * Copyright (C) 2006 The Android Open Source Project - * Copyright (C) 2015 QK Labs - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.internal.telephony; - -/** - * TODO: This should probably not be an interface see - * http://www.javaworld.com/javaworld/javaqa/2001-06/01-qa-0608-constants.html and google with - * http://www.google.com/search?q=interface+constants&ie=utf-8&oe=utf-8&aq=t&rls=com.ubuntu:en-US:unofficial&client=firefox-a - * - * Also they should all probably be static final. - */ - -/** - * {@hide} - */ -public interface RILConstants { - // From the top of ril.cpp - int RIL_ERRNO_INVALID_RESPONSE = -1; - - int MAX_INT = 0x7FFFFFFF; - - // from RIL_Errno - int SUCCESS = 0; - int RADIO_NOT_AVAILABLE = 1; /* If radio did not start or is resetting */ - int GENERIC_FAILURE = 2; - int PASSWORD_INCORRECT = 3; /* for PIN/PIN2 methods only! */ - int SIM_PIN2 = 4; /* Operation requires SIM PIN2 to be entered */ - int SIM_PUK2 = 5; /* Operation requires SIM PIN2 to be entered */ - int REQUEST_NOT_SUPPORTED = 6; - int REQUEST_CANCELLED = 7; - int OP_NOT_ALLOWED_DURING_VOICE_CALL = 8; /* data operation is not allowed during voice call in - class C */ - int OP_NOT_ALLOWED_BEFORE_REG_NW = 9; /* request is not allowed before device registers to - network */ - int SMS_SEND_FAIL_RETRY = 10; /* send sms fail and need retry */ - int SIM_ABSENT = 11; /* ICC card is absent */ - int SUBSCRIPTION_NOT_AVAILABLE = 12; /* fail to find CDMA subscription from specified - location */ - int MODE_NOT_SUPPORTED = 13; /* HW does not support preferred network type */ - int FDN_CHECK_FAILURE = 14; /* send operation barred error when FDN is enabled */ - int ILLEGAL_SIM_OR_ME = 15; /* network selection failure due - to wrong SIM/ME and no - retries needed */ - int MISSING_RESOURCE = 16; /* no logical channel available */ - int NO_SUCH_ELEMENT = 17; /* application not found on SIM */ - int SUBSCRIPTION_NOT_SUPPORTED = 26; /* Subscription not supported */ - - /* NETWORK_MODE_* See ril.h RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE */ - int NETWORK_MODE_WCDMA_PREF = 0; /* GSM/WCDMA (WCDMA preferred) */ - int NETWORK_MODE_GSM_ONLY = 1; /* GSM only */ - int NETWORK_MODE_WCDMA_ONLY = 2; /* WCDMA only */ - int NETWORK_MODE_GSM_UMTS = 3; /* GSM/WCDMA (auto mode, according to PRL) - AVAILABLE Application Settings menu*/ - int NETWORK_MODE_CDMA = 4; /* CDMA and EvDo (auto mode, according to PRL) - AVAILABLE Application Settings menu*/ - int NETWORK_MODE_CDMA_NO_EVDO = 5; /* CDMA only */ - int NETWORK_MODE_EVDO_NO_CDMA = 6; /* EvDo only */ - int NETWORK_MODE_GLOBAL = 7; /* GSM/WCDMA, CDMA, and EvDo (auto mode, according to PRL) - AVAILABLE Application Settings menu*/ - int NETWORK_MODE_LTE_CDMA_EVDO = 8; /* LTE, CDMA and EvDo */ - int NETWORK_MODE_LTE_GSM_WCDMA = 9; /* LTE, GSM/WCDMA */ - int NETWORK_MODE_LTE_CDMA_EVDO_GSM_WCDMA = 10; /* LTE, CDMA, EvDo, GSM/WCDMA */ - int NETWORK_MODE_LTE_ONLY = 11; /* LTE Only mode. */ - int NETWORK_MODE_LTE_WCDMA = 12; /* LTE/WCDMA */ - int PREFERRED_NETWORK_MODE = NETWORK_MODE_WCDMA_PREF; - - int CDMA_CELL_BROADCAST_SMS_DISABLED = 1; - int CDMA_CELL_BROADCAST_SMS_ENABLED = 0; - - int NO_PHONE = 0; - int GSM_PHONE = 1; - int CDMA_PHONE = 2; - int SIP_PHONE = 3; - int THIRD_PARTY_PHONE = 4; - int IMS_PHONE = 5; - - int LTE_ON_CDMA_UNKNOWN = -1; - int LTE_ON_CDMA_FALSE = 0; - int LTE_ON_CDMA_TRUE = 1; - - int CDM_TTY_MODE_DISABLED = 0; - int CDM_TTY_MODE_ENABLED = 1; - - int CDM_TTY_FULL_MODE = 1; - int CDM_TTY_HCO_MODE = 2; - int CDM_TTY_VCO_MODE = 3; - - /* Setup a packet data connection. See ril.h RIL_REQUEST_SETUP_DATA_CALL */ - int SETUP_DATA_TECH_CDMA = 0; - int SETUP_DATA_TECH_GSM = 1; - - int SETUP_DATA_AUTH_NONE = 0; - int SETUP_DATA_AUTH_PAP = 1; - int SETUP_DATA_AUTH_CHAP = 2; - int SETUP_DATA_AUTH_PAP_CHAP = 3; - - String SETUP_DATA_PROTOCOL_IP = "IP"; - String SETUP_DATA_PROTOCOL_IPV6 = "IPV6"; - String SETUP_DATA_PROTOCOL_IPV4V6 = "IPV4V6"; - - /* Deactivate data call reasons */ - int DEACTIVATE_REASON_NONE = 0; - int DEACTIVATE_REASON_RADIO_OFF = 1; - int DEACTIVATE_REASON_PDP_RESET = 2; - - /* NV config radio reset types. */ - int NV_CONFIG_RELOAD_RESET = 1; - int NV_CONFIG_ERASE_RESET = 2; - int NV_CONFIG_FACTORY_RESET = 3; - -/* -cat include/telephony/ril.h | \ - egrep '^#define' | \ - sed -re 's/^#define +([^ ]+)* +([^ ]+)/ int \1 = \2;/' \ - >>java/android/com.android.internal.telephony/gsm/RILConstants.java -*/ - - /** - * No restriction at all including voice/SMS/USSD/SS/AV64 - * and packet data. - */ - int RIL_RESTRICTED_STATE_NONE = 0x00; - /** - * Block emergency call due to restriction. - * But allow all normal voice/SMS/USSD/SS/AV64. - */ - int RIL_RESTRICTED_STATE_CS_EMERGENCY = 0x01; - /** - * Block all normal voice/SMS/USSD/SS/AV64 due to restriction. - * Only Emergency call allowed. - */ - int RIL_RESTRICTED_STATE_CS_NORMAL = 0x02; - /** - * Block all voice/SMS/USSD/SS/AV64 - * including emergency call due to restriction. - */ - int RIL_RESTRICTED_STATE_CS_ALL = 0x04; - /** - * Block packet data access due to restriction. - */ - int RIL_RESTRICTED_STATE_PS_ALL = 0x10; - - /** Data profile for RIL_REQUEST_SETUP_DATA_CALL */ - public static final int DATA_PROFILE_DEFAULT = 0; - public static final int DATA_PROFILE_TETHERED = 1; - public static final int DATA_PROFILE_IMS = 2; - public static final int DATA_PROFILE_FOTA = 3; - public static final int DATA_PROFILE_CBS = 4; - public static final int DATA_PROFILE_OEM_BASE = 1000; - - int RIL_REQUEST_GET_SIM_STATUS = 1; - int RIL_REQUEST_ENTER_SIM_PIN = 2; - int RIL_REQUEST_ENTER_SIM_PUK = 3; - int RIL_REQUEST_ENTER_SIM_PIN2 = 4; - int RIL_REQUEST_ENTER_SIM_PUK2 = 5; - int RIL_REQUEST_CHANGE_SIM_PIN = 6; - int RIL_REQUEST_CHANGE_SIM_PIN2 = 7; - int RIL_REQUEST_ENTER_NETWORK_DEPERSONALIZATION = 8; - int RIL_REQUEST_GET_CURRENT_CALLS = 9; - int RIL_REQUEST_DIAL = 10; - int RIL_REQUEST_GET_IMSI = 11; - int RIL_REQUEST_HANGUP = 12; - int RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND = 13; - int RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND = 14; - int RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE = 15; - int RIL_REQUEST_CONFERENCE = 16; - int RIL_REQUEST_UDUB = 17; - int RIL_REQUEST_LAST_CALL_FAIL_CAUSE = 18; - int RIL_REQUEST_SIGNAL_STRENGTH = 19; - int RIL_REQUEST_VOICE_REGISTRATION_STATE = 20; - int RIL_REQUEST_DATA_REGISTRATION_STATE = 21; - int RIL_REQUEST_OPERATOR = 22; - int RIL_REQUEST_RADIO_POWER = 23; - int RIL_REQUEST_DTMF = 24; - int RIL_REQUEST_SEND_SMS = 25; - int RIL_REQUEST_SEND_SMS_EXPECT_MORE = 26; - int RIL_REQUEST_SETUP_DATA_CALL = 27; - int RIL_REQUEST_SIM_IO = 28; - int RIL_REQUEST_SEND_USSD = 29; - int RIL_REQUEST_CANCEL_USSD = 30; - int RIL_REQUEST_GET_CLIR = 31; - int RIL_REQUEST_SET_CLIR = 32; - int RIL_REQUEST_QUERY_CALL_FORWARD_STATUS = 33; - int RIL_REQUEST_SET_CALL_FORWARD = 34; - int RIL_REQUEST_QUERY_CALL_WAITING = 35; - int RIL_REQUEST_SET_CALL_WAITING = 36; - int RIL_REQUEST_SMS_ACKNOWLEDGE = 37; - int RIL_REQUEST_GET_IMEI = 38; - int RIL_REQUEST_GET_IMEISV = 39; - int RIL_REQUEST_ANSWER = 40; - int RIL_REQUEST_DEACTIVATE_DATA_CALL = 41; - int RIL_REQUEST_QUERY_FACILITY_LOCK = 42; - int RIL_REQUEST_SET_FACILITY_LOCK = 43; - int RIL_REQUEST_CHANGE_BARRING_PASSWORD = 44; - int RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE = 45; - int RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC = 46; - int RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL = 47; - int RIL_REQUEST_QUERY_AVAILABLE_NETWORKS = 48; - int RIL_REQUEST_DTMF_START = 49; - int RIL_REQUEST_DTMF_STOP = 50; - int RIL_REQUEST_BASEBAND_VERSION = 51; - int RIL_REQUEST_SEPARATE_CONNECTION = 52; - int RIL_REQUEST_SET_MUTE = 53; - int RIL_REQUEST_GET_MUTE = 54; - int RIL_REQUEST_QUERY_CLIP = 55; - int RIL_REQUEST_LAST_DATA_CALL_FAIL_CAUSE = 56; - int RIL_REQUEST_DATA_CALL_LIST = 57; - int RIL_REQUEST_RESET_RADIO = 58; - int RIL_REQUEST_OEM_HOOK_RAW = 59; - int RIL_REQUEST_OEM_HOOK_STRINGS = 60; - int RIL_REQUEST_SCREEN_STATE = 61; - int RIL_REQUEST_SET_SUPP_SVC_NOTIFICATION = 62; - int RIL_REQUEST_WRITE_SMS_TO_SIM = 63; - int RIL_REQUEST_DELETE_SMS_ON_SIM = 64; - int RIL_REQUEST_SET_BAND_MODE = 65; - int RIL_REQUEST_QUERY_AVAILABLE_BAND_MODE = 66; - int RIL_REQUEST_STK_GET_PROFILE = 67; - int RIL_REQUEST_STK_SET_PROFILE = 68; - int RIL_REQUEST_STK_SEND_ENVELOPE_COMMAND = 69; - int RIL_REQUEST_STK_SEND_TERMINAL_RESPONSE = 70; - int RIL_REQUEST_STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM = 71; - int RIL_REQUEST_EXPLICIT_CALL_TRANSFER = 72; - int RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE = 73; - int RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE = 74; - int RIL_REQUEST_GET_NEIGHBORING_CELL_IDS = 75; - int RIL_REQUEST_SET_LOCATION_UPDATES = 76; - int RIL_REQUEST_CDMA_SET_SUBSCRIPTION_SOURCE = 77; - int RIL_REQUEST_CDMA_SET_ROAMING_PREFERENCE = 78; - int RIL_REQUEST_CDMA_QUERY_ROAMING_PREFERENCE = 79; - int RIL_REQUEST_SET_TTY_MODE = 80; - int RIL_REQUEST_QUERY_TTY_MODE = 81; - int RIL_REQUEST_CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE = 82; - int RIL_REQUEST_CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE = 83; - int RIL_REQUEST_CDMA_FLASH = 84; - int RIL_REQUEST_CDMA_BURST_DTMF = 85; - int RIL_REQUEST_CDMA_VALIDATE_AND_WRITE_AKEY = 86; - int RIL_REQUEST_CDMA_SEND_SMS = 87; - int RIL_REQUEST_CDMA_SMS_ACKNOWLEDGE = 88; - int RIL_REQUEST_GSM_GET_BROADCAST_CONFIG = 89; - int RIL_REQUEST_GSM_SET_BROADCAST_CONFIG = 90; - int RIL_REQUEST_GSM_BROADCAST_ACTIVATION = 91; - int RIL_REQUEST_CDMA_GET_BROADCAST_CONFIG = 92; - int RIL_REQUEST_CDMA_SET_BROADCAST_CONFIG = 93; - int RIL_REQUEST_CDMA_BROADCAST_ACTIVATION = 94; - int RIL_REQUEST_CDMA_SUBSCRIPTION = 95; - int RIL_REQUEST_CDMA_WRITE_SMS_TO_RUIM = 96; - int RIL_REQUEST_CDMA_DELETE_SMS_ON_RUIM = 97; - int RIL_REQUEST_DEVICE_IDENTITY = 98; - int RIL_REQUEST_EXIT_EMERGENCY_CALLBACK_MODE = 99; - int RIL_REQUEST_GET_SMSC_ADDRESS = 100; - int RIL_REQUEST_SET_SMSC_ADDRESS = 101; - int RIL_REQUEST_REPORT_SMS_MEMORY_STATUS = 102; - int RIL_REQUEST_REPORT_STK_SERVICE_IS_RUNNING = 103; - int RIL_REQUEST_CDMA_GET_SUBSCRIPTION_SOURCE = 104; - int RIL_REQUEST_ISIM_AUTHENTICATION = 105; - int RIL_REQUEST_ACKNOWLEDGE_INCOMING_GSM_SMS_WITH_PDU = 106; - int RIL_REQUEST_STK_SEND_ENVELOPE_WITH_STATUS = 107; - int RIL_REQUEST_VOICE_RADIO_TECH = 108; - int RIL_REQUEST_GET_CELL_INFO_LIST = 109; - int RIL_REQUEST_SET_UNSOL_CELL_INFO_LIST_RATE = 110; - int RIL_REQUEST_SET_INITIAL_ATTACH_APN = 111; - int RIL_REQUEST_IMS_REGISTRATION_STATE = 112; - int RIL_REQUEST_IMS_SEND_SMS = 113; - int RIL_REQUEST_SIM_TRANSMIT_APDU_BASIC = 114; - int RIL_REQUEST_SIM_OPEN_CHANNEL = 115; - int RIL_REQUEST_SIM_CLOSE_CHANNEL = 116; - int RIL_REQUEST_SIM_TRANSMIT_APDU_CHANNEL = 117; - int RIL_REQUEST_NV_READ_ITEM = 118; - int RIL_REQUEST_NV_WRITE_ITEM = 119; - int RIL_REQUEST_NV_WRITE_CDMA_PRL = 120; - int RIL_REQUEST_NV_RESET_CONFIG = 121; - int RIL_REQUEST_SET_UICC_SUBSCRIPTION = 122; - int RIL_REQUEST_ALLOW_DATA = 123; - int RIL_REQUEST_GET_HARDWARE_CONFIG = 124; - int RIL_REQUEST_SIM_AUTHENTICATION = 125; - int RIL_REQUEST_GET_DC_RT_INFO = 126; - int RIL_REQUEST_SET_DC_RT_INFO_RATE = 127; - int RIL_REQUEST_SET_DATA_PROFILE = 128; - int RIL_REQUEST_SHUTDOWN = 129; - - int RIL_UNSOL_RESPONSE_BASE = 1000; - int RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED = 1000; - int RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED = 1001; - int RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED = 1002; - int RIL_UNSOL_RESPONSE_NEW_SMS = 1003; - int RIL_UNSOL_RESPONSE_NEW_SMS_STATUS_REPORT = 1004; - int RIL_UNSOL_RESPONSE_NEW_SMS_ON_SIM = 1005; - int RIL_UNSOL_ON_USSD = 1006; - int RIL_UNSOL_ON_USSD_REQUEST = 1007; - int RIL_UNSOL_NITZ_TIME_RECEIVED = 1008; - int RIL_UNSOL_SIGNAL_STRENGTH = 1009; - int RIL_UNSOL_DATA_CALL_LIST_CHANGED = 1010; - int RIL_UNSOL_SUPP_SVC_NOTIFICATION = 1011; - int RIL_UNSOL_STK_SESSION_END = 1012; - int RIL_UNSOL_STK_PROACTIVE_COMMAND = 1013; - int RIL_UNSOL_STK_EVENT_NOTIFY = 1014; - int RIL_UNSOL_STK_CALL_SETUP = 1015; - int RIL_UNSOL_SIM_SMS_STORAGE_FULL = 1016; - int RIL_UNSOL_SIM_REFRESH = 1017; - int RIL_UNSOL_CALL_RING = 1018; - int RIL_UNSOL_RESPONSE_SIM_STATUS_CHANGED = 1019; - int RIL_UNSOL_RESPONSE_CDMA_NEW_SMS = 1020; - int RIL_UNSOL_RESPONSE_NEW_BROADCAST_SMS = 1021; - int RIL_UNSOL_CDMA_RUIM_SMS_STORAGE_FULL = 1022; - int RIL_UNSOL_RESTRICTED_STATE_CHANGED = 1023; - int RIL_UNSOL_ENTER_EMERGENCY_CALLBACK_MODE = 1024; - int RIL_UNSOL_CDMA_CALL_WAITING = 1025; - int RIL_UNSOL_CDMA_OTA_PROVISION_STATUS = 1026; - int RIL_UNSOL_CDMA_INFO_REC = 1027; - int RIL_UNSOL_OEM_HOOK_RAW = 1028; - int RIL_UNSOL_RINGBACK_TONE = 1029; - int RIL_UNSOL_RESEND_INCALL_MUTE = 1030; - int RIL_UNSOL_CDMA_SUBSCRIPTION_SOURCE_CHANGED = 1031; - int RIL_UNSOl_CDMA_PRL_CHANGED = 1032; - int RIL_UNSOL_EXIT_EMERGENCY_CALLBACK_MODE = 1033; - int RIL_UNSOL_RIL_CONNECTED = 1034; - int RIL_UNSOL_VOICE_RADIO_TECH_CHANGED = 1035; - int RIL_UNSOL_CELL_INFO_LIST = 1036; - int RIL_UNSOL_RESPONSE_IMS_NETWORK_STATE_CHANGED = 1037; - int RIL_UNSOL_UICC_SUBSCRIPTION_STATUS_CHANGED = 1038; - int RIL_UNSOL_SRVCC_STATE_NOTIFY = 1039; - int RIL_UNSOL_HARDWARE_CONFIG_CHANGED = 1040; -} diff --git a/QKSMS/src/main/java/com/android/internal/telephony/SmsConstants.java b/QKSMS/src/main/java/com/android/internal/telephony/SmsConstants.java deleted file mode 100644 index b36f83681..000000000 --- a/QKSMS/src/main/java/com/android/internal/telephony/SmsConstants.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright (C) 2012 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.android.internal.telephony; - -/** - * SMS Constants and must be the same as the corresponding - * deprecated version in SmsMessage. - * - * @hide - */ -public class SmsConstants { - /** - * User data text encoding code unit size - */ - public static final int ENCODING_UNKNOWN = 0; - public static final int ENCODING_7BIT = 1; - public static final int ENCODING_8BIT = 2; - public static final int ENCODING_16BIT = 3; - - /** - * The maximum number of payload septets per message - */ - public static final int MAX_USER_DATA_SEPTETS = 160; - - /** - * The maximum number of payload septets per message if a user data header - * is present. This assumes the header only contains the - * CONCATENATED_8_BIT_REFERENCE element. - */ - public static final int MAX_USER_DATA_SEPTETS_WITH_HEADER = 153; - - /** - * This value is not defined in global standard. Only in Korea, this is used. - */ - public static final int ENCODING_KSC5601 = 4; - - /** - * The maximum number of payload bytes per message - */ - public static final int MAX_USER_DATA_BYTES = 140; - - /** - * The maximum number of payload bytes per message if a user data header - * is present. This assumes the header only contains the - * CONCATENATED_8_BIT_REFERENCE element. - */ - public static final int MAX_USER_DATA_BYTES_WITH_HEADER = 134; - - /** - * SMS Class enumeration. - * See TS 23.038. - */ - public enum MessageClass { - UNKNOWN, CLASS_0, CLASS_1, CLASS_2, CLASS_3; - } - - /** - * Indicates a 3GPP format SMS message. - * - * @hide pending API council approval - */ - public static final String FORMAT_3GPP = "3gpp"; - - /** - * Indicates a 3GPP2 format SMS message. - * - * @hide pending API council approval - */ - public static final String FORMAT_3GPP2 = "3gpp2"; -} diff --git a/QKSMS/src/main/java/com/android/internal/telephony/TelephonyProperties.java b/QKSMS/src/main/java/com/android/internal/telephony/TelephonyProperties.java deleted file mode 100644 index 61aaaa366..000000000 --- a/QKSMS/src/main/java/com/android/internal/telephony/TelephonyProperties.java +++ /dev/null @@ -1,207 +0,0 @@ -/* - * Copyright (C) 2006 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.internal.telephony; - -/** - * Contains a list of string constants used to get or set telephone properties - * in the system. You can use {@link android.os.SystemProperties os.SystemProperties} - * to get and set these values. - * - * @hide - */ -public interface TelephonyProperties { - //****** Baseband and Radio Interface version - - //TODO T: property strings do not have to be gsm specific - // change gsm.*operator.*" properties to "operator.*" properties - - /** - * Baseband version - * Availability: property is available any time radio is on - */ - static final String PROPERTY_BASEBAND_VERSION = "gsm.version.baseband"; - - /** - * Radio Interface Layer (RIL) library implementation. - */ - static final String PROPERTY_RIL_IMPL = "gsm.version.ril-impl"; - - //****** Current Network - - /** - * Alpha name of current registered operator.

- * Availability: when registered to a network. Result may be unreliable on - * CDMA networks. - */ - static final String PROPERTY_OPERATOR_ALPHA = "gsm.operator.alpha"; - //TODO: most of these properties are generic, substitute gsm. with phone. bug 1856959 - - /** - * Numeric name (MCC+MNC) of current registered operator.

- * Availability: when registered to a network. Result may be unreliable on - * CDMA networks. - */ - static final String PROPERTY_OPERATOR_NUMERIC = "gsm.operator.numeric"; - - /** - * 'true' if the device is on a manually selected network - *

- * Availability: when registered to a network - */ - static final String PROPERTY_OPERATOR_ISMANUAL = "operator.ismanual"; - - /** - * 'true' if the device is considered roaming on this network for GSM - * purposes. - * Availability: when registered to a network - */ - static final String PROPERTY_OPERATOR_ISROAMING = "gsm.operator.isroaming"; - - /** - * The ISO country code equivalent of the current registered operator's - * MCC (Mobile Country Code)

- * Availability: when registered to a network. Result may be unreliable on - * CDMA networks. - */ - static final String PROPERTY_OPERATOR_ISO_COUNTRY = "gsm.operator.iso-country"; - - /** - * The contents of this property is the value of the kernel command line - * product_type variable that corresponds to a product that supports LTE on CDMA. - * {@see BaseCommands#getLteOnCdmaMode()} - */ - static final String PROPERTY_LTE_ON_CDMA_PRODUCT_TYPE = "telephony.lteOnCdmaProductType"; - - /** - * The contents of this property is the one of {@link Phone#LTE_ON_CDMA_TRUE} or - * {@link Phone#LTE_ON_CDMA_FALSE}. If absent the value will assumed to be false - * and the {@see #PROPERTY_LTE_ON_CDMA_PRODUCT_TYPE} will be used to determine its - * final value which could also be {@link Phone#LTE_ON_CDMA_FALSE}. - * {@see BaseCommands#getLteOnCdmaMode()} - */ - static final String PROPERTY_LTE_ON_CDMA_DEVICE = "telephony.lteOnCdmaDevice"; - - static final String CURRENT_ACTIVE_PHONE = "gsm.current.phone-type"; - - //****** SIM Card - /** - * One of "UNKNOWN" "ABSENT" "PIN_REQUIRED" - * "PUK_REQUIRED" "NETWORK_LOCKED" or "READY" - */ - static String PROPERTY_SIM_STATE = "gsm.sim.state"; - - /** - * The MCC+MNC (mobile country code+mobile network code) of the - * provider of the SIM. 5 or 6 decimal digits. - * Availability: SIM state must be "READY" - */ - static String PROPERTY_ICC_OPERATOR_NUMERIC = "gsm.sim.operator.numeric"; - - /** - * PROPERTY_ICC_OPERATOR_ALPHA is also known as the SPN, or Service Provider Name. - * Availability: SIM state must be "READY" - */ - static String PROPERTY_ICC_OPERATOR_ALPHA = "gsm.sim.operator.alpha"; - - /** - * ISO country code equivalent for the SIM provider's country code - */ - static String PROPERTY_ICC_OPERATOR_ISO_COUNTRY = "gsm.sim.operator.iso-country"; - - /** - * Indicates the available radio technology. Values include: "unknown", - * "GPRS", "EDGE" and "UMTS". - */ - static String PROPERTY_DATA_NETWORK_TYPE = "gsm.network.type"; - - /** - * Indicate if phone is in emergency callback mode - */ - static final String PROPERTY_INECM_MODE = "ril.cdma.inecmmode"; - - /** - * Indicate the timer value for exiting emergency callback mode - */ - static final String PROPERTY_ECM_EXIT_TIMER = "ro.cdma.ecmexittimer"; - - /** - * The international dialing prefix conversion string - */ - static final String PROPERTY_IDP_STRING = "ro.cdma.idpstring"; - - /** - * Defines the schema for the carrier specified OTASP number - */ - static final String PROPERTY_OTASP_NUM_SCHEMA = "ro.cdma.otaspnumschema"; - - /** - * Disable all calls including Emergency call when it set to true. - */ - static final String PROPERTY_DISABLE_CALL = "ro.telephony.disable-call"; - - /** - * Set to true for vendor RIL's that send multiple UNSOL_CALL_RING notifications. - */ - static final String PROPERTY_RIL_SENDS_MULTIPLE_CALL_RING = - "ro.telephony.call_ring.multiple"; - - /** - * The number of milliseconds between CALL_RING notifications. - */ - static final String PROPERTY_CALL_RING_DELAY = "ro.telephony.call_ring.delay"; - - /** - * Track CDMA SMS message id numbers to ensure they increment - * monotonically, regardless of reboots. - */ - static final String PROPERTY_CDMA_MSG_ID = "persist.radio.cdma.msgid"; - - /** - * Property to override DEFAULT_WAKE_LOCK_TIMEOUT - */ - static final String PROPERTY_WAKE_LOCK_TIMEOUT = "ro.ril.wake_lock_timeout"; - - /** - * Set to true to indicate that the modem needs to be reset - * when there is a radio technology change. - */ - static final String PROPERTY_RESET_ON_RADIO_TECH_CHANGE = "persist.radio.reset_on_switch"; - - /** - * Set to false to disable SMS receiving, default is - * the value of config_sms_capable - */ - static final String PROPERTY_SMS_RECEIVE = "telephony.sms.receive"; - - /** - * Set to false to disable SMS sending, default is - * the value of config_sms_capable - */ - static final String PROPERTY_SMS_SEND = "telephony.sms.send"; - - /** - * Set to true to indicate a test CSIM card is used in the device. - * This property is for testing purpose only. This should not be defined - * in commercial configuration. - */ - static final String PROPERTY_TEST_CSIM = "persist.radio.test-csim"; - - /** - * Ignore RIL_UNSOL_NITZ_TIME_RECEIVED completely, used for debugging/testing. - */ - static final String PROPERTY_IGNORE_NITZ = "telephony.test.ignore.nitz"; -} diff --git a/QKSMS/src/main/java/com/android/internal/util/ArrayUtils.java b/QKSMS/src/main/java/com/android/internal/util/ArrayUtils.java deleted file mode 100644 index 74013582d..000000000 --- a/QKSMS/src/main/java/com/android/internal/util/ArrayUtils.java +++ /dev/null @@ -1,243 +0,0 @@ -/* - * Copyright (C) 2006 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.internal.util; - -import java.lang.reflect.Array; - -// XXX these should be changed to reflect the actual memory allocator we use. -// it looks like right now objects want to be powers of 2 minus 8 -// and the array size eats another 4 bytes - -/** - * ArrayUtils contains some methods that you can call to find out - * the most efficient increments by which to grow arrays. - */ -public class ArrayUtils { - private static Object[] EMPTY = new Object[0]; - private static final int CACHE_SIZE = 73; - private static Object[] sCache = new Object[CACHE_SIZE]; - - private ArrayUtils() { /* cannot be instantiated */ } - - public static int idealByteArraySize(int need) { - for (int i = 4; i < 32; i++) - if (need <= (1 << i) - 12) - return (1 << i) - 12; - - return need; - } - - public static int idealBooleanArraySize(int need) { - return idealByteArraySize(need); - } - - public static int idealShortArraySize(int need) { - return idealByteArraySize(need * 2) / 2; - } - - public static int idealCharArraySize(int need) { - return idealByteArraySize(need * 2) / 2; - } - - public static int idealIntArraySize(int need) { - return idealByteArraySize(need * 4) / 4; - } - - public static int idealFloatArraySize(int need) { - return idealByteArraySize(need * 4) / 4; - } - - public static int idealObjectArraySize(int need) { - return idealByteArraySize(need * 4) / 4; - } - - public static int idealLongArraySize(int need) { - return idealByteArraySize(need * 8) / 8; - } - - /** - * Checks if the beginnings of two byte arrays are equal. - * - * @param array1 the first byte array - * @param array2 the second byte array - * @param length the number of bytes to check - * @return true if they're equal, false otherwise - */ - public static boolean equals(byte[] array1, byte[] array2, int length) { - if (array1 == array2) { - return true; - } - if (array1 == null || array2 == null || array1.length < length || array2.length < length) { - return false; - } - for (int i = 0; i < length; i++) { - if (array1[i] != array2[i]) { - return false; - } - } - return true; - } - - /** - * Returns an empty array of the specified type. The intent is that - * it will return the same empty array every time to avoid reallocation, - * although this is not guaranteed. - */ - @SuppressWarnings("unchecked") - public static T[] emptyArray(Class kind) { - if (kind == Object.class) { - return (T[]) EMPTY; - } - - int bucket = ((System.identityHashCode(kind) / 8) & 0x7FFFFFFF) % CACHE_SIZE; - Object cache = sCache[bucket]; - - if (cache == null || cache.getClass().getComponentType() != kind) { - cache = Array.newInstance(kind, 0); - sCache[bucket] = cache; - - // Log.e("cache", "new empty " + kind.getName() + " at " + bucket); - } - - return (T[]) cache; - } - - /** - * Checks that value is present as at least one of the elements of the array. - * - * @param array the array to check in - * @param value the value to check for - * @return true if the value is present in the array - */ - public static boolean contains(T[] array, T value) { - for (T element : array) { - if (element == null) { - if (value == null) return true; - } else { - if (value != null && element.equals(value)) return true; - } - } - return false; - } - - public static boolean contains(int[] array, int value) { - for (int element : array) { - if (element == value) { - return true; - } - } - return false; - } - - public static long total(long[] array) { - long total = 0; - for (long value : array) { - total += value; - } - return total; - } - - /** - * Appends an element to a copy of the array and returns the copy. - * - * @param array The original array, or null to represent an empty array. - * @param element The element to add. - * @return A new array that contains all of the elements of the original array - * with the specified element added at the end. - */ - @SuppressWarnings("unchecked") - public static T[] appendElement(Class kind, T[] array, T element) { - final T[] result; - final int end; - if (array != null) { - end = array.length; - result = (T[]) Array.newInstance(kind, end + 1); - System.arraycopy(array, 0, result, 0, end); - } else { - end = 0; - result = (T[]) Array.newInstance(kind, 1); - } - result[end] = element; - return result; - } - - /** - * Removes an element from a copy of the array and returns the copy. - * If the element is not present, then the original array is returned unmodified. - * - * @param array The original array, or null to represent an empty array. - * @param element The element to remove. - * @return A new array that contains all of the elements of the original array - * except the first copy of the specified element removed. If the specified element - * was not present, then returns the original array. Returns null if the result - * would be an empty array. - */ - @SuppressWarnings("unchecked") - public static T[] removeElement(Class kind, T[] array, T element) { - if (array != null) { - final int length = array.length; - for (int i = 0; i < length; i++) { - if (array[i] == element) { - if (length == 1) { - return null; - } - T[] result = (T[]) Array.newInstance(kind, length - 1); - System.arraycopy(array, 0, result, 0, i); - System.arraycopy(array, i + 1, result, i, length - i - 1); - return result; - } - } - } - return array; - } - - public static int[] appendInt(int[] cur, int val) { - if (cur == null) { - return new int[]{val}; - } - final int N = cur.length; - for (int i = 0; i < N; i++) { - if (cur[i] == val) { - return cur; - } - } - int[] ret = new int[N + 1]; - System.arraycopy(cur, 0, ret, 0, N); - ret[N] = val; - return ret; - } - - public static int[] removeInt(int[] cur, int val) { - if (cur == null) { - return null; - } - final int N = cur.length; - for (int i = 0; i < N; i++) { - if (cur[i] == val) { - int[] ret = new int[N - 1]; - if (i > 0) { - System.arraycopy(cur, 0, ret, 0, i); - } - if (i < (N - 1)) { - System.arraycopy(cur, i + 1, ret, i, N - i - 1); - } - return ret; - } - } - return cur; - } -} diff --git a/QKSMS/src/main/java/com/android/internal/util/Objects.java b/QKSMS/src/main/java/com/android/internal/util/Objects.java deleted file mode 100644 index 20bea6218..000000000 --- a/QKSMS/src/main/java/com/android/internal/util/Objects.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (C) 2007 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.internal.util; - -import java.util.Arrays; - -/** - * Object utility methods. - */ -public class Objects { - - /** - * Determines whether two possibly-null objects are equal. Returns: - *

- *

    - *
  • {@code true} if {@code a} and {@code b} are both null. - *
  • {@code true} if {@code a} and {@code b} are both non-null and they are - * equal according to {@link Object#equals(Object)}. - *
  • {@code false} in all other situations. - *
- *

- *

This assumes that any non-null objects passed to this function conform - * to the {@code equals()} contract. - */ - public static boolean equal(Object a, Object b) { - return a == b || (a != null && a.equals(b)); - } - - /** - * Generates a hash code for multiple values. The hash code is generated by - * calling {@link java.util.Arrays#hashCode(Object[])}. - *

- *

This is useful for implementing {@link Object#hashCode()}. For example, - * in an object that has three properties, {@code x}, {@code y}, and - * {@code z}, one could write: - *

-     * public int hashCode() {
-     *   return Objects.hashCode(getX(), getY(), getZ());
-     * }
- * - * Warning: When a single object is supplied, the returned hash code - * does not equal the hash code of that object. - */ - public static int hashCode(Object... objects) { - return Arrays.hashCode(objects); - } - -} diff --git a/QKSMS/src/main/java/com/android/internal/util/Preconditions.java b/QKSMS/src/main/java/com/android/internal/util/Preconditions.java deleted file mode 100644 index 99f306731..000000000 --- a/QKSMS/src/main/java/com/android/internal/util/Preconditions.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.internal.util; - -/** - * Simple static methods to be called at the start of your own methods to verify - * correct arguments and state. - */ -public class Preconditions { - - /** - * Ensures that an object reference passed as a parameter to the calling - * method is not null. - * - * @param reference an object reference - * @return the non-null reference that was validated - * @throws NullPointerException if {@code reference} is null - */ - public static T checkNotNull(T reference) { - if (reference == null) { - throw new NullPointerException(); - } - return reference; - } - - /** - * Ensures that an object reference passed as a parameter to the calling - * method is not null. - * - * @param reference an object reference - * @param errorMessage the exception message to use if the check fails; will - * be converted to a string using {@link String#valueOf(Object)} - * @return the non-null reference that was validated - * @throws NullPointerException if {@code reference} is null - */ - public static T checkNotNull(T reference, Object errorMessage) { - if (reference == null) { - throw new NullPointerException(String.valueOf(errorMessage)); - } - return reference; - } - - /** - * Ensures the truth of an expression involving the state of the calling - * instance, but not involving any parameters to the calling method. - * - * @param expression a boolean expression - * @throws IllegalStateException if {@code expression} is false - */ - public static void checkState(boolean expression) { - if (!expression) { - throw new IllegalStateException(); - } - } -} diff --git a/QKSMS/src/main/java/com/android/mms/dom/AttrImpl.java b/QKSMS/src/main/java/com/android/mms/dom/AttrImpl.java deleted file mode 100644 index ead639c41..000000000 --- a/QKSMS/src/main/java/com/android/mms/dom/AttrImpl.java +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Copyright (C) 2007 Esmertec AG. - * Copyright (C) 2007 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.mms.dom; - -import org.w3c.dom.Attr; -import org.w3c.dom.DOMException; -import org.w3c.dom.Element; -import org.w3c.dom.Node; -import org.w3c.dom.TypeInfo; - -public class AttrImpl extends NodeImpl implements Attr { - private String mName; - private String mValue; - - /* - * Internal methods - */ - - protected AttrImpl(DocumentImpl owner, String name) { - super(owner); - mName = name; - } - - /* - * Attr Interface Methods - */ - - public String getName() { - return mName; - } - - public Element getOwnerElement() { - // TODO Auto-generated method stub - return null; - } - - public boolean getSpecified() { - return mValue != null; - } - - public String getValue() { - return mValue; - } - - // Instead of setting a Text> with the content of the - // String value as defined in the specs, we directly set here the - // internal mValue member. - public void setValue(String value) throws DOMException { - mValue = value; - } - - /* - * Node Interface Methods - */ - - @Override - public String getNodeName() { - return mName; - } - - @Override - public short getNodeType() { - return Node.ATTRIBUTE_NODE; - } - - @Override - public Node getParentNode() { - return null; - } - - @Override - public Node getPreviousSibling() { - return null; - } - - @Override - public Node getNextSibling() { - return null; - } - - @Override - public void setNodeValue(String nodeValue) throws DOMException { - setValue(nodeValue); - } - - public TypeInfo getSchemaTypeInfo() { - return null; - } - - public boolean isId() { - return false; - } -} diff --git a/QKSMS/src/main/java/com/android/mms/dom/DocumentImpl.java b/QKSMS/src/main/java/com/android/mms/dom/DocumentImpl.java deleted file mode 100644 index aeeb51e37..000000000 --- a/QKSMS/src/main/java/com/android/mms/dom/DocumentImpl.java +++ /dev/null @@ -1,194 +0,0 @@ -/* - * Copyright (C) 2007 Esmertec AG. - * Copyright (C) 2007 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.mms.dom; - -import org.w3c.dom.Attr; -import org.w3c.dom.CDATASection; -import org.w3c.dom.Comment; -import org.w3c.dom.DOMConfiguration; -import org.w3c.dom.DOMException; -import org.w3c.dom.DOMImplementation; -import org.w3c.dom.Document; -import org.w3c.dom.DocumentFragment; -import org.w3c.dom.DocumentType; -import org.w3c.dom.Element; -import org.w3c.dom.EntityReference; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; -import org.w3c.dom.ProcessingInstruction; -import org.w3c.dom.Text; - -public abstract class DocumentImpl extends NodeImpl implements Document { - - /* - * Internal methods - */ - - public DocumentImpl() { - super(null); - } - - /* - * Document Interface Methods - */ - - public Attr createAttribute(String name) throws DOMException { - return new AttrImpl(this, name); - } - - public Attr createAttributeNS(String namespaceURI, String qualifiedName) - throws DOMException { - // TODO Auto-generated method stub - return null; - } - - public CDATASection createCDATASection(String data) throws DOMException { - // TODO Auto-generated method stub - return null; - } - - public Comment createComment(String data) { - // TODO Auto-generated method stub - return null; - } - - public DocumentFragment createDocumentFragment() { - // TODO Auto-generated method stub - return null; - } - - public abstract Element createElement(String tagName) throws DOMException; - - public Element createElementNS(String namespaceURI, String qualifiedName) - throws DOMException { - // TODO Auto-generated method stub - return null; - } - - public EntityReference createEntityReference(String name) throws DOMException { - // TODO Auto-generated method stub - return null; - } - - public ProcessingInstruction createProcessingInstruction(String target, String data) - throws DOMException { - // TODO Auto-generated method stub - return null; - } - - public Text createTextNode(String data) { - // TODO Auto-generated method stub - return null; - } - - public DocumentType getDoctype() { - // TODO Auto-generated method stub - return null; - } - - public abstract Element getDocumentElement(); - - public Element getElementById(String elementId) { - // TODO Auto-generated method stub - return null; - } - - public NodeList getElementsByTagName(String tagname) { - // TODO Auto-generated method stub - return null; - } - - public NodeList getElementsByTagNameNS(String namespaceURI, String localName) { - // TODO Auto-generated method stub - return null; - } - - public DOMImplementation getImplementation() { - // TODO Auto-generated method stub - return null; - } - - public Node importNode(Node importedNode, boolean deep) throws DOMException { - // TODO Auto-generated method stub - return null; - } - - /* - * Node Interface methods - */ - - @Override - public short getNodeType() { - return Node.DOCUMENT_NODE; - } - - @Override - public String getNodeName() { - // The value of nodeName is "#document" when Node is a Document - return "#document"; - } - - public String getInputEncoding() { - return null; - } - - public String getXmlEncoding() { - return null; - } - - public boolean getXmlStandalone() { - return false; - } - - public void setXmlStandalone(boolean xmlStandalone) throws DOMException {} - - public String getXmlVersion() { - return null; - } - - public void setXmlVersion(String xmlVersion) throws DOMException {} - - public boolean getStrictErrorChecking() { - return true; - } - - public void setStrictErrorChecking(boolean strictErrorChecking) {} - - public String getDocumentURI() { - return null; - } - - public void setDocumentURI(String documentURI) {} - - public Node adoptNode(Node source) throws DOMException { - throw new DOMException(DOMException.NOT_SUPPORTED_ERR, null); - } - - public DOMConfiguration getDomConfig() { - throw new DOMException(DOMException.NOT_SUPPORTED_ERR, null); - } - - public void normalizeDocument() { - throw new DOMException(DOMException.NOT_SUPPORTED_ERR, null); - } - - public Node renameNode(Node n, String namespaceURI, String qualifiedName) - throws DOMException { - throw new DOMException(DOMException.NOT_SUPPORTED_ERR, null); - } -} diff --git a/QKSMS/src/main/java/com/android/mms/dom/ElementImpl.java b/QKSMS/src/main/java/com/android/mms/dom/ElementImpl.java deleted file mode 100644 index bad35ef7b..000000000 --- a/QKSMS/src/main/java/com/android/mms/dom/ElementImpl.java +++ /dev/null @@ -1,172 +0,0 @@ -/* - * Copyright (C) 2007 Esmertec AG. - * Copyright (C) 2007 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.mms.dom; - -import org.w3c.dom.Attr; -import org.w3c.dom.DOMException; -import org.w3c.dom.Element; -import org.w3c.dom.NamedNodeMap; -import org.w3c.dom.NodeList; -import org.w3c.dom.TypeInfo; - -public class ElementImpl extends NodeImpl implements Element { - private String mTagName; - private NamedNodeMap mAttributes = new NamedNodeMapImpl(); - - /* - * Internal methods - */ - - protected ElementImpl(DocumentImpl owner, String tagName) { - super(owner); - mTagName = tagName; - } - - /* - * Element Interface methods - */ - - public String getAttribute(String name) { - Attr attrNode = getAttributeNode(name); - String attrValue = ""; - if (attrNode != null) { - attrValue = attrNode.getValue(); - } - return attrValue; - } - - public String getAttributeNS(String namespaceURI, String localName) { - // TODO Auto-generated method stub - return null; - } - - public Attr getAttributeNode(String name) { - return (Attr)mAttributes.getNamedItem(name); - } - - public Attr getAttributeNodeNS(String namespaceURI, String localName) { - // TODO Auto-generated method stub - return null; - } - - public NodeList getElementsByTagName(String name) { - return new NodeListImpl(this, name, true); - } - - public NodeList getElementsByTagNameNS(String namespaceURI, String localName) { - // TODO Auto-generated method stub - return null; - } - - public String getTagName() { - return mTagName; - } - - public boolean hasAttribute(String name) { - return (getAttributeNode(name) != null); - } - - public boolean hasAttributeNS(String namespaceURI, String localName) { - // TODO Auto-generated method stub - return false; - } - - public void removeAttribute(String name) throws DOMException { - // TODO Auto-generated method stub - - } - - public void removeAttributeNS(String namespaceURI, String localName) - throws DOMException { - // TODO Auto-generated method stub - - } - - public Attr removeAttributeNode(Attr oldAttr) throws DOMException { - // TODO Auto-generated method stub - return null; - } - - public void setAttribute(String name, String value) throws DOMException { - Attr attribute = getAttributeNode(name); - if (attribute == null) { - attribute = mOwnerDocument.createAttribute(name); - } - attribute.setNodeValue(value); - mAttributes.setNamedItem(attribute); - } - - public void setAttributeNS(String namespaceURI, String qualifiedName, - String value) throws DOMException { - // TODO Auto-generated method stub - - } - - public Attr setAttributeNode(Attr newAttr) throws DOMException { - // TODO Auto-generated method stub - return null; - } - - public Attr setAttributeNodeNS(Attr newAttr) throws DOMException { - // TODO Auto-generated method stub - return null; - } - - /* - * Node Interface methods - */ - - @Override - public short getNodeType() { - return ELEMENT_NODE; - } - - @Override - public String getNodeName() { - // The value of nodeName is tagName when Node is an Element - return mTagName; - } - - @Override - public NamedNodeMap getAttributes() { - return mAttributes; - } - - @Override - public boolean hasAttributes() { - return (mAttributes.getLength() > 0); - } - - public TypeInfo getSchemaTypeInfo() { - return null; - } - - public void setIdAttribute(String name, boolean isId) throws DOMException { - throw new DOMException(DOMException.NOT_SUPPORTED_ERR, null); - } - - public void setIdAttributeNS(String namespaceURI, String localName, - boolean isId) throws DOMException { - throw new DOMException(DOMException.NOT_SUPPORTED_ERR, null); - } - - public void setIdAttributeNode(Attr idAttr, boolean isId) - throws DOMException { - throw new DOMException(DOMException.NOT_SUPPORTED_ERR, null); - } -} diff --git a/QKSMS/src/main/java/com/android/mms/dom/NamedNodeMapImpl.java b/QKSMS/src/main/java/com/android/mms/dom/NamedNodeMapImpl.java deleted file mode 100644 index 93c3f6fb3..000000000 --- a/QKSMS/src/main/java/com/android/mms/dom/NamedNodeMapImpl.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright (C) 2007 Esmertec AG. - * Copyright (C) 2007 The Android Open Source Project - * Copyright (C) 2015 QK Labs - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.mms.dom; - -import org.w3c.dom.DOMException; -import org.w3c.dom.NamedNodeMap; -import org.w3c.dom.Node; - -import java.util.Vector; - -public class NamedNodeMapImpl implements NamedNodeMap { - - private Vector mNodes = new Vector(); - - public int getLength() { - return mNodes.size(); - } - - public Node getNamedItem(String name) { - Node node = null; - for (int i = 0; i < mNodes.size(); i++) { - if (name.equals(mNodes.elementAt(i).getNodeName())) { - node = mNodes.elementAt(i); - break; - } - } - return node; - } - - public Node getNamedItemNS(String namespaceURI, String localName) { - // TODO Auto-generated method stub - return null; - } - - public Node item(int index) { - if (index < mNodes.size()) { - return mNodes.elementAt(index); - } - return null; - } - - public Node removeNamedItem(String name) throws DOMException { - Node node = getNamedItem(name); - if (node == null) { - throw new DOMException(DOMException.NOT_FOUND_ERR, "Not found"); - } else { - mNodes.remove(node); - } - return node; - } - - public Node removeNamedItemNS(String namespaceURI, String localName) - throws DOMException { - // TODO Auto-generated method stub - return null; - } - - public Node setNamedItem(Node arg) throws DOMException { - Node existing = getNamedItem(arg.getNodeName()); - if (existing != null) { - mNodes.remove(existing); - } - mNodes.add(arg); - return existing; - } - - public Node setNamedItemNS(Node arg) throws DOMException { - // TODO Auto-generated method stub - return null; - } - -} diff --git a/QKSMS/src/main/java/com/android/mms/dom/NodeImpl.java b/QKSMS/src/main/java/com/android/mms/dom/NodeImpl.java deleted file mode 100644 index bbf6ef50e..000000000 --- a/QKSMS/src/main/java/com/android/mms/dom/NodeImpl.java +++ /dev/null @@ -1,274 +0,0 @@ -/* - * Copyright (C) 2007 Esmertec AG. - * Copyright (C) 2007 The Android Open Source Project - * Copyright (C) 2015 QK Labs - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.mms.dom; - -import com.android.mms.dom.events.EventTargetImpl; - -import org.w3c.dom.DOMException; -import org.w3c.dom.Document; -import org.w3c.dom.NamedNodeMap; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; -import org.w3c.dom.UserDataHandler; -import org.w3c.dom.events.Event; -import org.w3c.dom.events.EventException; -import org.w3c.dom.events.EventListener; -import org.w3c.dom.events.EventTarget; - -import java.util.NoSuchElementException; -import java.util.Vector; - -public abstract class NodeImpl implements Node, EventTarget { - private Node mParentNode; - private final Vector mChildNodes = new Vector(); - DocumentImpl mOwnerDocument; - private final EventTarget mEventTarget = new EventTargetImpl(this); - - /* - * Internal methods - */ - - protected NodeImpl(DocumentImpl owner) { - mOwnerDocument = owner; - } - - /* - * Node Interface Methods - */ - - public Node appendChild(Node newChild) throws DOMException { - ((NodeImpl)newChild).setParentNode(this); - mChildNodes.remove(newChild); - mChildNodes.add(newChild); - return newChild; - } - - public Node cloneNode(boolean deep) { - // TODO Auto-generated method stub - return null; - } - - public NamedNodeMap getAttributes() { - // Default. Override in Element. - return null; - } - - public NodeList getChildNodes() { - return new NodeListImpl(this, null, false); - } - - public Node getFirstChild() { - Node firstChild = null; - try { - firstChild = mChildNodes.firstElement(); - } - catch (NoSuchElementException e) { - // Ignore and return null - } - return firstChild; - } - - public Node getLastChild() { - Node lastChild = null; - try { - lastChild = mChildNodes.lastElement(); - } - catch (NoSuchElementException e) { - // Ignore and return null - } - return lastChild; - } - - public String getLocalName() { - // TODO Auto-generated method stub - return null; - } - - public String getNamespaceURI() { - // TODO Auto-generated method stub - return null; - } - - public Node getNextSibling() { - if ((mParentNode != null) && (this != mParentNode.getLastChild())) { - Vector siblings = ((NodeImpl)mParentNode).mChildNodes; - int indexOfThis = siblings.indexOf(this); - return siblings.elementAt(indexOfThis + 1); - } - return null; - } - - public abstract String getNodeName(); - - public abstract short getNodeType(); - - public String getNodeValue() throws DOMException { - // Default behaviour. Override if required. - return null; - } - - public Document getOwnerDocument() { - return mOwnerDocument; - } - - public Node getParentNode() { - return mParentNode; - } - - public String getPrefix() { - // TODO Auto-generated method stub - return null; - } - - public Node getPreviousSibling() { - if ((mParentNode != null) && (this != mParentNode.getFirstChild())) { - Vector siblings = ((NodeImpl)mParentNode).mChildNodes; - int indexOfThis = siblings.indexOf(this); - return siblings.elementAt(indexOfThis - 1); - } - return null; - } - - public boolean hasAttributes() { - // Default. Override in Element. - return false; - } - - public boolean hasChildNodes() { - return !(mChildNodes.isEmpty()); - } - - public Node insertBefore(Node newChild, Node refChild) throws DOMException { - // TODO Auto-generated method stub - return null; - } - - public boolean isSupported(String feature, String version) { - // TODO Auto-generated method stub - return false; - } - - public void normalize() { - // TODO Auto-generated method stub - } - - public Node removeChild(Node oldChild) throws DOMException { - if (mChildNodes.contains(oldChild)) { - mChildNodes.remove(oldChild); - ((NodeImpl)oldChild).setParentNode(null); - } else { - throw new DOMException(DOMException.NOT_FOUND_ERR, "Child does not exist"); - } - return null; - } - - public Node replaceChild(Node newChild, Node oldChild) throws DOMException { - if (mChildNodes.contains(oldChild)) { - // Try to remove the new child if available - try { - mChildNodes.remove(newChild); - } catch (DOMException e) { - // Ignore exception - } - mChildNodes.setElementAt(newChild, mChildNodes.indexOf(oldChild)); - ((NodeImpl)newChild).setParentNode(this); - ((NodeImpl)oldChild).setParentNode(null); - } else { - throw new DOMException(DOMException.NOT_FOUND_ERR, "Old child does not exist"); - } - return oldChild; - } - - public void setNodeValue(String nodeValue) throws DOMException { - // Default behaviour. Override if required. - } - - public void setPrefix(String prefix) throws DOMException { - // TODO Auto-generated method stub - } - - private void setParentNode(Node parentNode) { - mParentNode = parentNode; - } - - /* - * EventTarget Interface - */ - - public void addEventListener(String type, EventListener listener, boolean useCapture) { - mEventTarget.addEventListener(type, listener, useCapture); - } - - public void removeEventListener(String type, EventListener listener, boolean useCapture) { - mEventTarget.removeEventListener(type, listener, useCapture); - } - - public boolean dispatchEvent(Event evt) throws EventException { - return mEventTarget.dispatchEvent(evt); - } - - public String getBaseURI() { - return null; - } - - public short compareDocumentPosition(Node other) throws DOMException { - throw new DOMException(DOMException.NOT_SUPPORTED_ERR, null); - } - - public String getTextContent() throws DOMException { - throw new DOMException(DOMException.NOT_SUPPORTED_ERR, null); - } - - public void setTextContent(String textContent) throws DOMException { - throw new DOMException(DOMException.NOT_SUPPORTED_ERR, null); - } - - public boolean isSameNode(Node other) { - throw new DOMException(DOMException.NOT_SUPPORTED_ERR, null); - } - - public String lookupPrefix(String namespaceURI) { - return null; - } - - public boolean isDefaultNamespace(String namespaceURI) { - throw new DOMException(DOMException.NOT_SUPPORTED_ERR, null); - } - - public String lookupNamespaceURI(String prefix) { - return null; - } - - public boolean isEqualNode(Node arg) { - throw new DOMException(DOMException.NOT_SUPPORTED_ERR, null); - } - - public Object getFeature(String feature, String version) { - return null; - } - - public Object setUserData(String key, Object data, - UserDataHandler handler) { - throw new DOMException(DOMException.NOT_SUPPORTED_ERR, null); - } - - public Object getUserData(String key) { - return null; - } -} diff --git a/QKSMS/src/main/java/com/android/mms/dom/NodeListImpl.java b/QKSMS/src/main/java/com/android/mms/dom/NodeListImpl.java deleted file mode 100644 index 3b4a74a71..000000000 --- a/QKSMS/src/main/java/com/android/mms/dom/NodeListImpl.java +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Copyright (C) 2007 Esmertec AG. - * Copyright (C) 2007 The Android Open Source Project - * Copyright (C) 2015 QK Labs - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.mms.dom; - -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; - -import java.util.ArrayList; - -public class NodeListImpl implements NodeList { - private ArrayList mSearchNodes; - private ArrayList mStaticNodes; - private Node mRootNode; - private String mTagName; - private boolean mDeepSearch; - - /* - * Internal Interface - */ - - /** - * Constructs a NodeList by searching for all descendants or the direct - * children of a root node with a given tag name. - * @param rootNode The root Node of the search. - * @param tagName The tag name to be searched for. If null, all descendants - * will be returned. - * @param deep Limit the search to the direct children of rootNode if false, - * to all descendants otherwise. - */ - public NodeListImpl(Node rootNode, String tagName, boolean deepSearch) { - mRootNode = rootNode; - mTagName = tagName; - mDeepSearch = deepSearch; - } - - /** - * Constructs a NodeList for a given static node list. - * @param nodes The static node list. - */ - public NodeListImpl(ArrayList nodes) { - mStaticNodes = nodes; - } - - /* - * NodeListImpl Interface - */ - - public int getLength() { - if (mStaticNodes == null) { - fillList(mRootNode); - return mSearchNodes.size(); - } else { - return mStaticNodes.size(); - } - } - - public Node item(int index) { - Node node = null; - if (mStaticNodes == null) { - fillList(mRootNode); - try { - node = mSearchNodes.get(index); - } catch (IndexOutOfBoundsException e) { - // Do nothing and return null - } - } else { - try { - node = mStaticNodes.get(index); - } catch (IndexOutOfBoundsException e) { - // Do nothing and return null - } - } - return node; - } - - /** - * A preorder traversal is done in the following order: - *
    - *
  • Visit root. - *
  • Traverse children from left to right in preorder. - *
- * This method fills the live node list. - * @param The root of preorder traversal - * @return The next match - */ - private void fillList(Node node) { - // (Re)-initialize the container if this is the start of the search. - // Visit the root of this iteration otherwise. - if (node == mRootNode) { - mSearchNodes = new ArrayList(); - } else { - if ((mTagName == null) || node.getNodeName().equals(mTagName)) { - mSearchNodes.add(node); - } - } - - // Descend one generation... - node = node.getFirstChild(); - - // ...and visit in preorder the children if we are in deep search - // or directly add the children to the list otherwise. - while (node != null) { - if (mDeepSearch) { - fillList(node); - } else { - if ((mTagName == null) || node.getNodeName().equals(mTagName)) { - mSearchNodes.add(node); - } - } - node = node.getNextSibling(); - } - } -} diff --git a/QKSMS/src/main/java/com/android/mms/dom/events/EventImpl.java b/QKSMS/src/main/java/com/android/mms/dom/events/EventImpl.java deleted file mode 100644 index 24fc908fa..000000000 --- a/QKSMS/src/main/java/com/android/mms/dom/events/EventImpl.java +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Copyright (C) 2007 Esmertec AG. - * Copyright (C) 2007 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.mms.dom.events; - -import org.w3c.dom.events.Event; -import org.w3c.dom.events.EventTarget; - -public class EventImpl implements Event { - - // Event type informations - private String mEventType; - private boolean mCanBubble; - private boolean mCancelable; - - // Flags whether the event type information was set - // FIXME: Can we use mEventType for this purpose? - private boolean mInitialized; - - // Target of this event - private EventTarget mTarget; - - // Event status variables - private short mEventPhase; - private boolean mStopPropagation; - private boolean mPreventDefault; - private EventTarget mCurrentTarget; - private int mSeekTo; - - private final long mTimeStamp = System.currentTimeMillis(); - - public boolean getBubbles() { - return mCanBubble; - } - - public boolean getCancelable() { - return mCancelable; - } - - public EventTarget getCurrentTarget() { - return mCurrentTarget; - } - - public short getEventPhase() { - return mEventPhase; - } - - public EventTarget getTarget() { - return mTarget; - } - - public long getTimeStamp() { - return mTimeStamp; - } - - public String getType() { - return mEventType; - } - - public void initEvent(String eventTypeArg, boolean canBubbleArg, - boolean cancelableArg) { - mEventType = eventTypeArg; - mCanBubble = canBubbleArg; - mCancelable = cancelableArg; - mInitialized = true; - } - - public void initEvent(String eventTypeArg, boolean canBubbleArg, boolean cancelableArg, - int seekTo) { - mSeekTo = seekTo; - initEvent(eventTypeArg, canBubbleArg, cancelableArg); - } - - public void preventDefault() { - mPreventDefault = true; - } - - public void stopPropagation() { - mStopPropagation = true; - } - - /* - * Internal Interface - */ - - boolean isInitialized() { - return mInitialized; - } - - boolean isPreventDefault() { - return mPreventDefault; - } - - boolean isPropogationStopped() { - return mStopPropagation; - } - - void setTarget(EventTarget target) { - mTarget = target; - } - - void setEventPhase(short eventPhase) { - mEventPhase = eventPhase; - } - - void setCurrentTarget(EventTarget currentTarget) { - mCurrentTarget = currentTarget; - } - - public int getSeekTo() { - return mSeekTo; - } -} diff --git a/QKSMS/src/main/java/com/android/mms/dom/events/EventTargetImpl.java b/QKSMS/src/main/java/com/android/mms/dom/events/EventTargetImpl.java deleted file mode 100644 index 358543a26..000000000 --- a/QKSMS/src/main/java/com/android/mms/dom/events/EventTargetImpl.java +++ /dev/null @@ -1,132 +0,0 @@ -/* - * Copyright (C) 2007 Esmertec AG. - * Copyright (C) 2007 The Android Open Source Project - * Copyright (C) 2015 QK Labs - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.mms.dom.events; - -import android.util.Log; - -import org.w3c.dom.events.Event; -import org.w3c.dom.events.EventException; -import org.w3c.dom.events.EventListener; -import org.w3c.dom.events.EventTarget; - -import java.util.ArrayList; - -public class EventTargetImpl implements EventTarget { - private static final String TAG = "EventTargetImpl"; - private ArrayList mListenerEntries; - private EventTarget mNodeTarget; - - static class EventListenerEntry - { - final String mType; - final EventListener mListener; - final boolean mUseCapture; - - EventListenerEntry(String type, EventListener listener, boolean useCapture) - { - mType = type; - mListener = listener; - mUseCapture = useCapture; - } - } - - public EventTargetImpl(EventTarget target) { - mNodeTarget = target; - } - - public void addEventListener(String type, EventListener listener, boolean useCapture) { - if ((type == null) || type.equals("") || (listener == null)) { - return; - } - - // Make sure we have only one entry - removeEventListener(type, listener, useCapture); - - if (mListenerEntries == null) { - mListenerEntries = new ArrayList(); - } - mListenerEntries.add(new EventListenerEntry(type, listener, useCapture)); - } - - public boolean dispatchEvent(Event evt) throws EventException { - // We need to use the internal APIs to modify and access the event status - EventImpl eventImpl = (EventImpl)evt; - - if (!eventImpl.isInitialized()) { - throw new EventException(EventException.UNSPECIFIED_EVENT_TYPE_ERR, - "Event not initialized"); - } else if ((eventImpl.getType() == null) || eventImpl.getType().equals("")) { - throw new EventException(EventException.UNSPECIFIED_EVENT_TYPE_ERR, - "Unspecified even type"); - } - - // Initialize event status - eventImpl.setTarget(mNodeTarget); - - // TODO: At this point, to support event capturing and bubbling, we should - // establish the chain of EventTargets from the top of the tree to this - // event's target. - - // TODO: CAPTURING_PHASE skipped - - // Handle AT_TARGET - // Invoke handleEvent of non-capturing listeners on this EventTarget. - eventImpl.setEventPhase(Event.AT_TARGET); - eventImpl.setCurrentTarget(mNodeTarget); - if (!eventImpl.isPropogationStopped() && (mListenerEntries != null)) { - for (int i = 0; i < mListenerEntries.size(); i++) { - EventListenerEntry listenerEntry = mListenerEntries.get(i); - if (!listenerEntry.mUseCapture - && listenerEntry.mType.equals(eventImpl.getType())) { - try { - listenerEntry.mListener.handleEvent(eventImpl); - } - catch (Exception e) { - // Any exceptions thrown inside an EventListener will - // not stop propagation of the event - Log.w(TAG, "Catched EventListener exception", e); - } - } - } - } - - if (eventImpl.getBubbles()) { - // TODO: BUBBLING_PHASE skipped - } - - return eventImpl.isPreventDefault(); - } - - public void removeEventListener(String type, EventListener listener, - boolean useCapture) { - if (null == mListenerEntries) { - return; - } - for (int i = 0; i < mListenerEntries.size(); i ++) { - EventListenerEntry listenerEntry = mListenerEntries.get(i); - if ((listenerEntry.mUseCapture == useCapture) - && (listenerEntry.mListener == listener) - && listenerEntry.mType.equals(type)) { - mListenerEntries.remove(i); - break; - } - } - } - -} diff --git a/QKSMS/src/main/java/com/android/mms/dom/smil/ElementParallelTimeContainerImpl.java b/QKSMS/src/main/java/com/android/mms/dom/smil/ElementParallelTimeContainerImpl.java deleted file mode 100644 index 97b08ec36..000000000 --- a/QKSMS/src/main/java/com/android/mms/dom/smil/ElementParallelTimeContainerImpl.java +++ /dev/null @@ -1,156 +0,0 @@ -/* - * Copyright (C) 2007-2008 Esmertec AG. - * Copyright (C) 2007-2008 The Android Open Source Project - * Copyright (C) 2015 QK Labs - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.mms.dom.smil; - -import com.android.mms.dom.NodeListImpl; - -import org.w3c.dom.DOMException; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; -import org.w3c.dom.smil.ElementParallelTimeContainer; -import org.w3c.dom.smil.ElementTime; -import org.w3c.dom.smil.SMILElement; -import org.w3c.dom.smil.Time; -import org.w3c.dom.smil.TimeList; - -import java.util.ArrayList; - -public abstract class ElementParallelTimeContainerImpl extends ElementTimeContainerImpl - implements ElementParallelTimeContainer { - private final static String ENDSYNC_ATTRIBUTE_NAME = "endsync"; - private final static String ENDSYNC_FIRST = "first"; - private final static String ENDSYNC_LAST = "last"; - private final static String ENDSYNC_ALL = "all"; - private final static String ENDSYNC_MEDIA = "media"; - - /* - * Internal Interface - */ - - ElementParallelTimeContainerImpl(SMILElement element) { - super(element); - } - - public String getEndSync() { - String endsync = mSmilElement.getAttribute(ENDSYNC_ATTRIBUTE_NAME); - if ((endsync == null) || (endsync.length() == 0)) { - setEndSync(ENDSYNC_LAST); - return ENDSYNC_LAST; - } - if (ENDSYNC_FIRST.equals(endsync) || ENDSYNC_LAST.equals(endsync) || - ENDSYNC_ALL.equals(endsync) || ENDSYNC_MEDIA.equals(endsync)) { - return endsync; - } - - // FIXME add the checking for ID-Value and smil1.0-Id-value. - - setEndSync(ENDSYNC_LAST); - return ENDSYNC_LAST; - } - - public void setEndSync(String endSync) throws DOMException { - if (ENDSYNC_FIRST.equals(endSync) || ENDSYNC_LAST.equals(endSync) || - ENDSYNC_ALL.equals(endSync) || ENDSYNC_MEDIA.equals(endSync)) { - mSmilElement.setAttribute(ENDSYNC_ATTRIBUTE_NAME, endSync); - } else { // FIXME add the support for ID-Value and smil1.0-Id-value. - throw new DOMException(DOMException.NOT_SUPPORTED_ERR, - "Unsupported endsync value" + endSync); - } - } - - @Override - public float getDur() { - float dur = super.getDur(); - if (dur == 0) { - dur = getImplicitDuration(); - } - return dur; - } - - public float getImplicitDuration() { - float dur = -1.0F; - if (ENDSYNC_LAST.equals(getEndSync())) { - NodeList children = getTimeChildren(); - for (int i = 0; i < children.getLength(); ++i) { - ElementTime child = (ElementTime) children.item(i); - TimeList endTimeList = child.getEnd(); - for (int j = 0; j < endTimeList.getLength(); ++j) { - Time endTime = endTimeList.item(j); - if (endTime.getTimeType() == Time.SMIL_TIME_INDEFINITE) { - // Return "indefinite" here. - return -1.0F; - } - if (endTime.getResolved()) { - float end = (float)endTime.getResolvedOffset(); - dur = (end > dur) ? end : dur; - } - } - } - } // Other endsync types are not supported now. - - return dur; - } - - public NodeList getActiveChildrenAt(float instant) { - /* - * Find the closest Time of ElementTime before instant. - * Add ElementTime to list of active elements if the Time belongs to the begin-list, - * do not add it otherwise. - */ - ArrayList activeChildren = new ArrayList(); - NodeList children = getTimeChildren(); - int childrenLen = children.getLength(); - for (int i = 0; i < childrenLen; ++i) { - double maxOffset = 0.0; - boolean active = false; - ElementTime child = (ElementTime) children.item(i); - - TimeList beginList = child.getBegin(); - int len = beginList.getLength(); - for (int j = 0; j < len; ++j) { - Time begin = beginList.item(j); - if (begin.getResolved()) { - double resolvedOffset = begin.getResolvedOffset() * 1000.0; - if ((resolvedOffset <= instant) && (resolvedOffset >= maxOffset)) { - maxOffset = resolvedOffset; - active = true; - } - } - } - - TimeList endList = child.getEnd(); - len = endList.getLength(); - for (int j = 0; j < len; ++j) { - Time end = endList.item(j); - if (end.getResolved()) { - double resolvedOffset = end.getResolvedOffset() * 1000.0; - if ((resolvedOffset <= instant) && (resolvedOffset >= maxOffset)) { - maxOffset = resolvedOffset; - active = false; - } - } - } - - if (active) { - activeChildren.add((Node) child); - } - } - return new NodeListImpl(activeChildren); - } -} diff --git a/QKSMS/src/main/java/com/android/mms/dom/smil/ElementSequentialTimeContainerImpl.java b/QKSMS/src/main/java/com/android/mms/dom/smil/ElementSequentialTimeContainerImpl.java deleted file mode 100644 index 8330b3e65..000000000 --- a/QKSMS/src/main/java/com/android/mms/dom/smil/ElementSequentialTimeContainerImpl.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright (C) 2007 Esmertec AG. - * Copyright (C) 2007 The Android Open Source Project - * Copyright (C) 2015 QK Labs - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.mms.dom.smil; - -import com.android.mms.dom.NodeListImpl; - -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; -import org.w3c.dom.smil.ElementSequentialTimeContainer; -import org.w3c.dom.smil.ElementTime; -import org.w3c.dom.smil.SMILElement; - -import java.util.ArrayList; - -public abstract class ElementSequentialTimeContainerImpl extends - ElementTimeContainerImpl implements ElementSequentialTimeContainer { - - /* - * Internal Interface - */ - - ElementSequentialTimeContainerImpl(SMILElement element) { - super(element); - } - - /* - * ElementSequentialTimeContainer Interface - */ - - public NodeList getActiveChildrenAt(float instant) { - NodeList allChildren = this.getTimeChildren(); - ArrayList nodes = new ArrayList(); - for (int i = 0; i < allChildren.getLength(); i++) { - instant -= ((ElementTime) allChildren.item(i)).getDur(); - if (instant < 0) { - nodes.add(allChildren.item(i)); - return new NodeListImpl(nodes); - } - } - return new NodeListImpl(nodes); - } - - public float getDur() { - float dur = super.getDur(); - if (dur == 0) { - NodeList children = getTimeChildren(); - for (int i = 0; i < children.getLength(); ++i) { - ElementTime child = (ElementTime) children.item(i); - if (child.getDur() < 0) { - // Return "indefinite" since containing a child whose duration is indefinite. - return -1.0F; - } - dur += child.getDur(); - } - } - return dur; - } -} diff --git a/QKSMS/src/main/java/com/android/mms/dom/smil/ElementTimeContainerImpl.java b/QKSMS/src/main/java/com/android/mms/dom/smil/ElementTimeContainerImpl.java deleted file mode 100644 index eca14cf31..000000000 --- a/QKSMS/src/main/java/com/android/mms/dom/smil/ElementTimeContainerImpl.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (C) 2007 Esmertec AG. - * Copyright (C) 2007 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.mms.dom.smil; - -import org.w3c.dom.smil.ElementTimeContainer; -import org.w3c.dom.smil.SMILElement; - -public abstract class ElementTimeContainerImpl extends ElementTimeImpl implements - ElementTimeContainer { - - /* - * Internal Interface - */ - - ElementTimeContainerImpl(SMILElement element) { - super(element); - } -} diff --git a/QKSMS/src/main/java/com/android/mms/dom/smil/ElementTimeImpl.java b/QKSMS/src/main/java/com/android/mms/dom/smil/ElementTimeImpl.java deleted file mode 100644 index d3e113056..000000000 --- a/QKSMS/src/main/java/com/android/mms/dom/smil/ElementTimeImpl.java +++ /dev/null @@ -1,349 +0,0 @@ -/* - * Copyright (C) 2007-2008 Esmertec AG. - * Copyright (C) 2007-2008 The Android Open Source Project - * Copyright (C) 2015 QK Labs - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.mms.dom.smil; - -import android.util.Log; - -import org.w3c.dom.DOMException; -import org.w3c.dom.smil.ElementTime; -import org.w3c.dom.smil.SMILElement; -import org.w3c.dom.smil.Time; -import org.w3c.dom.smil.TimeList; - -import java.util.ArrayList; - -public abstract class ElementTimeImpl implements ElementTime { - private static final String TAG = "ElementTimeImpl"; - - private static final String FILL_REMOVE_ATTRIBUTE = "remove"; - private static final String FILL_FREEZE_ATTRIBUTE = "freeze"; - private static final String FILL_HOLD_ATTRIBUTE = "hold"; - private static final String FILL_TRANSITION_ATTRIBUTE = "transition"; - private static final String FILL_AUTO_ATTRIBUTE = "auto"; - private static final String FILL_ATTRIBUTE_NAME = "fill"; - private static final String FILLDEFAULT_ATTRIBUTE_NAME = "fillDefault"; - - final SMILElement mSmilElement; - - /* - * Internal Interface - */ - ElementTimeImpl(SMILElement element) { - mSmilElement = element; - } - - // Default implementation. Override if required. - int getBeginConstraints() { - return TimeImpl.ALLOW_ALL; - } - - // Default implementation. Override if required - int getEndConstraints() { - return TimeImpl.ALLOW_ALL; - } - - /** - * To get the parent node on the ElementTime tree. It is in opposition to getTimeChildren. - * @return the parent ElementTime. Returns null if there is no parent. - */ - abstract ElementTime getParentElementTime(); - - /* - * ElementTime Interface - */ - - public TimeList getBegin() { - String[] beginTimeStringList = mSmilElement.getAttribute("begin").split(";"); - - // TODO: Check other constraints on parsed values, e.g., "single, non-negative offset values - ArrayList

- * The number which has only dailable character is treated as not being - * formatted. - * - * @param phoneNumber - * the number to be formatted. - * @param phoneNumberE164 - * the E164 format number whose country code is used if the given - * phoneNumber doesn't have the country code. - * @param defaultCountryIso - * the ISO 3166-1 two letters country code whose convention will - * be used if the phoneNumberE164 is null or invalid, or if phoneNumber - * contains IDD. - * @return the formatted number if the given number has been formatted, - * otherwise, return the given number. - * - */ - @SuppressLint("Override") - public static String formatNumber(String phoneNumber, String phoneNumberE164, String defaultCountryIso) { - int len = phoneNumber.length(); - for (int i = 0; i < len; i++) { - if (!isDialable(phoneNumber.charAt(i))) { - return phoneNumber; - } - } - PhoneNumberUtil util = PhoneNumberUtil.getInstance(); - // Get the country code from phoneNumberE164 - if (phoneNumberE164 != null && phoneNumberE164.length() >= 2 - && phoneNumberE164.charAt(0) == '+') { - try { - // The number to be parsed is in E164 format, so the default region used doesn't - // matter. - Phonenumber.PhoneNumber pn = util.parse(phoneNumberE164, "ZZ"); - String regionCode = util.getRegionCodeForNumber(pn); - if (!TextUtils.isEmpty(regionCode) && - // This makes sure phoneNumber doesn't contain an IDD - normalizeNumber(phoneNumber).indexOf(phoneNumberE164.substring(1)) <= 0) { - defaultCountryIso = regionCode; - } - } catch (NumberParseException e) { - } - } - String result = formatNumber(phoneNumber, defaultCountryIso); - return result != null ? result : phoneNumber; - } - - /** - * Replace arabic/unicode digits with decimal digits. - * @param number - * the number to be normalized. - * @return the replaced number. - * - */ - @SuppressLint("Override") - public static String replaceUnicodeDigits(String number) { - StringBuilder normalizedDigits = new StringBuilder(number.length()); - for (char c : number.toCharArray()) { - int digit = Character.digit(c, 10); - if (digit != -1) { - normalizedDigits.append(digit); - } else { - normalizedDigits.append(c); - } - } - return normalizedDigits.toString(); - } - - /** - * Format a phone number. - *

- * If the given number doesn't have the country code, the phone will be - * formatted to the default country's convention. - * - * @param phoneNumber - * the number to be formatted. - * @param defaultCountryIso - * the ISO 3166-1 two letters country code whose convention will - * be used if the given number doesn't have the country code. - * @return the formatted number, or null if the given number is not valid. - * - */ - @SuppressLint("Override") - public static String formatNumber(String phoneNumber, String defaultCountryIso) { - // Do not attempt to format numbers that start with a hash or star symbol. - if (phoneNumber.startsWith("#") || phoneNumber.startsWith("*")) { - return phoneNumber; - } - - PhoneNumberUtil util = PhoneNumberUtil.getInstance(); - String result = null; - try { - Phonenumber.PhoneNumber pn = util.parseAndKeepRawInput(phoneNumber, defaultCountryIso); - result = util.formatInOriginalFormat(pn, defaultCountryIso); - } catch (NumberParseException e) { - } - return result; - } - - /** - * Format the given phoneNumber to the E.164 representation. - *

- * The given phone number must have an area code and could have a country - * code. - *

- * The defaultCountryIso is used to validate the given number and generate - * the E.164 phone number if the given number doesn't have a country code. - * - * @param phoneNumber - * the phone number to format - * @param defaultCountryIso - * the ISO 3166-1 two letters country code - * @return the E.164 representation, or null if the given phone number is - * not valid. - * - */ - @SuppressLint("Override") - public static String formatNumberToE164(String phoneNumber, String defaultCountryIso) { - PhoneNumberUtil util = PhoneNumberUtil.getInstance(); - String result = null; - try { - Phonenumber.PhoneNumber pn = util.parse(phoneNumber, defaultCountryIso); - if (util.isValidNumber(pn)) { - result = util.format(pn, PhoneNumberUtil.PhoneNumberFormat.E164); - } - } catch (NumberParseException e) { - } - return result; - } - - /** - * Normalize a phone number by removing the characters other than digits. If - * the given number has keypad letters, the letters will be converted to - * digits first. - * - * @param phoneNumber - * the number to be normalized. - * @return the normalized number. - * - */ - @SuppressLint("Override") - public static String normalizeNumber(String phoneNumber) { - StringBuilder sb = new StringBuilder(); - int len = phoneNumber.length(); - for (int i = 0; i < len; i++) { - char c = phoneNumber.charAt(i); - // Character.digit() supports ASCII and Unicode digits (fullwidth, Arabic-Indic, etc.) - int digit = Character.digit(c, 10); - if (digit != -1) { - sb.append(digit); - } else if (i == 0 && c == '+') { - sb.append(c); - } else if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) { - return normalizeNumber(PhoneNumberUtils.convertKeypadLettersToDigits(phoneNumber)); - } - } - return sb.toString(); - } - - /** or -1 if both are negative */ - static private int - minPositive (int a, int b) { - if (a >= 0 && b >= 0) { - return (a < b) ? a : b; - } else if (a >= 0) { /* && b < 0 */ - return a; - } else if (b >= 0) { /* && a < 0 */ - return b; - } else { /* a < 0 && b < 0 */ - return -1; - } - } - - /** index of the last character of the network portion - * (eg anything after is a post-dial string) - */ - static private int - indexOfLastNetworkChar(String a) { - int pIndex, wIndex; - int origLength; - int trimIndex; - - origLength = a.length(); - - pIndex = a.indexOf(PAUSE); - wIndex = a.indexOf(WAIT); - - trimIndex = minPositive(pIndex, wIndex); - - if (trimIndex < 0) { - return origLength - 1; - } else { - return trimIndex - 1; - } - } - - /** - * Return true iff the network portion of address is, - * as far as we can tell on the device, suitable for use as an SMS - * destination address. - */ - public static boolean isReallyWellFormedSmsAddress(String address) { - String networkPortion = - PhoneNumberUtils.extractNetworkPortion(address); - - return (!(networkPortion.equals("+") - || TextUtils.isEmpty(networkPortion))) - && isReallyDialable(networkPortion); - } - - private static boolean isReallyDialable(String address) { - for (int i = 0, count = address.length(); i < count; i++) { - if (!isReallyDialable(address.charAt(i))) { - return false; - } - } - return true; - } - - /** - * Compare phone numbers a and b, return true if they're identical - * enough for caller ID purposes. - * - * - Compares from right to left - * - requires MIN_MATCH (7) characters to match - * - handles common trunk prefixes and international prefixes - * (basically, everything except the Russian trunk prefix) - * - * Note that this method does not return false even when the two phone numbers - * are not exactly same; rather; we can call this method "similar()", not "equals()". - * - * @hide - */ - public static boolean compareLoosely(String a, String b) { - int ia, ib; - int matched; - int numNonDialableCharsInA = 0; - int numNonDialableCharsInB = 0; - - if (a == null || b == null) return a == b; - - if (a.length() == 0 || b.length() == 0) { - return false; - } - - ia = indexOfLastNetworkChar (a); - ib = indexOfLastNetworkChar (b); - matched = 0; - - while (ia >= 0 && ib >=0) { - char ca, cb; - boolean skipCmp = false; - - ca = a.charAt(ia); - - if (!isDialable(ca)) { - ia--; - skipCmp = true; - numNonDialableCharsInA++; - } - - cb = b.charAt(ib); - - if (!isDialable(cb)) { - ib--; - skipCmp = true; - numNonDialableCharsInB++; - } - - if (!skipCmp) { - if (cb != ca && ca != WILD && cb != WILD) { - break; - } - ia--; ib--; matched++; - } - } - - if (matched < MIN_MATCH) { - int effectiveALen = a.length() - numNonDialableCharsInA; - int effectiveBLen = b.length() - numNonDialableCharsInB; - - - // if the number of dialable chars in a and b match, but the matched chars < MIN_MATCH, - // treat them as equal (i.e. 404-04 and 40404) - return effectiveALen == effectiveBLen && effectiveALen == matched; - - } - - // At least one string has matched completely; - if (matched >= MIN_MATCH && (ia < 0 || ib < 0)) { - return true; - } - - /* - * Now, what remains must be one of the following for a - * match: - * - * - a '+' on one and a '00' or a '011' on the other - * - a '0' on one and a (+,00) on the other - * (for this, a '0' and a '00' prefix would have succeeded above) - */ - - if (matchIntlPrefix(a, ia + 1) - && matchIntlPrefix (b, ib +1) - ) { - return true; - } - - if (matchTrunkPrefix(a, ia + 1) - && matchIntlPrefixAndCC(b, ib +1) - ) { - return true; - } - - return matchTrunkPrefix(b, ib + 1) - && matchIntlPrefixAndCC(a, ia + 1); - - } - - /** all of 'a' up to len must be a (+|00|011)country code) - * We're fast and loose with the country code. Any \d{1,3} matches */ - private static boolean - matchIntlPrefixAndCC(String a, int len) { - /* [^0-9*#+pwn]*(\+|0(0|11)\d\d?\d? [^0-9*#+pwn] $ */ - /* 0 1 2 3 45 6 7 8 */ - - int state = 0; - for (int i = 0 ; i < len ; i++ ) { - char c = a.charAt(i); - - switch (state) { - case 0: - if (c == '+') state = 1; - else if (c == '0') state = 2; - else if (isNonSeparator(c)) return false; - break; - - case 2: - if (c == '0') state = 3; - else if (c == '1') state = 4; - else if (isNonSeparator(c)) return false; - break; - - case 4: - if (c == '1') state = 5; - else if (isNonSeparator(c)) return false; - break; - - case 1: - case 3: - case 5: - if (isISODigit(c)) state = 6; - else if (isNonSeparator(c)) return false; - break; - - case 6: - case 7: - if (isISODigit(c)) state++; - else if (isNonSeparator(c)) return false; - break; - - default: - if (isNonSeparator(c)) return false; - } - } - - return state == 6 || state == 7 || state == 8; - } - - /** - * Phone numbers are stored in "lookup" form in the database - * as reversed strings to allow for caller ID lookup - * - * This method takes a phone number and makes a valid SQL "LIKE" - * string that will match the lookup form - * - */ - /** all of a up to len must be an international prefix or - * separators/non-dialing digits - */ - private static boolean - matchIntlPrefix(String a, int len) { - /* '([^0-9*#+pwn]\+[^0-9*#+pwn] | [^0-9*#+pwn]0(0|11)[^0-9*#+pwn] )$' */ - /* 0 1 2 3 45 */ - - int state = 0; - for (int i = 0 ; i < len ; i++) { - char c = a.charAt(i); - - switch (state) { - case 0: - if (c == '+') state = 1; - else if (c == '0') state = 2; - else if (isNonSeparator(c)) return false; - break; - - case 2: - if (c == '0') state = 3; - else if (c == '1') state = 4; - else if (isNonSeparator(c)) return false; - break; - - case 4: - if (c == '1') state = 5; - else if (isNonSeparator(c)) return false; - break; - - default: - if (isNonSeparator(c)) return false; - break; - - } - } - - return state == 1 || state == 3 || state == 5; - } - - /** all of 'a' up to len must match non-US trunk prefix ('0') */ - private static boolean - matchTrunkPrefix(String a, int len) { - boolean found; - - found = false; - - for (int i = 0 ; i < len ; i++) { - char c = a.charAt(i); - - if (c == '0' && !found) { - found = true; - } else if (isNonSeparator(c)) { - return false; - } - } - - return found; - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/common/utils/TextUtils.java b/QKSMS/src/main/java/com/moez/QKSMS/common/utils/TextUtils.java deleted file mode 100644 index 55e50e1c2..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/common/utils/TextUtils.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.moez.QKSMS.common.utils; - -import android.text.Html; -import android.text.SpannedString; - -import java.util.regex.Pattern; - -public class TextUtils { - public static CharSequence styleText(CharSequence text) { - if (text == null || text.toString().isEmpty() || (!text.toString().contains("*") && !text.toString().contains("_"))) - return text; // Do nothing if there's nothing to be styled - - boolean bool; - - text = Html.toHtml(new SpannedString(text)); - - // bold text - if (text.toString().contains("*")) { - int doubleStars = 0; - bool = true; - for (int i = 0; i < text.length() - 1; i++) { - if (text.subSequence(i, i + 2).equals("**")) { - doubleStars++; - } - } - if (doubleStars >= 2) { - if (doubleStars % 2 != 0) { - doubleStars--; - } - for (int i = 0; i < doubleStars; i++) { - text = text.toString().replaceFirst(Pattern.quote("**"), bool ? "" : ""); - bool = !bool; - } - } - } - - // italic text - if (text.toString().contains("*")) { - int singleStars = 0; - bool = true; - for (int i = 0; i < text.length(); i++) { - if (text.subSequence(i, i + 1).equals("*")) { - singleStars++; - } - } - if (singleStars >= 2) { - if (singleStars % 2 != 0) { - singleStars--; - } - for (int i = 0; i < singleStars; i++) { - text = text.toString().replaceFirst(Pattern.quote("*"), bool ? "" : ""); - bool = !bool; - } - } - } - - // underlined text - if (text.toString().contains("_")) { - int underscores = 0; - bool = true; - for (int i = 0; i < text.length(); i++) { - if (text.subSequence(i, i + 1).equals("_")) { - underscores++; - } - } - if (underscores >= 2) { - if (underscores % 2 != 0) { - underscores--; - } - for (int i = 0; i < underscores; i++) { - text = text.toString().replaceFirst(Pattern.quote("_"), bool ? "" : ""); - bool = !bool; - } - } - } - - text = text.toString().replaceAll(Pattern.quote("

"), "").replaceAll(Pattern.quote("

"), ""); - - return Html.fromHtml(text.toString()); - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/common/utils/Units.java b/QKSMS/src/main/java/com/moez/QKSMS/common/utils/Units.java deleted file mode 100644 index 6d063cf06..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/common/utils/Units.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.moez.QKSMS.common.utils; - -import android.content.Context; -import android.util.DisplayMetrics; - -public class Units { - - /** - * Converts dp to pixels. - */ - public static int dpToPx(Context context, int dp) { - DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics(); - int px = Math.round(dp * (displayMetrics.xdpi / DisplayMetrics.DENSITY_DEFAULT)); - return px; - } - - - /** - * Converts pixels to dp. - */ - public static int pxToDp(Context context, int px) { - DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics(); - int dp = Math.round(px / (displayMetrics.xdpi / DisplayMetrics.DENSITY_DEFAULT)); - return dp; - } - - public static float spToPx(Context context, float sp) { - float scaledDensity = context.getResources().getDisplayMetrics().scaledDensity; - return sp * scaledDensity; - } - - public static float pxToSp(Context context, float px) { - float scaledDensity = context.getResources().getDisplayMetrics().scaledDensity; - return px / scaledDensity; - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/common/utils/ViewUtils.java b/QKSMS/src/main/java/com/moez/QKSMS/common/utils/ViewUtils.java deleted file mode 100644 index 22a6fb80e..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/common/utils/ViewUtils.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.moez.QKSMS.common.utils; - -import android.view.View; - -public class ViewUtils { - - /** - * Returns true if the given x,y coordinates falls within the view bounds. - * @param view - * @param x - * @param y - * @return - */ - public static boolean isInBounds(View view, int x, int y) { - - int[] l = new int[2]; - view.getLocationOnScreen(l); - int vx = l[0]; - int vy = l[1]; - int vw = view.getWidth(); - int vh = view.getHeight(); - - return !(x < vx || x > vx + vw || y < vy || y > vy + vh); - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/common/vcard/AndroidCustomField.java b/QKSMS/src/main/java/com/moez/QKSMS/common/vcard/AndroidCustomField.java deleted file mode 100644 index 28b97d8b6..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/common/vcard/AndroidCustomField.java +++ /dev/null @@ -1,123 +0,0 @@ -package com.moez.QKSMS.common.vcard; - -import ezvcard.VCard; -import ezvcard.VCardVersion; -import ezvcard.Warning; -import ezvcard.property.VCardProperty; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -/* - Copyright (c) 2014-2015, Michael Angstadt - All rights reserved. - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - The views and conclusions contained in the software and documentation are those - of the authors and should not be interpreted as representing official policies, - either expressed or implied, of the FreeBSD Project. - */ - -/** - * Represents an "X-ANDROID-CUSTOM" property. - * @author Michael Angstadt - */ -public class AndroidCustomField extends VCardProperty { - private String type; - private boolean dir; - private List values = new ArrayList<>(); - - /** - * Creates an "item" field. - * @param type the type - * @param value the value - * @return the property - */ - public static AndroidCustomField item(String type, String value) { - AndroidCustomField property = new AndroidCustomField(); - property.dir = false; - property.type = type; - property.values.add(value); - return property; - } - - /** - * Creates a "dir" field. - * @param type the type - * @param values the values - * @return the property - */ - public static AndroidCustomField dir(String type, String... values) { - AndroidCustomField property = new AndroidCustomField(); - property.dir = true; - property.type = type; - Collections.addAll(property.values, values); - return property; - } - - public String getType() { - return type; - } - - public void setType(String type) { - this.type = type; - } - - public List getValues() { - return values; - } - - public boolean isDir() { - return dir; - } - - public void setDir(boolean dir) { - this.dir = dir; - } - - public boolean isItem() { - return !isDir(); - } - - public void setItem(boolean item) { - setDir(!item); - } - - public boolean isNickname() { - return "nickname".equals(type); - } - - public boolean isContactEvent() { - return "contact_event".equals(type); - } - - public boolean isRelation() { - return "relation".equals(type); - } - - @Override - protected void _validate(List warnings, VCardVersion version, VCard vcard){ - if (type == null){ - warnings.add(new Warning("No type specified.")); - } - if (isItem() && values.size() != 1){ - warnings.add(new Warning("Items must contain exactly one value.")); - } - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/common/vcard/ContactOperations.java b/QKSMS/src/main/java/com/moez/QKSMS/common/vcard/ContactOperations.java deleted file mode 100644 index 88ada6b95..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/common/vcard/ContactOperations.java +++ /dev/null @@ -1,560 +0,0 @@ -package com.moez.QKSMS.common.vcard; - -import android.annotation.TargetApi; -import android.content.ContentProviderOperation; -import android.content.ContentValues; -import android.content.Context; -import android.content.OperationApplicationException; -import android.os.Build; -import android.os.RemoteException; -import android.provider.ContactsContract; -import ezvcard.VCard; -import ezvcard.property.Address; -import ezvcard.property.Birthday; -import ezvcard.property.Email; -import ezvcard.property.FormattedName; -import ezvcard.property.Impp; -import ezvcard.property.Nickname; -import ezvcard.property.Note; -import ezvcard.property.Organization; -import ezvcard.property.Photo; -import ezvcard.property.RawProperty; -import ezvcard.property.StructuredName; -import ezvcard.property.Telephone; -import ezvcard.property.Title; -import ezvcard.property.Url; -import ezvcard.property.VCardProperty; -import ezvcard.util.TelUri; - -import java.text.DateFormat; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import static android.text.TextUtils.isEmpty; - -/* - Copyright (c) 2014-2015, Michael Angstadt - All rights reserved. - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - The views and conclusions contained in the software and documentation are those - of the authors and should not be interpreted as representing official policies, - either expressed or implied, of the FreeBSD Project. - */ - -/** - * Inserts a {@link VCard} into an Android database. - * - * @author Pratyush - * @author Michael Angstadt - */ -public class ContactOperations { - private static final int rawContactID = 0; - - private final Context context; - private final NonEmptyContentValues account; - - public ContactOperations(Context context) { - this(context, null, null); - } - - public ContactOperations(Context context, String accountName, String accountType) { - this.context = context; - - account = new NonEmptyContentValues(); - account.put(ContactsContract.RawContacts.ACCOUNT_TYPE, accountType); - account.put(ContactsContract.RawContacts.ACCOUNT_NAME, accountName); - } - - @TargetApi(Build.VERSION_CODES.HONEYCOMB) - public void insertContact(VCard vcard) throws RemoteException, OperationApplicationException { - // TODO handle Raw properties - Raw properties include various extension which start with "X-" like X-ASSISTANT, X-AIM, X-SPOUSE - - List contentValues = new ArrayList<>(); - contentValues.add(account); - - convertName(contentValues, vcard); - convertNickname(contentValues, vcard); - convertPhones(contentValues, vcard); - convertEmails(contentValues, vcard); - convertAddresses(contentValues, vcard); - convertIms(contentValues, vcard); - - // handle Android Custom fields..This is only valid for Android generated Vcards. As the Android would - // generate NickName, ContactEvents other than Birthday and RelationShip with this "X-ANDROID-CUSTOM" name - convertCustomFields(contentValues, vcard); - - // handle Iphone kinda of group properties. which are grouped together. - convertGroupedProperties(contentValues, vcard); - - convertBirthdays(contentValues, vcard); - - convertWebsites(contentValues, vcard); - convertNotes(contentValues, vcard); - convertPhotos(contentValues, vcard); - convertOrganization(contentValues, vcard); - - ArrayList operations = new ArrayList<>(contentValues.size()); - for (NonEmptyContentValues values : contentValues) { - ContentValues cv = values.getContentValues(); - if (cv.size() == 0) { - continue; - } - - //@formatter:off - ContentProviderOperation operation = - ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) - .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContactID) - .withValues(cv) - .build(); - //@formatter:on - operations.add(operation); - } - - // Executing all the insert operations as a single database transaction - context.getContentResolver().applyBatch(ContactsContract.AUTHORITY, operations); - } - - private void convertName(List contentValues, VCard vcard) { - NonEmptyContentValues values = new NonEmptyContentValues(ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE); - - String firstName = null, lastName = null, namePrefix = null, nameSuffix = null; - StructuredName n = vcard.getStructuredName(); - if (n != null) { - firstName = n.getGiven(); - values.put(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, firstName); - - lastName = n.getFamily(); - values.put(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME, lastName); - - List prefixes = n.getPrefixes(); - if (!prefixes.isEmpty()) { - namePrefix = prefixes.get(0); - values.put(ContactsContract.CommonDataKinds.StructuredName.PREFIX, namePrefix); - } - - List suffixes = n.getSuffixes(); - if (!suffixes.isEmpty()) { - nameSuffix = suffixes.get(0); - values.put(ContactsContract.CommonDataKinds.StructuredName.SUFFIX, nameSuffix); - } - } - - FormattedName fn = vcard.getFormattedName(); - String formattedName = (fn == null) ? null : fn.getValue(); - - String displayName; - if (isEmpty(formattedName)) { - StringBuilder sb = new StringBuilder(); - if (!isEmpty(namePrefix)){ - sb.append(namePrefix).append(' '); - } - if (!isEmpty(firstName)){ - sb.append(firstName).append(' '); - } - if (!isEmpty(lastName)){ - sb.append(lastName).append(' '); - } - if (!isEmpty(nameSuffix)){ - if (sb.length() > 0){ - sb.deleteCharAt(sb.length()-1); //delete space character - sb.append(", "); - } - sb.append(nameSuffix); - } - - displayName = sb.toString().trim(); - } else { - displayName = formattedName; - } - values.put(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, displayName); - - RawProperty xPhoneticFirstName = vcard.getExtendedProperty("X-PHONETIC-FIRST-NAME"); - String firstPhoneticName = (xPhoneticFirstName == null) ? null : xPhoneticFirstName.getValue(); - values.put(ContactsContract.CommonDataKinds.StructuredName.PHONETIC_GIVEN_NAME, firstPhoneticName); - - RawProperty xPhoneticLastName = vcard.getExtendedProperty("X-PHONETIC-LAST-NAME"); - String lastPhoneticName = (xPhoneticLastName == null) ? null : xPhoneticLastName.getValue(); - values.put(ContactsContract.CommonDataKinds.StructuredName.PHONETIC_FAMILY_NAME, lastPhoneticName); - - contentValues.add(values); - } - - private void convertNickname(List contentValues, VCard vcard) { - for (Nickname nickname : vcard.getNicknames()) { - List nicknameValues = nickname.getValues(); - if (nicknameValues.isEmpty()) { - continue; - } - - for (String nicknameValue : nicknameValues) { - NonEmptyContentValues cv = new NonEmptyContentValues(ContactsContract.CommonDataKinds.Nickname.CONTENT_ITEM_TYPE); - cv.put(ContactsContract.CommonDataKinds.Nickname.NAME, nicknameValue); - contentValues.add(cv); - } - } - } - - private void convertPhones(List contentValues, VCard vcard) { - for (Telephone telephone : vcard.getTelephoneNumbers()) { - String value = telephone.getText(); - TelUri uri = telephone.getUri(); - if (isEmpty(value)) { - if (uri == null) { - continue; - } - value = uri.toString(); - } - - int phoneKind = DataMappings.getPhoneType(telephone); - - NonEmptyContentValues cv = new NonEmptyContentValues(ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE); - cv.put(ContactsContract.CommonDataKinds.Phone.NUMBER, value); - cv.put(ContactsContract.CommonDataKinds.Phone.TYPE, phoneKind); - contentValues.add(cv); - } - } - - private void convertEmails(List contentValues, VCard vcard) { - for (Email email : vcard.getEmails()) { - String value = email.getValue(); - if (isEmpty(value)) { - continue; - } - - int emailKind = DataMappings.getEmailType(email); - - NonEmptyContentValues cv = new NonEmptyContentValues(ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE); - cv.put(ContactsContract.CommonDataKinds.Email.ADDRESS, value); - cv.put(ContactsContract.CommonDataKinds.Email.TYPE, emailKind); - contentValues.add(cv); - } - } - - private void convertAddresses(List contentValues, VCard vcard) { - for (Address address : vcard.getAddresses()) { - NonEmptyContentValues cv = new NonEmptyContentValues(ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE); - - String street = address.getStreetAddress(); - cv.put(ContactsContract.CommonDataKinds.StructuredPostal.STREET, street); - - String poBox = address.getPoBox(); - cv.put(ContactsContract.CommonDataKinds.StructuredPostal.POBOX, poBox); - - String city = address.getLocality(); - cv.put(ContactsContract.CommonDataKinds.StructuredPostal.CITY, city); - - String state = address.getRegion(); - cv.put(ContactsContract.CommonDataKinds.StructuredPostal.REGION, state); - - String zipCode = address.getPostalCode(); - cv.put(ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE, zipCode); - - String country = address.getCountry(); - cv.put(ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY, country); - - String label = address.getLabel(); - cv.put(ContactsContract.CommonDataKinds.StructuredPostal.LABEL, label); - - int addressKind = DataMappings.getAddressType(address); - cv.put(ContactsContract.CommonDataKinds.StructuredPostal.TYPE, addressKind); - - contentValues.add(cv); - } - } - - private void convertIms(List contentValues, VCard vcard) { - //handle extended properties - for (Map.Entry entry : DataMappings.getImPropertyNameMappings().entrySet()) { - String propertyName = entry.getKey(); - Integer protocolType = entry.getValue(); - List rawProperties = vcard.getExtendedProperties(propertyName); - for (RawProperty rawProperty : rawProperties) { - NonEmptyContentValues cv = new NonEmptyContentValues(ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE); - - String value = rawProperty.getValue(); - cv.put(ContactsContract.CommonDataKinds.Im.DATA, value); - - cv.put(ContactsContract.CommonDataKinds.Im.PROTOCOL, protocolType); - - contentValues.add(cv); - } - } - - //handle IMPP properties - for (Impp impp : vcard.getImpps()) { - NonEmptyContentValues cv = new NonEmptyContentValues(ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE); - - String immpAddress = impp.getHandle(); - cv.put(ContactsContract.CommonDataKinds.Im.DATA, immpAddress); - - int immpProtocolType = DataMappings.getIMTypeFromProtocol(impp.getProtocol()); - cv.put(ContactsContract.CommonDataKinds.Im.PROTOCOL, immpProtocolType); - - contentValues.add(cv); - } - } - - private void convertCustomFields(List contentValues, VCard vcard) { - for (AndroidCustomField customField : vcard.getProperties(AndroidCustomField.class)) { - List values = customField.getValues(); - if (values.isEmpty()) { - continue; - } - - NonEmptyContentValues cv; - if (customField.isNickname()) { - cv = new NonEmptyContentValues(ContactsContract.CommonDataKinds.Nickname.CONTENT_ITEM_TYPE); - cv.put(ContactsContract.CommonDataKinds.Nickname.NAME, values.get(0)); - } else if (customField.isContactEvent()) { - cv = new NonEmptyContentValues(ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE); - cv.put(ContactsContract.CommonDataKinds.Event.START_DATE, values.get(0)); - cv.put(ContactsContract.CommonDataKinds.Event.TYPE, values.get(1)); - } else if (customField.isRelation()) { - cv = new NonEmptyContentValues(ContactsContract.CommonDataKinds.Relation.CONTENT_ITEM_TYPE); - cv.put(ContactsContract.CommonDataKinds.Relation.NAME, values.get(0)); - cv.put(ContactsContract.CommonDataKinds.Relation.TYPE, values.get(1)); - } else { - continue; - } - - contentValues.add(cv); - } - } - - private void convertGroupedProperties(List contentValues, VCard vcard) { - List extendedProperties = vcard.getExtendedProperties(); - Map> orderedByGroup = orderPropertiesByGroup(extendedProperties); - final int ABDATE = 1, ABRELATEDNAMES = 2; - - for (List properties : orderedByGroup.values()) { - if (properties.size() == 1) { - continue; - } - - String label = null; - String val = null; - int mime = 0; - for (RawProperty property : properties) { - String name = property.getPropertyName(); - - if (name.equalsIgnoreCase("X-ABDATE")) { - label = property.getValue(); //date - mime = ABDATE; - continue; - } - - if (name.equalsIgnoreCase("X-ABRELATEDNAMES")) { - label = property.getValue(); //name - mime = ABRELATEDNAMES; - continue; - } - - if (name.equalsIgnoreCase("X-ABLABEL")) { - val = property.getValue(); // type of value ..Birthday,anniversary - continue; - } - } - - NonEmptyContentValues cv = null; - switch (mime) { - case ABDATE: - cv = new NonEmptyContentValues(ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE); - - cv.put(ContactsContract.CommonDataKinds.Event.START_DATE, label); - - int type = DataMappings.getDateType(val); - cv.put(ContactsContract.CommonDataKinds.Event.TYPE, type); - - break; - - case ABRELATEDNAMES: - if (val != null) { - cv = new NonEmptyContentValues(ContactsContract.CommonDataKinds.Nickname.CONTENT_ITEM_TYPE); - cv.put(ContactsContract.CommonDataKinds.Nickname.NAME, label); - - if (!val.equals("Nickname")) { - type = DataMappings.getNameType(val); - cv.put(ContactsContract.CommonDataKinds.Relation.TYPE, type); - } - } - - break; - - default: - continue; - } - - contentValues.add(cv); - } - } - - private void convertBirthdays(List contentValues, VCard vcard) { - DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); - for (Birthday birthday : vcard.getBirthdays()) { - Date date = birthday.getDate(); - if (date == null) { - continue; - } - - NonEmptyContentValues cv = new NonEmptyContentValues(ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE); - cv.put(ContactsContract.CommonDataKinds.Event.TYPE, ContactsContract.CommonDataKinds.Event.TYPE_BIRTHDAY); - cv.put(ContactsContract.CommonDataKinds.Event.START_DATE, df.format(date)); - contentValues.add(cv); - } - } - - private void convertWebsites(List contentValues, VCard vcard) { - for (Url url : vcard.getUrls()) { - String urlValue = url.getValue(); - if (isEmpty(urlValue)) { - continue; - } - - int type = DataMappings.getWebSiteType(url.getType()); - - NonEmptyContentValues cv = new NonEmptyContentValues(ContactsContract.CommonDataKinds.Website.CONTENT_ITEM_TYPE); - cv.put(ContactsContract.CommonDataKinds.Website.URL, urlValue); - cv.put(ContactsContract.CommonDataKinds.Website.TYPE, type); - contentValues.add(cv); - } - } - - private void convertNotes(List contentValues, VCard vcard) { - for (Note note : vcard.getNotes()) { - String noteValue = note.getValue(); - - NonEmptyContentValues cv = new NonEmptyContentValues(ContactsContract.CommonDataKinds.Note.CONTENT_ITEM_TYPE); - cv.put(ContactsContract.CommonDataKinds.Note.NOTE, noteValue); - contentValues.add(cv); - } - } - - private void convertPhotos(List contentValues, VCard vcard) { - for (Photo photo : vcard.getPhotos()) { - byte[] data = photo.getData(); - - NonEmptyContentValues cv = new NonEmptyContentValues(ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE); - cv.put(ContactsContract.CommonDataKinds.Photo.PHOTO, data); - contentValues.add(cv); - } - } - - private void convertOrganization(List contentValues, VCard vcard) { - NonEmptyContentValues cv = new NonEmptyContentValues(ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE); - - Organization organization = vcard.getOrganization(); - if (organization != null) { - List values = organization.getValues(); - String keys[] = { ContactsContract.CommonDataKinds.Organization.COMPANY, ContactsContract.CommonDataKinds.Organization.DEPARTMENT, ContactsContract.CommonDataKinds.Organization.OFFICE_LOCATION }; - for (int i = 0; i < values.size(); i++) { - String key = keys[i]; - String value = values.get(i); - cv.put(key, value); - } - } - - List titleList = vcard.getTitles(); - if (!titleList.isEmpty()) { - cv.put(ContactsContract.CommonDataKinds.Organization.TITLE, titleList.get(0).getValue()); - } - - contentValues.add(cv); - } - - /** - * Groups properties by their group name. - * @param properties the properties to group - * @return a map where the key is the group name (null for no group) and the - * value is the list of properties that belong to that group - */ - private <T extends VCardProperty> Map<String, List<T>> orderPropertiesByGroup(List<T> properties) { - Map<String, List<T>> groupedProperties = new HashMap<>(); - - for (T property : properties) { - String group = property.getGroup(); - if (isEmpty(group)) { - continue; - } - - List<T> groupPropertiesList = groupedProperties.get(group); - if (groupPropertiesList == null) { - groupPropertiesList = new ArrayList<T>(); - groupedProperties.put(group, groupPropertiesList); - } - groupPropertiesList.add(property); - } - - return groupedProperties; - } - - /** - * A wrapper for {@link ContentValues} that only adds values which are - * non-null and non-empty (in the case of Strings). - */ - private static class NonEmptyContentValues { - private final ContentValues contentValues = new ContentValues(); - private final String contentItemType; - - public NonEmptyContentValues() { - this(null); - } - - /** - * @param contentItemType the MIME type (value of - * {@link ContactsContract.Contacts.Data#MIMETYPE}) - */ - public NonEmptyContentValues(String contentItemType) { - this.contentItemType = contentItemType; - } - - public void put(String key, String value) { - if (isEmpty(value)) { - return; - } - contentValues.put(key, value); - } - - public void put(String key, int value) { - contentValues.put(key, value); - } - - public void put(String key, byte[] value) { - if (value == null) { - return; - } - contentValues.put(key, value); - } - - /** - * Gets the wrapped {@link ContentValues} object, adding the MIME type - * entry if the values map is not empty. - * @return the wrapped {@link ContentValues} object - */ - public ContentValues getContentValues() { - if (contentValues.size() > 0 && contentItemType != null) { - put(ContactsContract.Contacts.Data.MIMETYPE, contentItemType); - } - return contentValues; - } - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/common/vcard/DataMappings.java b/QKSMS/src/main/java/com/moez/QKSMS/common/vcard/DataMappings.java deleted file mode 100644 index 3937766f1..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/common/vcard/DataMappings.java +++ /dev/null @@ -1,287 +0,0 @@ -package com.moez.QKSMS.common.vcard; - -import android.provider.ContactsContract; -import ezvcard.parameter.AddressType; -import ezvcard.parameter.EmailType; -import ezvcard.parameter.TelephoneType; -import ezvcard.property.Address; -import ezvcard.property.Email; -import ezvcard.property.Impp; -import ezvcard.property.Telephone; - -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; - -/* - Copyright (c) 2014-2015, Michael Angstadt - All rights reserved. - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - The views and conclusions contained in the software and documentation are those - of the authors and should not be interpreted as representing official policies, - either expressed or implied, of the FreeBSD Project. - */ - -/** - * Maps between vCard contact data types and Android {@link ContactsContract} - * data types. - * - * @author Pratyush - * @author Julien Garrigou - * @author Michael Angstadt - */ -public class DataMappings { - private static final Map<TelephoneType, Integer> phoneTypeMappings; - static { - Map<TelephoneType, Integer> m = new HashMap<>(); - m.put(TelephoneType.BBS, ContactsContract.CommonDataKinds.Phone.TYPE_CUSTOM); - m.put(TelephoneType.CAR, ContactsContract.CommonDataKinds.Phone.TYPE_CAR); - m.put(TelephoneType.CELL, ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE); - m.put(TelephoneType.FAX, ContactsContract.CommonDataKinds.Phone.TYPE_FAX_HOME); - m.put(TelephoneType.HOME, ContactsContract.CommonDataKinds.Phone.TYPE_HOME); - m.put(TelephoneType.ISDN, ContactsContract.CommonDataKinds.Phone.TYPE_ISDN); - m.put(TelephoneType.MODEM, ContactsContract.CommonDataKinds.Phone.TYPE_OTHER); - m.put(TelephoneType.PAGER, ContactsContract.CommonDataKinds.Phone.TYPE_PAGER); - m.put(TelephoneType.MSG, ContactsContract.CommonDataKinds.Phone.TYPE_MMS); - m.put(TelephoneType.PCS, ContactsContract.CommonDataKinds.Phone.TYPE_OTHER); - m.put(TelephoneType.TEXT, ContactsContract.CommonDataKinds.Phone.TYPE_MMS); - m.put(TelephoneType.TEXTPHONE, ContactsContract.CommonDataKinds.Phone.TYPE_MMS); - m.put(TelephoneType.VIDEO, ContactsContract.CommonDataKinds.Phone.TYPE_OTHER); - m.put(TelephoneType.WORK, ContactsContract.CommonDataKinds.Phone.TYPE_WORK); - m.put(TelephoneType.VOICE, ContactsContract.CommonDataKinds.Phone.TYPE_OTHER); - phoneTypeMappings = Collections.unmodifiableMap(m); - } - - private static final Map<String, Integer> websiteTypeMappings; - static { - Map<String, Integer> m = new HashMap<>(); - m.put("home", ContactsContract.CommonDataKinds.Website.TYPE_HOME); - m.put("work", ContactsContract.CommonDataKinds.Website.TYPE_WORK); - m.put("homepage", ContactsContract.CommonDataKinds.Website.TYPE_HOMEPAGE); - m.put("profile", ContactsContract.CommonDataKinds.Website.TYPE_PROFILE); - websiteTypeMappings = Collections.unmodifiableMap(m); - } - - private static final Map<EmailType, Integer> emailTypeMappings; - static { - Map<EmailType, Integer> m = new HashMap<>(); - m.put(EmailType.HOME, ContactsContract.CommonDataKinds.Email.TYPE_HOME); - m.put(EmailType.WORK, ContactsContract.CommonDataKinds.Email.TYPE_WORK); - emailTypeMappings = Collections.unmodifiableMap(m); - } - - private static final Map<AddressType, Integer> addressTypeMappings; - static { - Map<AddressType, Integer> m = new HashMap<>(); - m.put(AddressType.HOME, ContactsContract.CommonDataKinds.StructuredPostal.TYPE_HOME); - m.put(AddressType.get("business"), ContactsContract.CommonDataKinds.StructuredPostal.TYPE_WORK); - m.put(AddressType.WORK, ContactsContract.CommonDataKinds.StructuredPostal.TYPE_WORK); - m.put(AddressType.get("other"), ContactsContract.CommonDataKinds.StructuredPostal.TYPE_OTHER); - addressTypeMappings = Collections.unmodifiableMap(m); - } - - private static final Map<String, Integer> abRelatedNamesMappings; - static { - Map<String, Integer> m = new HashMap<>(); - m.put("father", ContactsContract.CommonDataKinds.Relation.TYPE_FATHER); - m.put("spouse", ContactsContract.CommonDataKinds.Relation.TYPE_SPOUSE); - m.put("mother", ContactsContract.CommonDataKinds.Relation.TYPE_MOTHER); - m.put("brother", ContactsContract.CommonDataKinds.Relation.TYPE_BROTHER); - m.put("parent", ContactsContract.CommonDataKinds.Relation.TYPE_PARENT); - m.put("sister", ContactsContract.CommonDataKinds.Relation.TYPE_SISTER); - m.put("child", ContactsContract.CommonDataKinds.Relation.TYPE_CHILD); - m.put("assistant", ContactsContract.CommonDataKinds.Relation.TYPE_ASSISTANT); - m.put("partner", ContactsContract.CommonDataKinds.Relation.TYPE_PARTNER); - m.put("manager", ContactsContract.CommonDataKinds.Relation.TYPE_MANAGER); - abRelatedNamesMappings = Collections.unmodifiableMap(m); - } - - private static final Map<String, Integer> abDateMappings; - static { - Map<String, Integer> m = new HashMap<>(); - m.put("anniversary", ContactsContract.CommonDataKinds.Event.TYPE_ANNIVERSARY); - m.put("other", ContactsContract.CommonDataKinds.Event.TYPE_OTHER); - abDateMappings = Collections.unmodifiableMap(m); - } - - private static final Map<String, Integer> imPropertyNameMappings; - static{ - Map<String, Integer> m = new HashMap<>(); - m.put("X-AIM", ContactsContract.CommonDataKinds.Im.PROTOCOL_AIM); - m.put("X-ICQ", ContactsContract.CommonDataKinds.Im.PROTOCOL_ICQ); - m.put("X-QQ", ContactsContract.CommonDataKinds.Im.PROTOCOL_ICQ); - m.put("X-GOOGLE-TALK", ContactsContract.CommonDataKinds.Im.PROTOCOL_CUSTOM); - m.put("X-JABBER", ContactsContract.CommonDataKinds.Im.PROTOCOL_JABBER); - m.put("X-MSN", ContactsContract.CommonDataKinds.Im.PROTOCOL_MSN); - m.put("X-MS-IMADDRESS", ContactsContract.CommonDataKinds.Im.PROTOCOL_MSN); - m.put("X-YAHOO", ContactsContract.CommonDataKinds.Im.PROTOCOL_YAHOO); - m.put("X-SKYPE", ContactsContract.CommonDataKinds.Im.PROTOCOL_SKYPE); - m.put("X-SKYPE-USERNAME", ContactsContract.CommonDataKinds.Im.PROTOCOL_SKYPE); - m.put("X-TWITTER", ContactsContract.CommonDataKinds.Im.PROTOCOL_CUSTOM); - imPropertyNameMappings = Collections.unmodifiableMap(m); - } - - private static final Map<String, Integer> imProtocolMappings; - static{ - Map<String, Integer> m = new HashMap<>(); - m.put("aim", ContactsContract.CommonDataKinds.Im.PROTOCOL_AIM); - m.put("icq", ContactsContract.CommonDataKinds.Im.PROTOCOL_ICQ); - m.put("msn", ContactsContract.CommonDataKinds.Im.PROTOCOL_MSN); - m.put("ymsgr", ContactsContract.CommonDataKinds.Im.PROTOCOL_YAHOO); - m.put("skype", ContactsContract.CommonDataKinds.Im.PROTOCOL_SKYPE); - imProtocolMappings = Collections.unmodifiableMap(m); - } - - /** - * Maps the value of a URL property's TYPE parameter to the appropriate - * Android {@link ContactsContract.CommonDataKinds.Website} value. - * @param type the TYPE parameter value (can be null) - * @return the Android type - */ - public static int getWebSiteType(String type) { - if (type == null){ - return ContactsContract.CommonDataKinds.Website.TYPE_CUSTOM; - } - - type = type.toLowerCase(); - Integer value = websiteTypeMappings.get(type); - return (value == null) ? ContactsContract.CommonDataKinds.Website.TYPE_CUSTOM : value; - } - - /** - * Maps the value of a X-ABLABEL property to the appropriate - * Android {@link ContactsContract.CommonDataKinds.Event} value. - * @param type the property value - * @return the Android type - */ - public static int getDateType(String type) { - if (type == null) { - return ContactsContract.CommonDataKinds.Event.TYPE_OTHER; - } - - type = type.toLowerCase(); - for (Map.Entry<String, Integer> entry : abDateMappings.entrySet()){ - if (type.contains(entry.getKey())){ - return entry.getValue(); - } - } - return ContactsContract.CommonDataKinds.Event.TYPE_OTHER; - } - - /** - * Maps the value of a X-ABLABEL property to the appropriate - * Android {@link ContactsContract.CommonDataKinds.Relation} value. - * @param type the property value - * @return the Android type - */ - public static int getNameType(String type) { - if (type == null) { - return ContactsContract.CommonDataKinds.Relation.TYPE_CUSTOM; - } - - type = type.toLowerCase(); - for (Map.Entry<String, Integer> entry : abRelatedNamesMappings.entrySet()){ - if (type.contains(entry.getKey())){ - return entry.getValue(); - } - } - return ContactsContract.CommonDataKinds.Relation.TYPE_CUSTOM; - } - - /** - * Gets the mappings that associate an extended property name (e.g. "X-AIM") - * with its appropriate Android {@link ContactsContract.CommonDataKinds.Im} - * value. - * @return the mappings (the key is the property name, the value is the Android value) - */ - public static Map<String, Integer> getImPropertyNameMappings(){ - return imPropertyNameMappings; - } - - /** - * Converts an IM protocol from a {@link Impp} property (e.g. "aim") to the - * appropriate Android {@link ContactsContract.CommonDataKinds.Im} value. - * @param protocol the IM protocol (e.g. "aim", can be null) - * @return the Android value - */ - public static int getIMTypeFromProtocol(String protocol) { - if (protocol == null){ - return ContactsContract.CommonDataKinds.Im.PROTOCOL_CUSTOM; - } - - protocol = protocol.toLowerCase(); - Integer value = imProtocolMappings.get(protocol); - return (value == null) ? ContactsContract.CommonDataKinds.Im.PROTOCOL_CUSTOM : value; - } - - /** - * Determines the appropriate Android - * {@link ContactsContract.CommonDataKinds.Phone} value for a - * {@link Telephone} property. - * @param property the property - * @return the Android type value - */ - public static int getPhoneType(Telephone property) { - for (TelephoneType type : property.getTypes()){ - Integer androidType = phoneTypeMappings.get(type); - if (androidType != null){ - return androidType; - } - } - return ContactsContract.CommonDataKinds.Phone.TYPE_OTHER; - } - - /** - * Determines the appropriate Android - * {@link ContactsContract.CommonDataKinds.Email} value for an {@link Email} - * property. - * @param property the property - * @return the Android type value - */ - public static int getEmailType(Email property) { - for (EmailType type : property.getTypes()){ - Integer androidType = emailTypeMappings.get(type); - if (androidType != null){ - return androidType; - } - } - return ContactsContract.CommonDataKinds.Email.TYPE_OTHER; - } - - /** - * Determines the appropriate Android - * {@link ContactsContract.CommonDataKinds.StructuredPostal} value for an - * {@link Address} property. - * @param property the property - * @return the Android type value - */ - public static int getAddressType(Address property) { - for (AddressType type : property.getTypes()){ - Integer androidType = addressTypeMappings.get(type); - if (androidType != null){ - return androidType; - } - } - return ContactsContract.CommonDataKinds.StructuredPostal.TYPE_CUSTOM; - } - - private DataMappings(){ - //hide constructor - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/data/Contact.java b/QKSMS/src/main/java/com/moez/QKSMS/data/Contact.java deleted file mode 100644 index 4d447f4e0..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/data/Contact.java +++ /dev/null @@ -1,1189 +0,0 @@ -package com.moez.QKSMS.data; - -import android.content.ContentUris; -import android.content.Context; -import android.database.ContentObserver; -import android.database.Cursor; -import android.database.sqlite.SqliteWrapper; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.graphics.drawable.BitmapDrawable; -import android.graphics.drawable.Drawable; -import android.net.Uri; -import android.os.Handler; -import android.os.Parcelable; -import android.provider.ContactsContract.CommonDataKinds.Email; -import android.provider.ContactsContract.CommonDataKinds.Phone; -import android.provider.ContactsContract.Contacts; -import android.provider.ContactsContract.Data; -import android.provider.ContactsContract.Presence; -import android.provider.ContactsContract.Profile; -import android.text.TextUtils; -import android.util.Log; - -import com.moez.QKSMS.LogTag; -import com.moez.QKSMS.QKSMSApp; -import com.moez.QKSMS.R; -import com.moez.QKSMS.common.utils.PhoneNumberUtils; -import com.moez.QKSMS.transaction.SmsHelper; - -import java.io.IOException; -import java.io.InputStream; -import java.nio.CharBuffer; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; - -public class Contact { - public static final int CONTACT_METHOD_TYPE_UNKNOWN = 0; - public static final int CONTACT_METHOD_TYPE_PHONE = 1; - public static final int CONTACT_METHOD_TYPE_EMAIL = 2; - public static final int CONTACT_METHOD_TYPE_SELF = 3; // the "Me" or profile contact - public static final String TEL_SCHEME = "tel"; - public static final String CONTENT_SCHEME = "content"; - private static final int CONTACT_METHOD_ID_UNKNOWN = -1; - private static final String TAG = "Contact"; - private static ContactsCache sContactCache; - private static final String SELF_ITEM_KEY = "Self_Item_Key"; - -// private static final ContentObserver sContactsObserver = new ContentObserver(new Handler()) { -// @Override -// public void onChange(boolean selfUpdate) { -// if (Log.isLoggable(LogTag.APP, Log.VERBOSE)) { -// log("contact changed, invalidate cache"); -// } -// invalidateCache(); -// } -// }; - - private static final ContentObserver sPresenceObserver = new ContentObserver(new Handler()) { - @Override - public void onChange(boolean selfUpdate) { - if (Log.isLoggable(LogTag.APP, Log.VERBOSE)) { - log("presence changed, invalidate cache"); - } - invalidateCache(); - } - }; - - private final static HashSet<UpdateListener> mListeners = new HashSet<>(); - - private long mContactMethodId; // Id in phone or email Uri returned by provider of current - // Contact, -1 is invalid. e.g. contact method id is 20 when - // current contact has phone content://.../phones/20. - private int mContactMethodType; - private String mNumber; - private String mNumberE164; - private String mName; - private String mNameAndNumber; // for display, e.g. Fred Flintstone <670-782-1123> - private boolean mNumberIsModified; // true if the number is modified - - private long mRecipientId; // used to find the Recipient cache entry - private String mLabel; - private long mPersonId; - private int mPresenceResId; // TODO: make this a state instead of a res ID - private String mPresenceText; - private BitmapDrawable mAvatar; - private byte [] mAvatarData; - private boolean mIsStale; - private boolean mQueryPending; - private boolean mIsMe; // true if this contact is me! - private boolean mSendToVoicemail; // true if this contact should not put up notification - - public interface UpdateListener { - public void onUpdate(Contact updated); - } - - private Contact(String number, String name) { - init(number, name); - } - /* - * Make a basic contact object with a phone number. - */ - private Contact(String number) { - init(number, ""); - } - - private Contact(boolean isMe) { - init(SELF_ITEM_KEY, ""); - mIsMe = isMe; - } - - private void init(String number, String name) { - mContactMethodId = CONTACT_METHOD_ID_UNKNOWN; - mName = name; - setNumber(number); - mNumberIsModified = false; - mLabel = ""; - mPersonId = 0; - mPresenceResId = 0; - mIsStale = true; - mSendToVoicemail = false; - } - - @Override - public String toString() { - return String.format("{ number=%s, name=%s, nameAndNumber=%s, label=%s, person_id=%d, hash=%d method_id=%d }", - (mNumber != null ? mNumber : "null"), - (mName != null ? mName : "null"), - (mNameAndNumber != null ? mNameAndNumber : "null"), - (mLabel != null ? mLabel : "null"), - mPersonId, hashCode(), - mContactMethodId); - } - - public static void logWithTrace(String tag, String msg, Object... format) { - Thread current = Thread.currentThread(); - StackTraceElement[] stack = current.getStackTrace(); - - StringBuilder sb = new StringBuilder(); - sb.append("["); - sb.append(current.getId()); - sb.append("] "); - sb.append(String.format(msg, format)); - - sb.append(" <- "); - int stop = stack.length > 7 ? 7 : stack.length; - for (int i = 3; i < stop; i++) { - String methodName = stack[i].getMethodName(); - sb.append(methodName); - if ((i+1) != stop) { - sb.append(" <- "); - } - } - - Log.d(tag, sb.toString()); - } - - public static Contact get(String number, boolean canBlock) { - return sContactCache.get(number, canBlock); - } - - public static Contact getMe(boolean canBlock) { - return sContactCache.getMe(canBlock); - } - - public void removeFromCache() { - sContactCache.remove(this); - } - - public static List<Contact> getByPhoneUris(Parcelable[] uris) { - return sContactCache.getContactInfoForPhoneUris(uris); - } - - public static void invalidateCache() { - if (Log.isLoggable(LogTag.APP, Log.VERBOSE)) { - log("invalidateCache"); - } - - // While invalidating our local Cache doesn't remove the contacts, it will mark them - // stale so the next time we're asked for a particular contact, we'll return that - // stale contact and at the same time, fire off an asyncUpdateContact to update - // that contact's info in the background. UI elements using the contact typically - // call addListener() so they immediately get notified when the contact has been - // updated with the latest info. They redraw themselves when we call the - // listener's onUpdate(). - sContactCache.invalidate(); - } - - public boolean isMe() { - return mIsMe; - } - - private static String emptyIfNull(String s) { - return (s != null ? s : ""); - } - - /** - * Fomat the name and number. - * - * @param name - * @param number - * @param numberE164 the number's E.164 representation, is used to get the - * country the number belongs to. - * @return the formatted name and number - */ - public static String formatNameAndNumber(String name, String number, String numberE164) { - // Format like this: Mike Cleron <(650) 555-1234> - // Erick Tseng <(650) 555-1212> - // Tutankhamun <tutank1341@gmail.com> - // (408) 555-1289 - String formattedNumber = number; - if (!SmsHelper.isEmailAddress(number)) { - formattedNumber = PhoneNumberUtils.formatNumber(number, numberE164, QKSMSApp.getApplication().getCurrentCountryIso()); - } - - if (!TextUtils.isEmpty(name) && !name.equals(number)) { - return name + " <" + formattedNumber + ">"; - } else { - return formattedNumber; - } - } - - public synchronized void reload() { - mIsStale = true; - sContactCache.get(mNumber, false); - } - - public synchronized String getNumber() { - return mNumber; - } - - public synchronized void setNumber(String number) { - if (!SmsHelper.isEmailAddress(number)) { - mNumber = PhoneNumberUtils.formatNumber(number, mNumberE164, QKSMSApp.getApplication().getCurrentCountryIso()); - } else { - mNumber = number; - } - notSynchronizedUpdateNameAndNumber(); - mNumberIsModified = true; - } - - public boolean isNumberModified() { - return mNumberIsModified; - } - - public boolean getSendToVoicemail() { - return mSendToVoicemail; - } - - public void setIsNumberModified(boolean flag) { - mNumberIsModified = flag; - } - - public synchronized String getName() { - if (TextUtils.isEmpty(mName)) { - return mNumber; - } else { - return mName; - } - } - - public synchronized boolean isNamed() { - return !TextUtils.isEmpty(mName); - } - - public synchronized String getNameAndNumber() { - return mNameAndNumber; - } - - private void notSynchronizedUpdateNameAndNumber() { - mNameAndNumber = formatNameAndNumber(mName, mNumber, mNumberE164); - } - - public synchronized long getRecipientId() { - return mRecipientId; - } - - public synchronized void setRecipientId(long id) { - mRecipientId = id; - } - - public synchronized String getLabel() { - return mLabel; - } - - public synchronized Uri getUri() { - return ContentUris.withAppendedId(Contacts.CONTENT_URI, mPersonId); - } - - public synchronized int getPresenceResId() { - return mPresenceResId; - } - - public synchronized boolean existsInDatabase() { - return (mPersonId > 0); - } - - public static void addListener(UpdateListener l) { - synchronized (mListeners) { - mListeners.add(l); - } - } - - public static void removeListener(UpdateListener l) { - synchronized (mListeners) { - mListeners.remove(l); - } - } - - public static void dumpListeners() { - synchronized (mListeners) { - int i = 0; - Log.i(TAG, "[Contact] dumpListeners; size=" + mListeners.size()); - for (UpdateListener listener : mListeners) { - Log.i(TAG, "["+ (i++) + "]" + listener); - } - } - } - - public synchronized boolean isEmail() { - return SmsHelper.isEmailAddress(mNumber); - } - - public String getPresenceText() { - return mPresenceText; - } - - public int getContactMethodType() { - return mContactMethodType; - } - - public long getContactMethodId() { - return mContactMethodId; - } - - public synchronized Uri getPhoneUri() { - if (existsInDatabase()) { - return ContentUris.withAppendedId(Phone.CONTENT_URI, mContactMethodId); - } else { - Uri.Builder ub = new Uri.Builder(); - ub.scheme(TEL_SCHEME); - ub.encodedOpaquePart(mNumber); - return ub.build(); - } - } - - public synchronized Drawable getAvatar(Context context, Drawable defaultValue) { - if (mAvatar == null) { - if (mAvatarData != null) { - Bitmap b = BitmapFactory.decodeByteArray(mAvatarData, 0, mAvatarData.length); - mAvatar = new BitmapDrawable(context.getResources(), b); - } - } - return mAvatar != null ? mAvatar : defaultValue; - } - - public static void init(final Context context) { - if (sContactCache != null) { // Stop previous Runnable - sContactCache.mTaskQueue.mWorkerThread.interrupt(); - } - sContactCache = new ContactsCache(context); - - RecipientIdCache.init(context); - - // it maybe too aggressive to listen for *any* contact changes, and rebuild MMS contact - // cache each time that occurs. Unless we can get targeted updates for the contacts we - // care about(which probably won't happen for a long time), we probably should just - // invalidate cache peoridically, or surgically. - /* - context.getContentResolver().registerContentObserver( - Contacts.CONTENT_URI, true, sContactsObserver); - */ - } - - public static void dump() { - sContactCache.dump(); - } - - private static class ContactsCache { - private final TaskStack mTaskQueue = new TaskStack(); - private static final String SEPARATOR = ";"; - - /** - * For a specified phone number, 2 rows were inserted into phone_lookup - * table. One is the phone number's E164 representation, and another is - * one's normalized format. If the phone number's normalized format in - * the lookup table is the suffix of the given number's one, it is - * treated as matched CallerId. E164 format number must fully equal. - * - * For example: Both 650-123-4567 and +1 (650) 123-4567 will match the - * normalized number 6501234567 in the phone lookup. - * - * The min_match is used to narrow down the candidates for the final - * comparison. - */ - // query params for caller id lookup - private static final String CALLER_ID_SELECTION = " Data._ID IN " - + " (SELECT DISTINCT lookup.data_id " - + " FROM " - + " (SELECT data_id, normalized_number, length(normalized_number) as len " - + " FROM phone_lookup " - + " WHERE min_match = ?) AS lookup " - + " WHERE lookup.normalized_number = ? OR" - + " (lookup.len <= ? AND " - + " substr(?, ? - lookup.len + 1) = lookup.normalized_number))"; - - // query params for caller id lookup without E164 number as param - private static final String CALLER_ID_SELECTION_WITHOUT_E164 = " Data._ID IN " - + " (SELECT DISTINCT lookup.data_id " - + " FROM " - + " (SELECT data_id, normalized_number, length(normalized_number) as len " - + " FROM phone_lookup " - + " WHERE min_match = ?) AS lookup " - + " WHERE " - + " (lookup.len <= ? AND " - + " substr(?, ? - lookup.len + 1) = lookup.normalized_number))"; - - // Utilizing private API - private static final Uri PHONES_WITH_PRESENCE_URI = Data.CONTENT_URI; - - private static final String[] CALLER_ID_PROJECTION = new String[] { - Phone._ID, // 0 - Phone.NUMBER, // 1 - Phone.LABEL, // 2 - Phone.DISPLAY_NAME, // 3 - Phone.CONTACT_ID, // 4 - Phone.CONTACT_PRESENCE, // 5 - Phone.CONTACT_STATUS, // 6 - Phone.NORMALIZED_NUMBER, // 7 - Contacts.SEND_TO_VOICEMAIL // 8 - }; - - private static final int PHONE_ID_COLUMN = 0; - private static final int PHONE_NUMBER_COLUMN = 1; - private static final int PHONE_LABEL_COLUMN = 2; - private static final int CONTACT_NAME_COLUMN = 3; - private static final int CONTACT_ID_COLUMN = 4; - private static final int CONTACT_PRESENCE_COLUMN = 5; - private static final int CONTACT_STATUS_COLUMN = 6; - private static final int PHONE_NORMALIZED_NUMBER = 7; - private static final int SEND_TO_VOICEMAIL = 8; - - private static final String[] SELF_PROJECTION = new String[] { - Phone._ID, // 0 - Phone.DISPLAY_NAME, // 1 - }; - - private static final int SELF_ID_COLUMN = 0; - private static final int SELF_NAME_COLUMN = 1; - - // query params for contact lookup by email - private static final Uri EMAIL_WITH_PRESENCE_URI = Data.CONTENT_URI; - - private static final String EMAIL_SELECTION = "UPPER(" + Email.DATA + ")=UPPER(?) AND " - + Data.MIMETYPE + "='" + Email.CONTENT_ITEM_TYPE + "'"; - - private static final String[] EMAIL_PROJECTION = new String[] { - Email._ID, // 0 - Email.DISPLAY_NAME, // 1 - Email.CONTACT_PRESENCE, // 2 - Email.CONTACT_ID, // 3 - Phone.DISPLAY_NAME, // 4 - Contacts.SEND_TO_VOICEMAIL // 5 - }; - private static final int EMAIL_ID_COLUMN = 0; - private static final int EMAIL_NAME_COLUMN = 1; - private static final int EMAIL_STATUS_COLUMN = 2; - private static final int EMAIL_CONTACT_ID_COLUMN = 3; - private static final int EMAIL_CONTACT_NAME_COLUMN = 4; - private static final int EMAIL_SEND_TO_VOICEMAIL_COLUMN = 5; - - private final Context mContext; - - private final HashMap<String, ArrayList<Contact>> mContactsHash = new HashMap<>(); - - private ContactsCache(Context context) { - mContext = context; - } - - void dump() { - synchronized (ContactsCache.this) { - Log.d(TAG, "**** Contact cache dump ****"); - for (String key : mContactsHash.keySet()) { - ArrayList<Contact> alc = mContactsHash.get(key); - for (Contact c : alc) { - Log.d(TAG, key + " ==> " + c.toString()); - } - } - } - } - - private static class TaskStack { - Thread mWorkerThread; - private final ArrayList<Runnable> mThingsToLoad; - - public TaskStack() { - mThingsToLoad = new ArrayList<Runnable>(); - mWorkerThread = new Thread(new Runnable() { - @Override - public void run() { - while (true) { - Runnable r = null; - synchronized (mThingsToLoad) { - if (mThingsToLoad.isEmpty()) { - try { - mThingsToLoad.wait(); - } catch (InterruptedException ex) { - break; // Exception sent by Contact.init() to stop Runnable - } - } - if (!mThingsToLoad.isEmpty()) { - r = mThingsToLoad.remove(0); - } - } - if (r != null) { - r.run(); - } - } - } - }, "Contact.ContactsCache.TaskStack worker thread"); - mWorkerThread.setPriority(Thread.MIN_PRIORITY); - mWorkerThread.start(); - } - - public void push(Runnable r) { - synchronized (mThingsToLoad) { - mThingsToLoad.add(r); - mThingsToLoad.notify(); - } - } - } - - public void pushTask(Runnable r) { - mTaskQueue.push(r); - } - - public Contact getMe(boolean canBlock) { - return get(SELF_ITEM_KEY, true, canBlock); - } - - public Contact get(String number, boolean canBlock) { - return get(number, false, canBlock); - } - - private Contact get(String number, boolean isMe, boolean canBlock) { - if (Log.isLoggable(LogTag.CONTACT, Log.DEBUG)) { - logWithTrace(TAG, "get(%s, %s, %s)", number, isMe, canBlock); - } - - if (TextUtils.isEmpty(number)) { - number = ""; // In some places (such as Korea), it's possible to receive - // a message without the sender's address. In this case, - // all such anonymous messages will get added to the same - // thread. - } - - // Always return a Contact object, if if we don't have an actual contact - // in the contacts db. - Contact contact = internalGet(number, isMe); - Runnable r = null; - - synchronized (contact) { - // If there's a query pending and we're willing to block then - // wait here until the query completes. - while (canBlock && contact.mQueryPending) { - try { - contact.wait(); - } catch (InterruptedException ex) { - // try again by virtue of the loop unless mQueryPending is false - } - } - - // If we're stale and we haven't already kicked off a query then kick - // it off here. - if (contact.mIsStale && !contact.mQueryPending) { - contact.mIsStale = false; - - if (Log.isLoggable(LogTag.APP, Log.VERBOSE)) { - log("async update for " + contact.toString() + " canBlock: " + canBlock + - " isStale: " + contact.mIsStale); - } - - final Contact c = contact; - r = new Runnable() { - @Override - public void run() { - updateContact(c); - } - }; - - // set this to true while we have the lock on contact since we will - // either run the query directly (canBlock case) or push the query - // onto the queue. In either case the mQueryPending will get set - // to false via updateContact. - contact.mQueryPending = true; - } - } - // do this outside of the synchronized so we don't hold up any - // subsequent calls to "get" on other threads - if (r != null) { - if (canBlock) { - r.run(); - } else { - pushTask(r); - } - } - return contact; - } - - /** - * Get CacheEntry list for given phone URIs. This method will do single one query to - * get expected contacts from provider. Be sure passed in URIs are not null and contains - * only valid URIs. - */ - public List<Contact> getContactInfoForPhoneUris(Parcelable[] uris) { - if (uris.length == 0) { - return null; - } - StringBuilder idSetBuilder = new StringBuilder(); - boolean first = true; - for (Parcelable p : uris) { - Uri uri = (Uri) p; - if ("content".equals(uri.getScheme())) { - if (first) { - first = false; - idSetBuilder.append(uri.getLastPathSegment()); - } else { - idSetBuilder.append(',').append(uri.getLastPathSegment()); - } - } - } - // Check whether there is content URI. - if (first) return null; - Cursor cursor = null; - if (idSetBuilder.length() > 0) { - final String whereClause = Phone._ID + " IN (" + idSetBuilder.toString() + ")"; - cursor = mContext.getContentResolver().query( - PHONES_WITH_PRESENCE_URI, CALLER_ID_PROJECTION, whereClause, null, null); - } - - if (cursor == null) { - return null; - } - - List<Contact> entries = new ArrayList<>(); - - try { - while (cursor.moveToNext()) { - Contact entry = new Contact(cursor.getString(PHONE_NUMBER_COLUMN), - cursor.getString(CONTACT_NAME_COLUMN)); - fillPhoneTypeContact(entry, cursor); - ArrayList<Contact> value = new ArrayList<>(); - value.add(entry); - // Put the result in the cache. - mContactsHash.put(key(entry.mNumber, sStaticKeyBuffer), value); - entries.add(entry); - } - } finally { - cursor.close(); - } - return entries; - } - - private boolean contactChanged(Contact orig, Contact newContactData) { - // The phone number should never change, so don't bother checking. - // TODO: Maybe update it if it has gotten longer, i.e. 650-234-5678 -> +16502345678? - - // Do the quick check first. - if (orig.mContactMethodType != newContactData.mContactMethodType) { - return true; - } - - if (orig.mContactMethodId != newContactData.mContactMethodId) { - return true; - } - - if (orig.mPersonId != newContactData.mPersonId) { - if (Log.isLoggable(LogTag.CONTACT, Log.DEBUG)) { - Log.d(TAG, "person id changed"); - } - return true; - } - - if (orig.mPresenceResId != newContactData.mPresenceResId) { - if (Log.isLoggable(LogTag.CONTACT, Log.DEBUG)) { - Log.d(TAG, "presence changed"); - } - return true; - } - - if (orig.mSendToVoicemail != newContactData.mSendToVoicemail) { - return true; - } - - String oldName = emptyIfNull(orig.mName); - String newName = emptyIfNull(newContactData.mName); - if (!oldName.equals(newName)) { - if (Log.isLoggable(LogTag.CONTACT, Log.DEBUG)) { - Log.d(TAG, String.format("name changed: %s -> %s", oldName, newName)); - } - return true; - } - - String oldLabel = emptyIfNull(orig.mLabel); - String newLabel = emptyIfNull(newContactData.mLabel); - if (!oldLabel.equals(newLabel)) { - if (Log.isLoggable(LogTag.CONTACT, Log.DEBUG)) { - Log.d(TAG, String.format("label changed: %s -> %s", oldLabel, newLabel)); - } - return true; - } - - if (!Arrays.equals(orig.mAvatarData, newContactData.mAvatarData)) { - if (Log.isLoggable(LogTag.CONTACT, Log.DEBUG)) { - Log.d(TAG, "avatar changed"); - } - return true; - } - - return false; - } - - private void updateContact(final Contact c) { - if (c == null) { - return; - } - - Contact entry = getContactInfo(c); - synchronized (c) { - if (contactChanged(c, entry)) { - if (Log.isLoggable(LogTag.APP, Log.VERBOSE)) { - log("updateContact: contact changed for " + entry.mName); - } - - c.mNumber = entry.mNumber; - c.mLabel = entry.mLabel; - c.mPersonId = entry.mPersonId; - c.mPresenceResId = entry.mPresenceResId; - c.mPresenceText = entry.mPresenceText; - c.mAvatarData = entry.mAvatarData; - c.mAvatar = entry.mAvatar; - c.mContactMethodId = entry.mContactMethodId; - c.mContactMethodType = entry.mContactMethodType; - c.mNumberE164 = entry.mNumberE164; - c.mName = entry.mName; - c.mSendToVoicemail = entry.mSendToVoicemail; - - c.notSynchronizedUpdateNameAndNumber(); - - // We saw a bug where we were updating an empty contact. That would trigger - // l.onUpdate() below, which would call ComposeMessageActivity.onUpdate, - // which would call the adapter's notifyDataSetChanged, which would throw - // away the message items and rebuild, eventually calling updateContact() - // again -- all in a vicious and unending loop. Break the cycle and don't - // notify if the number (the most important piece of information) is empty. - if (!TextUtils.isEmpty(c.mNumber)) { - // clone the list of listeners in case the onUpdate call turns around and - // modifies the list of listeners - // access to mListeners is synchronized on ContactsCache - HashSet<UpdateListener> iterator; - synchronized (mListeners) { - iterator = (HashSet<UpdateListener>)Contact.mListeners.clone(); - } - for (UpdateListener l : iterator) { - if (Log.isLoggable(LogTag.CONTACT, Log.DEBUG)) { - Log.d(TAG, "updating " + l); - } - l.onUpdate(c); - } - } - } - synchronized (c) { - c.mQueryPending = false; - c.notifyAll(); - } - } - } - - /** - * Returns the caller info in Contact. - */ - private Contact getContactInfo(Contact c) { - if (c.mIsMe) { - return getContactInfoForSelf(); - } else if (SmsHelper.isEmailAddress(c.mNumber)) { - return getContactInfoForEmailAddress(c.mNumber); - } else if (isAlphaNumber(c.mNumber)) { - // first try to look it up in the email field - Contact contact = getContactInfoForEmailAddress(c.mNumber); - if (contact.existsInDatabase()) { - return contact; - } - // then look it up in the phone field - return getContactInfoForPhoneNumber(c.mNumber); - } else { - // it's a real phone number, so strip out non-digits and look it up - final String strippedNumber = android.telephony.PhoneNumberUtils.stripSeparators(c.mNumber); - return getContactInfoForPhoneNumber(strippedNumber); - } - } - - // Some received sms's have addresses such as "OakfieldCPS" or "T-Mobile". This - // function will attempt to identify these and return true. If the number contains - // 3 or more digits, such as "jello123", this function will return false. - // Some countries have 3 digits shortcodes and we have to identify them as numbers. - // http://en.wikipedia.org/wiki/Short_code - // Examples of input/output for this function: - // "Jello123" -> false [3 digits, it is considered to be the phone number "123"] - // "T-Mobile" -> true [it is considered to be the address "T-Mobile"] - // "Mobile1" -> true [1 digit, it is considered to be the address "Mobile1"] - // "Dogs77" -> true [2 digits, it is considered to be the address "Dogs77"] - // "****1" -> true [1 digits, it is considered to be the address "****1"] - // "#4#5#6#" -> true [it is considered to be the address "#4#5#6#"] - // "AB12" -> true [2 digits, it is considered to be the address "AB12"] - // "12" -> true [2 digits, it is considered to be the address "12"] - private boolean isAlphaNumber(String number) { - // TODO: PhoneNumberUtils.isWellFormedSmsAddress() only check if the number is a valid - // GSM SMS address. If the address contains a dialable char, it considers it a well - // formed SMS addr. CDMA doesn't work that way and has a different parser for SMS - // address (see CdmaSmsAddress.parse(String address)). We should definitely fix this!!! - if (!android.telephony.PhoneNumberUtils.isWellFormedSmsAddress(number)) { - // The example "T-Mobile" will exit here because there are no numbers. - return true; // we're not an sms address, consider it an alpha number - } - if (SmsHelper.isAlias(number)) { - return true; - } - number = android.telephony.PhoneNumberUtils.extractNetworkPortion(number); - if (TextUtils.isEmpty(number)) { - return true; // there are no digits whatsoever in the number - } - // At this point, anything like "Mobile1" or "Dogs77" will be stripped down to - // "1" and "77". "#4#5#6#" remains as "#4#5#6#" at this point. - return number.length() < 3; - } - - /** - * Queries the caller id info with the phone number. - * @return a Contact containing the caller id info corresponding to the number. - */ - private Contact getContactInfoForPhoneNumber(String number) { - Contact entry = new Contact(number); - entry.mContactMethodType = CONTACT_METHOD_TYPE_PHONE; - - if (Log.isLoggable(LogTag.CONTACT, Log.DEBUG)) { - log("queryContactInfoByNumber: number=" + number); - } - - String normalizedNumber = PhoneNumberUtils.normalizeNumber(number); - String minMatch = android.telephony.PhoneNumberUtils.toCallerIDMinMatch(normalizedNumber); - if (!TextUtils.isEmpty(normalizedNumber) && !TextUtils.isEmpty(minMatch)) { - String numberLen = String.valueOf(normalizedNumber.length()); - String numberE164 = PhoneNumberUtils.formatNumberToE164( - number, QKSMSApp.getApplication().getCurrentCountryIso()); - String selection; - String[] args; - if (TextUtils.isEmpty(numberE164)) { - selection = CALLER_ID_SELECTION_WITHOUT_E164; - args = new String[] {minMatch, numberLen, normalizedNumber, numberLen}; - } else { - selection = CALLER_ID_SELECTION; - args = new String[] { - minMatch, numberE164, numberLen, normalizedNumber, numberLen}; - } - - Cursor cursor = mContext.getContentResolver().query( - PHONES_WITH_PRESENCE_URI, CALLER_ID_PROJECTION, selection, args, null); - if (cursor == null) { - Log.w(TAG, "queryContactInfoByNumber(" + number + ") returned NULL cursor!" - + " contact uri used " + PHONES_WITH_PRESENCE_URI); - return entry; - } - - try { - if (cursor.moveToFirst()) { - fillPhoneTypeContact(entry, cursor); - } - } finally { - cursor.close(); - } - } - return entry; - } - - /** - * @return a Contact containing the info for the profile. - */ - private Contact getContactInfoForSelf() { - Contact entry = new Contact(true); - entry.mContactMethodType = CONTACT_METHOD_TYPE_SELF; - - if (Log.isLoggable(LogTag.CONTACT, Log.DEBUG)) { - log("getContactInfoForSelf"); - } - Cursor cursor = mContext.getContentResolver().query( - Profile.CONTENT_URI, SELF_PROJECTION, null, null, null); - if (cursor == null) { - Log.w(TAG, "getContactInfoForSelf() returned NULL cursor!" - + " contact uri used " + Profile.CONTENT_URI); - return entry; - } - - try { - if (cursor.moveToFirst()) { - fillSelfContact(entry, cursor); - } - } finally { - cursor.close(); - } - return entry; - } - - private void fillPhoneTypeContact(final Contact contact, final Cursor cursor) { - synchronized (contact) { - contact.mContactMethodType = CONTACT_METHOD_TYPE_PHONE; - contact.mContactMethodId = cursor.getLong(PHONE_ID_COLUMN); - contact.mLabel = cursor.getString(PHONE_LABEL_COLUMN); - contact.mName = cursor.getString(CONTACT_NAME_COLUMN); - contact.mPersonId = cursor.getLong(CONTACT_ID_COLUMN); - contact.mPresenceResId = getPresenceIconResourceId( - cursor.getInt(CONTACT_PRESENCE_COLUMN)); - contact.mPresenceText = cursor.getString(CONTACT_STATUS_COLUMN); - contact.mNumberE164 = cursor.getString(PHONE_NORMALIZED_NUMBER); - contact.mSendToVoicemail = cursor.getInt(SEND_TO_VOICEMAIL) == 1; - if (Log.isLoggable(LogTag.CONTACT, Log.DEBUG)) { - log("fillPhoneTypeContact: name=" + contact.mName + ", number=" - + contact.mNumber + ", presence=" + contact.mPresenceResId - + " SendToVoicemail: " + contact.mSendToVoicemail); - } - } - byte[] data = loadAvatarData(contact); - - synchronized (contact) { - contact.mAvatarData = data; - } - } - - private void fillSelfContact(final Contact contact, final Cursor cursor) { - synchronized (contact) { - contact.mName = cursor.getString(SELF_NAME_COLUMN); - if (TextUtils.isEmpty(contact.mName)) { - contact.mName = mContext.getString(R.string.messagelist_sender_self); - } - if (Log.isLoggable(LogTag.CONTACT, Log.DEBUG)) { - log("fillSelfContact: name=" + contact.mName + ", number=" - + contact.mNumber); - } - } - byte[] data = loadAvatarData(contact); - - synchronized (contact) { - contact.mAvatarData = data; - } - } - /* - * Load the avatar data from the cursor into memory. Don't decode the data - * until someone calls for it (see getAvatar). Hang onto the raw data so that - * we can compare it when the data is reloaded. - * TODO: consider comparing a checksum so that we don't have to hang onto - * the raw bytes after the image is decoded. - */ - private byte[] loadAvatarData(Contact entry) { - byte [] data = null; - - if ((!entry.mIsMe && entry.mPersonId == 0) || entry.mAvatar != null) { - return null; - } - - if (Log.isLoggable(LogTag.CONTACT, Log.DEBUG)) { - log("loadAvatarData: name=" + entry.mName + ", number=" + entry.mNumber); - } - - // If the contact is "me", then use my local profile photo. Otherwise, build a - // uri to get the avatar of the contact. - Uri contactUri = entry.mIsMe ? - Profile.CONTENT_URI : - ContentUris.withAppendedId(Contacts.CONTENT_URI, entry.mPersonId); - - InputStream avatarDataStream = Contacts.openContactPhotoInputStream( - mContext.getContentResolver(), - contactUri, true); - try { - if (avatarDataStream != null) { - data = new byte[avatarDataStream.available()]; - avatarDataStream.read(data, 0, data.length); - } - } catch (IOException ex) { - // - } finally { - try { - if (avatarDataStream != null) { - avatarDataStream.close(); - } - } catch (IOException e) { - } - } - - return data; - } - - private int getPresenceIconResourceId(int presence) { - // TODO: must fix for SDK - if (presence != Presence.OFFLINE) { - return Presence.getPresenceIconResourceId(presence); - } - - return 0; - } - - /** - * Query the contact email table to get the name of an email address. - */ - private Contact getContactInfoForEmailAddress(String email) { - Contact entry = new Contact(email); - entry.mContactMethodType = CONTACT_METHOD_TYPE_EMAIL; - - Cursor cursor = SqliteWrapper.query(mContext, mContext.getContentResolver(), - EMAIL_WITH_PRESENCE_URI, - EMAIL_PROJECTION, - EMAIL_SELECTION, - new String[] { email }, - null); - - if (cursor != null) { - try { - while (cursor.moveToNext()) { - boolean found = false; - synchronized (entry) { - entry.mContactMethodId = cursor.getLong(EMAIL_ID_COLUMN); - entry.mPresenceResId = getPresenceIconResourceId( - cursor.getInt(EMAIL_STATUS_COLUMN)); - entry.mPersonId = cursor.getLong(EMAIL_CONTACT_ID_COLUMN); - entry.mSendToVoicemail = - cursor.getInt(EMAIL_SEND_TO_VOICEMAIL_COLUMN) == 1; - - String name = cursor.getString(EMAIL_NAME_COLUMN); - if (TextUtils.isEmpty(name)) { - name = cursor.getString(EMAIL_CONTACT_NAME_COLUMN); - } - if (!TextUtils.isEmpty(name)) { - entry.mName = name; - if (Log.isLoggable(LogTag.CONTACT, Log.DEBUG)) { - log("getContactInfoForEmailAddress: name=" + entry.mName + - ", email=" + email + ", presence=" + - entry.mPresenceResId); - } - found = true; - } - } - - if (found) { - byte[] data = loadAvatarData(entry); - synchronized (entry) { - entry.mAvatarData = data; - } - - break; - } - } - } finally { - cursor.close(); - } - } - return entry; - } - - // Invert and truncate to five characters the phoneNumber so that we - // can use it as the key in a hashtable. We keep a mapping of this - // key to a list of all contacts which have the same key. - private String key(String phoneNumber, CharBuffer keyBuffer) { - keyBuffer.clear(); - keyBuffer.mark(); - - int position = phoneNumber.length(); - int resultCount = 0; - while (--position >= 0) { - char c = phoneNumber.charAt(position); - if (Character.isDigit(c)) { - keyBuffer.put(c); - if (++resultCount == STATIC_KEY_BUFFER_MAXIMUM_LENGTH) { - break; - } - } - } - keyBuffer.reset(); - if (resultCount > 0) { - return keyBuffer.toString(); - } else { - // there were no usable digits in the input phoneNumber - return phoneNumber; - } - } - - // Reuse this so we don't have to allocate each time we go through this - // "get" function. - static final int STATIC_KEY_BUFFER_MAXIMUM_LENGTH = 5; - static CharBuffer sStaticKeyBuffer = CharBuffer.allocate(STATIC_KEY_BUFFER_MAXIMUM_LENGTH); - - private Contact internalGet(String numberOrEmail, boolean isMe) { - synchronized (ContactsCache.this) { - // See if we can find "number" in the hashtable. - // If so, just return the result. - final boolean isNotRegularPhoneNumber = isMe || SmsHelper.isEmailAddress(numberOrEmail) || - SmsHelper.isAlias(numberOrEmail); - final String key = isNotRegularPhoneNumber ? - numberOrEmail : key(numberOrEmail, sStaticKeyBuffer); - - ArrayList<Contact> candidates = mContactsHash.get(key); - if (candidates != null) { - int length = candidates.size(); - for (int i = 0; i < length; i++) { - Contact c= candidates.get(i); - if (isNotRegularPhoneNumber) { - if (numberOrEmail.equals(c.mNumber)) { - return c; - } - } else { - if (android.telephony.PhoneNumberUtils.compare(numberOrEmail, c.mNumber)) { - return c; - } - } - } - } else { - candidates = new ArrayList<Contact>(); - // call toString() since it may be the static CharBuffer - mContactsHash.put(key, candidates); - } - Contact c = isMe ? - new Contact(true) : - new Contact(numberOrEmail); - candidates.add(c); - return c; - } - } - - void invalidate() { - // Don't remove the contacts. Just mark them stale so we'll update their - // info, particularly their presence. - synchronized (ContactsCache.this) { - for (ArrayList<Contact> alc : mContactsHash.values()) { - for (Contact c : alc) { - synchronized (c) { - c.mIsStale = true; - } - } - } - } - } - - // Remove a contact from the ContactsCache based on the number or email address - private void remove(Contact contact) { - synchronized (ContactsCache.this) { - String number = contact.getNumber(); - final boolean isNotRegularPhoneNumber = contact.isMe() || - SmsHelper.isEmailAddress(number) || - SmsHelper.isAlias(number); - final String key = isNotRegularPhoneNumber ? - number : key(number, sStaticKeyBuffer); - ArrayList<Contact> candidates = mContactsHash.get(key); - if (candidates != null) { - int length = candidates.size(); - for (int i = 0; i < length; i++) { - Contact c = candidates.get(i); - if (isNotRegularPhoneNumber) { - if (number.equals(c.mNumber)) { - candidates.remove(i); - break; - } - } else { - if (android.telephony.PhoneNumberUtils.compare(number, c.mNumber)) { - candidates.remove(i); - break; - } - } - } - if (candidates.isEmpty()) { - mContactsHash.remove(key); - } - } - } - } - } - - private static void log(String msg) { - Log.d(TAG, msg); - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/data/ContactHelper.java b/QKSMS/src/main/java/com/moez/QKSMS/data/ContactHelper.java deleted file mode 100644 index ea7fff1c4..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/data/ContactHelper.java +++ /dev/null @@ -1,218 +0,0 @@ -package com.moez.QKSMS.data; - -import android.content.ContentResolver; -import android.content.Context; -import android.database.Cursor; -import android.database.sqlite.SQLiteException; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.graphics.Canvas; -import android.graphics.Color; -import android.graphics.Paint; -import android.graphics.Rect; -import android.graphics.drawable.BitmapDrawable; -import android.graphics.drawable.Drawable; -import android.net.Uri; -import android.provider.BaseColumns; -import android.provider.ContactsContract; -import android.telephony.PhoneNumberUtils; -import android.util.Log; -import com.moez.QKSMS.common.TypefaceManager; -import com.moez.QKSMS.common.utils.Units; -import com.moez.QKSMS.ui.ThemeManager; - -import java.io.BufferedInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import static android.provider.ContactsContract.CommonDataKinds.Phone; - -public class ContactHelper { - private static final String TAG = "ContactHelper"; - - public static Uri CONTACTS_URI = ContactsContract.Contacts.CONTENT_URI; - - public static class Favorites { - - public static String SELECTION = ContactsContract.Contacts.STARRED + "='1'"; - - public static String[] PROJECTION = new String[]{ - ContactsContract.Contacts._ID, - ContactsContract.Contacts.DISPLAY_NAME, - ContactsContract.Contacts.STARRED, - ContactsContract.Contacts.HAS_PHONE_NUMBER, - ContactsContract.Contacts.PHOTO_THUMBNAIL_URI}; - - public static final int ID = 0; - public static final int DISPLAY_NAME = 1; - public static final int STARRED = 2; - public static final int HAS_PHONE_NUMBER = 3; - public static final int PHOTO_THUMBNAIL_URI = 4; - } - - public static String getName(Context context, String address) { - - if (address == null || address.isEmpty() || validateEmail(address)) - return address; - - Cursor cursor; - - Uri uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(address)); - ContentResolver contentResolver = context.getContentResolver(); - - String name = address; - - try { - cursor = contentResolver.query(uri, new String[]{BaseColumns._ID, ContactsContract.PhoneLookup.DISPLAY_NAME}, null, null, null); - if (cursor.moveToNext()) - name = cursor.getString(cursor.getColumnIndex(ContactsContract.Data.DISPLAY_NAME)); - cursor.close(); - } catch (Exception e) { - Log.d(TAG, "Failed to find name for address " + address); - e.printStackTrace(); - } - - return name; - } - - /** - * Get the phone number of a contact given their id - * TODO: The logic for picking the best phone number could be better - */ - public static String getPhoneNumber(Context context, String contactId) { - - String number = ""; - - Cursor cursor; - try { - cursor = context.getContentResolver().query(Phone.CONTENT_URI, null, - Phone.CONTACT_ID + " = " + contactId, null, null); - - while (cursor.moveToNext()) { - number = cursor.getString(cursor.getColumnIndex(Phone.NUMBER)); - int type = cursor.getInt(cursor.getColumnIndex(Phone.TYPE)); - - switch (type) { - case Phone.TYPE_MOBILE: - // Return right away if it's a mobile number - cursor.close(); - return number; - } - } - - cursor.close(); - } catch (SQLiteException e) { - e.printStackTrace(); - } - - // Return whatever number we found last, since we don't know which is best - return number; - } - - public static boolean validateEmail(String email) { - Pattern pattern; - Matcher matcher; - String EMAIL_PATTERN = "\\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,4}\\b"; - pattern = Pattern.compile(EMAIL_PATTERN); - matcher = pattern.matcher(email); - return matcher.matches(); - } - - public static Uri getUri(String address) { - return Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(address)); - } - - public static long getId(Context context, String address) { - - if (address == null || address.isEmpty() || validateEmail(address)) - return 0; - - Cursor cursor; - - Uri uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(address)); - ContentResolver contentResolver = context.getContentResolver(); - - long id = 0; - - try { - cursor = contentResolver.query(uri, new String[]{BaseColumns._ID, ContactsContract.PhoneLookup.DISPLAY_NAME}, null, null, null); - if (cursor.moveToNext()) - id = cursor.getLong(cursor.getColumnIndex(ContactsContract.Data._ID)); - cursor.close(); - } catch (Exception e) { - Log.d(TAG, "Failed to find ID for address " + address); - e.printStackTrace(); - } - - return id; - } - - public static Uri getPhotoUri(Context context, Uri contactUri) { - Cursor cursor = context.getContentResolver().query(contactUri, Favorites.PROJECTION, null, null, null); - - String photoUriString = null; - if (cursor.moveToFirst()) { - photoUriString = cursor.getString(Favorites.PHOTO_THUMBNAIL_URI); - } - - return photoUriString == null ? null : Uri.parse(photoUriString); - } - - public static Drawable getDrawable(Context context, long id) { - return new BitmapDrawable(context.getResources(), getBitmap(context, id)); - } - - public static Bitmap getOwnerPhoto(Context context) { - - final String[] SELF_PROJECTION = new String[]{Phone._ID}; - Cursor cursor = context.getContentResolver().query(ContactsContract.Profile.CONTENT_URI, SELF_PROJECTION, null, null, null); - cursor.moveToFirst(); - if (cursor.getCount() > 0) return getBitmap(context, cursor.getLong(0)); - - return null; - } - - public static Bitmap getBitmap(Context context, long id) { - Bitmap bitmap = null; - try { - Uri contactUri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_URI, String.valueOf(id)); - InputStream input = ContactsContract.Contacts.openContactPhotoInputStream(context.getContentResolver(), contactUri, true); - if (input == null) { - return null; - } - BufferedInputStream buf = new BufferedInputStream(input); - bitmap = BitmapFactory.decodeStream(buf); - buf.close(); - } catch (IOException e) { - e.printStackTrace(); - } - return bitmap; - } - - public static Bitmap blankContact(Context context, String name) { - String text = name == null || PhoneNumberUtils.isWellFormedSmsAddress(PhoneNumberUtils.stripSeparators(name)) || name.length() == 0 ? "#" : "" + name.toUpperCase().charAt(0); - - int length = Units.dpToPx(context, 64); - - Bitmap bitmap = Bitmap.createBitmap(length, length, Bitmap.Config.ARGB_8888); - bitmap.eraseColor(ThemeManager.getColor()); - - Canvas canvas = new Canvas(bitmap); - - Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); - paint.setColor(Color.WHITE); - paint.setTypeface(TypefaceManager.obtainTypeface(context, TypefaceManager.Typefaces.ROBOTO_LIGHT)); - paint.setTextSize(length / 2); - - Rect bounds = new Rect(); - paint.getTextBounds(text, 0, text.length(), bounds); - int x = (bitmap.getWidth() - bounds.width()) / 2; - int y = (bitmap.getHeight() + bounds.height()) / 2; - - canvas.drawText(text, x, y, paint); - - return bitmap; - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/data/ContactList.java b/QKSMS/src/main/java/com/moez/QKSMS/data/ContactList.java deleted file mode 100644 index 8460496e0..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/data/ContactList.java +++ /dev/null @@ -1,178 +0,0 @@ -package com.moez.QKSMS.data; - -import android.net.Uri; -import android.os.Parcelable; -import android.text.TextUtils; -import android.util.Log; - -import com.moez.QKSMS.LogTag; -import com.moez.QKSMS.transaction.SmsHelper; - -import java.util.ArrayList; -import java.util.List; - -public class ContactList extends ArrayList<Contact> { - private static final long serialVersionUID = 1L; - - public static ContactList getByNumbers(Iterable<String> numbers, boolean canBlock) { - ContactList list = new ContactList(); - for (String number : numbers) { - if (!TextUtils.isEmpty(number)) { - list.add(Contact.get(number, canBlock)); - } - } - return list; - } - - public static ContactList getByNumbers(String semiSepNumbers, - boolean canBlock, - boolean replaceNumber) { - ContactList list = new ContactList(); - for (String number : semiSepNumbers.split(";")) { - if (!TextUtils.isEmpty(number)) { - Contact contact = Contact.get(number, canBlock); - if (replaceNumber) { - contact.setNumber(number); - } - list.add(contact); - } - } - return list; - } - - /** - * Returns a ContactList for the corresponding recipient URIs passed in. This method will - * always block to query provider. The given URIs could be the phone data URIs or tel URI - * for the numbers don't belong to any contact. - * - * @param uris phone URI to create the ContactList - */ - public static ContactList blockingGetByUris(Parcelable[] uris) { - ContactList list = new ContactList(); - if (uris != null && uris.length > 0) { - for (Parcelable p : uris) { - Uri uri = (Uri) p; - if ("tel".equals(uri.getScheme())) { - Contact contact = Contact.get(uri.getSchemeSpecificPart(), true); - list.add(contact); - } - } - final List<Contact> contacts = Contact.getByPhoneUris(uris); - if (contacts != null) { - list.addAll(contacts); - } - } - return list; - } - - /** - * Returns a ContactList for the corresponding recipient ids passed in. This method will - * create the contact if it doesn't exist, and would inject the recipient id into the contact. - */ - public static ContactList getByIds(String spaceSepIds, boolean canBlock) { - ContactList list = new ContactList(); - for (RecipientIdCache.Entry entry : RecipientIdCache.getAddresses(spaceSepIds)) { - if (entry != null && !TextUtils.isEmpty(entry.number)) { - Contact contact = Contact.get(entry.number, canBlock); - contact.setRecipientId(entry.id); - list.add(contact); - } - } - return list; - } - - public int getPresenceResId() { - // We only show presence for single contacts. - if (size() != 1) - return 0; - - return get(0).getPresenceResId(); - } - - public String formatNames(String separator) { - String[] names = new String[size()]; - int i = 0; - for (Contact c : this) { - names[i++] = c.getName(); - } - return TextUtils.join(separator, names); - } - - public String formatNamesAndNumbers(String separator) { - String[] nans = new String[size()]; - int i = 0; - for (Contact c : this) { - nans[i++] = c.getNameAndNumber(); - } - return TextUtils.join(separator, nans); - } - - public String serialize() { - return TextUtils.join(";", getNumbers()); - } - - public boolean containsEmail() { - for (Contact c : this) { - if (c.isEmail()) { - return true; - } - } - return false; - } - - public String[] getNumbers() { - return getNumbers(false /* don't scrub for MMS address */); - } - - public String[] getNumbers(boolean scrubForMmsAddress) { - List<String> numbers = new ArrayList<>(); - String number; - for (Contact c : this) { - number = c.getNumber(); - - if (scrubForMmsAddress) { - // parse/scrub the address for valid MMS address. The returned number - // could be null if it's not a valid MMS address. We don't want to send - // a message to an invalid number, as the network may do its own stripping, - // and end up sending the message to a different number! - number = SmsHelper.parseMmsAddress(number); - } - - // Don't add duplicate numbers. This can happen if a contact name has a comma. - // Since we use a comma as a delimiter between contacts, the code will consider - // the same recipient has been added twice. The recipients UI still works correctly. - // It's easiest to just make sure we only send to the same recipient once. - if (!TextUtils.isEmpty(number) && !numbers.contains(number)) { - numbers.add(number); - } - } - return numbers.toArray(new String[numbers.size()]); - } - - @Override - public boolean equals(Object obj) { - try { - ContactList other = (ContactList)obj; - // If they're different sizes, the contact - // set is obviously different. - if (size() != other.size()) { - return false; - } - - // Make sure all the individual contacts are the same. - for (Contact c : this) { - if (!other.contains(c)) { - return false; - } - } - - return true; - } catch (ClassCastException e) { - return false; - } - } - - private void log(String msg) { - Log.d(LogTag.TAG, "[ContactList] " + msg); - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/data/Conversation.java b/QKSMS/src/main/java/com/moez/QKSMS/data/Conversation.java deleted file mode 100644 index e0ec62591..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/data/Conversation.java +++ /dev/null @@ -1,1466 +0,0 @@ -package com.moez.QKSMS.data; - -import android.app.Activity; -import android.content.AsyncQueryHandler; -import android.content.ContentResolver; -import android.content.ContentUris; -import android.content.ContentValues; -import android.content.Context; -import android.database.Cursor; -import android.database.sqlite.SqliteWrapper; -import android.net.Uri; -import android.os.AsyncTask; -import android.provider.BaseColumns; -import android.provider.Telephony.Mms; -import android.provider.Telephony.MmsSms; -import android.provider.Telephony.Sms; -import android.provider.Telephony.Sms.Conversations; -import android.provider.Telephony.Threads; -import android.provider.Telephony.ThreadsColumns; -import android.text.TextUtils; -import android.util.Log; - -import com.android.mms.transaction.MmsMessageSender; -import com.google.android.mms.pdu_alt.PduHeaders; -import com.moez.QKSMS.QKSMSAppBase; -import com.moez.QKSMS.mmssms.Utils; -import com.moez.QKSMS.LogTag; -import com.moez.QKSMS.QKSMSApp; -import com.moez.QKSMS.R; -import com.moez.QKSMS.common.google.DraftCache; -import com.moez.QKSMS.receiver.UnreadBadgeService; -import com.moez.QKSMS.common.utils.AddressUtils; -import com.moez.QKSMS.common.utils.PhoneNumberUtils; -import com.moez.QKSMS.transaction.NotificationManager; -import com.moez.QKSMS.transaction.SmsHelper; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashSet; -import java.util.Iterator; -import java.util.Set; - -/** - * An interface for finding information about conversations and/or creating new ones. - */ -public class Conversation { - private static final String TAG = "Mms/conv"; - private static final boolean DEBUG = false; - private static final boolean DELETEDEBUG = false; - - public static final Uri sAllThreadsUri = - Threads.CONTENT_URI.buildUpon().appendQueryParameter("simple", "true").build(); - - public static final String[] ALL_THREADS_PROJECTION = { - Threads._ID, Threads.DATE, Threads.MESSAGE_COUNT, Threads.RECIPIENT_IDS, - Threads.SNIPPET, Threads.SNIPPET_CHARSET, Threads.READ, Threads.ERROR, - Threads.HAS_ATTACHMENT - }; - - public static final String[] UNREAD_PROJECTION = { - Threads._ID, - Threads.READ - }; - - public static final String UNREAD_SELECTION = "(read=0 OR seen=0)"; - public static final String FAILED_SELECTION = "error != 0"; - - public static final String[] SEEN_PROJECTION = new String[]{"seen"}; - - public static final int ID = 0; - public static final int DATE = 1; - public static final int MESSAGE_COUNT = 2; - public static final int RECIPIENT_IDS = 3; - public static final int SNIPPET = 4; - public static final int SNIPPET_CS = 5; - public static final int READ = 6; - public static final int ERROR = 7; - public static final int HAS_ATTACHMENT = 8; - - - private final Context mContext; - - // The thread ID of this conversation. Can be zero in the case of a - // new conversation where the recipient set is changing as the user - // types and we have not hit the database yet to create a thread. - private long mThreadId; - - private ContactList mRecipients; // The current set of recipients. - private long mDate; // The last update time. - private int mMessageCount; // Number of messages. - private String mSnippet; // Text of the most recent message. - private boolean mHasUnreadMessages; // True if there are unread messages. - private boolean mHasAttachment; // True if any message has an attachment. - private boolean mHasError; // True if any message is in an error state. - private boolean mIsChecked; // True if user has selected the conversation for a - // multi-operation such as delete. - - private static ContentValues sReadContentValues; - private static boolean sLoadingThreads; - private static boolean sDeletingThreads; - private static Object sDeletingThreadsLock = new Object(); - private boolean mMarkAsReadBlocked; - private boolean mMarkAsReadWaiting; - - private Conversation(Context context) { - mContext = context; - mRecipients = new ContactList(); - mThreadId = 0; - } - - private Conversation(Context context, long threadId, boolean allowQuery) { - if (DEBUG) { - Log.v(TAG, "Conversation constructor threadId: " + threadId); - } - mContext = context; - if (!loadFromThreadId(threadId, allowQuery)) { - mRecipients = new ContactList(); - mThreadId = 0; - } - } - - private Conversation(Context context, Cursor cursor, boolean allowQuery) { - if (DEBUG) { - Log.v(TAG, "Conversation constructor cursor, allowQuery: " + allowQuery); - } - mContext = context; - fillFromCursor(context, this, cursor, allowQuery); - } - - /** - * Create a new conversation with no recipients. {@link #setRecipients} can - * be called as many times as you like; the conversation will not be - * created in the database until {@link #ensureThreadId} is called. - */ - public static Conversation createNew(Context context) { - return new Conversation(context); - } - - /** - * Find the conversation matching the provided thread ID. - */ - public static Conversation get(Context context, long threadId, boolean allowQuery) { - if (DEBUG) { - Log.v(TAG, "Conversation get by threadId: " + threadId); - } - Conversation conv = Cache.get(threadId); - if (conv != null) - return conv; - - conv = new Conversation(context, threadId, allowQuery); - try { - Cache.put(conv); - } catch (IllegalStateException e) { - LogTag.error("Tried to add duplicate Conversation to Cache (from threadId): " + conv); - if (!Cache.replace(conv)) { - LogTag.error("get by threadId cache.replace failed on " + conv); - } - } - return conv; - } - - /** - * Find the conversation matching the provided recipient set. - * When called with an empty recipient list, equivalent to {@link #createNew}. - */ - public static Conversation get(Context context, ContactList recipients, boolean allowQuery) { - if (DEBUG) { - Log.v(TAG, "Conversation get by recipients: " + recipients.serialize()); - } - // If there are no recipients in the list, make a new conversation. - if (recipients.size() < 1) { - return createNew(context); - } - - Conversation conv = Cache.get(recipients); - if (conv != null) - return conv; - - long threadId = getOrCreateThreadId(context, recipients); - conv = new Conversation(context, threadId, allowQuery); - Log.d(TAG, "Conversation.get: created new conversation " + /*conv.toString()*/ "xxxxxxx"); - - if (!conv.getRecipients().equals(recipients)) { - LogTag.error(TAG, "Conversation.get: new conv's recipients don't match input recpients " - + /*recipients*/ "xxxxxxx"); - } - - try { - Cache.put(conv); - } catch (IllegalStateException e) { - LogTag.error("Tried to add duplicate Conversation to Cache (from recipients): " + conv); - if (!Cache.replace(conv)) { - LogTag.error("get by recipients cache.replace failed on " + conv); - } - } - - return conv; - } - - /** - * Find the conversation matching in the specified Uri. - * When called with a null Uri, equivalent to {@link #createNew}. - */ - public static Conversation get(Context context, Uri uri, boolean allowQuery) { - if (DEBUG) { - Log.v(TAG, "Conversation get by uri: " + uri); - } - if (uri == null) { - return createNew(context); - } - - if (DEBUG) Log.v(TAG, "Conversation get URI: " + uri); - - // Handle a conversation URI - if (uri.getPathSegments().size() >= 2) { - try { - long threadId = Long.parseLong(uri.getPathSegments().get(1)); - if (DEBUG) { - Log.v(TAG, "Conversation get threadId: " + threadId); - } - return get(context, threadId, allowQuery); - } catch (NumberFormatException exception) { - LogTag.error("Invalid URI: " + uri); - } - } - - String recipients = PhoneNumberUtils.replaceUnicodeDigits(getRecipients(uri)) - .replace(',', ';'); - return get(context, ContactList.getByNumbers(recipients, - allowQuery /* don't block */, true /* replace number */), allowQuery); - } - - /** - * Returns true if the recipient in the uri matches the recipient list in this - * conversation. - */ - public boolean sameRecipient(Uri uri, Context context) { - int size = mRecipients.size(); - if (size > 1) { - return false; - } - if (uri == null) { - return size == 0; - } - ContactList incomingRecipient = null; - if (uri.getPathSegments().size() >= 2) { - // it's a thread id for a conversation - Conversation otherConv = get(context, uri, false); - if (otherConv == null) { - return false; - } - incomingRecipient = otherConv.mRecipients; - } else { - String recipient = getRecipients(uri); - incomingRecipient = ContactList.getByNumbers(recipient, - false /* don't block */, false /* don't replace number */); - } - if (DEBUG) Log.v(TAG, "sameRecipient incomingRecipient: " + incomingRecipient + - " mRecipients: " + mRecipients); - return mRecipients.equals(incomingRecipient); - } - - /** - * Returns a temporary Conversation (not representing one on disk) wrapping - * the contents of the provided cursor. The cursor should be the one - * returned to your AsyncQueryHandler passed in to {@link #startQueryForAll}. - * The recipient list of this conversation can be empty if the results - * were not in cache. - */ - public static Conversation from(Context context, Cursor cursor) { - // First look in the cache for the Conversation and return that one. That way, all the - // people that are looking at the cached copy will get updated when fillFromCursor() is - // called with this cursor. - long threadId = cursor.getLong(ID); - if (threadId > 0) { - Conversation conv = Cache.get(threadId); - if (conv != null) { - fillFromCursor(context, conv, cursor, false); // update the existing conv in-place - return conv; - } - } - Conversation conv = new Conversation(context, cursor, false); - try { - Cache.put(conv); - } catch (IllegalStateException e) { - LogTag.error(TAG, "Tried to add duplicate Conversation to Cache (from cursor): " + - conv); - if (!Cache.replace(conv)) { - LogTag.error("Converations.from cache.replace failed on " + conv); - } - } - return conv; - } - - private void buildReadContentValues() { - if (sReadContentValues == null) { - sReadContentValues = new ContentValues(2); - sReadContentValues.put("read", 1); - sReadContentValues.put("seen", 1); - } - } - - private void sendReadReport(final Context context, - final long threadId, - final int status) { - String selection = Mms.MESSAGE_TYPE + " = " + PduHeaders.MESSAGE_TYPE_RETRIEVE_CONF - + " AND " + Mms.READ + " = 0" - + " AND " + Mms.READ_REPORT + " = " + PduHeaders.VALUE_YES; - - if (threadId != -1) { - selection = selection + " AND " + Mms.THREAD_ID + " = " + threadId; - } - - final Cursor c = SqliteWrapper.query(context, context.getContentResolver(), - Mms.Inbox.CONTENT_URI, new String[]{Mms._ID, Mms.MESSAGE_ID}, - selection, null, null); - - try { - if (c == null || c.getCount() == 0) { - return; - } - - while (c.moveToNext()) { - Uri uri = ContentUris.withAppendedId(Mms.CONTENT_URI, c.getLong(0)); - if (Log.isLoggable(LogTag.APP, Log.VERBOSE)) { - LogTag.debug("sendReadReport: uri = " + uri); - } - MmsMessageSender.sendReadRec(context, AddressUtils.getFrom(context, uri), - c.getString(1), status); - } - } finally { - if (c != null) { - c.close(); - } - } - } - - - /** - * Marks all messages in this conversation as read and updates - * relevant notifications. This method returns immediately; - * work is dispatched to a background thread. This function should - * always be called from the UI thread. - */ - public void markAsRead() { - if (DELETEDEBUG) { - Contact.logWithTrace(TAG, "markAsRead mMarkAsReadWaiting: " + mMarkAsReadWaiting + - " mMarkAsReadBlocked: " + mMarkAsReadBlocked); - } - if (mMarkAsReadWaiting) { - // We've already been asked to mark everything as read, but we're blocked. - return; - } - if (mMarkAsReadBlocked) { - // We're blocked so record the fact that we want to mark the messages as read - // when we get unblocked. - mMarkAsReadWaiting = true; - return; - } - final Uri threadUri = getUri(); - - new AsyncTask<Void, Void, Void>() { - protected Void doInBackground(Void... none) { - if (DELETEDEBUG || Log.isLoggable(LogTag.APP, Log.VERBOSE)) { - LogTag.debug("markAsRead.doInBackground"); - } - // If we have no Uri to mark (as in the case of a conversation that - // has not yet made its way to disk), there's nothing to do. - if (threadUri != null) { - buildReadContentValues(); - - // Check the read flag first. It's much faster to do a query than - // to do an update. Timing this function show it's about 10x faster to - // do the query compared to the update, even when there's nothing to - // update. - boolean needUpdate = true; - - Cursor c = mContext.getContentResolver().query(threadUri, - UNREAD_PROJECTION, UNREAD_SELECTION, null, null); - if (c != null) { - try { - needUpdate = c.getCount() > 0; - } finally { - c.close(); - } - } - - if (needUpdate) { - sendReadReport(mContext, mThreadId, PduHeaders.READ_STATUS_READ); - LogTag.debug("markAsRead: update read/seen for thread uri: " + - threadUri); - mContext.getContentResolver().update(threadUri, sReadContentValues, - UNREAD_SELECTION, null); - } - setHasUnreadMessages(false); - } - // Always update notifications regardless of the read state, which is usually - // canceling the notification of the thread that was just marked read. - //MessagingNotification.blockingUpdateAllNotifications(mContext, MessagingNotification.THREAD_NONE); - NotificationManager.update(mContext); - - UnreadBadgeService.update(mContext); - - return null; - } - }.execute(); - } - - /** - * Call this with false to prevent marking messages as read. The code calls this so - * the DB queries in markAsRead don't slow down the main query for messages. Once we've - * queried for all the messages (see ComposeMessageActivity.onQueryComplete), then we - * can mark messages as read. Only call this function on the UI thread. - */ - public void blockMarkAsRead(boolean block) { - if (DELETEDEBUG || Log.isLoggable(LogTag.APP, Log.VERBOSE)) { - LogTag.debug("blockMarkAsRead: " + block); - } - - if (block != mMarkAsReadBlocked) { - mMarkAsReadBlocked = block; - if (!mMarkAsReadBlocked) { - if (mMarkAsReadWaiting) { - mMarkAsReadWaiting = false; - markAsRead(); - } - } - } - } - - /** - * Returns a content:// URI referring to this conversation, - * or null if it does not exist on disk yet. - */ - public synchronized Uri getUri() { - if (mThreadId <= 0) - return null; - - return ContentUris.withAppendedId(Threads.CONTENT_URI, mThreadId); - } - - /** - * Return the Uri for all messages in the given thread ID. - * - * @deprecated - */ - public static Uri getUri(long threadId) { - // TODO: Callers using this should really just have a Conversation - // and call getUri() on it, but this guarantees no blocking. - return ContentUris.withAppendedId(Threads.CONTENT_URI, threadId); - } - - /** - * Returns the thread ID of this conversation. Can be zero if - * {@link #ensureThreadId} has not been called yet. - */ - public synchronized long getThreadId() { - return mThreadId; - } - - /** - * Guarantees that the conversation has been created in the database. - * This will make a blocking database call if it hasn't. - * - * @return The thread ID of this conversation in the database - */ - public synchronized long ensureThreadId() { - if (DEBUG || DELETEDEBUG) { - LogTag.debug("ensureThreadId before: " + mThreadId); - } - if (mThreadId <= 0) { - mThreadId = getOrCreateThreadId(mContext, mRecipients); - } - if (DEBUG || DELETEDEBUG) { - LogTag.debug("ensureThreadId after: " + mThreadId); - } - - return mThreadId; - } - - public synchronized void clearThreadId() { - // remove ourself from the cache - if (Log.isLoggable(LogTag.APP, Log.VERBOSE)) { - LogTag.debug("clearThreadId old threadId was: " + mThreadId + " now zero"); - } - Cache.remove(mThreadId); - - mThreadId = 0; - } - - /** - * Sets the list of recipients associated with this conversation. - * If called, {@link #ensureThreadId} must be called before the next - * operation that depends on this conversation existing in the - * database (e.g. storing a draft message to it). - */ - public synchronized void setRecipients(ContactList list) { - if (Log.isLoggable(LogTag.APP, Log.VERBOSE)) { - Log.d(TAG, "setRecipients before: " + this.toString()); - } - mRecipients = list; - - // Invalidate thread ID because the recipient set has changed. - mThreadId = 0; - - if (Log.isLoggable(LogTag.APP, Log.VERBOSE)) { - Log.d(TAG, "setRecipients after: " + this.toString()); - } - } - - /** - * Returns the recipient set of this conversation. - */ - public synchronized ContactList getRecipients() { - return mRecipients; - } - - /** - * Returns true if a draft message exists in this conversation. - */ - public synchronized boolean hasDraft() { - if (mThreadId <= 0) - return false; - - return DraftCache.getInstance().hasDraft(mThreadId); - } - - /** - * Sets whether or not this conversation has a draft message. - */ - public synchronized void setDraftState(boolean hasDraft) { - if (mThreadId <= 0) - return; - - DraftCache.getInstance().setDraftState(mThreadId, hasDraft); - } - - /** - * Returns the time of the last update to this conversation in milliseconds, - * on the {@link System#currentTimeMillis} timebase. - */ - public synchronized long getDate() { - return mDate; - } - - /** - * Returns the number of messages in this conversation, excluding the draft - * (if it exists). - */ - public synchronized int getMessageCount() { - return mMessageCount; - } - - /** - * Set the number of messages in this conversation, excluding the draft - * (if it exists). - */ - public synchronized void setMessageCount(int cnt) { - mMessageCount = cnt; - } - - /** - * Returns a snippet of text from the most recent message in the conversation. - */ - public synchronized String getSnippet() { - return mSnippet; - } - - /** - * Returns true if there are any unread messages in the conversation. - */ - public boolean hasUnreadMessages() { - synchronized (this) { - return mHasUnreadMessages; - } - } - - private void setHasUnreadMessages(boolean flag) { - synchronized (this) { - mHasUnreadMessages = flag; - } - } - - /** - * Returns true if any messages in the conversation have attachments. - */ - public synchronized boolean hasAttachment() { - return mHasAttachment; - } - - /** - * Returns true if any messages in the conversation are in an error state. - */ - public synchronized boolean hasError() { - return mHasError; - } - - /** - * Returns true if this conversation is selected for a multi-operation. - */ - public synchronized boolean isChecked() { - return mIsChecked; - } - - public synchronized void setIsChecked(boolean isChecked) { - mIsChecked = isChecked; - } - - private static long getOrCreateThreadId(Context context, ContactList list) { - HashSet<String> recipients = new HashSet<>(); - Contact cacheContact = null; - for (Contact c : list) { - cacheContact = Contact.get(c.getNumber(), false); - if (cacheContact != null) { - recipients.add(cacheContact.getNumber()); - } else { - recipients.add(c.getNumber()); - } - } - synchronized (sDeletingThreadsLock) { - if (DELETEDEBUG) { - Log.d(TAG, "Conversation getOrCreateThreadId for: " + list.formatNamesAndNumbers(",") + " sDeletingThreads: " + sDeletingThreads); - } - long now = System.currentTimeMillis(); - while (sDeletingThreads) { - try { - sDeletingThreadsLock.wait(30000); - } catch (InterruptedException e) { - } - if (System.currentTimeMillis() - now > 29000) { - // The deleting thread task is stuck or onDeleteComplete wasn't called. - // Unjam ourselves. - Log.e(TAG, "getOrCreateThreadId timed out waiting for delete to complete", - new Exception()); - sDeletingThreads = false; - break; - } - } - long retVal = Utils.getOrCreateThreadId(context, recipients); - if (DELETEDEBUG || Log.isLoggable(LogTag.APP, Log.VERBOSE)) { - LogTag.debug("[Conversation] getOrCreateThreadId for (%s) returned %d", - recipients, retVal); - } - return retVal; - } - } - - public static long getOrCreateThreadId(Context context, String address) { - synchronized (sDeletingThreadsLock) { - if (DELETEDEBUG) { - Log.d(TAG, "Conversation getOrCreateThreadId for: " + address + " sDeletingThreads: " + sDeletingThreads); - } - long now = System.currentTimeMillis(); - while (sDeletingThreads) { - try { - sDeletingThreadsLock.wait(30000); - } catch (InterruptedException e) { - } - if (System.currentTimeMillis() - now > 29000) { - // The deleting thread task is stuck or onDeleteComplete wasn't called. - // Unjam ourselves. - Log.e(TAG, "getOrCreateThreadId timed out waiting for delete to complete", - new Exception()); - sDeletingThreads = false; - break; - } - } - long retVal = Utils.getOrCreateThreadId(context, address); - if (DELETEDEBUG || Log.isLoggable(LogTag.APP, Log.VERBOSE)) { - LogTag.debug("[Conversation] getOrCreateThreadId for (%s) returned %d", - address, retVal); - } - return retVal; - } - } - - /* - * The primary key of a conversation is its recipient set; override - * equals() and hashCode() to just pass through to the internal - * recipient sets. - */ - @Override - public synchronized boolean equals(Object obj) { - try { - Conversation other = (Conversation) obj; - return (mRecipients.equals(other.mRecipients)); - } catch (ClassCastException e) { - return false; - } - } - - @Override - public synchronized int hashCode() { - return mRecipients.hashCode(); - } - - @Override - public synchronized String toString() { - return String.format("[%s] (tid %d)", mRecipients.serialize(), mThreadId); - } - - /** - * Remove any obsolete conversations sitting around on disk. Obsolete threads are threads - * that aren't referenced by any message in the pdu or sms tables. - */ - public static void asyncDeleteObsoleteThreads(AsyncQueryHandler handler, int token) { - handler.startDelete(token, null, Threads.OBSOLETE_THREADS_URI, null, null); - } - - /** - * Start a query for all conversations in the database on the specified - * AsyncQueryHandler. - * - * @param handler An AsyncQueryHandler that will receive onQueryComplete - * upon completion of the query - * @param token The token that will be passed to onQueryComplete - */ - public static void startQueryForAll(AsyncQueryHandler handler, int token) { - handler.cancelOperation(token); - - // This query looks like this in the log: - // I/Database( 147): elapsedTime4Sql|/data/data/com.android.providers.telephony/databases/ - // mmssms.db|2.253 ms|SELECT _id, date, message_count, recipient_ids, snippet, snippet_cs, - // read, error, has_attachment FROM threads ORDER BY date DESC - - startQuery(handler, token, null); - } - - /** - * Start a query for in the database on the specified AsyncQueryHandler with the specified - * "where" clause. - * - * @param handler An AsyncQueryHandler that will receive onQueryComplete - * upon completion of the query - * @param token The token that will be passed to onQueryComplete - * @param selection A where clause (can be null) to select particular conv items. - */ - public static void startQuery(AsyncQueryHandler handler, int token, String selection) { - handler.cancelOperation(token); - - // This query looks like this in the log: - // I/Database( 147): elapsedTime4Sql|/data/data/com.android.providers.telephony/databases/ - // mmssms.db|2.253 ms|SELECT _id, date, message_count, recipient_ids, snippet, snippet_cs, - // read, error, has_attachment FROM threads ORDER BY date DESC - - handler.startQuery(token, null, sAllThreadsUri, - ALL_THREADS_PROJECTION, selection, null, Conversations.DEFAULT_SORT_ORDER); - } - - /** - * Start a delete of the conversation with the specified thread ID. - * - * @param handler An AsyncQueryHandler that will receive onDeleteComplete - * upon completion of the conversation being deleted - * @param token The token that will be passed to onDeleteComplete - * @param deleteAll Delete the whole thread including locked messages - * @param threadIds Collection of thread IDs of the conversations to be deleted - */ - public static void startDelete(ConversationQueryHandler handler, int token, boolean deleteAll, Collection<Long> threadIds) { - synchronized (sDeletingThreadsLock) { - if (DELETEDEBUG) { - Log.v(TAG, "Conversation startDelete sDeletingThreads: " + sDeletingThreads); - } - if (sDeletingThreads) { - Log.e(TAG, "startDeleteAll already in the middle of a delete", new Exception()); - } - //MmsApp.getApplication().getPduLoaderManager().clear(); - sDeletingThreads = true; - - for (long threadId : threadIds) { - Uri uri = ContentUris.withAppendedId(Threads.CONTENT_URI, threadId); - String selection = deleteAll ? null : "locked=0"; - - handler.setDeleteToken(token); - handler.startDelete(token, new Long(threadId), uri, selection, null); - - DraftCache.getInstance().setDraftState(threadId, false); - } - } - } - - /** - * Start deleting all conversations in the database. - * - * @param handler An AsyncQueryHandler that will receive onDeleteComplete - * upon completion of all conversations being deleted - * @param token The token that will be passed to onDeleteComplete - * @param deleteAll Delete the whole thread including locked messages - */ - public static void startDeleteAll(ConversationQueryHandler handler, int token, - boolean deleteAll) { - synchronized (sDeletingThreadsLock) { - if (DELETEDEBUG) { - Log.v(TAG, "Conversation startDeleteAll sDeletingThreads: " + - sDeletingThreads); - } - if (sDeletingThreads) { - Log.e(TAG, "startDeleteAll already in the middle of a delete", new Exception()); - } - sDeletingThreads = true; - String selection = deleteAll ? null : "locked=0"; - - QKSMSAppBase app = QKSMSApp.getApplication(); - //app.getPduLoaderManager().clear(); - //app.getThumbnailManager().clear(); - - handler.setDeleteToken(token); - handler.startDelete(token, new Long(-1), Threads.CONTENT_URI, selection, null); - } - } - - public static class ConversationQueryHandler extends AsyncQueryHandler { - private int mDeleteToken; - private Context mContext; - - public ConversationQueryHandler(ContentResolver cr, Context context) { - super(cr); - mContext = context; - } - - public void setDeleteToken(int token) { - mDeleteToken = token; - } - - /** - * Always call this super method from your overridden onDeleteComplete function. - */ - @Override - protected void onDeleteComplete(int token, Object cookie, int result) { - if (token == mDeleteToken) { - // release lock - synchronized (sDeletingThreadsLock) { - sDeletingThreads = false; - if (DELETEDEBUG) { - Log.v(TAG, "Conversation onDeleteComplete sDeletingThreads: " + sDeletingThreads); - } - sDeletingThreadsLock.notifyAll(); - } - UnreadBadgeService.update(mContext); - NotificationManager.create(mContext); - } - } - } - - /** - * Check for locked messages in all threads or a specified thread. - * - * @param handler An AsyncQueryHandler that will receive onQueryComplete - * upon completion of looking for locked messages - * @param threadIds A list of threads to search. null means all threads - * @param token The token that will be passed to onQueryComplete - */ - public static void startQueryHaveLockedMessages(AsyncQueryHandler handler, - Collection<Long> threadIds, - int token) { - handler.cancelOperation(token); - Uri uri = MmsSms.CONTENT_LOCKED_URI; - - String selection = null; - if (threadIds != null) { - StringBuilder buf = new StringBuilder(); - int i = 0; - - for (long threadId : threadIds) { - if (i++ > 0) { - buf.append(" OR "); - } - // We have to build the selection arg into the selection because deep down in - // provider, the function buildUnionSubQuery takes selectionArgs, but ignores it. - buf.append(Mms.THREAD_ID).append("=").append(Long.toString(threadId)); - } - selection = buf.toString(); - } - handler.startQuery(token, threadIds, uri, - ALL_THREADS_PROJECTION, selection, null, Conversations.DEFAULT_SORT_ORDER); - } - - /** - * Check for locked messages in all threads or a specified thread. - * - * @param handler An AsyncQueryHandler that will receive onQueryComplete - * upon completion of looking for locked messages - * @param threadId The threadId of the thread to search. -1 means all threads - * @param token The token that will be passed to onQueryComplete - */ - public static void startQueryHaveLockedMessages(AsyncQueryHandler handler, - long threadId, - int token) { - ArrayList<Long> threadIds = null; - if (threadId != -1) { - threadIds = new ArrayList<Long>(); - threadIds.add(threadId); - } - startQueryHaveLockedMessages(handler, threadIds, token); - } - - /** - * Fill the specified conversation with the values from the specified - * cursor, possibly setting recipients to empty if value allowQuery - * is false and the recipient IDs are not in cache. The cursor should - * be one made via {@link #startQueryForAll}. - */ - private static void fillFromCursor(Context context, Conversation conv, - Cursor c, boolean allowQuery) { - synchronized (conv) { - conv.mThreadId = c.getLong(ID); - conv.mDate = c.getLong(DATE); - conv.mMessageCount = c.getInt(MESSAGE_COUNT); - - // Replace the snippet with a default value if it's empty. - String snippet = SmsHelper.cleanseMmsSubject(context, - SmsHelper.extractEncStrFromCursor(c, SNIPPET, SNIPPET_CS)); - if (TextUtils.isEmpty(snippet)) { - snippet = context.getString(R.string.no_subject_view); - } - conv.mSnippet = snippet; - - conv.setHasUnreadMessages(c.getInt(READ) == 0); - conv.mHasError = (c.getInt(ERROR) != 0); - conv.mHasAttachment = (c.getInt(HAS_ATTACHMENT) != 0); - } - // Fill in as much of the conversation as we can before doing the slow stuff of looking - // up the contacts associated with this conversation. - String recipientIds = c.getString(RECIPIENT_IDS); - ContactList recipients = ContactList.getByIds(recipientIds, allowQuery); - synchronized (conv) { - conv.mRecipients = recipients; - } - - if (Log.isLoggable(LogTag.THREAD_CACHE, Log.VERBOSE)) { - Log.d(TAG, "fillFromCursor: conv=" + conv + ", recipientIds=" + recipientIds); - } - } - - /** - * Private cache for the use of the various forms of Conversation.get. - */ - private static class Cache { - private static Cache sInstance = new Cache(); - - static Cache getInstance() { - return sInstance; - } - - private final HashSet<Conversation> mCache; - - private Cache() { - mCache = new HashSet<Conversation>(10); - } - - /** - * Return the conversation with the specified thread ID, or - * null if it's not in cache. - */ - static Conversation get(long threadId) { - synchronized (sInstance) { - if (Log.isLoggable(LogTag.THREAD_CACHE, Log.VERBOSE)) { - LogTag.debug("Conversation get with threadId: " + threadId); - } - for (Conversation c : sInstance.mCache) { - if (DEBUG) { - LogTag.debug("Conversation get() threadId: " + threadId + - " c.getThreadId(): " + c.getThreadId()); - } - if (c.getThreadId() == threadId) { - return c; - } - } - } - return null; - } - - /** - * Return the conversation with the specified recipient - * list, or null if it's not in cache. - */ - static Conversation get(ContactList list) { - synchronized (sInstance) { - if (Log.isLoggable(LogTag.THREAD_CACHE, Log.VERBOSE)) { - LogTag.debug("Conversation get with ContactList: " + list); - } - for (Conversation c : sInstance.mCache) { - if (c.getRecipients().equals(list)) { - return c; - } - } - } - return null; - } - - /** - * Put the specified conversation in the cache. The caller - * should not place an already-existing conversation in the - * cache, but rather update it in place. - */ - static void put(Conversation c) { - synchronized (sInstance) { - // We update cache entries in place so people with long- - // held references get updated. - if (Log.isLoggable(LogTag.THREAD_CACHE, Log.VERBOSE)) { - Log.d(TAG, "Conversation.Cache.put: conv= " + c + ", hash: " + c.hashCode()); - } - - if (sInstance.mCache.contains(c)) { - if (DEBUG) { - dumpCache(); - } - throw new IllegalStateException("cache already contains " + c + - " threadId: " + c.mThreadId); - } - sInstance.mCache.add(c); - } - } - - /** - * Replace the specified conversation in the cache. This is used in cases where we - * lookup a conversation in the cache by threadId, but don't find it. The caller - * then builds a new conversation (from the cursor) and tries to add it, but gets - * an exception that the conversation is already in the cache, because the hash - * is based on the recipients and it's there under a stale threadId. In this function - * we remove the stale entry and add the new one. Returns true if the operation is - * successful - */ - static boolean replace(Conversation c) { - synchronized (sInstance) { - if (Log.isLoggable(LogTag.THREAD_CACHE, Log.VERBOSE)) { - LogTag.debug("Conversation.Cache.put: conv= " + c + ", hash: " + c.hashCode()); - } - - if (!sInstance.mCache.contains(c)) { - if (DEBUG) { - dumpCache(); - } - return false; - } - // Here it looks like we're simply removing and then re-adding the same object - // to the hashset. Because the hashkey is the conversation's recipients, and not - // the thread id, we'll actually remove the object with the stale threadId and - // then add the the conversation with updated threadId, both having the same - // recipients. - sInstance.mCache.remove(c); - sInstance.mCache.add(c); - return true; - } - } - - static void remove(long threadId) { - synchronized (sInstance) { - if (DEBUG) { - LogTag.debug("remove threadid: " + threadId); - dumpCache(); - } - for (Conversation c : sInstance.mCache) { - if (c.getThreadId() == threadId) { - sInstance.mCache.remove(c); - return; - } - } - } - } - - static void dumpCache() { - synchronized (sInstance) { - LogTag.debug("Conversation dumpCache: "); - for (Conversation c : sInstance.mCache) { - LogTag.debug(" conv: " + c.toString() + " hash: " + c.hashCode()); - } - } - } - - /** - * Remove all conversations from the cache that are not in - * the provided set of thread IDs. - */ - static void keepOnly(Set<Long> threads) { - synchronized (sInstance) { - Iterator<Conversation> iter = sInstance.mCache.iterator(); - while (iter.hasNext()) { - Conversation c = iter.next(); - if (!threads.contains(c.getThreadId())) { - iter.remove(); - } - } - } - if (DEBUG) { - LogTag.debug("after keepOnly"); - dumpCache(); - } - } - } - - /** - * Set up the conversation cache. To be called once at application - * startup time. - */ - public static void init(final Context context) { - Thread thread = new Thread(new Runnable() { - @Override - public void run() { - cacheAllThreads(context); - } - }, "Conversation.init"); - thread.setPriority(Thread.MIN_PRIORITY); - thread.start(); - } - - public static void markAllConversationsAsSeen(final Context context) { - if (DELETEDEBUG || DEBUG) { - Contact.logWithTrace(TAG, "Conversation.markAllConversationsAsSeen"); - } - - Thread thread = new Thread(new Runnable() { - @Override - public void run() { - if (DELETEDEBUG) { - Log.d(TAG, "Conversation.markAllConversationsAsSeen.run"); - } - blockingMarkAllSmsMessagesAsSeen(context); - blockingMarkAllMmsMessagesAsSeen(context); - - // Always update notifications regardless of the read state. - //MessagingNotification.blockingUpdateAllNotifications(context, MessagingNotification.THREAD_NONE); - } - }, "Conversation.markAllConversationsAsSeen"); - thread.setPriority(Thread.MIN_PRIORITY); - thread.start(); - } - - private static void blockingMarkAllSmsMessagesAsSeen(final Context context) { - ContentResolver resolver = context.getContentResolver(); - Cursor cursor = resolver.query(Sms.Inbox.CONTENT_URI, - SEEN_PROJECTION, - "seen=0", - null, - null); - - int count = 0; - - if (cursor != null) { - try { - count = cursor.getCount(); - } finally { - cursor.close(); - } - } - - if (count == 0) { - return; - } - - if (DELETEDEBUG || Log.isLoggable(LogTag.APP, Log.VERBOSE)) { - Log.d(TAG, "mark " + count + " SMS msgs as seen"); - } - - ContentValues values = new ContentValues(1); - values.put("seen", 1); - - resolver.update(Sms.Inbox.CONTENT_URI, - values, - "seen=0", - null); - } - - private static void blockingMarkAllMmsMessagesAsSeen(final Context context) { - ContentResolver resolver = context.getContentResolver(); - Cursor cursor = resolver.query(Mms.Inbox.CONTENT_URI, - SEEN_PROJECTION, - "seen=0", - null, - null); - - int count = 0; - - if (cursor != null) { - try { - count = cursor.getCount(); - } finally { - cursor.close(); - } - } - - if (count == 0) { - return; - } - - if (DELETEDEBUG || Log.isLoggable(LogTag.APP, Log.VERBOSE)) { - Log.d(TAG, "mark " + count + " MMS msgs as seen"); - } - - ContentValues values = new ContentValues(1); - values.put("seen", 1); - - resolver.update(Mms.Inbox.CONTENT_URI, - values, - "seen=0", - null); - - } - - /** - * Are we in the process of loading and caching all the threads?. - */ - public static boolean loadingThreads() { - synchronized (Cache.getInstance()) { - return sLoadingThreads; - } - } - - private static void cacheAllThreads(Context context) { - if (Log.isLoggable(LogTag.THREAD_CACHE, Log.VERBOSE)) { - LogTag.debug("[Conversation] cacheAllThreads: begin"); - } - synchronized (Cache.getInstance()) { - if (sLoadingThreads) { - return; - } - sLoadingThreads = true; - } - - // Keep track of what threads are now on disk so we - // can discard anything removed from the cache. - HashSet<Long> threadsOnDisk = new HashSet<>(); - - // Query for all conversations. - Cursor c = context.getContentResolver().query(sAllThreadsUri, - ALL_THREADS_PROJECTION, null, null, null); - try { - if (c != null) { - while (c.moveToNext()) { - long threadId = c.getLong(ID); - threadsOnDisk.add(threadId); - - // Try to find this thread ID in the cache. - Conversation conv; - synchronized (Cache.getInstance()) { - conv = Cache.get(threadId); - } - - if (conv == null) { - // Make a new Conversation and put it in - // the cache if necessary. - conv = new Conversation(context, c, true); - try { - synchronized (Cache.getInstance()) { - Cache.put(conv); - } - } catch (IllegalStateException e) { - LogTag.error("Tried to add duplicate Conversation to Cache" + - " for threadId: " + threadId + " new conv: " + conv); - if (!Cache.replace(conv)) { - LogTag.error("cacheAllThreads cache.replace failed on " + conv); - } - } - } else { - // Or update in place so people with references - // to conversations get updated too. - fillFromCursor(context, conv, c, true); - } - } - } - } finally { - if (c != null) { - c.close(); - } - synchronized (Cache.getInstance()) { - sLoadingThreads = false; - } - } - - // Purge the cache of threads that no longer exist on disk. - Cache.keepOnly(threadsOnDisk); - - if (Log.isLoggable(LogTag.THREAD_CACHE, Log.VERBOSE)) { - LogTag.debug("[Conversation] cacheAllThreads: finished"); - Cache.dumpCache(); - } - } - - private boolean loadFromThreadId(long threadId, boolean allowQuery) { - Cursor c = mContext.getContentResolver().query(sAllThreadsUri, ALL_THREADS_PROJECTION, - "_id=" + Long.toString(threadId), null, null); - try { - if (c.moveToFirst()) { - fillFromCursor(mContext, this, c, allowQuery); - - if (threadId != mThreadId) { - LogTag.error("loadFromThreadId: fillFromCursor returned differnt thread_id!" + - " threadId=" + threadId + ", mThreadId=" + mThreadId); - } - } else { - LogTag.error("loadFromThreadId: Can't find thread ID " + threadId); - return false; - } - } finally { - c.close(); - } - return true; - } - - public static String getRecipients(Uri uri) { - String base = uri.getSchemeSpecificPart(); - int pos = base.indexOf('?'); - return (pos == -1) ? base : base.substring(0, pos); - } - - public static void dump() { - Cache.dumpCache(); - } - - public static void dumpThreadsTable(Context context) { - LogTag.debug("**** Dump of threads table ****"); - Cursor c = context.getContentResolver().query(sAllThreadsUri, - ALL_THREADS_PROJECTION, null, null, "date ASC"); - try { - c.moveToPosition(-1); - while (c.moveToNext()) { - String snippet = SmsHelper.extractEncStrFromCursor(c, SNIPPET, SNIPPET_CS); - Log.d(TAG, "dumpThreadsTable threadId: " + c.getLong(ID) + - " " + ThreadsColumns.DATE + " : " + c.getLong(DATE) + - " " + ThreadsColumns.MESSAGE_COUNT + " : " + c.getInt(MESSAGE_COUNT) + - " " + ThreadsColumns.SNIPPET + " : " + snippet + - " " + ThreadsColumns.READ + " : " + c.getInt(READ) + - " " + ThreadsColumns.ERROR + " : " + c.getInt(ERROR) + - " " + ThreadsColumns.HAS_ATTACHMENT + " : " + c.getInt(HAS_ATTACHMENT) + - " " + ThreadsColumns.RECIPIENT_IDS + " : " + c.getString(RECIPIENT_IDS)); - - ContactList recipients = ContactList.getByIds(c.getString(RECIPIENT_IDS), false); - Log.d(TAG, "----recipients: " + recipients.serialize()); - } - } finally { - c.close(); - } - } - - static final String[] SMS_PROJECTION = new String[]{ - BaseColumns._ID, - // For SMS - Sms.THREAD_ID, - Sms.ADDRESS, - Sms.BODY, - Sms.DATE, - Sms.READ, - Sms.TYPE, - Sms.STATUS, - Sms.LOCKED, - Sms.ERROR_CODE, - }; - - // The indexes of the default columns which must be consistent - // with above PROJECTION. - static final int COLUMN_ID = 0; - static final int COLUMN_THREAD_ID = 1; - static final int COLUMN_SMS_ADDRESS = 2; - static final int COLUMN_SMS_BODY = 3; - static final int COLUMN_SMS_DATE = 4; - static final int COLUMN_SMS_READ = 5; - static final int COLUMN_SMS_TYPE = 6; - static final int COLUMN_SMS_STATUS = 7; - static final int COLUMN_SMS_LOCKED = 8; - static final int COLUMN_SMS_ERROR_CODE = 9; - - public static void dumpSmsTable(Context context) { - LogTag.debug("**** Dump of sms table ****"); - Cursor c = context.getContentResolver().query(Sms.CONTENT_URI, - SMS_PROJECTION, null, null, "_id DESC"); - try { - // Only dump the latest 20 messages - c.moveToPosition(-1); - while (c.moveToNext() && c.getPosition() < 20) { - String body = c.getString(COLUMN_SMS_BODY); - LogTag.debug("dumpSmsTable " + BaseColumns._ID + ": " + c.getLong(COLUMN_ID) + - " " + Sms.THREAD_ID + " : " + c.getLong(DATE) + - " " + Sms.ADDRESS + " : " + c.getString(COLUMN_SMS_ADDRESS) + - " " + Sms.BODY + " : " + body.substring(0, Math.min(body.length(), 8)) + - " " + Sms.DATE + " : " + c.getLong(COLUMN_SMS_DATE) + - " " + Sms.TYPE + " : " + c.getInt(COLUMN_SMS_TYPE)); - } - } finally { - c.close(); - } - } - - /** - * verifySingleRecipient takes a threadId and a string recipient [phone number or email - * address]. It uses that threadId to lookup the row in the threads table and grab the - * recipient ids column. The recipient ids column contains a space-separated list of - * recipient ids. These ids are keys in the canonical_addresses table. The recipient is - * compared against what's stored in the mmssms.db, but only if the recipient id list has - * a single address. - * - * @param context is used for getting a ContentResolver - * @param threadId of the thread we're sending to - * @param recipientStr is a phone number or email address - * @return the verified number or email of the recipient - */ - public static String verifySingleRecipient(final Context context, - final long threadId, final String recipientStr) { - if (threadId <= 0) { - LogTag.error("verifySingleRecipient threadId is ZERO, recipient: " + recipientStr); - LogTag.dumpInternalTables(context); - return recipientStr; - } - Cursor c = context.getContentResolver().query(sAllThreadsUri, ALL_THREADS_PROJECTION, - "_id=" + Long.toString(threadId), null, null); - if (c == null) { - LogTag.error("verifySingleRecipient threadId: " + threadId + - " resulted in NULL cursor , recipient: " + recipientStr); - LogTag.dumpInternalTables(context); - return recipientStr; - } - String address = recipientStr; - String recipientIds; - try { - if (!c.moveToFirst()) { - LogTag.error("verifySingleRecipient threadId: " + threadId + - " can't moveToFirst , recipient: " + recipientStr); - LogTag.dumpInternalTables(context); - return recipientStr; - } - recipientIds = c.getString(RECIPIENT_IDS); - } finally { - c.close(); - } - String[] ids = recipientIds.split(" "); - - if (ids.length != 1) { - // We're only verifying the situation where we have a single recipient input against - // a thread with a single recipient. If the thread has multiple recipients, just - // assume the input number is correct and return it. - return recipientStr; - } - - // Get the actual number from the canonical_addresses table for this recipientId - address = RecipientIdCache.getSingleAddressFromCanonicalAddressInDb(context, ids[0]); - - if (TextUtils.isEmpty(address)) { - LogTag.error("verifySingleRecipient threadId: " + threadId + - " getSingleNumberFromCanonicalAddresses returned empty number for: " + - ids[0] + " recipientIds: " + recipientIds); - LogTag.dumpInternalTables(context); - return recipientStr; - } - if (PhoneNumberUtils.compareLoosely(recipientStr, address)) { - // Bingo, we've got a match. We're returning the input number because of area - // codes. We could have a number in the canonical_address name of "232-1012" and - // assume the user's phone's area code is 650. If the user sends a message to - // "(415) 232-1012", it will loosely match "232-1202". If we returned the value - // from the table (232-1012), the message would go to the wrong person (to the - // person in the 650 area code rather than in the 415 area code). - return recipientStr; - } - - if (context instanceof Activity) { - LogTag.warnPossibleRecipientMismatch("verifySingleRecipient for threadId: " + - threadId + " original recipient: " + recipientStr + - " recipient from DB: " + address, (Activity) context); - } - LogTag.dumpInternalTables(context); - if (Log.isLoggable(LogTag.THREAD_CACHE, Log.VERBOSE)) { - LogTag.debug("verifySingleRecipient for threadId: " + - threadId + " original recipient: " + recipientStr + - " recipient from DB: " + address); - } - return address; - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/data/ConversationLegacy.java b/QKSMS/src/main/java/com/moez/QKSMS/data/ConversationLegacy.java deleted file mode 100644 index bfc6a3d68..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/data/ConversationLegacy.java +++ /dev/null @@ -1,309 +0,0 @@ -package com.moez.QKSMS.data; - -import android.content.ContentResolver; -import android.content.ContentValues; -import android.content.Context; -import android.database.Cursor; -import android.net.Uri; -import android.os.AsyncTask; -import android.telephony.PhoneNumberUtils; -import android.util.Log; -import android.widget.Toast; -import com.moez.QKSMS.R; -import com.moez.QKSMS.receiver.UnreadBadgeService; -import com.moez.QKSMS.common.google.DraftCache; -import com.moez.QKSMS.transaction.NotificationManager; -import com.moez.QKSMS.transaction.SmsHelper; -import com.moez.QKSMS.transaction.SqliteWrapper; -import com.moez.QKSMS.ui.dialog.DefaultSmsHelper; -import com.moez.QKSMS.ui.messagelist.MessageColumns; -import com.moez.QKSMS.ui.messagelist.MessageItem; - -/** - * Use this class (rather than Conversation) for marking conversations as read, and managing drafts. - */ -public class ConversationLegacy { - private final String TAG = "ConversationLegacy"; - - public static final Uri CONVERSATIONS_CONTENT_PROVIDER = Uri.parse("content://mms-sms/conversations?simple=true"); - public static final Uri ADDRESSES_CONTENT_PROVIDER = Uri.parse("content://mms-sms/canonical-addresses"); - - public static final int COLUMN_ADDRESSES_ADDRESS = 1; - - private ContactHelper contactHelper; - private Context context; - - private long threadId; - private String name; - private String address; - private long recipient; - private String draft; - private int type; - - private Cursor cursor; - - public ConversationLegacy(Context context, long threadId) { - this.context = context; - this.threadId = threadId; - contactHelper = new ContactHelper(); - } - - public long getThreadId() { - return threadId; - } - - public Uri getUri() { - return Uri.parse("content://mms-sms/conversations/" + getThreadId()); - } - - - public String getName(boolean findIfNull) { - if (name == null || name.trim().isEmpty()) { - if (findIfNull) name = contactHelper.getName(context, getAddress()); - else return getAddress(); - } - - return name; - } - - public String getAddress() { - if (address == null) { - if (getType() == 0) { //Single person - try { - cursor = context.getContentResolver().query(ADDRESSES_CONTENT_PROVIDER, null, "_id=" + getRecipient(), null, null); - cursor.moveToFirst(); - address = cursor.getString(COLUMN_ADDRESSES_ADDRESS); - - address = PhoneNumberUtils.stripSeparators(address); - - if (address == null || address.isEmpty()) { - cursor = context.getContentResolver().query(SmsHelper.RECEIVED_MESSAGE_CONTENT_PROVIDER, new String[]{SmsHelper.COLUMN_ID}, "thread_id=" + threadId, null, SmsHelper.sortDateDesc); - cursor.moveToFirst(); - - long id = cursor.getLong(cursor.getColumnIndexOrThrow(SmsHelper.COLUMN_ID)); - address = new Message(context, id).getAddress(); - } - } catch (Exception e) { - e.printStackTrace(); - } finally { - if (cursor != null) { - cursor.close(); - } - } - } - } - - return address; - } - - public long getRecipient() { - if (recipient == 0) { - try { - cursor = context.getContentResolver().query(CONVERSATIONS_CONTENT_PROVIDER, null, "_id=" + threadId, null, null); - cursor.moveToFirst(); - recipient = cursor.getInt(cursor.getColumnIndexOrThrow(SmsHelper.COLUMN_RECIPIENT)); - } catch (Exception e) { - e.printStackTrace(); - } finally { - if (cursor != null) { - cursor.close(); - } - } - } - - return recipient; - } - - public boolean hasDraft() { - return DraftCache.getInstance().hasDraft(threadId); - } - - public String getDraft() { - - if (draft == null) { - try { - cursor = context.getContentResolver().query(SmsHelper.DRAFTS_CONTENT_PROVIDER, null, SmsHelper.COLUMN_THREAD_ID + "=" + threadId, null, null); - cursor.moveToFirst(); - draft = cursor.getString(cursor.getColumnIndexOrThrow(SmsHelper.COLUMN_BODY)); - } catch (Exception e) { - e.printStackTrace(); - } finally { - if (cursor != null) { - cursor.close(); - } - } - } - - return draft; - } - - public void clearDrafts() { - if (hasDraft()) { - try { - DraftCache.getInstance().setSavingDraft(true); - DraftCache.getInstance().setDraftState(threadId, false); - - cursor = context.getContentResolver().query(SmsHelper.DRAFTS_CONTENT_PROVIDER, null, SmsHelper.COLUMN_THREAD_ID + "=" + threadId, null, null); - if (cursor.moveToFirst()) { - do { - context.getContentResolver().delete(Uri.parse("content://sms/" + cursor.getLong(cursor.getColumnIndexOrThrow(SmsHelper.COLUMN_ID))), null, null); - } while (cursor.moveToNext()); - } - } catch (Exception e) { - e.printStackTrace(); - } finally { - if (cursor != null) { - cursor.close(); - } - DraftCache.getInstance().setSavingDraft(false); - } - } - } - - public void saveDraft(final String draft) { - - clearDrafts(); - - if (draft.length() > 0) { - try { - DraftCache.getInstance().setSavingDraft(true); - DraftCache.getInstance().setDraftState(threadId, true); - ConversationLegacy.this.draft = draft; - - ContentResolver contentResolver = context.getContentResolver(); - ContentValues cv = new ContentValues(); - - cv.put("address", getAddress()); - cv.put("body", draft); - - contentResolver.insert(SmsHelper.DRAFTS_CONTENT_PROVIDER, cv); - } finally { - DraftCache.getInstance().setSavingDraft(false); - } - } else { - ConversationLegacy.this.draft = null; - } - - Toast.makeText(context, R.string.toast_draft, Toast.LENGTH_SHORT).show(); - } - - public int getType() { - if (type == 0) { - try { - cursor = context.getContentResolver().query(CONVERSATIONS_CONTENT_PROVIDER, null, "_id=" + threadId, null, null); - cursor.moveToFirst(); - type = cursor.getInt(cursor.getColumnIndexOrThrow(SmsHelper.COLUMN_TYPE)); - } catch (Exception e) { - e.printStackTrace(); - } finally { - cursor.close(); - } - } - - return type; - } - - private long[] getUnreadIds() { - long[] ids = new long[0]; - - try { - cursor = context.getContentResolver().query(getUri(), new String[]{SmsHelper.COLUMN_ID}, SmsHelper.UNREAD_SELECTION, null, null); - ids = new long[cursor.getCount()]; - cursor.moveToFirst(); - - for (int i = 0; i < ids.length; i++) { - ids[i] = cursor.getLong(cursor.getColumnIndexOrThrow(SmsHelper.COLUMN_ID)); - cursor.moveToNext(); - Log.d(TAG, "Unread ID: " + ids[i]); - } - } catch (Exception e) { - e.printStackTrace(); - } finally { - if (cursor != null) { - cursor.close(); - } - } - - return ids; - } - - public void markRead() { - - new Thread() { - public void run() { - - long[] ids = getUnreadIds(); - if (ids.length > 0) { - new DefaultSmsHelper(context, R.string.not_default_mark_read).showIfNotDefault(null); - - ContentValues cv = new ContentValues(); - cv.put("read", true); - cv.put("seen", true); - - for (long id : ids) { - context.getContentResolver().update(getUri(), cv, SmsHelper.COLUMN_ID + "=" + id, null); - } - - NotificationManager.update(context); - - UnreadBadgeService.update(context); - } - } - }.start(); - } - - public void markUnread() { - new DefaultSmsHelper(context, R.string.not_default_mark_unread).showIfNotDefault(null); - - try { - cursor = context.getContentResolver().query(getUri(), MessageColumns.PROJECTION, null, null, SmsHelper.sortDateDesc); - cursor.moveToFirst(); - - MessageColumns.ColumnsMap columnsMap = new MessageColumns.ColumnsMap(cursor); - MessageItem message = new MessageItem(context, cursor.getString(columnsMap.mColumnMsgType), cursor, columnsMap, null, true); - - if (message.isMe()) { - while (cursor.moveToNext()) { - MessageItem message2 = new MessageItem(context, cursor.getString(columnsMap.mColumnMsgType), cursor, columnsMap, null, true); - if (!message2.isMe()) { - message = message2; - break; - } - } - } - - ContentValues cv = new ContentValues(); - cv.put("read", false); - cv.put("seen", false); - - context.getContentResolver().update(message.mMessageUri, cv, null, null); - } catch (Exception e) { - e.printStackTrace(); - } finally { - if (cursor != null) { - cursor.close(); - } - } - - NotificationManager.create(context); - } - - public void delete() { //TODO do this using AsyncQueryHandler - new DefaultSmsHelper(context, R.string.not_default_delete).showIfNotDefault(null); - - new AsyncTask<Void, Void, Void>() { - - @Override - protected Void doInBackground(Void... params) { - SqliteWrapper.delete(context, context.getContentResolver(), getUri(), null, null); - return null; - } - - @Override - protected void onPostExecute(Void aVoid) { - super.onPostExecute(aVoid); - Toast.makeText(context, R.string.toast_conversation_deleted, Toast.LENGTH_SHORT).show(); - } - }.execute((Void[]) null); - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/data/Message.java b/QKSMS/src/main/java/com/moez/QKSMS/data/Message.java deleted file mode 100644 index e4214337d..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/data/Message.java +++ /dev/null @@ -1,189 +0,0 @@ -package com.moez.QKSMS.data; - -import android.content.ContentValues; -import android.content.Context; -import android.database.Cursor; -import android.graphics.Bitmap; -import android.net.Uri; -import com.moez.QKSMS.R; -import com.moez.QKSMS.transaction.SmsHelper; -import com.moez.QKSMS.ui.dialog.DefaultSmsHelper; - -public class Message { - private final String TAG = "Message"; - - public static final int RECEIVED = 1; - public static final int SENT = 2; - public static final int DRAFT = 3; - public static final int SENDING = 4; - public static final int FAILED = 5; - - public static final Uri SMS_CONTENT_PROVIDER = Uri.parse("content://sms/"); - public static final Uri MMS_SMS_CONTENT_PROVIDER = Uri.parse("content://mms-sms/conversations/"); - public static final Uri SENT_MESSAGE_CONTENT_PROVIDER = Uri.parse("content://sms/sent"); - - // ContentResolver columns - static final Uri RECEIVED_MESSAGE_CONTENT_PROVIDER = Uri.parse("content://sms/inbox"); - private Context context; - private ContactHelper contactHelper; - private Uri uri; - private long id; - private long threadId; - private String body; - private String address; - private String name; - private long contactId; - private Bitmap photoBitmap; - private int read; // change to boolean - - public Message(Context context, long id) { - this.context = context; - this.id = id; - - contactHelper = new ContactHelper(); - - uri = Uri.withAppendedPath(MMS_SMS_CONTENT_PROVIDER, "" + id); - } - - public Message(Context context, Uri uri) { - this.context = context; - this.uri = uri; - - contactHelper = new ContactHelper(); - - Cursor cursor = context.getContentResolver().query(uri, new String[]{SmsHelper.COLUMN_ID}, null, null, null); - cursor.moveToFirst(); - id = cursor.getLong(cursor.getColumnIndexOrThrow(SmsHelper.COLUMN_ID)); - cursor.close(); - } - - public long getId() { - return id; - } - - public long getThreadId() { - if (threadId == 0) { - Cursor cursor = null; - try { - cursor = context.getContentResolver().query(SMS_CONTENT_PROVIDER, new String[]{SmsHelper.COLUMN_THREAD_ID}, "_id=" + id, null, null); - cursor.moveToFirst(); - threadId = cursor.getLong(cursor.getColumnIndexOrThrow(SmsHelper.COLUMN_THREAD_ID)); - } catch (Exception e) { - e.printStackTrace(); - } finally { - if (cursor != null) { - cursor.close(); - } - } - } - - return threadId; - } - - public boolean isMms() { - boolean isMms = false; - Cursor cursor = null; - try { - cursor = context.getContentResolver().query(MMS_SMS_CONTENT_PROVIDER, new String[]{SmsHelper.COLUMN_MMS}, "_id=" + id, null, null); - cursor.moveToFirst(); - isMms = "application/vnd.wap.multipart.related".equals(cursor.getString(cursor.getColumnIndex(SmsHelper.COLUMN_MMS))); - } catch (Exception e) { - e.printStackTrace(); - } finally { - if (cursor != null) { - cursor.close(); - } - } - return isMms; - } - - public String getAddress() { - Cursor cursor = null; - if (address == null) { - try { - cursor = context.getContentResolver().query(SMS_CONTENT_PROVIDER, new String[]{SmsHelper.COLUMN_ADDRESS}, "_id=" + id, null, null); - cursor.moveToFirst(); - address = cursor.getString(cursor.getColumnIndexOrThrow(SmsHelper.COLUMN_ADDRESS)); - } catch (Exception e) { - e.printStackTrace(); - } finally { - if (cursor != null) { - cursor.close(); - } - } - } - return address; - } - - public String getName() { - if (name == null) name = contactHelper.getName(context, getAddress()); - return name; - } - - public String getBody() { - if (body == null) { - Cursor cursor = null; - try { - cursor = context.getContentResolver().query(SMS_CONTENT_PROVIDER, new String[]{SmsHelper.COLUMN_BODY}, "_id=" + id, null, null); - cursor.moveToFirst(); - body = cursor.getString(cursor.getColumnIndexOrThrow(SmsHelper.COLUMN_BODY)); - } catch (Exception e) { - e.printStackTrace(); - } finally { - if (cursor != null) { - cursor.close(); - } - } - } - - return body; - } - - public long getContactId() { - if (contactId == 0) contactId = contactHelper.getId(context, getAddress()); - return contactId; - } - - public Bitmap getPhotoBitmap() { - if (photoBitmap == null) - photoBitmap = contactHelper.getBitmap(context, getContactId()); - return photoBitmap; - } - - public void markSeen() { - ContentValues cv = new ContentValues(); - cv.put("seen", true); - - if (isMms()) { - context.getContentResolver().update(Uri.parse("content://mms/" + getId()), cv, null, null); - } else { - context.getContentResolver().update(Uri.parse("content://sms/" + getId()), cv, null, null); - } - } - - public void markRead() { - ContentValues cv = new ContentValues(); - cv.put("read", true); - cv.put("seen", true); - - if (isMms()) { - context.getContentResolver().update(Uri.parse("content://mms/" + getId()), cv, null, null); - } else { - context.getContentResolver().update(Uri.parse("content://sms/" + getId()), cv, null, null); - } - } - - public void delete() { - new DefaultSmsHelper(context, R.string.not_default_delete).showIfNotDefault(null); - - try { - if (isMms()) { - context.getContentResolver().delete(Uri.parse("content://mms/" + getId()), null, null); - } else { - context.getContentResolver().delete(Uri.parse("content://sms/" + getId()), null, null); - } - } catch (Exception e) { - e.printStackTrace(); - } - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/data/RecipientIdCache.java b/QKSMS/src/main/java/com/moez/QKSMS/data/RecipientIdCache.java deleted file mode 100644 index 550720714..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/data/RecipientIdCache.java +++ /dev/null @@ -1,276 +0,0 @@ -package com.moez.QKSMS.data; - -import android.content.ContentResolver; -import android.content.ContentUris; -import android.content.ContentValues; -import android.content.Context; -import android.database.Cursor; -import android.database.sqlite.SqliteWrapper; -import android.net.Uri; -import android.provider.Telephony; -import android.text.TextUtils; -import android.util.Log; - -import com.moez.QKSMS.LogTag; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class RecipientIdCache { - private static final boolean LOCAL_DEBUG = false; - private static final String TAG = "Mms/cache"; - - private static Uri sAllCanonical = - Uri.parse("content://mms-sms/canonical-addresses"); - - private static Uri sSingleCanonicalAddressUri = - Uri.parse("content://mms-sms/canonical-address"); - - private static RecipientIdCache sInstance; - static RecipientIdCache getInstance() { return sInstance; } - - private final Map<Long, String> mCache; - - private final Context mContext; - - public static class Entry { - public long id; - public String number; - - public Entry(long id, String number) { - this.id = id; - this.number = number; - } - } - - static void init(Context context) { - sInstance = new RecipientIdCache(context); - new Thread(new Runnable() { - public void run() { - fill(); - } - }, "RecipientIdCache.init").start(); - } - - RecipientIdCache(Context context) { - mCache = new HashMap<Long, String>(); - mContext = context; - } - - public static void fill() { - if (LogTag.VERBOSE || Log.isLoggable(LogTag.THREAD_CACHE, Log.VERBOSE)) { - LogTag.debug("[RecipientIdCache] fill: begin"); - } - - Context context = sInstance.mContext; - Cursor c = SqliteWrapper.query(context, context.getContentResolver(), - sAllCanonical, null, null, null, null); - if (c == null) { - Log.w(TAG, "null Cursor in fill()"); - return; - } - - try { - synchronized (sInstance) { - // Technically we don't have to clear this because the stupid - // canonical_addresses table is never GC'ed. - sInstance.mCache.clear(); - while (c.moveToNext()) { - // TODO: don't hardcode the column indices - long id = c.getLong(0); - String number = c.getString(1); - sInstance.mCache.put(id, number); - } - } - } finally { - c.close(); - } - - if (LogTag.VERBOSE || Log.isLoggable(LogTag.THREAD_CACHE, Log.VERBOSE)) { - LogTag.debug("[RecipientIdCache] fill: finished"); - dump(); - } - } - - public static List<Entry> getAddresses(String spaceSepIds) { - synchronized (sInstance) { - List<Entry> numbers = new ArrayList<>(); - String[] ids = spaceSepIds.split(" "); - for (String id : ids) { - long longId; - - try { - longId = Long.parseLong(id); - } catch (NumberFormatException ex) { - // skip this id - continue; - } - - String number = sInstance.mCache.get(longId); - - if (number == null) { - Log.w(TAG, "RecipientId " + longId + " not in cache!"); - if (Log.isLoggable(LogTag.THREAD_CACHE, Log.VERBOSE)) { - dump(); - } - - fill(); - number = sInstance.mCache.get(longId); - } - - if (TextUtils.isEmpty(number)) { - Log.w(TAG, "RecipientId " + longId + " has empty number!"); - } else { - numbers.add(new Entry(longId, number)); - } - } - return numbers; - } - } - - public static void updateNumbers(long threadId, ContactList contacts) { - long recipientId = 0; - - for (Contact contact : contacts) { - if (contact.isNumberModified()) { - contact.setIsNumberModified(false); - } else { - // if the contact's number wasn't modified, don't bother. - continue; - } - - recipientId = contact.getRecipientId(); - if (recipientId == 0) { - continue; - } - - String number1 = contact.getNumber(); - boolean needsDbUpdate = false; - synchronized (sInstance) { - String number2 = sInstance.mCache.get(recipientId); - - if (Log.isLoggable(LogTag.APP, Log.VERBOSE)) { - Log.d(TAG, "[RecipientIdCache] updateNumbers: contact=" + contact + - ", wasModified=true, recipientId=" + recipientId); - Log.d(TAG, " contact.getNumber=" + number1 + - ", sInstance.mCache.get(recipientId)=" + number2); - } - - // if the numbers don't match, let's update the RecipientIdCache's number - // with the new number in the contact. - if (!number1.equalsIgnoreCase(number2)) { - sInstance.mCache.put(recipientId, number1); - needsDbUpdate = true; - } - } - if (needsDbUpdate) { - // Do this without the lock held. - sInstance.updateCanonicalAddressInDb(recipientId, number1); - } - } - } - - private void updateCanonicalAddressInDb(long id, String number) { - if (LogTag.VERBOSE || Log.isLoggable(LogTag.APP, Log.VERBOSE)) { - Log.d(TAG, "[RecipientIdCache] updateCanonicalAddressInDb: id=" + id + - ", number=" + number); - } - - final ContentValues values = new ContentValues(); - values.put(Telephony.CanonicalAddressesColumns.ADDRESS, number); - - final StringBuilder buf = new StringBuilder(Telephony.CanonicalAddressesColumns._ID); - buf.append('=').append(id); - - final Uri uri = ContentUris.withAppendedId(sSingleCanonicalAddressUri, id); - final ContentResolver cr = mContext.getContentResolver(); - - // We're running on the UI thread so just fire & forget, hope for the best. - // (We were ignoring the return value anyway...) - new Thread("updateCanonicalAddressInDb") { - public void run() { - cr.update(uri, values, buf.toString(), null); - } - }.start(); - } - - public static void dump() { - // Only dump user private data if we're in special debug mode - synchronized (sInstance) { - Log.d(TAG, "*** Recipient ID cache dump ***"); - for (Long id : sInstance.mCache.keySet()) { - Log.d(TAG, id + ": " + sInstance.mCache.get(id)); - } - } - } - - public static void canonicalTableDump() { - Log.d(TAG, "**** Dump of canoncial_addresses table ****"); - Context context = sInstance.mContext; - Cursor c = SqliteWrapper.query(context, context.getContentResolver(), - sAllCanonical, null, null, null, null); - if (c == null) { - Log.w(TAG, "null Cursor in content://mms-sms/canonical-addresses"); - } - try { - while (c.moveToNext()) { - // TODO: don't hardcode the column indices - long id = c.getLong(0); - String number = c.getString(1); - Log.d(TAG, "id: " + id + " number: " + number); - } - } finally { - c.close(); - } - } - - /** - * getSingleNumberFromCanonicalAddresses looks up the recipientId in the canonical_addresses - * table and returns the associated number or email address. - * @param context needed for the ContentResolver - * @param recipientId of the contact to look up - * @return phone number or email address of the recipientId - */ - public static String getSingleAddressFromCanonicalAddressInDb(final Context context, - final String recipientId) { - Cursor c = SqliteWrapper.query(context, context.getContentResolver(), - ContentUris.withAppendedId(sSingleCanonicalAddressUri, Long.parseLong(recipientId)), - null, null, null, null); - if (c == null) { - LogTag.warn(TAG, "null Cursor looking up recipient: " + recipientId); - return null; - } - try { - if (c.moveToFirst()) { - String number = c.getString(0); - return number; - } - } finally { - c.close(); - } - return null; - } - - // used for unit tests - public static void insertCanonicalAddressInDb(final Context context, String number) { - if (LogTag.VERBOSE || Log.isLoggable(LogTag.APP, Log.VERBOSE)) { - Log.d(TAG, "[RecipientIdCache] insertCanonicalAddressInDb: number=" + number); - } - - final ContentValues values = new ContentValues(); - values.put(Telephony.CanonicalAddressesColumns.ADDRESS, number); - - final ContentResolver cr = context.getContentResolver(); - - // We're running on the UI thread so just fire & forget, hope for the best. - // (We were ignoring the return value anyway...) - new Thread("insertCanonicalAddressInDb") { - public void run() { - cr.insert(sAllCanonical, values); - } - }.start(); - } - -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/enums/QKPreference.java b/QKSMS/src/main/java/com/moez/QKSMS/enums/QKPreference.java deleted file mode 100644 index ecaf6eb45..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/enums/QKPreference.java +++ /dev/null @@ -1,124 +0,0 @@ -package com.moez.QKSMS.enums; - -import android.os.Build; -import com.moez.QKSMS.ui.ThemeManager; - -import java.util.Arrays; -import java.util.HashSet; - -public enum QKPreference { - // Appearance - THEME("pref_key_theme", ThemeManager.DEFAULT_COLOR), - ICON("pref_key_icon"), - BACKGROUND("pref_key_background", "offwhite"), - - BUBBLES("pref_key_bubbles"), - BUBBLES_NEW("pref_key_new_bubbles", true), - BUBBLES_COLOR_SENT("pref_key_colour_sent", false), - BUBBLES_COLOR_RECEIVED("pref_key_colour_received", true), - - AUTO_NIGHT("pref_key_night_auto", false), - AUTO_NIGHT_DAY_START("pref_key_day_start", "6:00"), - AUTO_NIGHT_NIGHT_START("pref_key_night_start", "21:00"), - - TINTED_STATUS("pref_key_status_tint", true), - TINTED_NAV("pref_key_navigation_tint", false), - - FONT_FAMILY("pref_key_font_family", "0"), - FONT_SIZE("pref_key_font_size", "1"), - FONT_WEIGHT("pref_key_font_weight", "0"), - - HIDE_AVATAR_CONVERSATIONS("pref_key_hide_avatar_conversations", false), - HIDE_AVATAR_SENT("pref_key_hide_avatar_sent", true), - HIDE_AVATAR_RECEIVED("pref_key_hide_avatar_received", false), - - MESSAGE_COUNT("pref_key_message_count", false), - - // General - DELAYED_MESSAGING("pref_key_delayed", false), - DELAYED_DURATION("pref_key_delay_duration", 3), - - DELIVERY_CONFIRMATIONS("pref_key_delivery", false), - DELIVERY_TOAST("pref_key_delivery_toast", true), - DELIVERY_VIBRATE("pref_key_delivery_vibrate", true), - - AUTO_DELETE("pref_key_delete_old_messages", false), - AUTO_DELETE_UNREAD("pref_key_delete_old_unread_messages", "7"), // This type of preference only accepts strings - AUTO_DELETE_READ("pref_key_delete_old_read_messages", "7"), - - AUTO_EMOJI("pref_key_auto_emoji", false), - TEXT_FORMATTING("pref_key_markdown_enabled", false), - STRIP_UNICODE("pref_key_strip_unicode", false), - SPLIT_SMS("pref_key_split", false), - SPLIT_COUNTER("pref_key_split_counter", true), - - BLOCKED_CONVERSATIONS("pref_key_blocked_enabled", false), - BLOCKED_SENDERS("pref_key_blocked_senders", new HashSet<String>()), - BLOCKED_FUTURE("pref_key_block_future", new HashSet<String>()), - MOBILE_ONLY("pref_key_mobile_only", false), - ENTER_BUTTON("pref_key_enter_button", "0"), - SENT_TIMESTAMPS("pref_key_sent_timestamps", false), - STARRED_CONTACTS("pref_key_compose_favorites", true), - PROXIMITY_SENSOR("pref_key_prox_sensor_calling", false), - YAPPY_INTEGRATION("pref_key_endlessjabber", false), - QK_RESPONSES("pref_key_qk_responses", new HashSet<>(Arrays.asList(new String[]{ - "Okay", "Give me a moment", "On my way", "Thanks", "Sounds good", "What's up?", "Agreed", "No", - "Love you", "Sorry", "LOL", "That's okay"}))), - - // Notifications - NOTIFICATIONS("pref_key_notifications", true), - NOTIFICATIONS_LED("pref_key_led", true), - NOTIFICATIONS_LED_COLOR("pref_key_theme_led", "-48060"), - NOTIFICATIONS_WAKE("pref_key_wake", false), - NOTIFICATIONS_TICKER("pref_key_ticker", false), - NOTIFICATIONS_PRIVATE("pref_key_notification_private", false), - NOTIFICATIONS_VIBRATION("pref_key_vibration", true), - NOTIFICATIONS_SOUND("pref_key_ringtone", "content://settings/system/notification_sound"), - NOTIFICATIONS_CALL_BUTTON("pref_key_notification_call", false), - NOTIFICATIONS_MARK_READ("pref_key_dismiss_read", false), - - // MMS - GROUP_MESSAGING("pref_key_compose_group", true), - AUTOMATIC_DATA("pref_key_auto_data", true), - TEXT_VIA_MMS("pref_key_texts_as_mms", false), - LONG_AS_MMS("", true), - LONG_AS_MMS_AFTER("", true), - MAX_MMS_SIZE("", true), - AUTO_CONFIGURE_MMS("", true), - MMSC("mmsc_url", true), - MMS_PORT("mms_port", true), - MMS_PROXY("mms_proxy", true), - - // QK Reply - QK_REPLY("pref_key_quickreply_enabled", Build.VERSION.SDK_INT < 24), - TAP_DISMISS("pref_key_quickreply_dismiss", true), - - // QK Compose - QK_COMPOSE("pref_key_quickcompose", false), - - // LiveViews - CONVERSATION_THEME("conversation_theme"), - - // Storage - LAST_AUTO_DELETE_CHECK("last_auto_delete_check", 0); - - private String mKey; - private Object mDefaultValue; - - QKPreference(String key) { - mKey = key; - } - - QKPreference(String key, Object defaultValue) { - mKey = key; - mDefaultValue = defaultValue; - } - - public String getKey() { - return mKey; - } - - public Object getDefaultValue() { - return mDefaultValue; - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/exif/ByteBufferInputStream.java b/QKSMS/src/main/java/com/moez/QKSMS/exif/ByteBufferInputStream.java deleted file mode 100644 index 5b7e72768..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/exif/ByteBufferInputStream.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (C) 2012 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.moez.QKSMS.exif; - -import java.io.InputStream; -import java.nio.ByteBuffer; - -class ByteBufferInputStream extends InputStream { - - private final ByteBuffer mBuf; - - public ByteBufferInputStream(ByteBuffer buf) { - mBuf = buf; - } - - @Override - public int read() { - if (!mBuf.hasRemaining()) { - return -1; - } - return mBuf.get() & 0xFF; - } - - @Override - public int read(byte[] bytes, int off, int len) { - if (!mBuf.hasRemaining()) { - return -1; - } - - len = Math.min(len, mBuf.remaining()); - mBuf.get(bytes, off, len); - return len; - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/exif/CountedDataInputStream.java b/QKSMS/src/main/java/com/moez/QKSMS/exif/CountedDataInputStream.java deleted file mode 100644 index 6523f3ce4..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/exif/CountedDataInputStream.java +++ /dev/null @@ -1,136 +0,0 @@ -/* - * Copyright (C) 2012 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.moez.QKSMS.exif; - -import java.io.EOFException; -import java.io.FilterInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.nio.ByteBuffer; -import java.nio.ByteOrder; -import java.nio.charset.Charset; - -class CountedDataInputStream extends FilterInputStream { - - private int mCount = 0; - - // allocate a byte buffer for a long value; - private final byte mByteArray[] = new byte[8]; - private final ByteBuffer mByteBuffer = ByteBuffer.wrap(mByteArray); - - protected CountedDataInputStream(InputStream in) { - super(in); - } - - public int getReadByteCount() { - return mCount; - } - - @Override - public int read(byte[] b) throws IOException { - int r = in.read(b); - mCount += (r >= 0) ? r : 0; - return r; - } - - @Override - public int read(byte[] b, int off, int len) throws IOException { - int r = in.read(b, off, len); - mCount += (r >= 0) ? r : 0; - return r; - } - - @Override - public int read() throws IOException { - int r = in.read(); - mCount += (r >= 0) ? 1 : 0; - return r; - } - - @Override - public long skip(long length) throws IOException { - long skip = in.skip(length); - mCount += skip; - return skip; - } - - public void skipOrThrow(long length) throws IOException { - if (skip(length) != length) throw new EOFException(); - } - - public void skipTo(long target) throws IOException { - long cur = mCount; - long diff = target - cur; - assert(diff >= 0); - skipOrThrow(diff); - } - - public void readOrThrow(byte[] b, int off, int len) throws IOException { - int r = read(b, off, len); - if (r != len) throw new EOFException(); - } - - public void readOrThrow(byte[] b) throws IOException { - readOrThrow(b, 0, b.length); - } - - public void setByteOrder(ByteOrder order) { - mByteBuffer.order(order); - } - - public ByteOrder getByteOrder() { - return mByteBuffer.order(); - } - - public short readShort() throws IOException { - readOrThrow(mByteArray, 0 ,2); - mByteBuffer.rewind(); - return mByteBuffer.getShort(); - } - - public int readUnsignedShort() throws IOException { - return readShort() & 0xffff; - } - - public int readInt() throws IOException { - readOrThrow(mByteArray, 0 , 4); - mByteBuffer.rewind(); - return mByteBuffer.getInt(); - } - - public long readUnsignedInt() throws IOException { - return readInt() & 0xffffffffL; - } - - public long readLong() throws IOException { - readOrThrow(mByteArray, 0 , 8); - mByteBuffer.rewind(); - return mByteBuffer.getLong(); - } - - public String readString(int n) throws IOException { - byte buf[] = new byte[n]; - readOrThrow(buf); - return new String(buf, "UTF8"); - } - - public String readString(int n, Charset charset) throws IOException { - byte buf[] = new byte[n]; - readOrThrow(buf); - return new String(buf, charset); - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/exif/ExifData.java b/QKSMS/src/main/java/com/moez/QKSMS/exif/ExifData.java deleted file mode 100644 index 3e7c1c459..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/exif/ExifData.java +++ /dev/null @@ -1,348 +0,0 @@ -/* - * Copyright (C) 2012 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.moez.QKSMS.exif; - -import android.util.Log; - -import java.io.UnsupportedEncodingException; -import java.nio.ByteOrder; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -/** - * This class stores the EXIF header in IFDs according to the JPEG - * specification. It is the result produced by {@link ExifReader}. - * - * @see ExifReader - * @see IfdData - */ -class ExifData { - private static final String TAG = "ExifData"; - private static final byte[] USER_COMMENT_ASCII = { - 0x41, 0x53, 0x43, 0x49, 0x49, 0x00, 0x00, 0x00 - }; - private static final byte[] USER_COMMENT_JIS = { - 0x4A, 0x49, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00 - }; - private static final byte[] USER_COMMENT_UNICODE = { - 0x55, 0x4E, 0x49, 0x43, 0x4F, 0x44, 0x45, 0x00 - }; - - private final IfdData[] mIfdDatas = new IfdData[IfdId.TYPE_IFD_COUNT]; - private byte[] mThumbnail; - private final ArrayList<byte[]> mStripBytes = new ArrayList<>(); - private final ByteOrder mByteOrder; - - ExifData(ByteOrder order) { - mByteOrder = order; - } - - /** - * Gets the compressed thumbnail. Returns null if there is no compressed - * thumbnail. - * - * @see #hasCompressedThumbnail() - */ - protected byte[] getCompressedThumbnail() { - return mThumbnail; - } - - /** - * Sets the compressed thumbnail. - */ - protected void setCompressedThumbnail(byte[] thumbnail) { - mThumbnail = thumbnail; - } - - /** - * Returns true it this header contains a compressed thumbnail. - */ - protected boolean hasCompressedThumbnail() { - return mThumbnail != null; - } - - /** - * Adds an uncompressed strip. - */ - protected void setStripBytes(int index, byte[] strip) { - if (index < mStripBytes.size()) { - mStripBytes.set(index, strip); - } else { - for (int i = mStripBytes.size(); i < index; i++) { - mStripBytes.add(null); - } - mStripBytes.add(strip); - } - } - - /** - * Gets the strip count. - */ - protected int getStripCount() { - return mStripBytes.size(); - } - - /** - * Gets the strip at the specified index. - * - * @exceptions #IndexOutOfBoundException - */ - protected byte[] getStrip(int index) { - return mStripBytes.get(index); - } - - /** - * Returns true if this header contains uncompressed strip. - */ - protected boolean hasUncompressedStrip() { - return !mStripBytes.isEmpty(); - } - - /** - * Gets the byte order. - */ - protected ByteOrder getByteOrder() { - return mByteOrder; - } - - /** - * Returns the {@link IfdData} object corresponding to a given IFD if it - * exists or null. - */ - protected IfdData getIfdData(int ifdId) { - if (ExifTag.isValidIfd(ifdId)) { - return mIfdDatas[ifdId]; - } - return null; - } - - /** - * Adds IFD data. If IFD data of the same type already exists, it will be - * replaced by the new data. - */ - protected void addIfdData(IfdData data) { - mIfdDatas[data.getId()] = data; - } - - /** - * Returns the {@link IfdData} object corresponding to a given IFD or - * generates one if none exist. - */ - protected IfdData getOrCreateIfdData(int ifdId) { - IfdData ifdData = mIfdDatas[ifdId]; - if (ifdData == null) { - ifdData = new IfdData(ifdId); - mIfdDatas[ifdId] = ifdData; - } - return ifdData; - } - - /** - * Returns the tag with a given TID in the given IFD if the tag exists. - * Otherwise returns null. - */ - protected ExifTag getTag(short tag, int ifd) { - IfdData ifdData = mIfdDatas[ifd]; - return (ifdData == null) ? null : ifdData.getTag(tag); - } - - /** - * Adds the given ExifTag to its default IFD and returns an existing ExifTag - * with the same TID or null if none exist. - */ - protected ExifTag addTag(ExifTag tag) { - if (tag != null) { - int ifd = tag.getIfd(); - return addTag(tag, ifd); - } - return null; - } - - /** - * Adds the given ExifTag to the given IFD and returns an existing ExifTag - * with the same TID or null if none exist. - */ - protected ExifTag addTag(ExifTag tag, int ifdId) { - if (tag != null && ExifTag.isValidIfd(ifdId)) { - IfdData ifdData = getOrCreateIfdData(ifdId); - return ifdData.setTag(tag); - } - return null; - } - - protected void clearThumbnailAndStrips() { - mThumbnail = null; - mStripBytes.clear(); - } - - /** - * Removes the thumbnail and its related tags. IFD1 will be removed. - */ - protected void removeThumbnailData() { - clearThumbnailAndStrips(); - mIfdDatas[IfdId.TYPE_IFD_1] = null; - } - - /** - * Removes the tag with a given TID and IFD. - */ - protected void removeTag(short tagId, int ifdId) { - IfdData ifdData = mIfdDatas[ifdId]; - if (ifdData == null) { - return; - } - ifdData.removeTag(tagId); - } - - /** - * Decodes the user comment tag into string as specified in the EXIF - * standard. Returns null if decoding failed. - */ - protected String getUserComment() { - IfdData ifdData = mIfdDatas[IfdId.TYPE_IFD_0]; - if (ifdData == null) { - return null; - } - ExifTag tag = ifdData.getTag(ExifInterface.getTrueTagKey(ExifInterface.TAG_USER_COMMENT)); - if (tag == null) { - return null; - } - if (tag.getComponentCount() < 8) { - return null; - } - - byte[] buf = new byte[tag.getComponentCount()]; - tag.getBytes(buf); - - byte[] code = new byte[8]; - System.arraycopy(buf, 0, code, 0, 8); - - try { - if (Arrays.equals(code, USER_COMMENT_ASCII)) { - return new String(buf, 8, buf.length - 8, "US-ASCII"); - } else if (Arrays.equals(code, USER_COMMENT_JIS)) { - return new String(buf, 8, buf.length - 8, "EUC-JP"); - } else if (Arrays.equals(code, USER_COMMENT_UNICODE)) { - return new String(buf, 8, buf.length - 8, "UTF-16"); - } else { - return null; - } - } catch (UnsupportedEncodingException e) { - Log.w(TAG, "Failed to decode the user comment"); - return null; - } - } - - /** - * Returns a list of all {@link ExifTag}s in the ExifData or null if there - * are none. - */ - protected List<ExifTag> getAllTags() { - ArrayList<ExifTag> ret = new ArrayList<>(); - for (IfdData d : mIfdDatas) { - if (d != null) { - ExifTag[] tags = d.getAllTags(); - if (tags != null) { - for (ExifTag t : tags) { - ret.add(t); - } - } - } - } - if (ret.isEmpty()) { - return null; - } - return ret; - } - - /** - * Returns a list of all {@link ExifTag}s in a given IFD or null if there - * are none. - */ - protected List<ExifTag> getAllTagsForIfd(int ifd) { - IfdData d = mIfdDatas[ifd]; - if (d == null) { - return null; - } - ExifTag[] tags = d.getAllTags(); - if (tags == null) { - return null; - } - ArrayList<ExifTag> ret = new ArrayList<>(tags.length); - for (ExifTag t : tags) { - ret.add(t); - } - if (ret.isEmpty()) { - return null; - } - return ret; - } - - /** - * Returns a list of all {@link ExifTag}s with a given TID or null if there - * are none. - */ - protected List<ExifTag> getAllTagsForTagId(short tag) { - ArrayList<ExifTag> ret = new ArrayList<>(); - for (IfdData d : mIfdDatas) { - if (d != null) { - ExifTag t = d.getTag(tag); - if (t != null) { - ret.add(t); - } - } - } - if (ret.isEmpty()) { - return null; - } - return ret; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (obj instanceof ExifData) { - ExifData data = (ExifData) obj; - if (data.mByteOrder != mByteOrder || - data.mStripBytes.size() != mStripBytes.size() || - !Arrays.equals(data.mThumbnail, mThumbnail)) { - return false; - } - for (int i = 0; i < mStripBytes.size(); i++) { - if (!Arrays.equals(data.mStripBytes.get(i), mStripBytes.get(i))) { - return false; - } - } - for (int i = 0; i < IfdId.TYPE_IFD_COUNT; i++) { - IfdData ifd1 = data.getIfdData(i); - IfdData ifd2 = getIfdData(i); - if (ifd1 != ifd2 && ifd1 != null && !ifd1.equals(ifd2)) { - return false; - } - } - return true; - } - return false; - } - -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/exif/ExifInterface.java b/QKSMS/src/main/java/com/moez/QKSMS/exif/ExifInterface.java deleted file mode 100644 index 6c7c61597..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/exif/ExifInterface.java +++ /dev/null @@ -1,2398 +0,0 @@ -/* - * Copyright (C) 2013 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.moez.QKSMS.exif; - -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.util.SparseIntArray; - -import java.io.BufferedInputStream; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.Closeable; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.io.RandomAccessFile; -import java.nio.ByteBuffer; -import java.nio.ByteOrder; -import java.nio.channels.FileChannel.MapMode; -import java.text.DateFormat; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Calendar; -import java.util.Collection; -import java.util.HashSet; -import java.util.List; -import java.util.TimeZone; - -/** - * This class provides methods and constants for reading and writing jpeg file - * metadata. It contains a collection of ExifTags, and a collection of - * definitions for creating valid ExifTags. The collection of ExifTags can be - * updated by: reading new ones from a file, deleting or adding existing ones, - * or building new ExifTags from a tag definition. These ExifTags can be written - * to a valid jpeg image as exif metadata. - * <p> - * Each ExifTag has a tag ID (TID) and is stored in a specific image file - * directory (IFD) as specified by the exif standard. A tag definition can be - * looked up with a constant that is a combination of TID and IFD. This - * definition has information about the type, number of components, and valid - * IFDs for a tag. - * - * @see ExifTag - */ -public class ExifInterface { - public static final int TAG_NULL = -1; - public static final int IFD_NULL = -1; - public static final int DEFINITION_NULL = 0; - - /** - * Tag constants for Jeita EXIF 2.2 - */ - - // IFD 0 - public static final int TAG_IMAGE_WIDTH = - defineTag(IfdId.TYPE_IFD_0, (short) 0x0100); - public static final int TAG_IMAGE_LENGTH = - defineTag(IfdId.TYPE_IFD_0, (short) 0x0101); // Image height - public static final int TAG_BITS_PER_SAMPLE = - defineTag(IfdId.TYPE_IFD_0, (short) 0x0102); - public static final int TAG_COMPRESSION = - defineTag(IfdId.TYPE_IFD_0, (short) 0x0103); - public static final int TAG_PHOTOMETRIC_INTERPRETATION = - defineTag(IfdId.TYPE_IFD_0, (short) 0x0106); - public static final int TAG_IMAGE_DESCRIPTION = - defineTag(IfdId.TYPE_IFD_0, (short) 0x010E); - public static final int TAG_MAKE = - defineTag(IfdId.TYPE_IFD_0, (short) 0x010F); - public static final int TAG_MODEL = - defineTag(IfdId.TYPE_IFD_0, (short) 0x0110); - public static final int TAG_STRIP_OFFSETS = - defineTag(IfdId.TYPE_IFD_0, (short) 0x0111); - public static final int TAG_ORIENTATION = - defineTag(IfdId.TYPE_IFD_0, (short) 0x0112); - public static final int TAG_SAMPLES_PER_PIXEL = - defineTag(IfdId.TYPE_IFD_0, (short) 0x0115); - public static final int TAG_ROWS_PER_STRIP = - defineTag(IfdId.TYPE_IFD_0, (short) 0x0116); - public static final int TAG_STRIP_BYTE_COUNTS = - defineTag(IfdId.TYPE_IFD_0, (short) 0x0117); - public static final int TAG_X_RESOLUTION = - defineTag(IfdId.TYPE_IFD_0, (short) 0x011A); - public static final int TAG_Y_RESOLUTION = - defineTag(IfdId.TYPE_IFD_0, (short) 0x011B); - public static final int TAG_PLANAR_CONFIGURATION = - defineTag(IfdId.TYPE_IFD_0, (short) 0x011C); - public static final int TAG_RESOLUTION_UNIT = - defineTag(IfdId.TYPE_IFD_0, (short) 0x0128); - public static final int TAG_TRANSFER_FUNCTION = - defineTag(IfdId.TYPE_IFD_0, (short) 0x012D); - public static final int TAG_SOFTWARE = - defineTag(IfdId.TYPE_IFD_0, (short) 0x0131); - public static final int TAG_DATE_TIME = - defineTag(IfdId.TYPE_IFD_0, (short) 0x0132); - public static final int TAG_ARTIST = - defineTag(IfdId.TYPE_IFD_0, (short) 0x013B); - public static final int TAG_WHITE_POINT = - defineTag(IfdId.TYPE_IFD_0, (short) 0x013E); - public static final int TAG_PRIMARY_CHROMATICITIES = - defineTag(IfdId.TYPE_IFD_0, (short) 0x013F); - public static final int TAG_Y_CB_CR_COEFFICIENTS = - defineTag(IfdId.TYPE_IFD_0, (short) 0x0211); - public static final int TAG_Y_CB_CR_SUB_SAMPLING = - defineTag(IfdId.TYPE_IFD_0, (short) 0x0212); - public static final int TAG_Y_CB_CR_POSITIONING = - defineTag(IfdId.TYPE_IFD_0, (short) 0x0213); - public static final int TAG_REFERENCE_BLACK_WHITE = - defineTag(IfdId.TYPE_IFD_0, (short) 0x0214); - public static final int TAG_COPYRIGHT = - defineTag(IfdId.TYPE_IFD_0, (short) 0x8298); - public static final int TAG_EXIF_IFD = - defineTag(IfdId.TYPE_IFD_0, (short) 0x8769); - public static final int TAG_GPS_IFD = - defineTag(IfdId.TYPE_IFD_0, (short) 0x8825); - // IFD 1 - public static final int TAG_JPEG_INTERCHANGE_FORMAT = - defineTag(IfdId.TYPE_IFD_1, (short) 0x0201); - public static final int TAG_JPEG_INTERCHANGE_FORMAT_LENGTH = - defineTag(IfdId.TYPE_IFD_1, (short) 0x0202); - // IFD Exif Tags - public static final int TAG_EXPOSURE_TIME = - defineTag(IfdId.TYPE_IFD_EXIF, (short) 0x829A); - public static final int TAG_F_NUMBER = - defineTag(IfdId.TYPE_IFD_EXIF, (short) 0x829D); - public static final int TAG_EXPOSURE_PROGRAM = - defineTag(IfdId.TYPE_IFD_EXIF, (short) 0x8822); - public static final int TAG_SPECTRAL_SENSITIVITY = - defineTag(IfdId.TYPE_IFD_EXIF, (short) 0x8824); - public static final int TAG_ISO_SPEED_RATINGS = - defineTag(IfdId.TYPE_IFD_EXIF, (short) 0x8827); - public static final int TAG_OECF = - defineTag(IfdId.TYPE_IFD_EXIF, (short) 0x8828); - public static final int TAG_EXIF_VERSION = - defineTag(IfdId.TYPE_IFD_EXIF, (short) 0x9000); - public static final int TAG_DATE_TIME_ORIGINAL = - defineTag(IfdId.TYPE_IFD_EXIF, (short) 0x9003); - public static final int TAG_DATE_TIME_DIGITIZED = - defineTag(IfdId.TYPE_IFD_EXIF, (short) 0x9004); - public static final int TAG_COMPONENTS_CONFIGURATION = - defineTag(IfdId.TYPE_IFD_EXIF, (short) 0x9101); - public static final int TAG_COMPRESSED_BITS_PER_PIXEL = - defineTag(IfdId.TYPE_IFD_EXIF, (short) 0x9102); - public static final int TAG_SHUTTER_SPEED_VALUE = - defineTag(IfdId.TYPE_IFD_EXIF, (short) 0x9201); - public static final int TAG_APERTURE_VALUE = - defineTag(IfdId.TYPE_IFD_EXIF, (short) 0x9202); - public static final int TAG_BRIGHTNESS_VALUE = - defineTag(IfdId.TYPE_IFD_EXIF, (short) 0x9203); - public static final int TAG_EXPOSURE_BIAS_VALUE = - defineTag(IfdId.TYPE_IFD_EXIF, (short) 0x9204); - public static final int TAG_MAX_APERTURE_VALUE = - defineTag(IfdId.TYPE_IFD_EXIF, (short) 0x9205); - public static final int TAG_SUBJECT_DISTANCE = - defineTag(IfdId.TYPE_IFD_EXIF, (short) 0x9206); - public static final int TAG_METERING_MODE = - defineTag(IfdId.TYPE_IFD_EXIF, (short) 0x9207); - public static final int TAG_LIGHT_SOURCE = - defineTag(IfdId.TYPE_IFD_EXIF, (short) 0x9208); - public static final int TAG_FLASH = - defineTag(IfdId.TYPE_IFD_EXIF, (short) 0x9209); - public static final int TAG_FOCAL_LENGTH = - defineTag(IfdId.TYPE_IFD_EXIF, (short) 0x920A); - public static final int TAG_SUBJECT_AREA = - defineTag(IfdId.TYPE_IFD_EXIF, (short) 0x9214); - public static final int TAG_MAKER_NOTE = - defineTag(IfdId.TYPE_IFD_EXIF, (short) 0x927C); - public static final int TAG_USER_COMMENT = - defineTag(IfdId.TYPE_IFD_EXIF, (short) 0x9286); - public static final int TAG_SUB_SEC_TIME = - defineTag(IfdId.TYPE_IFD_EXIF, (short) 0x9290); - public static final int TAG_SUB_SEC_TIME_ORIGINAL = - defineTag(IfdId.TYPE_IFD_EXIF, (short) 0x9291); - public static final int TAG_SUB_SEC_TIME_DIGITIZED = - defineTag(IfdId.TYPE_IFD_EXIF, (short) 0x9292); - public static final int TAG_FLASHPIX_VERSION = - defineTag(IfdId.TYPE_IFD_EXIF, (short) 0xA000); - public static final int TAG_COLOR_SPACE = - defineTag(IfdId.TYPE_IFD_EXIF, (short) 0xA001); - public static final int TAG_PIXEL_X_DIMENSION = - defineTag(IfdId.TYPE_IFD_EXIF, (short) 0xA002); - public static final int TAG_PIXEL_Y_DIMENSION = - defineTag(IfdId.TYPE_IFD_EXIF, (short) 0xA003); - public static final int TAG_RELATED_SOUND_FILE = - defineTag(IfdId.TYPE_IFD_EXIF, (short) 0xA004); - public static final int TAG_INTEROPERABILITY_IFD = - defineTag(IfdId.TYPE_IFD_EXIF, (short) 0xA005); - public static final int TAG_FLASH_ENERGY = - defineTag(IfdId.TYPE_IFD_EXIF, (short) 0xA20B); - public static final int TAG_SPATIAL_FREQUENCY_RESPONSE = - defineTag(IfdId.TYPE_IFD_EXIF, (short) 0xA20C); - public static final int TAG_FOCAL_PLANE_X_RESOLUTION = - defineTag(IfdId.TYPE_IFD_EXIF, (short) 0xA20E); - public static final int TAG_FOCAL_PLANE_Y_RESOLUTION = - defineTag(IfdId.TYPE_IFD_EXIF, (short) 0xA20F); - public static final int TAG_FOCAL_PLANE_RESOLUTION_UNIT = - defineTag(IfdId.TYPE_IFD_EXIF, (short) 0xA210); - public static final int TAG_SUBJECT_LOCATION = - defineTag(IfdId.TYPE_IFD_EXIF, (short) 0xA214); - public static final int TAG_EXPOSURE_INDEX = - defineTag(IfdId.TYPE_IFD_EXIF, (short) 0xA215); - public static final int TAG_SENSING_METHOD = - defineTag(IfdId.TYPE_IFD_EXIF, (short) 0xA217); - public static final int TAG_FILE_SOURCE = - defineTag(IfdId.TYPE_IFD_EXIF, (short) 0xA300); - public static final int TAG_SCENE_TYPE = - defineTag(IfdId.TYPE_IFD_EXIF, (short) 0xA301); - public static final int TAG_CFA_PATTERN = - defineTag(IfdId.TYPE_IFD_EXIF, (short) 0xA302); - public static final int TAG_CUSTOM_RENDERED = - defineTag(IfdId.TYPE_IFD_EXIF, (short) 0xA401); - public static final int TAG_EXPOSURE_MODE = - defineTag(IfdId.TYPE_IFD_EXIF, (short) 0xA402); - public static final int TAG_WHITE_BALANCE = - defineTag(IfdId.TYPE_IFD_EXIF, (short) 0xA403); - public static final int TAG_DIGITAL_ZOOM_RATIO = - defineTag(IfdId.TYPE_IFD_EXIF, (short) 0xA404); - public static final int TAG_FOCAL_LENGTH_IN_35_MM_FILE = - defineTag(IfdId.TYPE_IFD_EXIF, (short) 0xA405); - public static final int TAG_SCENE_CAPTURE_TYPE = - defineTag(IfdId.TYPE_IFD_EXIF, (short) 0xA406); - public static final int TAG_GAIN_CONTROL = - defineTag(IfdId.TYPE_IFD_EXIF, (short) 0xA407); - public static final int TAG_CONTRAST = - defineTag(IfdId.TYPE_IFD_EXIF, (short) 0xA408); - public static final int TAG_SATURATION = - defineTag(IfdId.TYPE_IFD_EXIF, (short) 0xA409); - public static final int TAG_SHARPNESS = - defineTag(IfdId.TYPE_IFD_EXIF, (short) 0xA40A); - public static final int TAG_DEVICE_SETTING_DESCRIPTION = - defineTag(IfdId.TYPE_IFD_EXIF, (short) 0xA40B); - public static final int TAG_SUBJECT_DISTANCE_RANGE = - defineTag(IfdId.TYPE_IFD_EXIF, (short) 0xA40C); - public static final int TAG_IMAGE_UNIQUE_ID = - defineTag(IfdId.TYPE_IFD_EXIF, (short) 0xA420); - // IFD GPS tags - public static final int TAG_GPS_VERSION_ID = - defineTag(IfdId.TYPE_IFD_GPS, (short) 0); - public static final int TAG_GPS_LATITUDE_REF = - defineTag(IfdId.TYPE_IFD_GPS, (short) 1); - public static final int TAG_GPS_LATITUDE = - defineTag(IfdId.TYPE_IFD_GPS, (short) 2); - public static final int TAG_GPS_LONGITUDE_REF = - defineTag(IfdId.TYPE_IFD_GPS, (short) 3); - public static final int TAG_GPS_LONGITUDE = - defineTag(IfdId.TYPE_IFD_GPS, (short) 4); - public static final int TAG_GPS_ALTITUDE_REF = - defineTag(IfdId.TYPE_IFD_GPS, (short) 5); - public static final int TAG_GPS_ALTITUDE = - defineTag(IfdId.TYPE_IFD_GPS, (short) 6); - public static final int TAG_GPS_TIME_STAMP = - defineTag(IfdId.TYPE_IFD_GPS, (short) 7); - public static final int TAG_GPS_SATTELLITES = - defineTag(IfdId.TYPE_IFD_GPS, (short) 8); - public static final int TAG_GPS_STATUS = - defineTag(IfdId.TYPE_IFD_GPS, (short) 9); - public static final int TAG_GPS_MEASURE_MODE = - defineTag(IfdId.TYPE_IFD_GPS, (short) 10); - public static final int TAG_GPS_DOP = - defineTag(IfdId.TYPE_IFD_GPS, (short) 11); - public static final int TAG_GPS_SPEED_REF = - defineTag(IfdId.TYPE_IFD_GPS, (short) 12); - public static final int TAG_GPS_SPEED = - defineTag(IfdId.TYPE_IFD_GPS, (short) 13); - public static final int TAG_GPS_TRACK_REF = - defineTag(IfdId.TYPE_IFD_GPS, (short) 14); - public static final int TAG_GPS_TRACK = - defineTag(IfdId.TYPE_IFD_GPS, (short) 15); - public static final int TAG_GPS_IMG_DIRECTION_REF = - defineTag(IfdId.TYPE_IFD_GPS, (short) 16); - public static final int TAG_GPS_IMG_DIRECTION = - defineTag(IfdId.TYPE_IFD_GPS, (short) 17); - public static final int TAG_GPS_MAP_DATUM = - defineTag(IfdId.TYPE_IFD_GPS, (short) 18); - public static final int TAG_GPS_DEST_LATITUDE_REF = - defineTag(IfdId.TYPE_IFD_GPS, (short) 19); - public static final int TAG_GPS_DEST_LATITUDE = - defineTag(IfdId.TYPE_IFD_GPS, (short) 20); - public static final int TAG_GPS_DEST_LONGITUDE_REF = - defineTag(IfdId.TYPE_IFD_GPS, (short) 21); - public static final int TAG_GPS_DEST_LONGITUDE = - defineTag(IfdId.TYPE_IFD_GPS, (short) 22); - public static final int TAG_GPS_DEST_BEARING_REF = - defineTag(IfdId.TYPE_IFD_GPS, (short) 23); - public static final int TAG_GPS_DEST_BEARING = - defineTag(IfdId.TYPE_IFD_GPS, (short) 24); - public static final int TAG_GPS_DEST_DISTANCE_REF = - defineTag(IfdId.TYPE_IFD_GPS, (short) 25); - public static final int TAG_GPS_DEST_DISTANCE = - defineTag(IfdId.TYPE_IFD_GPS, (short) 26); - public static final int TAG_GPS_PROCESSING_METHOD = - defineTag(IfdId.TYPE_IFD_GPS, (short) 27); - public static final int TAG_GPS_AREA_INFORMATION = - defineTag(IfdId.TYPE_IFD_GPS, (short) 28); - public static final int TAG_GPS_DATE_STAMP = - defineTag(IfdId.TYPE_IFD_GPS, (short) 29); - public static final int TAG_GPS_DIFFERENTIAL = - defineTag(IfdId.TYPE_IFD_GPS, (short) 30); - // IFD Interoperability tags - public static final int TAG_INTEROPERABILITY_INDEX = - defineTag(IfdId.TYPE_IFD_INTEROPERABILITY, (short) 1); - - /** - * Tags that contain offset markers. These are included in the banned - * defines. - */ - private static HashSet<Short> sOffsetTags = new HashSet<>(); - static { - sOffsetTags.add(getTrueTagKey(TAG_GPS_IFD)); - sOffsetTags.add(getTrueTagKey(TAG_EXIF_IFD)); - sOffsetTags.add(getTrueTagKey(TAG_JPEG_INTERCHANGE_FORMAT)); - sOffsetTags.add(getTrueTagKey(TAG_INTEROPERABILITY_IFD)); - sOffsetTags.add(getTrueTagKey(TAG_STRIP_OFFSETS)); - } - - /** - * Tags with definitions that cannot be overridden (banned defines). - */ - protected static HashSet<Short> sBannedDefines = new HashSet<>(sOffsetTags); - static { - sBannedDefines.add(getTrueTagKey(TAG_NULL)); - sBannedDefines.add(getTrueTagKey(TAG_JPEG_INTERCHANGE_FORMAT_LENGTH)); - sBannedDefines.add(getTrueTagKey(TAG_STRIP_BYTE_COUNTS)); - } - - /** - * Returns the constant representing a tag with a given TID and default IFD. - */ - public static int defineTag(int ifdId, short tagId) { - return (tagId & 0x0000ffff) | (ifdId << 16); - } - - /** - * Returns the TID for a tag constant. - */ - public static short getTrueTagKey(int tag) { - // Truncate - return (short) tag; - } - - /** - * Returns the default IFD for a tag constant. - */ - public static int getTrueIfd(int tag) { - return tag >>> 16; - } - - /** - * Constants for {@link TAG_ORIENTATION}. They can be interpreted as - * follows: - * <ul> - * <li>TOP_LEFT is the normal orientation.</li> - * <li>TOP_RIGHT is a left-right mirror.</li> - * <li>BOTTOM_LEFT is a 180 degree rotation.</li> - * <li>BOTTOM_RIGHT is a top-bottom mirror.</li> - * <li>LEFT_TOP is mirrored about the top-left<->bottom-right axis.</li> - * <li>RIGHT_TOP is a 90 degree clockwise rotation.</li> - * <li>LEFT_BOTTOM is mirrored about the top-right<->bottom-left axis.</li> - * <li>RIGHT_BOTTOM is a 270 degree clockwise rotation.</li> - * </ul> - */ - public static interface Orientation { - public static final short TOP_LEFT = 1; - public static final short TOP_RIGHT = 2; - public static final short BOTTOM_LEFT = 3; - public static final short BOTTOM_RIGHT = 4; - public static final short LEFT_TOP = 5; - public static final short RIGHT_TOP = 6; - public static final short LEFT_BOTTOM = 7; - public static final short RIGHT_BOTTOM = 8; - } - - /** - * Constants for {@link TAG_Y_CB_CR_POSITIONING} - */ - public static interface YCbCrPositioning { - public static final short CENTERED = 1; - public static final short CO_SITED = 2; - } - - /** - * Constants for {@link TAG_COMPRESSION} - */ - public static interface Compression { - public static final short UNCOMPRESSION = 1; - public static final short JPEG = 6; - } - - /** - * Constants for {@link TAG_RESOLUTION_UNIT} - */ - public static interface ResolutionUnit { - public static final short INCHES = 2; - public static final short CENTIMETERS = 3; - } - - /** - * Constants for {@link TAG_PHOTOMETRIC_INTERPRETATION} - */ - public static interface PhotometricInterpretation { - public static final short RGB = 2; - public static final short YCBCR = 6; - } - - /** - * Constants for {@link TAG_PLANAR_CONFIGURATION} - */ - public static interface PlanarConfiguration { - public static final short CHUNKY = 1; - public static final short PLANAR = 2; - } - - /** - * Constants for {@link TAG_EXPOSURE_PROGRAM} - */ - public static interface ExposureProgram { - public static final short NOT_DEFINED = 0; - public static final short MANUAL = 1; - public static final short NORMAL_PROGRAM = 2; - public static final short APERTURE_PRIORITY = 3; - public static final short SHUTTER_PRIORITY = 4; - public static final short CREATIVE_PROGRAM = 5; - public static final short ACTION_PROGRAM = 6; - public static final short PROTRAIT_MODE = 7; - public static final short LANDSCAPE_MODE = 8; - } - - /** - * Constants for {@link TAG_METERING_MODE} - */ - public static interface MeteringMode { - public static final short UNKNOWN = 0; - public static final short AVERAGE = 1; - public static final short CENTER_WEIGHTED_AVERAGE = 2; - public static final short SPOT = 3; - public static final short MULTISPOT = 4; - public static final short PATTERN = 5; - public static final short PARTAIL = 6; - public static final short OTHER = 255; - } - - /** - * Constants for {@link TAG_FLASH} As the definition in Jeita EXIF 2.2 - * standard, we can treat this constant as bitwise flag. - * <p> - * e.g. - * <p> - * short flash = FIRED | RETURN_STROBE_RETURN_LIGHT_DETECTED | - * MODE_AUTO_MODE - */ - public static interface Flash { - // LSB - public static final short DID_NOT_FIRED = 0; - public static final short FIRED = 1; - // 1st~2nd bits - public static final short RETURN_NO_STROBE_RETURN_DETECTION_FUNCTION = 0 << 1; - public static final short RETURN_STROBE_RETURN_LIGHT_NOT_DETECTED = 2 << 1; - public static final short RETURN_STROBE_RETURN_LIGHT_DETECTED = 3 << 1; - // 3rd~4th bits - public static final short MODE_UNKNOWN = 0 << 3; - public static final short MODE_COMPULSORY_FLASH_FIRING = 1 << 3; - public static final short MODE_COMPULSORY_FLASH_SUPPRESSION = 2 << 3; - public static final short MODE_AUTO_MODE = 3 << 3; - // 5th bit - public static final short FUNCTION_PRESENT = 0 << 5; - public static final short FUNCTION_NO_FUNCTION = 1 << 5; - // 6th bit - public static final short RED_EYE_REDUCTION_NO_OR_UNKNOWN = 0 << 6; - public static final short RED_EYE_REDUCTION_SUPPORT = 1 << 6; - } - - /** - * Constants for {@link TAG_COLOR_SPACE} - */ - public static interface ColorSpace { - public static final short SRGB = 1; - public static final short UNCALIBRATED = (short) 0xFFFF; - } - - /** - * Constants for {@link TAG_EXPOSURE_MODE} - */ - public static interface ExposureMode { - public static final short AUTO_EXPOSURE = 0; - public static final short MANUAL_EXPOSURE = 1; - public static final short AUTO_BRACKET = 2; - } - - /** - * Constants for {@link TAG_WHITE_BALANCE} - */ - public static interface WhiteBalance { - public static final short AUTO = 0; - public static final short MANUAL = 1; - } - - /** - * Constants for {@link TAG_SCENE_CAPTURE_TYPE} - */ - public static interface SceneCapture { - public static final short STANDARD = 0; - public static final short LANDSCAPE = 1; - public static final short PROTRAIT = 2; - public static final short NIGHT_SCENE = 3; - } - - /** - * Constants for {@link TAG_COMPONENTS_CONFIGURATION} - */ - public static interface ComponentsConfiguration { - public static final short NOT_EXIST = 0; - public static final short Y = 1; - public static final short CB = 2; - public static final short CR = 3; - public static final short R = 4; - public static final short G = 5; - public static final short B = 6; - } - - /** - * Constants for {@link TAG_LIGHT_SOURCE} - */ - public static interface LightSource { - public static final short UNKNOWN = 0; - public static final short DAYLIGHT = 1; - public static final short FLUORESCENT = 2; - public static final short TUNGSTEN = 3; - public static final short FLASH = 4; - public static final short FINE_WEATHER = 9; - public static final short CLOUDY_WEATHER = 10; - public static final short SHADE = 11; - public static final short DAYLIGHT_FLUORESCENT = 12; - public static final short DAY_WHITE_FLUORESCENT = 13; - public static final short COOL_WHITE_FLUORESCENT = 14; - public static final short WHITE_FLUORESCENT = 15; - public static final short STANDARD_LIGHT_A = 17; - public static final short STANDARD_LIGHT_B = 18; - public static final short STANDARD_LIGHT_C = 19; - public static final short D55 = 20; - public static final short D65 = 21; - public static final short D75 = 22; - public static final short D50 = 23; - public static final short ISO_STUDIO_TUNGSTEN = 24; - public static final short OTHER = 255; - } - - /** - * Constants for {@link TAG_SENSING_METHOD} - */ - public static interface SensingMethod { - public static final short NOT_DEFINED = 1; - public static final short ONE_CHIP_COLOR = 2; - public static final short TWO_CHIP_COLOR = 3; - public static final short THREE_CHIP_COLOR = 4; - public static final short COLOR_SEQUENTIAL_AREA = 5; - public static final short TRILINEAR = 7; - public static final short COLOR_SEQUENTIAL_LINEAR = 8; - } - - /** - * Constants for {@link TAG_FILE_SOURCE} - */ - public static interface FileSource { - public static final short DSC = 3; - } - - /** - * Constants for {@link TAG_SCENE_TYPE} - */ - public static interface SceneType { - public static final short DIRECT_PHOTOGRAPHED = 1; - } - - /** - * Constants for {@link TAG_GAIN_CONTROL} - */ - public static interface GainControl { - public static final short NONE = 0; - public static final short LOW_UP = 1; - public static final short HIGH_UP = 2; - public static final short LOW_DOWN = 3; - public static final short HIGH_DOWN = 4; - } - - /** - * Constants for {@link TAG_CONTRAST} - */ - public static interface Contrast { - public static final short NORMAL = 0; - public static final short SOFT = 1; - public static final short HARD = 2; - } - - /** - * Constants for {@link TAG_SATURATION} - */ - public static interface Saturation { - public static final short NORMAL = 0; - public static final short LOW = 1; - public static final short HIGH = 2; - } - - /** - * Constants for {@link TAG_SHARPNESS} - */ - public static interface Sharpness { - public static final short NORMAL = 0; - public static final short SOFT = 1; - public static final short HARD = 2; - } - - /** - * Constants for {@link TAG_SUBJECT_DISTANCE} - */ - public static interface SubjectDistance { - public static final short UNKNOWN = 0; - public static final short MACRO = 1; - public static final short CLOSE_VIEW = 2; - public static final short DISTANT_VIEW = 3; - } - - /** - * Constants for {@link TAG_GPS_LATITUDE_REF}, - * {@link TAG_GPS_DEST_LATITUDE_REF} - */ - public static interface GpsLatitudeRef { - public static final String NORTH = "N"; - public static final String SOUTH = "S"; - } - - /** - * Constants for {@link TAG_GPS_LONGITUDE_REF}, - * {@link TAG_GPS_DEST_LONGITUDE_REF} - */ - public static interface GpsLongitudeRef { - public static final String EAST = "E"; - public static final String WEST = "W"; - } - - /** - * Constants for {@link TAG_GPS_ALTITUDE_REF} - */ - public static interface GpsAltitudeRef { - public static final short SEA_LEVEL = 0; - public static final short SEA_LEVEL_NEGATIVE = 1; - } - - /** - * Constants for {@link TAG_GPS_STATUS} - */ - public static interface GpsStatus { - public static final String IN_PROGRESS = "A"; - public static final String INTEROPERABILITY = "V"; - } - - /** - * Constants for {@link TAG_GPS_MEASURE_MODE} - */ - public static interface GpsMeasureMode { - public static final String MODE_2_DIMENSIONAL = "2"; - public static final String MODE_3_DIMENSIONAL = "3"; - } - - /** - * Constants for {@link TAG_GPS_SPEED_REF}, - * {@link TAG_GPS_DEST_DISTANCE_REF} - */ - public static interface GpsSpeedRef { - public static final String KILOMETERS = "K"; - public static final String MILES = "M"; - public static final String KNOTS = "N"; - } - - /** - * Constants for {@link TAG_GPS_TRACK_REF}, - * {@link TAG_GPS_IMG_DIRECTION_REF}, {@link TAG_GPS_DEST_BEARING_REF} - */ - public static interface GpsTrackRef { - public static final String TRUE_DIRECTION = "T"; - public static final String MAGNETIC_DIRECTION = "M"; - } - - /** - * Constants for {@link TAG_GPS_DIFFERENTIAL} - */ - public static interface GpsDifferential { - public static final short WITHOUT_DIFFERENTIAL_CORRECTION = 0; - public static final short DIFFERENTIAL_CORRECTION_APPLIED = 1; - } - - private static final String NULL_ARGUMENT_STRING = "Argument is null"; - private ExifData mData = new ExifData(DEFAULT_BYTE_ORDER); - public static final ByteOrder DEFAULT_BYTE_ORDER = ByteOrder.BIG_ENDIAN; - - public ExifInterface() { - mGPSDateStampFormat.setTimeZone(TimeZone.getTimeZone("UTC")); - } - - /** - * Reads the exif tags from a byte array, clearing this ExifInterface - * object's existing exif tags. - * - * @param jpeg a byte array containing a jpeg compressed image. - * @throws java.io.IOException - */ - public void readExif(byte[] jpeg) throws IOException { - readExif(new ByteArrayInputStream(jpeg)); - } - - /** - * Reads the exif tags from an InputStream, clearing this ExifInterface - * object's existing exif tags. - * - * @param inStream an InputStream containing a jpeg compressed image. - * @throws java.io.IOException - */ - public void readExif(InputStream inStream) throws IOException { - if (inStream == null) { - throw new IllegalArgumentException(NULL_ARGUMENT_STRING); - } - ExifData d = null; - try { - d = new ExifReader(this).read(inStream); - } catch (ExifInvalidFormatException e) { - throw new IOException("Invalid exif format : " + e); - } - mData = d; - } - - /** - * Reads the exif tags from a file, clearing this ExifInterface object's - * existing exif tags. - * - * @param inFileName a string representing the filepath to jpeg file. - * @throws java.io.FileNotFoundException - * @throws java.io.IOException - */ - public void readExif(String inFileName) throws FileNotFoundException, IOException { - if (inFileName == null) { - throw new IllegalArgumentException(NULL_ARGUMENT_STRING); - } - InputStream is = null; - try { - is = new BufferedInputStream(new FileInputStream(inFileName)); - readExif(is); - } catch (IOException e) { - closeSilently(is); - throw e; - } - is.close(); - } - - /** - * Sets the exif tags, clearing this ExifInterface object's existing exif - * tags. - * - * @param tags a collection of exif tags to set. - */ - public void setExif(Collection<ExifTag> tags) { - clearExif(); - setTags(tags); - } - - /** - * Clears this ExifInterface object's existing exif tags. - */ - public void clearExif() { - mData = new ExifData(DEFAULT_BYTE_ORDER); - } - - /** - * Writes the tags from this ExifInterface object into a jpeg image, - * removing prior exif tags. - * - * @param jpeg a byte array containing a jpeg compressed image. - * @param exifOutStream an OutputStream to which the jpeg image with added - * exif tags will be written. - * @throws java.io.IOException - */ - public void writeExif(byte[] jpeg, OutputStream exifOutStream) throws IOException { - if (jpeg == null || exifOutStream == null) { - throw new IllegalArgumentException(NULL_ARGUMENT_STRING); - } - OutputStream s = getExifWriterStream(exifOutStream); - s.write(jpeg, 0, jpeg.length); - s.flush(); - } - - /** - * Writes the tags from this ExifInterface object into a jpeg compressed - * bitmap, removing prior exif tags. - * - * @param bmap a bitmap to compress and write exif into. - * @param exifOutStream the OutputStream to which the jpeg image with added - * exif tags will be written. - * @throws java.io.IOException - */ - public void writeExif(Bitmap bmap, OutputStream exifOutStream) throws IOException { - if (bmap == null || exifOutStream == null) { - throw new IllegalArgumentException(NULL_ARGUMENT_STRING); - } - OutputStream s = getExifWriterStream(exifOutStream); - bmap.compress(Bitmap.CompressFormat.JPEG, 90, s); - s.flush(); - } - - /** - * Writes the tags from this ExifInterface object into a jpeg stream, - * removing prior exif tags. - * - * @param jpegStream an InputStream containing a jpeg compressed image. - * @param exifOutStream an OutputStream to which the jpeg image with added - * exif tags will be written. - * @throws java.io.IOException - */ - public void writeExif(InputStream jpegStream, OutputStream exifOutStream) throws IOException { - if (jpegStream == null || exifOutStream == null) { - throw new IllegalArgumentException(NULL_ARGUMENT_STRING); - } - OutputStream s = getExifWriterStream(exifOutStream); - doExifStreamIO(jpegStream, s); - s.flush(); - } - - /** - * Writes the tags from this ExifInterface object into a jpeg image, - * removing prior exif tags. - * - * @param jpeg a byte array containing a jpeg compressed image. - * @param exifOutFileName a String containing the filepath to which the jpeg - * image with added exif tags will be written. - * @throws java.io.FileNotFoundException - * @throws java.io.IOException - */ - public void writeExif(byte[] jpeg, String exifOutFileName) throws FileNotFoundException, - IOException { - if (jpeg == null || exifOutFileName == null) { - throw new IllegalArgumentException(NULL_ARGUMENT_STRING); - } - OutputStream s = null; - try { - s = getExifWriterStream(exifOutFileName); - s.write(jpeg, 0, jpeg.length); - s.flush(); - } catch (IOException e) { - closeSilently(s); - throw e; - } - s.close(); - } - - /** - * Writes the tags from this ExifInterface object into a jpeg compressed - * bitmap, removing prior exif tags. - * - * @param bmap a bitmap to compress and write exif into. - * @param exifOutFileName a String containing the filepath to which the jpeg - * image with added exif tags will be written. - * @throws java.io.FileNotFoundException - * @throws java.io.IOException - */ - public void writeExif(Bitmap bmap, String exifOutFileName) throws FileNotFoundException, - IOException { - if (bmap == null || exifOutFileName == null) { - throw new IllegalArgumentException(NULL_ARGUMENT_STRING); - } - OutputStream s = null; - try { - s = getExifWriterStream(exifOutFileName); - bmap.compress(Bitmap.CompressFormat.JPEG, 90, s); - s.flush(); - } catch (IOException e) { - closeSilently(s); - throw e; - } - s.close(); - } - - /** - * Writes the tags from this ExifInterface object into a jpeg stream, - * removing prior exif tags. - * - * @param jpegStream an InputStream containing a jpeg compressed image. - * @param exifOutFileName a String containing the filepath to which the jpeg - * image with added exif tags will be written. - * @throws java.io.FileNotFoundException - * @throws java.io.IOException - */ - public void writeExif(InputStream jpegStream, String exifOutFileName) - throws FileNotFoundException, IOException { - if (jpegStream == null || exifOutFileName == null) { - throw new IllegalArgumentException(NULL_ARGUMENT_STRING); - } - OutputStream s = null; - try { - s = getExifWriterStream(exifOutFileName); - doExifStreamIO(jpegStream, s); - s.flush(); - } catch (IOException e) { - closeSilently(s); - throw e; - } - s.close(); - } - - /** - * Writes the tags from this ExifInterface object into a jpeg file, removing - * prior exif tags. - * - * @param jpegFileName a String containing the filepath for a jpeg file. - * @param exifOutFileName a String containing the filepath to which the jpeg - * image with added exif tags will be written. - * @throws java.io.FileNotFoundException - * @throws java.io.IOException - */ - public void writeExif(String jpegFileName, String exifOutFileName) - throws FileNotFoundException, IOException { - if (jpegFileName == null || exifOutFileName == null) { - throw new IllegalArgumentException(NULL_ARGUMENT_STRING); - } - InputStream is = null; - try { - is = new FileInputStream(jpegFileName); - writeExif(is, exifOutFileName); - } catch (IOException e) { - closeSilently(is); - throw e; - } - is.close(); - } - - /** - * Wraps an OutputStream object with an ExifOutputStream. Exif tags in this - * ExifInterface object will be added to a jpeg image written to this - * stream, removing prior exif tags. Other methods of this ExifInterface - * object should not be called until the returned OutputStream has been - * closed. - * - * @param outStream an OutputStream to wrap. - * @return an OutputStream that wraps the outStream parameter, and adds exif - * metadata. A jpeg image should be written to this stream. - */ - public OutputStream getExifWriterStream(OutputStream outStream) { - if (outStream == null) { - throw new IllegalArgumentException(NULL_ARGUMENT_STRING); - } - ExifOutputStream eos = new ExifOutputStream(outStream, this); - eos.setExifData(mData); - return eos; - } - - /** - * Returns an OutputStream object that writes to a file. Exif tags in this - * ExifInterface object will be added to a jpeg image written to this - * stream, removing prior exif tags. Other methods of this ExifInterface - * object should not be called until the returned OutputStream has been - * closed. - * - * @param exifOutFileName an String containing a filepath for a jpeg file. - * @return an OutputStream that writes to the exifOutFileName file, and adds - * exif metadata. A jpeg image should be written to this stream. - * @throws java.io.FileNotFoundException - */ - public OutputStream getExifWriterStream(String exifOutFileName) throws FileNotFoundException { - if (exifOutFileName == null) { - throw new IllegalArgumentException(NULL_ARGUMENT_STRING); - } - OutputStream out = null; - try { - out = new FileOutputStream(exifOutFileName); - } catch (FileNotFoundException e) { - closeSilently(out); - throw e; - } - return getExifWriterStream(out); - } - - /** - * Attempts to do an in-place rewrite the exif metadata in a file for the - * given tags. If tags do not exist or do not have the same size as the - * existing exif tags, this method will fail. - * - * @param filename a String containing a filepath for a jpeg file with exif - * tags to rewrite. - * @param tags tags that will be written into the jpeg file over existing - * tags if possible. - * @return true if success, false if could not overwrite. If false, no - * changes are made to the file. - * @throws java.io.FileNotFoundException - * @throws java.io.IOException - */ - public boolean rewriteExif(String filename, Collection<ExifTag> tags) - throws FileNotFoundException, IOException { - RandomAccessFile file = null; - InputStream is = null; - boolean ret; - try { - File temp = new File(filename); - is = new BufferedInputStream(new FileInputStream(temp)); - - // Parse beginning of APP1 in exif to find size of exif header. - ExifParser parser = null; - try { - parser = ExifParser.parse(is, this); - } catch (ExifInvalidFormatException e) { - throw new IOException("Invalid exif format : ", e); - } - long exifSize = parser.getOffsetToExifEndFromSOF(); - - // Free up resources - is.close(); - is = null; - - // Open file for memory mapping. - file = new RandomAccessFile(temp, "rw"); - long fileLength = file.length(); - if (fileLength < exifSize) { - throw new IOException("Filesize changed during operation"); - } - - // Map only exif header into memory. - ByteBuffer buf = file.getChannel().map(MapMode.READ_WRITE, 0, exifSize); - - // Attempt to overwrite tag values without changing lengths (avoids - // file copy). - ret = rewriteExif(buf, tags); - } catch (IOException e) { - closeSilently(file); - throw e; - } finally { - closeSilently(is); - } - file.close(); - return ret; - } - - /** - * Attempts to do an in-place rewrite the exif metadata in a ByteBuffer for - * the given tags. If tags do not exist or do not have the same size as the - * existing exif tags, this method will fail. - * - * @param buf a ByteBuffer containing a jpeg file with existing exif tags to - * rewrite. - * @param tags tags that will be written into the jpeg ByteBuffer over - * existing tags if possible. - * @return true if success, false if could not overwrite. If false, no - * changes are made to the ByteBuffer. - * @throws java.io.IOException - */ - public boolean rewriteExif(ByteBuffer buf, Collection<ExifTag> tags) throws IOException { - ExifModifier mod = null; - try { - mod = new ExifModifier(buf, this); - for (ExifTag t : tags) { - mod.modifyTag(t); - } - return mod.commit(); - } catch (ExifInvalidFormatException e) { - throw new IOException("Invalid exif format : " + e); - } - } - - /** - * Attempts to do an in-place rewrite of the exif metadata. If this fails, - * fall back to overwriting file. This preserves tags that are not being - * rewritten. - * - * @param filename a String containing a filepath for a jpeg file. - * @param tags tags that will be written into the jpeg file over existing - * tags if possible. - * @throws java.io.FileNotFoundException - * @throws java.io.IOException - * @see #rewriteExif - */ - public void forceRewriteExif(String filename, Collection<ExifTag> tags) - throws FileNotFoundException, - IOException { - // Attempt in-place write - if (!rewriteExif(filename, tags)) { - // Fall back to doing a copy - ExifData tempData = mData; - mData = new ExifData(DEFAULT_BYTE_ORDER); - FileInputStream is = null; - ByteArrayOutputStream bytes = null; - try { - is = new FileInputStream(filename); - bytes = new ByteArrayOutputStream(); - doExifStreamIO(is, bytes); - byte[] imageBytes = bytes.toByteArray(); - readExif(imageBytes); - setTags(tags); - writeExif(imageBytes, filename); - } catch (IOException e) { - closeSilently(is); - throw e; - } finally { - is.close(); - // Prevent clobbering of mData - mData = tempData; - } - } - } - - /** - * Attempts to do an in-place rewrite of the exif metadata using the tags in - * this ExifInterface object. If this fails, fall back to overwriting file. - * This preserves tags that are not being rewritten. - * - * @param filename a String containing a filepath for a jpeg file. - * @throws java.io.FileNotFoundException - * @throws java.io.IOException - * @see #rewriteExif - */ - public void forceRewriteExif(String filename) throws FileNotFoundException, IOException { - forceRewriteExif(filename, getAllTags()); - } - - /** - * Get the exif tags in this ExifInterface object or null if none exist. - * - * @return a List of {@link ExifTag}s. - */ - public List<ExifTag> getAllTags() { - return mData.getAllTags(); - } - - /** - * Returns a list of ExifTags that share a TID (which can be obtained by - * calling {@link #getTrueTagKey} on a defined tag constant) or null if none - * exist. - * - * @param tagId a TID as defined in the exif standard (or with - * {@link #defineTag}). - * @return a List of {@link ExifTag}s. - */ - public List<ExifTag> getTagsForTagId(short tagId) { - return mData.getAllTagsForTagId(tagId); - } - - /** - * Returns a list of ExifTags that share an IFD (which can be obtained by - * calling {@link #getTrueIFD} on a defined tag constant) or null if none - * exist. - * - * @param ifdId an IFD as defined in the exif standard (or with - * {@link #defineTag}). - * @return a List of {@link ExifTag}s. - */ - public List<ExifTag> getTagsForIfdId(int ifdId) { - return mData.getAllTagsForIfd(ifdId); - } - - /** - * Gets an ExifTag for an IFD other than the tag's default. - * - * @see #getTag - */ - public ExifTag getTag(int tagId, int ifdId) { - if (!ExifTag.isValidIfd(ifdId)) { - return null; - } - return mData.getTag(getTrueTagKey(tagId), ifdId); - } - - /** - * Returns the ExifTag in that tag's default IFD for a defined tag constant - * or null if none exists. - * - * @param tagId a defined tag constant, e.g. {@link #TAG_IMAGE_WIDTH}. - * @return an {@link ExifTag} or null if none exists. - */ - public ExifTag getTag(int tagId) { - int ifdId = getDefinedTagDefaultIfd(tagId); - return getTag(tagId, ifdId); - } - - /** - * Gets a tag value for an IFD other than the tag's default. - * - * @see #getTagValue - */ - public Object getTagValue(int tagId, int ifdId) { - ExifTag t = getTag(tagId, ifdId); - return (t == null) ? null : t.getValue(); - } - - /** - * Returns the value of the ExifTag in that tag's default IFD for a defined - * tag constant or null if none exists or the value could not be cast into - * the return type. - * - * @param tagId a defined tag constant, e.g. {@link #TAG_IMAGE_WIDTH}. - * @return the value of the ExifTag or null if none exists. - */ - public Object getTagValue(int tagId) { - int ifdId = getDefinedTagDefaultIfd(tagId); - return getTagValue(tagId, ifdId); - } - - /* - * Getter methods that are similar to getTagValue. Null is returned if the - * tag value cannot be cast into the return type. - */ - - /** - * @see #getTagValue - */ - public String getTagStringValue(int tagId, int ifdId) { - ExifTag t = getTag(tagId, ifdId); - if (t == null) { - return null; - } - return t.getValueAsString(); - } - - /** - * @see #getTagValue - */ - public String getTagStringValue(int tagId) { - int ifdId = getDefinedTagDefaultIfd(tagId); - return getTagStringValue(tagId, ifdId); - } - - /** - * @see #getTagValue - */ - public Long getTagLongValue(int tagId, int ifdId) { - long[] l = getTagLongValues(tagId, ifdId); - if (l == null || l.length <= 0) { - return null; - } - return Long.valueOf(l[0]); - } - - /** - * @see #getTagValue - */ - public Long getTagLongValue(int tagId) { - int ifdId = getDefinedTagDefaultIfd(tagId); - return getTagLongValue(tagId, ifdId); - } - - /** - * @see #getTagValue - */ - public Integer getTagIntValue(int tagId, int ifdId) { - int[] l = getTagIntValues(tagId, ifdId); - if (l == null || l.length <= 0) { - return null; - } - return Integer.valueOf(l[0]); - } - - /** - * @see #getTagValue - */ - public Integer getTagIntValue(int tagId) { - int ifdId = getDefinedTagDefaultIfd(tagId); - return getTagIntValue(tagId, ifdId); - } - - /** - * @see #getTagValue - */ - public Byte getTagByteValue(int tagId, int ifdId) { - byte[] l = getTagByteValues(tagId, ifdId); - if (l == null || l.length <= 0) { - return null; - } - return Byte.valueOf(l[0]); - } - - /** - * @see #getTagValue - */ - public Byte getTagByteValue(int tagId) { - int ifdId = getDefinedTagDefaultIfd(tagId); - return getTagByteValue(tagId, ifdId); - } - - /** - * @see #getTagValue - */ - public Rational getTagRationalValue(int tagId, int ifdId) { - Rational[] l = getTagRationalValues(tagId, ifdId); - if (l == null || l.length == 0) { - return null; - } - return new Rational(l[0]); - } - - /** - * @see #getTagValue - */ - public Rational getTagRationalValue(int tagId) { - int ifdId = getDefinedTagDefaultIfd(tagId); - return getTagRationalValue(tagId, ifdId); - } - - /** - * @see #getTagValue - */ - public long[] getTagLongValues(int tagId, int ifdId) { - ExifTag t = getTag(tagId, ifdId); - if (t == null) { - return null; - } - return t.getValueAsLongs(); - } - - /** - * @see #getTagValue - */ - public long[] getTagLongValues(int tagId) { - int ifdId = getDefinedTagDefaultIfd(tagId); - return getTagLongValues(tagId, ifdId); - } - - /** - * @see #getTagValue - */ - public int[] getTagIntValues(int tagId, int ifdId) { - ExifTag t = getTag(tagId, ifdId); - if (t == null) { - return null; - } - return t.getValueAsInts(); - } - - /** - * @see #getTagValue - */ - public int[] getTagIntValues(int tagId) { - int ifdId = getDefinedTagDefaultIfd(tagId); - return getTagIntValues(tagId, ifdId); - } - - /** - * @see #getTagValue - */ - public byte[] getTagByteValues(int tagId, int ifdId) { - ExifTag t = getTag(tagId, ifdId); - if (t == null) { - return null; - } - return t.getValueAsBytes(); - } - - /** - * @see #getTagValue - */ - public byte[] getTagByteValues(int tagId) { - int ifdId = getDefinedTagDefaultIfd(tagId); - return getTagByteValues(tagId, ifdId); - } - - /** - * @see #getTagValue - */ - public Rational[] getTagRationalValues(int tagId, int ifdId) { - ExifTag t = getTag(tagId, ifdId); - if (t == null) { - return null; - } - return t.getValueAsRationals(); - } - - /** - * @see #getTagValue - */ - public Rational[] getTagRationalValues(int tagId) { - int ifdId = getDefinedTagDefaultIfd(tagId); - return getTagRationalValues(tagId, ifdId); - } - - /** - * Checks whether a tag has a defined number of elements. - * - * @param tagId a defined tag constant, e.g. {@link #TAG_IMAGE_WIDTH}. - * @return true if the tag has a defined number of elements. - */ - public boolean isTagCountDefined(int tagId) { - int info = getTagInfo().get(tagId); - // No value in info can be zero, as all tags have a non-zero type - return info != 0 && getComponentCountFromInfo(info) != ExifTag.SIZE_UNDEFINED; - } - - /** - * Gets the defined number of elements for a tag. - * - * @param tagId a defined tag constant, e.g. {@link #TAG_IMAGE_WIDTH}. - * @return the number of elements or {@link ExifTag#SIZE_UNDEFINED} if the - * tag or the number of elements is not defined. - */ - public int getDefinedTagCount(int tagId) { - int info = getTagInfo().get(tagId); - if (info == 0) { - return ExifTag.SIZE_UNDEFINED; - } - return getComponentCountFromInfo(info); - } - - /** - * Gets the number of elements for an ExifTag in a given IFD. - * - * @param tagId a defined tag constant, e.g. {@link #TAG_IMAGE_WIDTH}. - * @param ifdId the IFD containing the ExifTag to check. - * @return the number of elements in the ExifTag, if the tag's size is - * undefined this will return the actual number of elements that is - * in the ExifTag's value. - */ - public int getActualTagCount(int tagId, int ifdId) { - ExifTag t = getTag(tagId, ifdId); - if (t == null) { - return 0; - } - return t.getComponentCount(); - } - - /** - * Gets the default IFD for a tag. - * - * @param tagId a defined tag constant, e.g. {@link #TAG_IMAGE_WIDTH}. - * @return the default IFD for a tag definition or {@link #IFD_NULL} if no - * definition exists. - */ - public int getDefinedTagDefaultIfd(int tagId) { - int info = getTagInfo().get(tagId); - if (info == DEFINITION_NULL) { - return IFD_NULL; - } - return getTrueIfd(tagId); - } - - /** - * Gets the defined type for a tag. - * - * @param tagId a defined tag constant, e.g. {@link #TAG_IMAGE_WIDTH}. - * @return the type. - * @see ExifTag#getDataType() - */ - public short getDefinedTagType(int tagId) { - int info = getTagInfo().get(tagId); - if (info == 0) { - return -1; - } - return getTypeFromInfo(info); - } - - /** - * Returns true if tag TID is one of the following: {@link TAG_EXIF_IFD}, - * {@link TAG_GPS_IFD}, {@link TAG_JPEG_INTERCHANGE_FORMAT}, - * {@link TAG_STRIP_OFFSETS}, {@link TAG_INTEROPERABILITY_IFD} - * <p> - * Note: defining tags with these TID's is disallowed. - * - * @param tag a tag's TID (can be obtained from a defined tag constant with - * {@link #getTrueTagKey}). - * @return true if the TID is that of an offset tag. - */ - protected static boolean isOffsetTag(short tag) { - return sOffsetTags.contains(tag); - } - - /** - * Creates a tag for a defined tag constant in a given IFD if that IFD is - * allowed for the tag. This method will fail anytime the appropriate - * {@link ExifTag#setValue} for this tag's datatype would fail. - * - * @param tagId a tag constant, e.g. {@link #TAG_IMAGE_WIDTH}. - * @param ifdId the IFD that the tag should be in. - * @param val the value of the tag to set. - * @return an ExifTag object or null if one could not be constructed. - * @see #buildTag - */ - public ExifTag buildTag(int tagId, int ifdId, Object val) { - int info = getTagInfo().get(tagId); - if (info == 0 || val == null) { - return null; - } - short type = getTypeFromInfo(info); - int definedCount = getComponentCountFromInfo(info); - boolean hasDefinedCount = (definedCount != ExifTag.SIZE_UNDEFINED); - if (!ExifInterface.isIfdAllowed(info, ifdId)) { - return null; - } - ExifTag t = new ExifTag(getTrueTagKey(tagId), type, definedCount, ifdId, hasDefinedCount); - if (!t.setValue(val)) { - return null; - } - return t; - } - - /** - * Creates a tag for a defined tag constant in the tag's default IFD. - * - * @param tagId a tag constant, e.g. {@link #TAG_IMAGE_WIDTH}. - * @param val the tag's value. - * @return an ExifTag object. - */ - public ExifTag buildTag(int tagId, Object val) { - int ifdId = getTrueIfd(tagId); - return buildTag(tagId, ifdId, val); - } - - protected ExifTag buildUninitializedTag(int tagId) { - int info = getTagInfo().get(tagId); - if (info == 0) { - return null; - } - short type = getTypeFromInfo(info); - int definedCount = getComponentCountFromInfo(info); - boolean hasDefinedCount = (definedCount != ExifTag.SIZE_UNDEFINED); - int ifdId = getTrueIfd(tagId); - ExifTag t = new ExifTag(getTrueTagKey(tagId), type, definedCount, ifdId, hasDefinedCount); - return t; - } - - /** - * Sets the value of an ExifTag if it exists in the given IFD. The value - * must be the correct type and length for that ExifTag. - * - * @param tagId a tag constant, e.g. {@link #TAG_IMAGE_WIDTH}. - * @param ifdId the IFD that the ExifTag is in. - * @param val the value to set. - * @return true if success, false if the ExifTag doesn't exist or the value - * is the wrong type/length. - * @see #setTagValue - */ - public boolean setTagValue(int tagId, int ifdId, Object val) { - ExifTag t = getTag(tagId, ifdId); - return t != null && t.setValue(val); - } - - /** - * Sets the value of an ExifTag if it exists it's default IFD. The value - * must be the correct type and length for that ExifTag. - * - * @param tagId a tag constant, e.g. {@link #TAG_IMAGE_WIDTH}. - * @param val the value to set. - * @return true if success, false if the ExifTag doesn't exist or the value - * is the wrong type/length. - */ - public boolean setTagValue(int tagId, Object val) { - int ifdId = getDefinedTagDefaultIfd(tagId); - return setTagValue(tagId, ifdId, val); - } - - /** - * Puts an ExifTag into this ExifInterface object's tags, removing a - * previous ExifTag with the same TID and IFD. The IFD it is put into will - * be the one the tag was created with in {@link #buildTag}. - * - * @param tag an ExifTag to put into this ExifInterface's tags. - * @return the previous ExifTag with the same TID and IFD or null if none - * exists. - */ - public ExifTag setTag(ExifTag tag) { - return mData.addTag(tag); - } - - /** - * Puts a collection of ExifTags into this ExifInterface objects's tags. Any - * previous ExifTags with the same TID and IFDs will be removed. - * - * @param tags a Collection of ExifTags. - * @see #setTag - */ - public void setTags(Collection<ExifTag> tags) { - for (ExifTag t : tags) { - setTag(t); - } - } - - /** - * Removes the ExifTag for a tag constant from the given IFD. - * - * @param tagId a tag constant, e.g. {@link #TAG_IMAGE_WIDTH}. - * @param ifdId the IFD of the ExifTag to remove. - */ - public void deleteTag(int tagId, int ifdId) { - mData.removeTag(getTrueTagKey(tagId), ifdId); - } - - /** - * Removes the ExifTag for a tag constant from that tag's default IFD. - * - * @param tagId a tag constant, e.g. {@link #TAG_IMAGE_WIDTH}. - */ - public void deleteTag(int tagId) { - int ifdId = getDefinedTagDefaultIfd(tagId); - deleteTag(tagId, ifdId); - } - - /** - * Creates a new tag definition in this ExifInterface object for a given TID - * and default IFD. Creating a definition with the same TID and default IFD - * as a previous definition will override it. - * - * @param tagId the TID for the tag. - * @param defaultIfd the default IFD for the tag. - * @param tagType the type of the tag (see {@link ExifTag#getDataType()}). - * @param defaultComponentCount the number of elements of this tag's type in - * the tags value. - * @param allowedIfds the IFD's this tag is allowed to be put in. - * @return the defined tag constant (e.g. {@link #TAG_IMAGE_WIDTH}) or - * {@link #TAG_NULL} if the definition could not be made. - */ - public int setTagDefinition(short tagId, int defaultIfd, short tagType, - short defaultComponentCount, int[] allowedIfds) { - if (sBannedDefines.contains(tagId)) { - return TAG_NULL; - } - if (ExifTag.isValidType(tagType) && ExifTag.isValidIfd(defaultIfd)) { - int tagDef = defineTag(defaultIfd, tagId); - if (tagDef == TAG_NULL) { - return TAG_NULL; - } - int[] otherDefs = getTagDefinitionsForTagId(tagId); - SparseIntArray infos = getTagInfo(); - // Make sure defaultIfd is in allowedIfds - boolean defaultCheck = false; - for (int i : allowedIfds) { - if (defaultIfd == i) { - defaultCheck = true; - } - if (!ExifTag.isValidIfd(i)) { - return TAG_NULL; - } - } - if (!defaultCheck) { - return TAG_NULL; - } - - int ifdFlags = getFlagsFromAllowedIfds(allowedIfds); - // Make sure no identical tags can exist in allowedIfds - if (otherDefs != null) { - for (int def : otherDefs) { - int tagInfo = infos.get(def); - int allowedFlags = getAllowedIfdFlagsFromInfo(tagInfo); - if ((ifdFlags & allowedFlags) != 0) { - return TAG_NULL; - } - } - } - getTagInfo().put(tagDef, ifdFlags << 24 | (tagType << 16) | defaultComponentCount); - return tagDef; - } - return TAG_NULL; - } - - protected int getTagDefinition(short tagId, int defaultIfd) { - return getTagInfo().get(defineTag(defaultIfd, tagId)); - } - - protected int[] getTagDefinitionsForTagId(short tagId) { - int[] ifds = IfdData.getIfds(); - int[] defs = new int[ifds.length]; - int counter = 0; - SparseIntArray infos = getTagInfo(); - for (int i : ifds) { - int def = defineTag(i, tagId); - if (infos.get(def) != DEFINITION_NULL) { - defs[counter++] = def; - } - } - if (counter == 0) { - return null; - } - - return Arrays.copyOfRange(defs, 0, counter); - } - - protected int getTagDefinitionForTag(ExifTag tag) { - short type = tag.getDataType(); - int count = tag.getComponentCount(); - int ifd = tag.getIfd(); - return getTagDefinitionForTag(tag.getTagId(), type, count, ifd); - } - - protected int getTagDefinitionForTag(short tagId, short type, int count, int ifd) { - int[] defs = getTagDefinitionsForTagId(tagId); - if (defs == null) { - return TAG_NULL; - } - SparseIntArray infos = getTagInfo(); - int ret = TAG_NULL; - for (int i : defs) { - int info = infos.get(i); - short def_type = getTypeFromInfo(info); - int def_count = getComponentCountFromInfo(info); - int[] def_ifds = getAllowedIfdsFromInfo(info); - boolean valid_ifd = false; - for (int j : def_ifds) { - if (j == ifd) { - valid_ifd = true; - break; - } - } - if (valid_ifd && type == def_type - && (count == def_count || def_count == ExifTag.SIZE_UNDEFINED)) { - ret = i; - break; - } - } - return ret; - } - - /** - * Removes a tag definition for given defined tag constant. - * - * @param tagId a defined tag constant, e.g. {@link #TAG_IMAGE_WIDTH}. - */ - public void removeTagDefinition(int tagId) { - getTagInfo().delete(tagId); - } - - /** - * Resets tag definitions to the default ones. - */ - public void resetTagDefinitions() { - mTagInfo = null; - } - - /** - * Returns the thumbnail from IFD1 as a bitmap, or null if none exists. - * - * @return the thumbnail as a bitmap. - */ - public Bitmap getThumbnailBitmap() { - if (mData.hasCompressedThumbnail()) { - byte[] thumb = mData.getCompressedThumbnail(); - return BitmapFactory.decodeByteArray(thumb, 0, thumb.length); - } else if (mData.hasUncompressedStrip()) { - // TODO: implement uncompressed - } - return null; - } - - /** - * Returns the thumbnail from IFD1 as a byte array, or null if none exists. - * The bytes may either be an uncompressed strip as specified in the exif - * standard or a jpeg compressed image. - * - * @return the thumbnail as a byte array. - */ - public byte[] getThumbnailBytes() { - if (mData.hasCompressedThumbnail()) { - return mData.getCompressedThumbnail(); - } else if (mData.hasUncompressedStrip()) { - // TODO: implement this - } - return null; - } - - /** - * Returns the thumbnail if it is jpeg compressed, or null if none exists. - * - * @return the thumbnail as a byte array. - */ - public byte[] getThumbnail() { - return mData.getCompressedThumbnail(); - } - - /** - * Check if thumbnail is compressed. - * - * @return true if the thumbnail is compressed. - */ - public boolean isThumbnailCompressed() { - return mData.hasCompressedThumbnail(); - } - - /** - * Check if thumbnail exists. - * - * @return true if a compressed thumbnail exists. - */ - public boolean hasThumbnail() { - // TODO: add back in uncompressed strip - return mData.hasCompressedThumbnail(); - } - - // TODO: uncompressed thumbnail setters - - /** - * Sets the thumbnail to be a jpeg compressed image. Clears any prior - * thumbnail. - * - * @param thumb a byte array containing a jpeg compressed image. - * @return true if the thumbnail was set. - */ - public boolean setCompressedThumbnail(byte[] thumb) { - mData.clearThumbnailAndStrips(); - mData.setCompressedThumbnail(thumb); - return true; - } - - /** - * Sets the thumbnail to be a jpeg compressed bitmap. Clears any prior - * thumbnail. - * - * @param thumb a bitmap to compress to a jpeg thumbnail. - * @return true if the thumbnail was set. - */ - public boolean setCompressedThumbnail(Bitmap thumb) { - ByteArrayOutputStream thumbnail = new ByteArrayOutputStream(); - return thumb.compress(Bitmap.CompressFormat.JPEG, 90, thumbnail) && setCompressedThumbnail(thumbnail.toByteArray()); - } - - /** - * Clears the compressed thumbnail if it exists. - */ - public void removeCompressedThumbnail() { - mData.setCompressedThumbnail(null); - } - - // Convenience methods: - - /** - * Decodes the user comment tag into string as specified in the EXIF - * standard. Returns null if decoding failed. - */ - public String getUserComment() { - return mData.getUserComment(); - } - - /** - * Returns the Orientation ExifTag value for a given number of degrees. - * - * @param degrees the amount an image is rotated in degrees. - */ - public static short getOrientationValueForRotation(int degrees) { - degrees %= 360; - if (degrees < 0) { - degrees += 360; - } - if (degrees < 90) { - return Orientation.TOP_LEFT; // 0 degrees - } else if (degrees < 180) { - return Orientation.RIGHT_TOP; // 90 degrees cw - } else if (degrees < 270) { - return Orientation.BOTTOM_LEFT; // 180 degrees - } else { - return Orientation.RIGHT_BOTTOM; // 270 degrees cw - } - } - - /** - * Returns the rotation degrees corresponding to an ExifTag Orientation - * value. - * - * @param orientation the ExifTag Orientation value. - */ - public static int getRotationForOrientationValue(short orientation) { - switch (orientation) { - case Orientation.TOP_LEFT: - return 0; - case Orientation.RIGHT_TOP: - return 90; - case Orientation.BOTTOM_LEFT: - return 180; - case Orientation.RIGHT_BOTTOM: - return 270; - default: - return 0; - } - } - - /** - * Gets the double representation of the GPS latitude or longitude - * coordinate. - * - * @param coordinate an array of 3 Rationals representing the degrees, - * minutes, and seconds of the GPS location as defined in the - * exif specification. - * @param reference a GPS reference reperesented by a String containing "N", - * "S", "E", or "W". - * @return the GPS coordinate represented as degrees + minutes/60 + - * seconds/3600 - */ - public static double convertLatOrLongToDouble(Rational[] coordinate, String reference) { - try { - double degrees = coordinate[0].toDouble(); - double minutes = coordinate[1].toDouble(); - double seconds = coordinate[2].toDouble(); - double result = degrees + minutes / 60.0 + seconds / 3600.0; - if ((reference.equals("S") || reference.equals("W"))) { - return -result; - } - return result; - } catch (ArrayIndexOutOfBoundsException e) { - throw new IllegalArgumentException(); - } - } - - /** - * Gets the GPS latitude and longitude as a pair of doubles from this - * ExifInterface object's tags, or null if the necessary tags do not exist. - * - * @return an array of 2 doubles containing the latitude, and longitude - * respectively. - * @see #convertLatOrLongToDouble - */ - public double[] getLatLongAsDoubles() { - Rational[] latitude = getTagRationalValues(TAG_GPS_LATITUDE); - String latitudeRef = getTagStringValue(TAG_GPS_LATITUDE_REF); - Rational[] longitude = getTagRationalValues(TAG_GPS_LONGITUDE); - String longitudeRef = getTagStringValue(TAG_GPS_LONGITUDE_REF); - if (latitude == null || longitude == null || latitudeRef == null || longitudeRef == null - || latitude.length < 3 || longitude.length < 3) { - return null; - } - double[] latLon = new double[2]; - latLon[0] = convertLatOrLongToDouble(latitude, latitudeRef); - latLon[1] = convertLatOrLongToDouble(longitude, longitudeRef); - return latLon; - } - - private static final String GPS_DATE_FORMAT_STR = "yyyy:MM:dd"; - private static final String DATETIME_FORMAT_STR = "yyyy:MM:dd kk:mm:ss"; - private final DateFormat mDateTimeStampFormat = new SimpleDateFormat(DATETIME_FORMAT_STR); - private final DateFormat mGPSDateStampFormat = new SimpleDateFormat(GPS_DATE_FORMAT_STR); - private final Calendar mGPSTimeStampCalendar = Calendar - .getInstance(TimeZone.getTimeZone("UTC")); - - /** - * Creates, formats, and sets the DateTimeStamp tag for one of: - * {@link #TAG_DATE_TIME}, {@link #TAG_DATE_TIME_DIGITIZED}, - * {@link #TAG_DATE_TIME_ORIGINAL}. - * - * @param tagId one of the DateTimeStamp tags. - * @param timestamp a timestamp to format. - * @param timezone a TimeZone object. - * @return true if success, false if the tag could not be set. - */ - public boolean addDateTimeStampTag(int tagId, long timestamp, TimeZone timezone) { - if (tagId == TAG_DATE_TIME || tagId == TAG_DATE_TIME_DIGITIZED - || tagId == TAG_DATE_TIME_ORIGINAL) { - mDateTimeStampFormat.setTimeZone(timezone); - ExifTag t = buildTag(tagId, mDateTimeStampFormat.format(timestamp)); - if (t == null) { - return false; - } - setTag(t); - } else { - return false; - } - return true; - } - - /** - * Creates and sets all to the GPS tags for a give latitude and longitude. - * - * @param latitude a GPS latitude coordinate. - * @param longitude a GPS longitude coordinate. - * @return true if success, false if they could not be created or set. - */ - public boolean addGpsTags(double latitude, double longitude) { - ExifTag latTag = buildTag(TAG_GPS_LATITUDE, toExifLatLong(latitude)); - ExifTag longTag = buildTag(TAG_GPS_LONGITUDE, toExifLatLong(longitude)); - ExifTag latRefTag = buildTag(TAG_GPS_LATITUDE_REF, - latitude >= 0 ? GpsLatitudeRef.NORTH - : GpsLatitudeRef.SOUTH); - ExifTag longRefTag = buildTag(TAG_GPS_LONGITUDE_REF, - longitude >= 0 ? GpsLongitudeRef.EAST - : GpsLongitudeRef.WEST); - if (latTag == null || longTag == null || latRefTag == null || longRefTag == null) { - return false; - } - setTag(latTag); - setTag(longTag); - setTag(latRefTag); - setTag(longRefTag); - return true; - } - - /** - * Creates and sets the GPS timestamp tag. - * - * @param timestamp a GPS timestamp. - * @return true if success, false if could not be created or set. - */ - public boolean addGpsDateTimeStampTag(long timestamp) { - ExifTag t = buildTag(TAG_GPS_DATE_STAMP, mGPSDateStampFormat.format(timestamp)); - if (t == null) { - return false; - } - setTag(t); - mGPSTimeStampCalendar.setTimeInMillis(timestamp); - t = buildTag(TAG_GPS_TIME_STAMP, new Rational[] { - new Rational(mGPSTimeStampCalendar.get(Calendar.HOUR_OF_DAY), 1), - new Rational(mGPSTimeStampCalendar.get(Calendar.MINUTE), 1), - new Rational(mGPSTimeStampCalendar.get(Calendar.SECOND), 1) - }); - if (t == null) { - return false; - } - setTag(t); - return true; - } - - private static Rational[] toExifLatLong(double value) { - // convert to the format dd/1 mm/1 ssss/100 - value = Math.abs(value); - int degrees = (int) value; - value = (value - degrees) * 60; - int minutes = (int) value; - value = (value - minutes) * 6000; - int seconds = (int) value; - return new Rational[] { - new Rational(degrees, 1), new Rational(minutes, 1), new Rational(seconds, 100) - }; - } - - private void doExifStreamIO(InputStream is, OutputStream os) throws IOException { - byte[] buf = new byte[1024]; - int ret = is.read(buf, 0, 1024); - while (ret != -1) { - os.write(buf, 0, ret); - ret = is.read(buf, 0, 1024); - } - } - - protected static void closeSilently(Closeable c) { - if (c != null) { - try { - c.close(); - } catch (Throwable e) { - // ignored - } - } - } - - private SparseIntArray mTagInfo = null; - - protected SparseIntArray getTagInfo() { - if (mTagInfo == null) { - mTagInfo = new SparseIntArray(); - initTagInfo(); - } - return mTagInfo; - } - - private void initTagInfo() { - /** - * We put tag information in a 4-bytes integer. The first byte a bitmask - * representing the allowed IFDs of the tag, the second byte is the data - * type, and the last two byte are a short value indicating the default - * component count of this tag. - */ - // IFD0 tags - int[] ifdAllowedIfds = { - IfdId.TYPE_IFD_0, IfdId.TYPE_IFD_1 - }; - int ifdFlags = getFlagsFromAllowedIfds(ifdAllowedIfds) << 24; - mTagInfo.put(ExifInterface.TAG_MAKE, - ifdFlags | ExifTag.TYPE_ASCII << 16 | ExifTag.SIZE_UNDEFINED); - mTagInfo.put(ExifInterface.TAG_IMAGE_WIDTH, - ifdFlags | ExifTag.TYPE_UNSIGNED_LONG << 16 | 1); - mTagInfo.put(ExifInterface.TAG_IMAGE_LENGTH, - ifdFlags | ExifTag.TYPE_UNSIGNED_LONG << 16 | 1); - mTagInfo.put(ExifInterface.TAG_BITS_PER_SAMPLE, - ifdFlags | ExifTag.TYPE_UNSIGNED_SHORT << 16 | 3); - mTagInfo.put(ExifInterface.TAG_COMPRESSION, - ifdFlags | ExifTag.TYPE_UNSIGNED_SHORT << 16 | 1); - mTagInfo.put(ExifInterface.TAG_PHOTOMETRIC_INTERPRETATION, - ifdFlags | ExifTag.TYPE_UNSIGNED_SHORT << 16 | 1); - mTagInfo.put(ExifInterface.TAG_ORIENTATION, ifdFlags | ExifTag.TYPE_UNSIGNED_SHORT << 16 - | 1); - mTagInfo.put(ExifInterface.TAG_SAMPLES_PER_PIXEL, - ifdFlags | ExifTag.TYPE_UNSIGNED_SHORT << 16 | 1); - mTagInfo.put(ExifInterface.TAG_PLANAR_CONFIGURATION, - ifdFlags | ExifTag.TYPE_UNSIGNED_SHORT << 16 | 1); - mTagInfo.put(ExifInterface.TAG_Y_CB_CR_SUB_SAMPLING, - ifdFlags | ExifTag.TYPE_UNSIGNED_SHORT << 16 | 2); - mTagInfo.put(ExifInterface.TAG_Y_CB_CR_POSITIONING, - ifdFlags | ExifTag.TYPE_UNSIGNED_SHORT << 16 | 1); - mTagInfo.put(ExifInterface.TAG_X_RESOLUTION, - ifdFlags | ExifTag.TYPE_UNSIGNED_RATIONAL << 16 | 1); - mTagInfo.put(ExifInterface.TAG_Y_RESOLUTION, - ifdFlags | ExifTag.TYPE_UNSIGNED_RATIONAL << 16 | 1); - mTagInfo.put(ExifInterface.TAG_RESOLUTION_UNIT, - ifdFlags | ExifTag.TYPE_UNSIGNED_SHORT << 16 | 1); - mTagInfo.put(ExifInterface.TAG_STRIP_OFFSETS, - ifdFlags | ExifTag.TYPE_UNSIGNED_LONG << 16 | ExifTag.SIZE_UNDEFINED); - mTagInfo.put(ExifInterface.TAG_ROWS_PER_STRIP, - ifdFlags | ExifTag.TYPE_UNSIGNED_LONG << 16 | 1); - mTagInfo.put(ExifInterface.TAG_STRIP_BYTE_COUNTS, - ifdFlags | ExifTag.TYPE_UNSIGNED_LONG << 16 | ExifTag.SIZE_UNDEFINED); - mTagInfo.put(ExifInterface.TAG_TRANSFER_FUNCTION, - ifdFlags | ExifTag.TYPE_UNSIGNED_SHORT << 16 | 3 * 256); - mTagInfo.put(ExifInterface.TAG_WHITE_POINT, - ifdFlags | ExifTag.TYPE_UNSIGNED_RATIONAL << 16 | 2); - mTagInfo.put(ExifInterface.TAG_PRIMARY_CHROMATICITIES, - ifdFlags | ExifTag.TYPE_UNSIGNED_RATIONAL << 16 | 6); - mTagInfo.put(ExifInterface.TAG_Y_CB_CR_COEFFICIENTS, - ifdFlags | ExifTag.TYPE_UNSIGNED_RATIONAL << 16 | 3); - mTagInfo.put(ExifInterface.TAG_REFERENCE_BLACK_WHITE, - ifdFlags | ExifTag.TYPE_UNSIGNED_RATIONAL << 16 | 6); - mTagInfo.put(ExifInterface.TAG_DATE_TIME, - ifdFlags | ExifTag.TYPE_ASCII << 16 | 20); - mTagInfo.put(ExifInterface.TAG_IMAGE_DESCRIPTION, - ifdFlags | ExifTag.TYPE_ASCII << 16 | ExifTag.SIZE_UNDEFINED); - mTagInfo.put(ExifInterface.TAG_MAKE, - ifdFlags | ExifTag.TYPE_ASCII << 16 | ExifTag.SIZE_UNDEFINED); - mTagInfo.put(ExifInterface.TAG_MODEL, - ifdFlags | ExifTag.TYPE_ASCII << 16 | ExifTag.SIZE_UNDEFINED); - mTagInfo.put(ExifInterface.TAG_SOFTWARE, - ifdFlags | ExifTag.TYPE_ASCII << 16 | ExifTag.SIZE_UNDEFINED); - mTagInfo.put(ExifInterface.TAG_ARTIST, - ifdFlags | ExifTag.TYPE_ASCII << 16 | ExifTag.SIZE_UNDEFINED); - mTagInfo.put(ExifInterface.TAG_COPYRIGHT, - ifdFlags | ExifTag.TYPE_ASCII << 16 | ExifTag.SIZE_UNDEFINED); - mTagInfo.put(ExifInterface.TAG_EXIF_IFD, - ifdFlags | ExifTag.TYPE_UNSIGNED_LONG << 16 | 1); - mTagInfo.put(ExifInterface.TAG_GPS_IFD, - ifdFlags | ExifTag.TYPE_UNSIGNED_LONG << 16 | 1); - // IFD1 tags - int[] ifd1AllowedIfds = { - IfdId.TYPE_IFD_1 - }; - int ifdFlags1 = getFlagsFromAllowedIfds(ifd1AllowedIfds) << 24; - mTagInfo.put(ExifInterface.TAG_JPEG_INTERCHANGE_FORMAT, - ifdFlags1 | ExifTag.TYPE_UNSIGNED_LONG << 16 | 1); - mTagInfo.put(ExifInterface.TAG_JPEG_INTERCHANGE_FORMAT_LENGTH, - ifdFlags1 | ExifTag.TYPE_UNSIGNED_LONG << 16 | 1); - // Exif tags - int[] exifAllowedIfds = { - IfdId.TYPE_IFD_EXIF - }; - int exifFlags = getFlagsFromAllowedIfds(exifAllowedIfds) << 24; - mTagInfo.put(ExifInterface.TAG_EXIF_VERSION, - exifFlags | ExifTag.TYPE_UNDEFINED << 16 | 4); - mTagInfo.put(ExifInterface.TAG_FLASHPIX_VERSION, - exifFlags | ExifTag.TYPE_UNDEFINED << 16 | 4); - mTagInfo.put(ExifInterface.TAG_COLOR_SPACE, - exifFlags | ExifTag.TYPE_UNSIGNED_SHORT << 16 | 1); - mTagInfo.put(ExifInterface.TAG_COMPONENTS_CONFIGURATION, - exifFlags | ExifTag.TYPE_UNDEFINED << 16 | 4); - mTagInfo.put(ExifInterface.TAG_COMPRESSED_BITS_PER_PIXEL, - exifFlags | ExifTag.TYPE_UNSIGNED_RATIONAL << 16 | 1); - mTagInfo.put(ExifInterface.TAG_PIXEL_X_DIMENSION, - exifFlags | ExifTag.TYPE_UNSIGNED_LONG << 16 | 1); - mTagInfo.put(ExifInterface.TAG_PIXEL_Y_DIMENSION, - exifFlags | ExifTag.TYPE_UNSIGNED_LONG << 16 | 1); - mTagInfo.put(ExifInterface.TAG_MAKER_NOTE, - exifFlags | ExifTag.TYPE_UNDEFINED << 16 | ExifTag.SIZE_UNDEFINED); - mTagInfo.put(ExifInterface.TAG_USER_COMMENT, - exifFlags | ExifTag.TYPE_UNDEFINED << 16 | ExifTag.SIZE_UNDEFINED); - mTagInfo.put(ExifInterface.TAG_RELATED_SOUND_FILE, - exifFlags | ExifTag.TYPE_ASCII << 16 | 13); - mTagInfo.put(ExifInterface.TAG_DATE_TIME_ORIGINAL, - exifFlags | ExifTag.TYPE_ASCII << 16 | 20); - mTagInfo.put(ExifInterface.TAG_DATE_TIME_DIGITIZED, - exifFlags | ExifTag.TYPE_ASCII << 16 | 20); - mTagInfo.put(ExifInterface.TAG_SUB_SEC_TIME, - exifFlags | ExifTag.TYPE_ASCII << 16 | ExifTag.SIZE_UNDEFINED); - mTagInfo.put(ExifInterface.TAG_SUB_SEC_TIME_ORIGINAL, - exifFlags | ExifTag.TYPE_ASCII << 16 | ExifTag.SIZE_UNDEFINED); - mTagInfo.put(ExifInterface.TAG_SUB_SEC_TIME_DIGITIZED, - exifFlags | ExifTag.TYPE_ASCII << 16 | ExifTag.SIZE_UNDEFINED); - mTagInfo.put(ExifInterface.TAG_IMAGE_UNIQUE_ID, - exifFlags | ExifTag.TYPE_ASCII << 16 | 33); - mTagInfo.put(ExifInterface.TAG_EXPOSURE_TIME, - exifFlags | ExifTag.TYPE_UNSIGNED_RATIONAL << 16 | 1); - mTagInfo.put(ExifInterface.TAG_F_NUMBER, - exifFlags | ExifTag.TYPE_UNSIGNED_RATIONAL << 16 | 1); - mTagInfo.put(ExifInterface.TAG_EXPOSURE_PROGRAM, - exifFlags | ExifTag.TYPE_UNSIGNED_SHORT << 16 | 1); - mTagInfo.put(ExifInterface.TAG_SPECTRAL_SENSITIVITY, - exifFlags | ExifTag.TYPE_ASCII << 16 | ExifTag.SIZE_UNDEFINED); - mTagInfo.put(ExifInterface.TAG_ISO_SPEED_RATINGS, - exifFlags | ExifTag.TYPE_UNSIGNED_SHORT << 16 | ExifTag.SIZE_UNDEFINED); - mTagInfo.put(ExifInterface.TAG_OECF, - exifFlags | ExifTag.TYPE_UNDEFINED << 16 | ExifTag.SIZE_UNDEFINED); - mTagInfo.put(ExifInterface.TAG_SHUTTER_SPEED_VALUE, - exifFlags | ExifTag.TYPE_RATIONAL << 16 | 1); - mTagInfo.put(ExifInterface.TAG_APERTURE_VALUE, - exifFlags | ExifTag.TYPE_UNSIGNED_RATIONAL << 16 | 1); - mTagInfo.put(ExifInterface.TAG_BRIGHTNESS_VALUE, - exifFlags | ExifTag.TYPE_RATIONAL << 16 | 1); - mTagInfo.put(ExifInterface.TAG_EXPOSURE_BIAS_VALUE, - exifFlags | ExifTag.TYPE_RATIONAL << 16 | 1); - mTagInfo.put(ExifInterface.TAG_MAX_APERTURE_VALUE, - exifFlags | ExifTag.TYPE_UNSIGNED_RATIONAL << 16 | 1); - mTagInfo.put(ExifInterface.TAG_SUBJECT_DISTANCE, - exifFlags | ExifTag.TYPE_UNSIGNED_RATIONAL << 16 | 1); - mTagInfo.put(ExifInterface.TAG_METERING_MODE, - exifFlags | ExifTag.TYPE_UNSIGNED_SHORT << 16 | 1); - mTagInfo.put(ExifInterface.TAG_LIGHT_SOURCE, - exifFlags | ExifTag.TYPE_UNSIGNED_SHORT << 16 | 1); - mTagInfo.put(ExifInterface.TAG_FLASH, - exifFlags | ExifTag.TYPE_UNSIGNED_SHORT << 16 | 1); - mTagInfo.put(ExifInterface.TAG_FOCAL_LENGTH, - exifFlags | ExifTag.TYPE_UNSIGNED_RATIONAL << 16 | 1); - mTagInfo.put(ExifInterface.TAG_SUBJECT_AREA, - exifFlags | ExifTag.TYPE_UNSIGNED_SHORT << 16 | ExifTag.SIZE_UNDEFINED); - mTagInfo.put(ExifInterface.TAG_FLASH_ENERGY, - exifFlags | ExifTag.TYPE_UNSIGNED_RATIONAL << 16 | 1); - mTagInfo.put(ExifInterface.TAG_SPATIAL_FREQUENCY_RESPONSE, - exifFlags | ExifTag.TYPE_UNDEFINED << 16 | ExifTag.SIZE_UNDEFINED); - mTagInfo.put(ExifInterface.TAG_FOCAL_PLANE_X_RESOLUTION, - exifFlags | ExifTag.TYPE_UNSIGNED_RATIONAL << 16 | 1); - mTagInfo.put(ExifInterface.TAG_FOCAL_PLANE_Y_RESOLUTION, - exifFlags | ExifTag.TYPE_UNSIGNED_RATIONAL << 16 | 1); - mTagInfo.put(ExifInterface.TAG_FOCAL_PLANE_RESOLUTION_UNIT, - exifFlags | ExifTag.TYPE_UNSIGNED_SHORT << 16 | 1); - mTagInfo.put(ExifInterface.TAG_SUBJECT_LOCATION, - exifFlags | ExifTag.TYPE_UNSIGNED_SHORT << 16 | 2); - mTagInfo.put(ExifInterface.TAG_EXPOSURE_INDEX, - exifFlags | ExifTag.TYPE_UNSIGNED_RATIONAL << 16 | 1); - mTagInfo.put(ExifInterface.TAG_SENSING_METHOD, - exifFlags | ExifTag.TYPE_UNSIGNED_SHORT << 16 | 1); - mTagInfo.put(ExifInterface.TAG_FILE_SOURCE, - exifFlags | ExifTag.TYPE_UNDEFINED << 16 | 1); - mTagInfo.put(ExifInterface.TAG_SCENE_TYPE, - exifFlags | ExifTag.TYPE_UNDEFINED << 16 | 1); - mTagInfo.put(ExifInterface.TAG_CFA_PATTERN, - exifFlags | ExifTag.TYPE_UNDEFINED << 16 | ExifTag.SIZE_UNDEFINED); - mTagInfo.put(ExifInterface.TAG_CUSTOM_RENDERED, - exifFlags | ExifTag.TYPE_UNSIGNED_SHORT << 16 | 1); - mTagInfo.put(ExifInterface.TAG_EXPOSURE_MODE, - exifFlags | ExifTag.TYPE_UNSIGNED_SHORT << 16 | 1); - mTagInfo.put(ExifInterface.TAG_WHITE_BALANCE, - exifFlags | ExifTag.TYPE_UNSIGNED_SHORT << 16 | 1); - mTagInfo.put(ExifInterface.TAG_DIGITAL_ZOOM_RATIO, - exifFlags | ExifTag.TYPE_UNSIGNED_RATIONAL << 16 | 1); - mTagInfo.put(ExifInterface.TAG_FOCAL_LENGTH_IN_35_MM_FILE, - exifFlags | ExifTag.TYPE_UNSIGNED_SHORT << 16 | 1); - mTagInfo.put(ExifInterface.TAG_SCENE_CAPTURE_TYPE, - exifFlags | ExifTag.TYPE_UNSIGNED_SHORT << 16 | 1); - mTagInfo.put(ExifInterface.TAG_GAIN_CONTROL, - exifFlags | ExifTag.TYPE_UNSIGNED_RATIONAL << 16 | 1); - mTagInfo.put(ExifInterface.TAG_CONTRAST, - exifFlags | ExifTag.TYPE_UNSIGNED_SHORT << 16 | 1); - mTagInfo.put(ExifInterface.TAG_SATURATION, - exifFlags | ExifTag.TYPE_UNSIGNED_SHORT << 16 | 1); - mTagInfo.put(ExifInterface.TAG_SHARPNESS, - exifFlags | ExifTag.TYPE_UNSIGNED_SHORT << 16 | 1); - mTagInfo.put(ExifInterface.TAG_DEVICE_SETTING_DESCRIPTION, - exifFlags | ExifTag.TYPE_UNDEFINED << 16 | ExifTag.SIZE_UNDEFINED); - mTagInfo.put(ExifInterface.TAG_SUBJECT_DISTANCE_RANGE, - exifFlags | ExifTag.TYPE_UNSIGNED_SHORT << 16 | 1); - mTagInfo.put(ExifInterface.TAG_INTEROPERABILITY_IFD, exifFlags - | ExifTag.TYPE_UNSIGNED_LONG << 16 | 1); - // GPS tag - int[] gpsAllowedIfds = { - IfdId.TYPE_IFD_GPS - }; - int gpsFlags = getFlagsFromAllowedIfds(gpsAllowedIfds) << 24; - mTagInfo.put(ExifInterface.TAG_GPS_VERSION_ID, - gpsFlags | ExifTag.TYPE_UNSIGNED_BYTE << 16 | 4); - mTagInfo.put(ExifInterface.TAG_GPS_LATITUDE_REF, - gpsFlags | ExifTag.TYPE_ASCII << 16 | 2); - mTagInfo.put(ExifInterface.TAG_GPS_LONGITUDE_REF, - gpsFlags | ExifTag.TYPE_ASCII << 16 | 2); - mTagInfo.put(ExifInterface.TAG_GPS_LATITUDE, - gpsFlags | ExifTag.TYPE_RATIONAL << 16 | 3); - mTagInfo.put(ExifInterface.TAG_GPS_LONGITUDE, - gpsFlags | ExifTag.TYPE_RATIONAL << 16 | 3); - mTagInfo.put(ExifInterface.TAG_GPS_ALTITUDE_REF, - gpsFlags | ExifTag.TYPE_UNSIGNED_BYTE << 16 | 1); - mTagInfo.put(ExifInterface.TAG_GPS_ALTITUDE, - gpsFlags | ExifTag.TYPE_UNSIGNED_RATIONAL << 16 | 1); - mTagInfo.put(ExifInterface.TAG_GPS_TIME_STAMP, - gpsFlags | ExifTag.TYPE_UNSIGNED_RATIONAL << 16 | 3); - mTagInfo.put(ExifInterface.TAG_GPS_SATTELLITES, - gpsFlags | ExifTag.TYPE_ASCII << 16 | ExifTag.SIZE_UNDEFINED); - mTagInfo.put(ExifInterface.TAG_GPS_STATUS, - gpsFlags | ExifTag.TYPE_ASCII << 16 | 2); - mTagInfo.put(ExifInterface.TAG_GPS_MEASURE_MODE, - gpsFlags | ExifTag.TYPE_ASCII << 16 | 2); - mTagInfo.put(ExifInterface.TAG_GPS_DOP, - gpsFlags | ExifTag.TYPE_UNSIGNED_RATIONAL << 16 | 1); - mTagInfo.put(ExifInterface.TAG_GPS_SPEED_REF, - gpsFlags | ExifTag.TYPE_ASCII << 16 | 2); - mTagInfo.put(ExifInterface.TAG_GPS_SPEED, - gpsFlags | ExifTag.TYPE_UNSIGNED_RATIONAL << 16 | 1); - mTagInfo.put(ExifInterface.TAG_GPS_TRACK_REF, - gpsFlags | ExifTag.TYPE_ASCII << 16 | 2); - mTagInfo.put(ExifInterface.TAG_GPS_TRACK, - gpsFlags | ExifTag.TYPE_UNSIGNED_RATIONAL << 16 | 1); - mTagInfo.put(ExifInterface.TAG_GPS_IMG_DIRECTION_REF, - gpsFlags | ExifTag.TYPE_ASCII << 16 | 2); - mTagInfo.put(ExifInterface.TAG_GPS_IMG_DIRECTION, - gpsFlags | ExifTag.TYPE_UNSIGNED_RATIONAL << 16 | 1); - mTagInfo.put(ExifInterface.TAG_GPS_MAP_DATUM, - gpsFlags | ExifTag.TYPE_ASCII << 16 | ExifTag.SIZE_UNDEFINED); - mTagInfo.put(ExifInterface.TAG_GPS_DEST_LATITUDE_REF, - gpsFlags | ExifTag.TYPE_ASCII << 16 | 2); - mTagInfo.put(ExifInterface.TAG_GPS_DEST_LATITUDE, - gpsFlags | ExifTag.TYPE_UNSIGNED_RATIONAL << 16 | 1); - mTagInfo.put(ExifInterface.TAG_GPS_DEST_BEARING_REF, - gpsFlags | ExifTag.TYPE_ASCII << 16 | 2); - mTagInfo.put(ExifInterface.TAG_GPS_DEST_BEARING, - gpsFlags | ExifTag.TYPE_UNSIGNED_RATIONAL << 16 | 1); - mTagInfo.put(ExifInterface.TAG_GPS_DEST_DISTANCE_REF, - gpsFlags | ExifTag.TYPE_ASCII << 16 | 2); - mTagInfo.put(ExifInterface.TAG_GPS_DEST_DISTANCE, - gpsFlags | ExifTag.TYPE_UNSIGNED_RATIONAL << 16 | 1); - mTagInfo.put(ExifInterface.TAG_GPS_PROCESSING_METHOD, - gpsFlags | ExifTag.TYPE_UNDEFINED << 16 | ExifTag.SIZE_UNDEFINED); - mTagInfo.put(ExifInterface.TAG_GPS_AREA_INFORMATION, - gpsFlags | ExifTag.TYPE_UNDEFINED << 16 | ExifTag.SIZE_UNDEFINED); - mTagInfo.put(ExifInterface.TAG_GPS_DATE_STAMP, - gpsFlags | ExifTag.TYPE_ASCII << 16 | 11); - mTagInfo.put(ExifInterface.TAG_GPS_DIFFERENTIAL, - gpsFlags | ExifTag.TYPE_UNSIGNED_SHORT << 16 | 11); - // Interoperability tag - int[] interopAllowedIfds = { - IfdId.TYPE_IFD_INTEROPERABILITY - }; - int interopFlags = getFlagsFromAllowedIfds(interopAllowedIfds) << 24; - mTagInfo.put(TAG_INTEROPERABILITY_INDEX, interopFlags | ExifTag.TYPE_ASCII << 16 - | ExifTag.SIZE_UNDEFINED); - } - - protected static int getAllowedIfdFlagsFromInfo(int info) { - return info >>> 24; - } - - protected static int[] getAllowedIfdsFromInfo(int info) { - int ifdFlags = getAllowedIfdFlagsFromInfo(info); - int[] ifds = IfdData.getIfds(); - ArrayList<Integer> l = new ArrayList<>(); - for (int i = 0; i < IfdId.TYPE_IFD_COUNT; i++) { - int flag = (ifdFlags >> i) & 1; - if (flag == 1) { - l.add(ifds[i]); - } - } - if (l.isEmpty()) { - return null; - } - int[] ret = new int[l.size()]; - int j = 0; - for (int i : l) { - ret[j++] = i; - } - return ret; - } - - protected static boolean isIfdAllowed(int info, int ifd) { - int[] ifds = IfdData.getIfds(); - int ifdFlags = getAllowedIfdFlagsFromInfo(info); - for (int i = 0; i < ifds.length; i++) { - if (ifd == ifds[i] && ((ifdFlags >> i) & 1) == 1) { - return true; - } - } - return false; - } - - protected static int getFlagsFromAllowedIfds(int[] allowedIfds) { - if (allowedIfds == null || allowedIfds.length == 0) { - return 0; - } - int flags = 0; - int[] ifds = IfdData.getIfds(); - for (int i = 0; i < IfdId.TYPE_IFD_COUNT; i++) { - for (int j : allowedIfds) { - if (ifds[i] == j) { - flags |= 1 << i; - break; - } - } - } - return flags; - } - - protected static short getTypeFromInfo(int info) { - return (short) ((info >> 16) & 0x0ff); - } - - protected static int getComponentCountFromInfo(int info) { - return info & 0x0ffff; - } - -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/exif/ExifInvalidFormatException.java b/QKSMS/src/main/java/com/moez/QKSMS/exif/ExifInvalidFormatException.java deleted file mode 100644 index aa32e2eb6..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/exif/ExifInvalidFormatException.java +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (C) 2012 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.moez.QKSMS.exif; - -public class ExifInvalidFormatException extends Exception { - public ExifInvalidFormatException(String meg) { - super(meg); - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/exif/ExifModifier.java b/QKSMS/src/main/java/com/moez/QKSMS/exif/ExifModifier.java deleted file mode 100644 index 84a14e5d1..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/exif/ExifModifier.java +++ /dev/null @@ -1,195 +0,0 @@ -/* - * Copyright (C) 2012 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.moez.QKSMS.exif; - -import android.util.Log; - -import java.io.IOException; -import java.io.InputStream; -import java.nio.ByteBuffer; -import java.nio.ByteOrder; -import java.util.ArrayList; -import java.util.List; - -class ExifModifier { - public static final String TAG = "ExifModifier"; - public static final boolean DEBUG = false; - private final ByteBuffer mByteBuffer; - private final ExifData mTagToModified; - private final List<TagOffset> mTagOffsets = new ArrayList<>(); - private final ExifInterface mInterface; - private int mOffsetBase; - - private static class TagOffset { - final int mOffset; - final ExifTag mTag; - - TagOffset(ExifTag tag, int offset) { - mTag = tag; - mOffset = offset; - } - } - - protected ExifModifier(ByteBuffer byteBuffer, ExifInterface iRef) throws IOException, - ExifInvalidFormatException { - mByteBuffer = byteBuffer; - mOffsetBase = byteBuffer.position(); - mInterface = iRef; - InputStream is = null; - try { - is = new ByteBufferInputStream(byteBuffer); - // Do not require any IFD; - ExifParser parser = ExifParser.parse(is, mInterface); - mTagToModified = new ExifData(parser.getByteOrder()); - mOffsetBase += parser.getTiffStartPosition(); - mByteBuffer.position(0); - } finally { - ExifInterface.closeSilently(is); - } - } - - protected ByteOrder getByteOrder() { - return mTagToModified.getByteOrder(); - } - - protected boolean commit() throws IOException, ExifInvalidFormatException { - InputStream is = null; - try { - is = new ByteBufferInputStream(mByteBuffer); - int flag = 0; - IfdData[] ifdDatas = new IfdData[] { - mTagToModified.getIfdData(IfdId.TYPE_IFD_0), - mTagToModified.getIfdData(IfdId.TYPE_IFD_1), - mTagToModified.getIfdData(IfdId.TYPE_IFD_EXIF), - mTagToModified.getIfdData(IfdId.TYPE_IFD_INTEROPERABILITY), - mTagToModified.getIfdData(IfdId.TYPE_IFD_GPS) - }; - - if (ifdDatas[IfdId.TYPE_IFD_0] != null) { - flag |= ExifParser.OPTION_IFD_0; - } - if (ifdDatas[IfdId.TYPE_IFD_1] != null) { - flag |= ExifParser.OPTION_IFD_1; - } - if (ifdDatas[IfdId.TYPE_IFD_EXIF] != null) { - flag |= ExifParser.OPTION_IFD_EXIF; - } - if (ifdDatas[IfdId.TYPE_IFD_GPS] != null) { - flag |= ExifParser.OPTION_IFD_GPS; - } - if (ifdDatas[IfdId.TYPE_IFD_INTEROPERABILITY] != null) { - flag |= ExifParser.OPTION_IFD_INTEROPERABILITY; - } - - ExifParser parser = ExifParser.parse(is, flag, mInterface); - int event = parser.next(); - IfdData currIfd = null; - while (event != ExifParser.EVENT_END) { - switch (event) { - case ExifParser.EVENT_START_OF_IFD: - currIfd = ifdDatas[parser.getCurrentIfd()]; - if (currIfd == null) { - parser.skipRemainingTagsInCurrentIfd(); - } - break; - case ExifParser.EVENT_NEW_TAG: - ExifTag oldTag = parser.getTag(); - ExifTag newTag = currIfd.getTag(oldTag.getTagId()); - if (newTag != null) { - if (newTag.getComponentCount() != oldTag.getComponentCount() - || newTag.getDataType() != oldTag.getDataType()) { - return false; - } else { - mTagOffsets.add(new TagOffset(newTag, oldTag.getOffset())); - currIfd.removeTag(oldTag.getTagId()); - if (currIfd.getTagCount() == 0) { - parser.skipRemainingTagsInCurrentIfd(); - } - } - } - break; - } - event = parser.next(); - } - for (IfdData ifd : ifdDatas) { - if (ifd != null && ifd.getTagCount() > 0) { - return false; - } - } - modify(); - } finally { - ExifInterface.closeSilently(is); - } - return true; - } - - private void modify() { - mByteBuffer.order(getByteOrder()); - for (TagOffset tagOffset : mTagOffsets) { - writeTagValue(tagOffset.mTag, tagOffset.mOffset); - } - } - - private void writeTagValue(ExifTag tag, int offset) { - if (DEBUG) { - Log.v(TAG, "modifying tag to: \n" + tag.toString()); - Log.v(TAG, "at offset: " + offset); - } - mByteBuffer.position(offset + mOffsetBase); - switch (tag.getDataType()) { - case ExifTag.TYPE_ASCII: - byte buf[] = tag.getStringByte(); - if (buf.length == tag.getComponentCount()) { - buf[buf.length - 1] = 0; - mByteBuffer.put(buf); - } else { - mByteBuffer.put(buf); - mByteBuffer.put((byte) 0); - } - break; - case ExifTag.TYPE_LONG: - case ExifTag.TYPE_UNSIGNED_LONG: - for (int i = 0, n = tag.getComponentCount(); i < n; i++) { - mByteBuffer.putInt((int) tag.getValueAt(i)); - } - break; - case ExifTag.TYPE_RATIONAL: - case ExifTag.TYPE_UNSIGNED_RATIONAL: - for (int i = 0, n = tag.getComponentCount(); i < n; i++) { - Rational v = tag.getRational(i); - mByteBuffer.putInt((int) v.getNumerator()); - mByteBuffer.putInt((int) v.getDenominator()); - } - break; - case ExifTag.TYPE_UNDEFINED: - case ExifTag.TYPE_UNSIGNED_BYTE: - buf = new byte[tag.getComponentCount()]; - tag.getBytes(buf); - mByteBuffer.put(buf); - break; - case ExifTag.TYPE_UNSIGNED_SHORT: - for (int i = 0, n = tag.getComponentCount(); i < n; i++) { - mByteBuffer.putShort((short) tag.getValueAt(i)); - } - break; - } - } - - public void modifyTag(ExifTag tag) { - mTagToModified.addTag(tag); - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/exif/ExifOutputStream.java b/QKSMS/src/main/java/com/moez/QKSMS/exif/ExifOutputStream.java deleted file mode 100644 index 07207d312..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/exif/ExifOutputStream.java +++ /dev/null @@ -1,518 +0,0 @@ -/* - * Copyright (C) 2012 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.moez.QKSMS.exif; - -import android.util.Log; - -import java.io.BufferedOutputStream; -import java.io.FilterOutputStream; -import java.io.IOException; -import java.io.OutputStream; -import java.nio.ByteBuffer; -import java.nio.ByteOrder; -import java.util.ArrayList; - -/** - * This class provides a way to replace the Exif header of a JPEG image. - * <p> - * Below is an example of writing EXIF data into a file - * - * <pre> - * public static void writeExif(byte[] jpeg, ExifData exif, String path) { - * OutputStream os = null; - * try { - * os = new FileOutputStream(path); - * ExifOutputStream eos = new ExifOutputStream(os); - * // Set the exif header - * eos.setExifData(exif); - * // Write the original jpeg out, the header will be add into the file. - * eos.write(jpeg); - * } catch (FileNotFoundException e) { - * e.printStackTrace(); - * } catch (IOException e) { - * e.printStackTrace(); - * } finally { - * if (os != null) { - * try { - * os.close(); - * } catch (IOException e) { - * e.printStackTrace(); - * } - * } - * } - * } - * </pre> - */ -class ExifOutputStream extends FilterOutputStream { - private static final String TAG = "ExifOutputStream"; - private static final boolean DEBUG = false; - private static final int STREAMBUFFER_SIZE = 0x00010000; // 64Kb - - private static final int STATE_SOI = 0; - private static final int STATE_FRAME_HEADER = 1; - private static final int STATE_JPEG_DATA = 2; - - private static final int EXIF_HEADER = 0x45786966; - private static final short TIFF_HEADER = 0x002A; - private static final short TIFF_BIG_ENDIAN = 0x4d4d; - private static final short TIFF_LITTLE_ENDIAN = 0x4949; - private static final short TAG_SIZE = 12; - private static final short TIFF_HEADER_SIZE = 8; - private static final int MAX_EXIF_SIZE = 65535; - - private ExifData mExifData; - private int mState = STATE_SOI; - private int mByteToSkip; - private int mByteToCopy; - private final byte[] mSingleByteArray = new byte[1]; - private final ByteBuffer mBuffer = ByteBuffer.allocate(4); - private final ExifInterface mInterface; - - protected ExifOutputStream(OutputStream ou, ExifInterface iRef) { - super(new BufferedOutputStream(ou, STREAMBUFFER_SIZE)); - mInterface = iRef; - } - - /** - * Sets the ExifData to be written into the JPEG file. Should be called - * before writing image data. - */ - protected void setExifData(ExifData exifData) { - mExifData = exifData; - } - - /** - * Gets the Exif header to be written into the JPEF file. - */ - protected ExifData getExifData() { - return mExifData; - } - - private int requestByteToBuffer(int requestByteCount, byte[] buffer - , int offset, int length) { - int byteNeeded = requestByteCount - mBuffer.position(); - int byteToRead = length > byteNeeded ? byteNeeded : length; - mBuffer.put(buffer, offset, byteToRead); - return byteToRead; - } - - /** - * Writes the image out. The input data should be a valid JPEG format. After - * writing, it's Exif header will be replaced by the given header. - */ - @Override - public void write(byte[] buffer, int offset, int length) throws IOException { - while ((mByteToSkip > 0 || mByteToCopy > 0 || mState != STATE_JPEG_DATA) - && length > 0) { - if (mByteToSkip > 0) { - int byteToProcess = length > mByteToSkip ? mByteToSkip : length; - length -= byteToProcess; - mByteToSkip -= byteToProcess; - offset += byteToProcess; - } - if (mByteToCopy > 0) { - int byteToProcess = length > mByteToCopy ? mByteToCopy : length; - out.write(buffer, offset, byteToProcess); - length -= byteToProcess; - mByteToCopy -= byteToProcess; - offset += byteToProcess; - } - if (length == 0) { - return; - } - switch (mState) { - case STATE_SOI: - int byteRead = requestByteToBuffer(2, buffer, offset, length); - offset += byteRead; - length -= byteRead; - if (mBuffer.position() < 2) { - return; - } - mBuffer.rewind(); - if (mBuffer.getShort() != JpegHeader.SOI) { - throw new IOException("Not a valid jpeg image, cannot write exif"); - } - out.write(mBuffer.array(), 0, 2); - mState = STATE_FRAME_HEADER; - mBuffer.rewind(); - writeExifData(); - break; - case STATE_FRAME_HEADER: - // We ignore the APP1 segment and copy all other segments - // until SOF tag. - byteRead = requestByteToBuffer(4, buffer, offset, length); - offset += byteRead; - length -= byteRead; - // Check if this image data doesn't contain SOF. - if (mBuffer.position() == 2) { - short tag = mBuffer.getShort(); - if (tag == JpegHeader.EOI) { - out.write(mBuffer.array(), 0, 2); - mBuffer.rewind(); - } - } - if (mBuffer.position() < 4) { - return; - } - mBuffer.rewind(); - short marker = mBuffer.getShort(); - if (marker == JpegHeader.APP1) { - mByteToSkip = (mBuffer.getShort() & 0x0000ffff) - 2; - mState = STATE_JPEG_DATA; - } else if (!JpegHeader.isSofMarker(marker)) { - out.write(mBuffer.array(), 0, 4); - mByteToCopy = (mBuffer.getShort() & 0x0000ffff) - 2; - } else { - out.write(mBuffer.array(), 0, 4); - mState = STATE_JPEG_DATA; - } - mBuffer.rewind(); - } - } - if (length > 0) { - out.write(buffer, offset, length); - } - } - - /** - * Writes the one bytes out. The input data should be a valid JPEG format. - * After writing, it's Exif header will be replaced by the given header. - */ - @Override - public void write(int oneByte) throws IOException { - mSingleByteArray[0] = (byte) (0xff & oneByte); - write(mSingleByteArray); - } - - /** - * Equivalent to calling write(buffer, 0, buffer.length). - */ - @Override - public void write(byte[] buffer) throws IOException { - write(buffer, 0, buffer.length); - } - - private void writeExifData() throws IOException { - if (mExifData == null) { - return; - } - if (DEBUG) { - Log.v(TAG, "Writing exif data..."); - } - ArrayList<ExifTag> nullTags = stripNullValueTags(mExifData); - createRequiredIfdAndTag(); - int exifSize = calculateAllOffset(); - if (exifSize + 8 > MAX_EXIF_SIZE) { - throw new IOException("Exif header is too large (>64Kb)"); - } - OrderedDataOutputStream dataOutputStream = new OrderedDataOutputStream(out); - dataOutputStream.setByteOrder(ByteOrder.BIG_ENDIAN); - dataOutputStream.writeShort(JpegHeader.APP1); - dataOutputStream.writeShort((short) (exifSize + 8)); - dataOutputStream.writeInt(EXIF_HEADER); - dataOutputStream.writeShort((short) 0x0000); - if (mExifData.getByteOrder() == ByteOrder.BIG_ENDIAN) { - dataOutputStream.writeShort(TIFF_BIG_ENDIAN); - } else { - dataOutputStream.writeShort(TIFF_LITTLE_ENDIAN); - } - dataOutputStream.setByteOrder(mExifData.getByteOrder()); - dataOutputStream.writeShort(TIFF_HEADER); - dataOutputStream.writeInt(8); - writeAllTags(dataOutputStream); - writeThumbnail(dataOutputStream); - for (ExifTag t : nullTags) { - mExifData.addTag(t); - } - } - - private ArrayList<ExifTag> stripNullValueTags(ExifData data) { - ArrayList<ExifTag> nullTags = new ArrayList<>(); - for(ExifTag t : data.getAllTags()) { - if (t.getValue() == null && !ExifInterface.isOffsetTag(t.getTagId())) { - data.removeTag(t.getTagId(), t.getIfd()); - nullTags.add(t); - } - } - return nullTags; - } - - private void writeThumbnail(OrderedDataOutputStream dataOutputStream) throws IOException { - if (mExifData.hasCompressedThumbnail()) { - dataOutputStream.write(mExifData.getCompressedThumbnail()); - } else if (mExifData.hasUncompressedStrip()) { - for (int i = 0; i < mExifData.getStripCount(); i++) { - dataOutputStream.write(mExifData.getStrip(i)); - } - } - } - - private void writeAllTags(OrderedDataOutputStream dataOutputStream) throws IOException { - writeIfd(mExifData.getIfdData(IfdId.TYPE_IFD_0), dataOutputStream); - writeIfd(mExifData.getIfdData(IfdId.TYPE_IFD_EXIF), dataOutputStream); - IfdData interoperabilityIfd = mExifData.getIfdData(IfdId.TYPE_IFD_INTEROPERABILITY); - if (interoperabilityIfd != null) { - writeIfd(interoperabilityIfd, dataOutputStream); - } - IfdData gpsIfd = mExifData.getIfdData(IfdId.TYPE_IFD_GPS); - if (gpsIfd != null) { - writeIfd(gpsIfd, dataOutputStream); - } - IfdData ifd1 = mExifData.getIfdData(IfdId.TYPE_IFD_1); - if (ifd1 != null) { - writeIfd(mExifData.getIfdData(IfdId.TYPE_IFD_1), dataOutputStream); - } - } - - private void writeIfd(IfdData ifd, OrderedDataOutputStream dataOutputStream) - throws IOException { - ExifTag[] tags = ifd.getAllTags(); - dataOutputStream.writeShort((short) tags.length); - for (ExifTag tag : tags) { - dataOutputStream.writeShort(tag.getTagId()); - dataOutputStream.writeShort(tag.getDataType()); - dataOutputStream.writeInt(tag.getComponentCount()); - if (DEBUG) { - Log.v(TAG, "\n" + tag.toString()); - } - if (tag.getDataSize() > 4) { - dataOutputStream.writeInt(tag.getOffset()); - } else { - ExifOutputStream.writeTagValue(tag, dataOutputStream); - for (int i = 0, n = 4 - tag.getDataSize(); i < n; i++) { - dataOutputStream.write(0); - } - } - } - dataOutputStream.writeInt(ifd.getOffsetToNextIfd()); - for (ExifTag tag : tags) { - if (tag.getDataSize() > 4) { - ExifOutputStream.writeTagValue(tag, dataOutputStream); - } - } - } - - private int calculateOffsetOfIfd(IfdData ifd, int offset) { - offset += 2 + ifd.getTagCount() * TAG_SIZE + 4; - ExifTag[] tags = ifd.getAllTags(); - for (ExifTag tag : tags) { - if (tag.getDataSize() > 4) { - tag.setOffset(offset); - offset += tag.getDataSize(); - } - } - return offset; - } - - private void createRequiredIfdAndTag() throws IOException { - // IFD0 is required for all file - IfdData ifd0 = mExifData.getIfdData(IfdId.TYPE_IFD_0); - if (ifd0 == null) { - ifd0 = new IfdData(IfdId.TYPE_IFD_0); - mExifData.addIfdData(ifd0); - } - ExifTag exifOffsetTag = mInterface.buildUninitializedTag(ExifInterface.TAG_EXIF_IFD); - if (exifOffsetTag == null) { - throw new IOException("No definition for crucial exif tag: " - + ExifInterface.TAG_EXIF_IFD); - } - ifd0.setTag(exifOffsetTag); - - // Exif IFD is required for all files. - IfdData exifIfd = mExifData.getIfdData(IfdId.TYPE_IFD_EXIF); - if (exifIfd == null) { - exifIfd = new IfdData(IfdId.TYPE_IFD_EXIF); - mExifData.addIfdData(exifIfd); - } - - // GPS IFD - IfdData gpsIfd = mExifData.getIfdData(IfdId.TYPE_IFD_GPS); - if (gpsIfd != null) { - ExifTag gpsOffsetTag = mInterface.buildUninitializedTag(ExifInterface.TAG_GPS_IFD); - if (gpsOffsetTag == null) { - throw new IOException("No definition for crucial exif tag: " - + ExifInterface.TAG_GPS_IFD); - } - ifd0.setTag(gpsOffsetTag); - } - - // Interoperability IFD - IfdData interIfd = mExifData.getIfdData(IfdId.TYPE_IFD_INTEROPERABILITY); - if (interIfd != null) { - ExifTag interOffsetTag = mInterface - .buildUninitializedTag(ExifInterface.TAG_INTEROPERABILITY_IFD); - if (interOffsetTag == null) { - throw new IOException("No definition for crucial exif tag: " - + ExifInterface.TAG_INTEROPERABILITY_IFD); - } - exifIfd.setTag(interOffsetTag); - } - - IfdData ifd1 = mExifData.getIfdData(IfdId.TYPE_IFD_1); - - // thumbnail - if (mExifData.hasCompressedThumbnail()) { - - if (ifd1 == null) { - ifd1 = new IfdData(IfdId.TYPE_IFD_1); - mExifData.addIfdData(ifd1); - } - - ExifTag offsetTag = mInterface - .buildUninitializedTag(ExifInterface.TAG_JPEG_INTERCHANGE_FORMAT); - if (offsetTag == null) { - throw new IOException("No definition for crucial exif tag: " - + ExifInterface.TAG_JPEG_INTERCHANGE_FORMAT); - } - - ifd1.setTag(offsetTag); - ExifTag lengthTag = mInterface - .buildUninitializedTag(ExifInterface.TAG_JPEG_INTERCHANGE_FORMAT_LENGTH); - if (lengthTag == null) { - throw new IOException("No definition for crucial exif tag: " - + ExifInterface.TAG_JPEG_INTERCHANGE_FORMAT_LENGTH); - } - - lengthTag.setValue(mExifData.getCompressedThumbnail().length); - ifd1.setTag(lengthTag); - - // Get rid of tags for uncompressed if they exist. - ifd1.removeTag(ExifInterface.getTrueTagKey(ExifInterface.TAG_STRIP_OFFSETS)); - ifd1.removeTag(ExifInterface.getTrueTagKey(ExifInterface.TAG_STRIP_BYTE_COUNTS)); - } else if (mExifData.hasUncompressedStrip()) { - if (ifd1 == null) { - ifd1 = new IfdData(IfdId.TYPE_IFD_1); - mExifData.addIfdData(ifd1); - } - int stripCount = mExifData.getStripCount(); - ExifTag offsetTag = mInterface.buildUninitializedTag(ExifInterface.TAG_STRIP_OFFSETS); - if (offsetTag == null) { - throw new IOException("No definition for crucial exif tag: " - + ExifInterface.TAG_STRIP_OFFSETS); - } - ExifTag lengthTag = mInterface - .buildUninitializedTag(ExifInterface.TAG_STRIP_BYTE_COUNTS); - if (lengthTag == null) { - throw new IOException("No definition for crucial exif tag: " - + ExifInterface.TAG_STRIP_BYTE_COUNTS); - } - long[] lengths = new long[stripCount]; - for (int i = 0; i < mExifData.getStripCount(); i++) { - lengths[i] = mExifData.getStrip(i).length; - } - lengthTag.setValue(lengths); - ifd1.setTag(offsetTag); - ifd1.setTag(lengthTag); - // Get rid of tags for compressed if they exist. - ifd1.removeTag(ExifInterface.getTrueTagKey(ExifInterface.TAG_JPEG_INTERCHANGE_FORMAT)); - ifd1.removeTag(ExifInterface - .getTrueTagKey(ExifInterface.TAG_JPEG_INTERCHANGE_FORMAT_LENGTH)); - } else if (ifd1 != null) { - // Get rid of offset and length tags if there is no thumbnail. - ifd1.removeTag(ExifInterface.getTrueTagKey(ExifInterface.TAG_STRIP_OFFSETS)); - ifd1.removeTag(ExifInterface.getTrueTagKey(ExifInterface.TAG_STRIP_BYTE_COUNTS)); - ifd1.removeTag(ExifInterface.getTrueTagKey(ExifInterface.TAG_JPEG_INTERCHANGE_FORMAT)); - ifd1.removeTag(ExifInterface - .getTrueTagKey(ExifInterface.TAG_JPEG_INTERCHANGE_FORMAT_LENGTH)); - } - } - - private int calculateAllOffset() { - int offset = TIFF_HEADER_SIZE; - IfdData ifd0 = mExifData.getIfdData(IfdId.TYPE_IFD_0); - offset = calculateOffsetOfIfd(ifd0, offset); - ifd0.getTag(ExifInterface.getTrueTagKey(ExifInterface.TAG_EXIF_IFD)).setValue(offset); - - IfdData exifIfd = mExifData.getIfdData(IfdId.TYPE_IFD_EXIF); - offset = calculateOffsetOfIfd(exifIfd, offset); - - IfdData interIfd = mExifData.getIfdData(IfdId.TYPE_IFD_INTEROPERABILITY); - if (interIfd != null) { - exifIfd.getTag(ExifInterface.getTrueTagKey(ExifInterface.TAG_INTEROPERABILITY_IFD)) - .setValue(offset); - offset = calculateOffsetOfIfd(interIfd, offset); - } - - IfdData gpsIfd = mExifData.getIfdData(IfdId.TYPE_IFD_GPS); - if (gpsIfd != null) { - ifd0.getTag(ExifInterface.getTrueTagKey(ExifInterface.TAG_GPS_IFD)).setValue(offset); - offset = calculateOffsetOfIfd(gpsIfd, offset); - } - - IfdData ifd1 = mExifData.getIfdData(IfdId.TYPE_IFD_1); - if (ifd1 != null) { - ifd0.setOffsetToNextIfd(offset); - offset = calculateOffsetOfIfd(ifd1, offset); - } - - // thumbnail - if (mExifData.hasCompressedThumbnail()) { - ifd1.getTag(ExifInterface.getTrueTagKey(ExifInterface.TAG_JPEG_INTERCHANGE_FORMAT)) - .setValue(offset); - offset += mExifData.getCompressedThumbnail().length; - } else if (mExifData.hasUncompressedStrip()) { - int stripCount = mExifData.getStripCount(); - long[] offsets = new long[stripCount]; - for (int i = 0; i < mExifData.getStripCount(); i++) { - offsets[i] = offset; - offset += mExifData.getStrip(i).length; - } - ifd1.getTag(ExifInterface.getTrueTagKey(ExifInterface.TAG_STRIP_OFFSETS)).setValue( - offsets); - } - return offset; - } - - static void writeTagValue(ExifTag tag, OrderedDataOutputStream dataOutputStream) - throws IOException { - switch (tag.getDataType()) { - case ExifTag.TYPE_ASCII: - byte buf[] = tag.getStringByte(); - if (buf.length == tag.getComponentCount()) { - buf[buf.length - 1] = 0; - dataOutputStream.write(buf); - } else { - dataOutputStream.write(buf); - dataOutputStream.write(0); - } - break; - case ExifTag.TYPE_LONG: - case ExifTag.TYPE_UNSIGNED_LONG: - for (int i = 0, n = tag.getComponentCount(); i < n; i++) { - dataOutputStream.writeInt((int) tag.getValueAt(i)); - } - break; - case ExifTag.TYPE_RATIONAL: - case ExifTag.TYPE_UNSIGNED_RATIONAL: - for (int i = 0, n = tag.getComponentCount(); i < n; i++) { - dataOutputStream.writeRational(tag.getRational(i)); - } - break; - case ExifTag.TYPE_UNDEFINED: - case ExifTag.TYPE_UNSIGNED_BYTE: - buf = new byte[tag.getComponentCount()]; - tag.getBytes(buf); - dataOutputStream.write(buf); - break; - case ExifTag.TYPE_UNSIGNED_SHORT: - for (int i = 0, n = tag.getComponentCount(); i < n; i++) { - dataOutputStream.writeShort((short) tag.getValueAt(i)); - } - break; - } - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/exif/ExifParser.java b/QKSMS/src/main/java/com/moez/QKSMS/exif/ExifParser.java deleted file mode 100644 index 6a0e99bb5..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/exif/ExifParser.java +++ /dev/null @@ -1,913 +0,0 @@ -/* - * Copyright (C) 2012 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.moez.QKSMS.exif; - -import android.util.Log; - -import java.io.IOException; -import java.io.InputStream; -import java.nio.ByteOrder; -import java.nio.charset.Charset; -import java.util.Map.Entry; -import java.util.TreeMap; - -/** - * This class provides a low-level EXIF parsing API. Given a JPEG format - * InputStream, the caller can request which IFD's to read via - * {@link #parse(java.io.InputStream, int)} with given options. - * <p> - * Below is an example of getting EXIF data from IFD 0 and EXIF IFD using the - * parser. - * - * <pre> - * void parse() { - * ExifParser parser = ExifParser.parse(mImageInputStream, - * ExifParser.OPTION_IFD_0 | ExifParser.OPTIONS_IFD_EXIF); - * int event = parser.next(); - * while (event != ExifParser.EVENT_END) { - * switch (event) { - * case ExifParser.EVENT_START_OF_IFD: - * break; - * case ExifParser.EVENT_NEW_TAG: - * ExifTag tag = parser.getTag(); - * if (!tag.hasValue()) { - * parser.registerForTagValue(tag); - * } else { - * processTag(tag); - * } - * break; - * case ExifParser.EVENT_VALUE_OF_REGISTERED_TAG: - * tag = parser.getTag(); - * if (tag.getDataType() != ExifTag.TYPE_UNDEFINED) { - * processTag(tag); - * } - * break; - * } - * event = parser.next(); - * } - * } - * - * void processTag(ExifTag tag) { - * // process the tag as you like. - * } - * </pre> - */ -public class ExifParser { - private static final boolean LOGV = false; - private static final String TAG = "ExifParser"; - /** - * When the parser reaches a new IFD area. Call {@link #getCurrentIfd()} to - * know which IFD we are in. - */ - public static final int EVENT_START_OF_IFD = 0; - /** - * When the parser reaches a new tag. Call {@link #getTag()}to get the - * corresponding tag. - */ - public static final int EVENT_NEW_TAG = 1; - /** - * When the parser reaches the value area of tag that is registered by - * {@link #registerForTagValue(ExifTag)} previously. Call {@link #getTag()} - * to get the corresponding tag. - */ - public static final int EVENT_VALUE_OF_REGISTERED_TAG = 2; - - /** - * When the parser reaches the compressed image area. - */ - public static final int EVENT_COMPRESSED_IMAGE = 3; - /** - * When the parser reaches the uncompressed image strip. Call - * {@link #getStripIndex()} to get the index of the strip. - * - * @see #getStripIndex() - * @see #getStripCount() - */ - public static final int EVENT_UNCOMPRESSED_STRIP = 4; - /** - * When there is nothing more to parse. - */ - public static final int EVENT_END = 5; - - /** - * Option bit to request to parse IFD0. - */ - public static final int OPTION_IFD_0 = 1 << 0; - /** - * Option bit to request to parse IFD1. - */ - public static final int OPTION_IFD_1 = 1 << 1; - /** - * Option bit to request to parse Exif-IFD. - */ - public static final int OPTION_IFD_EXIF = 1 << 2; - /** - * Option bit to request to parse GPS-IFD. - */ - public static final int OPTION_IFD_GPS = 1 << 3; - /** - * Option bit to request to parse Interoperability-IFD. - */ - public static final int OPTION_IFD_INTEROPERABILITY = 1 << 4; - /** - * Option bit to request to parse thumbnail. - */ - public static final int OPTION_THUMBNAIL = 1 << 5; - - protected static final int EXIF_HEADER = 0x45786966; // EXIF header "Exif" - protected static final short EXIF_HEADER_TAIL = (short) 0x0000; // EXIF header in APP1 - - // TIFF header - protected static final short LITTLE_ENDIAN_TAG = (short) 0x4949; // "II" - protected static final short BIG_ENDIAN_TAG = (short) 0x4d4d; // "MM" - protected static final short TIFF_HEADER_TAIL = 0x002A; - - protected static final int TAG_SIZE = 12; - protected static final int OFFSET_SIZE = 2; - - private static final Charset US_ASCII = Charset.forName("US-ASCII"); - - protected static final int DEFAULT_IFD0_OFFSET = 8; - - private final CountedDataInputStream mTiffStream; - private final int mOptions; - private int mIfdStartOffset = 0; - private int mNumOfTagInIfd = 0; - private int mIfdType; - private ExifTag mTag; - private ImageEvent mImageEvent; - private int mStripCount; - private ExifTag mStripSizeTag; - private ExifTag mJpegSizeTag; - private boolean mNeedToParseOffsetsInCurrentIfd; - private boolean mContainExifData = false; - private int mApp1End; - private int mOffsetToApp1EndFromSOF = 0; - private byte[] mDataAboveIfd0; - private int mIfd0Position; - private int mTiffStartPosition; - private final ExifInterface mInterface; - - private static final short TAG_EXIF_IFD = ExifInterface - .getTrueTagKey(ExifInterface.TAG_EXIF_IFD); - private static final short TAG_GPS_IFD = ExifInterface.getTrueTagKey(ExifInterface.TAG_GPS_IFD); - private static final short TAG_INTEROPERABILITY_IFD = ExifInterface - .getTrueTagKey(ExifInterface.TAG_INTEROPERABILITY_IFD); - private static final short TAG_JPEG_INTERCHANGE_FORMAT = ExifInterface - .getTrueTagKey(ExifInterface.TAG_JPEG_INTERCHANGE_FORMAT); - private static final short TAG_JPEG_INTERCHANGE_FORMAT_LENGTH = ExifInterface - .getTrueTagKey(ExifInterface.TAG_JPEG_INTERCHANGE_FORMAT_LENGTH); - private static final short TAG_STRIP_OFFSETS = ExifInterface - .getTrueTagKey(ExifInterface.TAG_STRIP_OFFSETS); - private static final short TAG_STRIP_BYTE_COUNTS = ExifInterface - .getTrueTagKey(ExifInterface.TAG_STRIP_BYTE_COUNTS); - - private final TreeMap<Integer, Object> mCorrespondingEvent = new TreeMap<>(); - - private boolean isIfdRequested(int ifdType) { - switch (ifdType) { - case IfdId.TYPE_IFD_0: - return (mOptions & OPTION_IFD_0) != 0; - case IfdId.TYPE_IFD_1: - return (mOptions & OPTION_IFD_1) != 0; - case IfdId.TYPE_IFD_EXIF: - return (mOptions & OPTION_IFD_EXIF) != 0; - case IfdId.TYPE_IFD_GPS: - return (mOptions & OPTION_IFD_GPS) != 0; - case IfdId.TYPE_IFD_INTEROPERABILITY: - return (mOptions & OPTION_IFD_INTEROPERABILITY) != 0; - } - return false; - } - - private boolean isThumbnailRequested() { - return (mOptions & OPTION_THUMBNAIL) != 0; - } - - private ExifParser(InputStream inputStream, int options, ExifInterface iRef) - throws IOException, ExifInvalidFormatException { - if (inputStream == null) { - throw new IOException("Null argument inputStream to ExifParser"); - } - if (LOGV) { - Log.v(TAG, "Reading exif..."); - } - mInterface = iRef; - mContainExifData = seekTiffData(inputStream); - mTiffStream = new CountedDataInputStream(inputStream); - mOptions = options; - if (!mContainExifData) { - return; - } - - parseTiffHeader(); - long offset = mTiffStream.readUnsignedInt(); - if (offset > Integer.MAX_VALUE) { - throw new ExifInvalidFormatException("Invalid offset " + offset); - } - mIfd0Position = (int) offset; - mIfdType = IfdId.TYPE_IFD_0; - if (isIfdRequested(IfdId.TYPE_IFD_0) || needToParseOffsetsInCurrentIfd()) { - registerIfd(IfdId.TYPE_IFD_0, offset); - if (offset != DEFAULT_IFD0_OFFSET) { - mDataAboveIfd0 = new byte[(int) offset - DEFAULT_IFD0_OFFSET]; - read(mDataAboveIfd0); - } - } - } - - /** - * Parses the the given InputStream with the given options - * - * @exception java.io.IOException - * @exception ExifInvalidFormatException - */ - protected static ExifParser parse(InputStream inputStream, int options, ExifInterface iRef) - throws IOException, ExifInvalidFormatException { - return new ExifParser(inputStream, options, iRef); - } - - /** - * Parses the the given InputStream with default options; that is, every IFD - * and thumbnaill will be parsed. - * - * @exception java.io.IOException - * @exception ExifInvalidFormatException - * @see #parse(java.io.InputStream, int) - */ - protected static ExifParser parse(InputStream inputStream, ExifInterface iRef) - throws IOException, ExifInvalidFormatException { - return new ExifParser(inputStream, OPTION_IFD_0 | OPTION_IFD_1 - | OPTION_IFD_EXIF | OPTION_IFD_GPS | OPTION_IFD_INTEROPERABILITY - | OPTION_THUMBNAIL, iRef); - } - - /** - * Moves the parser forward and returns the next parsing event - * - * @exception java.io.IOException - * @exception ExifInvalidFormatException - * @see #EVENT_START_OF_IFD - * @see #EVENT_NEW_TAG - * @see #EVENT_VALUE_OF_REGISTERED_TAG - * @see #EVENT_COMPRESSED_IMAGE - * @see #EVENT_UNCOMPRESSED_STRIP - * @see #EVENT_END - */ - protected int next() throws IOException, ExifInvalidFormatException { - if (!mContainExifData) { - return EVENT_END; - } - int offset = mTiffStream.getReadByteCount(); - int endOfTags = mIfdStartOffset + OFFSET_SIZE + TAG_SIZE * mNumOfTagInIfd; - if (offset < endOfTags) { - mTag = readTag(); - if (mTag == null) { - return next(); - } - if (mNeedToParseOffsetsInCurrentIfd) { - checkOffsetOrImageTag(mTag); - } - return EVENT_NEW_TAG; - } else if (offset == endOfTags) { - // There is a link to ifd1 at the end of ifd0 - if (mIfdType == IfdId.TYPE_IFD_0) { - long ifdOffset = readUnsignedLong(); - if (isIfdRequested(IfdId.TYPE_IFD_1) || isThumbnailRequested()) { - if (ifdOffset != 0) { - registerIfd(IfdId.TYPE_IFD_1, ifdOffset); - } - } - } else { - int offsetSize = 4; - // Some camera models use invalid length of the offset - if (mCorrespondingEvent.size() > 0) { - offsetSize = mCorrespondingEvent.firstEntry().getKey() - - mTiffStream.getReadByteCount(); - } - if (offsetSize < 4) { - Log.w(TAG, "Invalid size of link to next IFD: " + offsetSize); - } else { - long ifdOffset = readUnsignedLong(); - if (ifdOffset != 0) { - Log.w(TAG, "Invalid link to next IFD: " + ifdOffset); - } - } - } - } - while (mCorrespondingEvent.size() != 0) { - Entry<Integer, Object> entry = mCorrespondingEvent.pollFirstEntry(); - Object event = entry.getValue(); - try { - skipTo(entry.getKey()); - } catch (IOException e) { - Log.w(TAG, "Failed to skip to data at: " + entry.getKey() + - " for " + event.getClass().getName() + ", the file may be broken."); - continue; - } - if (event instanceof IfdEvent) { - mIfdType = ((IfdEvent) event).ifd; - mNumOfTagInIfd = mTiffStream.readUnsignedShort(); - mIfdStartOffset = entry.getKey(); - - if (mNumOfTagInIfd * TAG_SIZE + mIfdStartOffset + OFFSET_SIZE > mApp1End) { - Log.w(TAG, "Invalid size of IFD " + mIfdType); - return EVENT_END; - } - - mNeedToParseOffsetsInCurrentIfd = needToParseOffsetsInCurrentIfd(); - if (((IfdEvent) event).isRequested) { - return EVENT_START_OF_IFD; - } else { - skipRemainingTagsInCurrentIfd(); - } - } else if (event instanceof ImageEvent) { - mImageEvent = (ImageEvent) event; - return mImageEvent.type; - } else { - ExifTagEvent tagEvent = (ExifTagEvent) event; - mTag = tagEvent.tag; - if (mTag.getDataType() != ExifTag.TYPE_UNDEFINED) { - readFullTagValue(mTag); - checkOffsetOrImageTag(mTag); - } - if (tagEvent.isRequested) { - return EVENT_VALUE_OF_REGISTERED_TAG; - } - } - } - return EVENT_END; - } - - /** - * Skips the tags area of current IFD, if the parser is not in the tag area, - * nothing will happen. - * - * @throws java.io.IOException - * @throws ExifInvalidFormatException - */ - protected void skipRemainingTagsInCurrentIfd() throws IOException, ExifInvalidFormatException { - int endOfTags = mIfdStartOffset + OFFSET_SIZE + TAG_SIZE * mNumOfTagInIfd; - int offset = mTiffStream.getReadByteCount(); - if (offset > endOfTags) { - return; - } - if (mNeedToParseOffsetsInCurrentIfd) { - while (offset < endOfTags) { - mTag = readTag(); - offset += TAG_SIZE; - if (mTag == null) { - continue; - } - checkOffsetOrImageTag(mTag); - } - } else { - skipTo(endOfTags); - } - long ifdOffset = readUnsignedLong(); - // For ifd0, there is a link to ifd1 in the end of all tags - if (mIfdType == IfdId.TYPE_IFD_0 - && (isIfdRequested(IfdId.TYPE_IFD_1) || isThumbnailRequested())) { - if (ifdOffset > 0) { - registerIfd(IfdId.TYPE_IFD_1, ifdOffset); - } - } - } - - private boolean needToParseOffsetsInCurrentIfd() { - switch (mIfdType) { - case IfdId.TYPE_IFD_0: - return isIfdRequested(IfdId.TYPE_IFD_EXIF) || isIfdRequested(IfdId.TYPE_IFD_GPS) - || isIfdRequested(IfdId.TYPE_IFD_INTEROPERABILITY) - || isIfdRequested(IfdId.TYPE_IFD_1); - case IfdId.TYPE_IFD_1: - return isThumbnailRequested(); - case IfdId.TYPE_IFD_EXIF: - // The offset to interoperability IFD is located in Exif IFD - return isIfdRequested(IfdId.TYPE_IFD_INTEROPERABILITY); - default: - return false; - } - } - - /** - * If {@link #next()} return {@link #EVENT_NEW_TAG} or - * {@link #EVENT_VALUE_OF_REGISTERED_TAG}, call this function to get the - * corresponding tag. - * <p> - * For {@link #EVENT_NEW_TAG}, the tag may not contain the value if the size - * of the value is greater than 4 bytes. One should call - * {@link ExifTag#hasValue()} to check if the tag contains value. If there - * is no value,call {@link #registerForTagValue(ExifTag)} to have the parser - * emit {@link #EVENT_VALUE_OF_REGISTERED_TAG} when it reaches the area - * pointed by the offset. - * <p> - * When {@link #EVENT_VALUE_OF_REGISTERED_TAG} is emitted, the value of the - * tag will have already been read except for tags of undefined type. For - * tags of undefined type, call one of the read methods to get the value. - * - * @see #registerForTagValue(ExifTag) - * @see #read(byte[]) - * @see #read(byte[], int, int) - * @see #readLong() - * @see #readRational() - * @see #readString(int) - * @see #readString(int, java.nio.charset.Charset) - */ - protected ExifTag getTag() { - return mTag; - } - - /** - * Gets number of tags in the current IFD area. - */ - protected int getTagCountInCurrentIfd() { - return mNumOfTagInIfd; - } - - /** - * Gets the ID of current IFD. - * - * @see IfdId#TYPE_IFD_0 - * @see IfdId#TYPE_IFD_1 - * @see IfdId#TYPE_IFD_GPS - * @see IfdId#TYPE_IFD_INTEROPERABILITY - * @see IfdId#TYPE_IFD_EXIF - */ - protected int getCurrentIfd() { - return mIfdType; - } - - /** - * When receiving {@link #EVENT_UNCOMPRESSED_STRIP}, call this function to - * get the index of this strip. - * - * @see #getStripCount() - */ - protected int getStripIndex() { - return mImageEvent.stripIndex; - } - - /** - * When receiving {@link #EVENT_UNCOMPRESSED_STRIP}, call this function to - * get the number of strip data. - * - * @see #getStripIndex() - */ - protected int getStripCount() { - return mStripCount; - } - - /** - * When receiving {@link #EVENT_UNCOMPRESSED_STRIP}, call this function to - * get the strip size. - */ - protected int getStripSize() { - if (mStripSizeTag == null) - return 0; - return (int) mStripSizeTag.getValueAt(0); - } - - /** - * When receiving {@link #EVENT_COMPRESSED_IMAGE}, call this function to get - * the image data size. - */ - protected int getCompressedImageSize() { - if (mJpegSizeTag == null) { - return 0; - } - return (int) mJpegSizeTag.getValueAt(0); - } - - private void skipTo(int offset) throws IOException { - mTiffStream.skipTo(offset); - while (!mCorrespondingEvent.isEmpty() && mCorrespondingEvent.firstKey() < offset) { - mCorrespondingEvent.pollFirstEntry(); - } - } - - /** - * When getting {@link #EVENT_NEW_TAG} in the tag area of IFD, the tag may - * not contain the value if the size of the value is greater than 4 bytes. - * When the value is not available here, call this method so that the parser - * will emit {@link #EVENT_VALUE_OF_REGISTERED_TAG} when it reaches the area - * where the value is located. - * - * @see #EVENT_VALUE_OF_REGISTERED_TAG - */ - protected void registerForTagValue(ExifTag tag) { - if (tag.getOffset() >= mTiffStream.getReadByteCount()) { - mCorrespondingEvent.put(tag.getOffset(), new ExifTagEvent(tag, true)); - } - } - - private void registerIfd(int ifdType, long offset) { - // Cast unsigned int to int since the offset is always smaller - // than the size of APP1 (65536) - mCorrespondingEvent.put((int) offset, new IfdEvent(ifdType, isIfdRequested(ifdType))); - } - - private void registerCompressedImage(long offset) { - mCorrespondingEvent.put((int) offset, new ImageEvent(EVENT_COMPRESSED_IMAGE)); - } - - private void registerUncompressedStrip(int stripIndex, long offset) { - mCorrespondingEvent.put((int) offset, new ImageEvent(EVENT_UNCOMPRESSED_STRIP - , stripIndex)); - } - - private ExifTag readTag() throws IOException, ExifInvalidFormatException { - short tagId = mTiffStream.readShort(); - short dataFormat = mTiffStream.readShort(); - long numOfComp = mTiffStream.readUnsignedInt(); - if (numOfComp > Integer.MAX_VALUE) { - throw new ExifInvalidFormatException( - "Number of component is larger then Integer.MAX_VALUE"); - } - // Some invalid image file contains invalid data type. Ignore those tags - if (!ExifTag.isValidType(dataFormat)) { - Log.w(TAG, String.format("Tag %04x: Invalid data type %d", tagId, dataFormat)); - mTiffStream.skip(4); - return null; - } - // TODO: handle numOfComp overflow - ExifTag tag = new ExifTag(tagId, dataFormat, (int) numOfComp, mIfdType, - ((int) numOfComp) != ExifTag.SIZE_UNDEFINED); - int dataSize = tag.getDataSize(); - if (dataSize > 4) { - long offset = mTiffStream.readUnsignedInt(); - if (offset > Integer.MAX_VALUE) { - throw new ExifInvalidFormatException( - "offset is larger then Integer.MAX_VALUE"); - } - // Some invalid images put some undefined data before IFD0. - // Read the data here. - if ((offset < mIfd0Position) && (dataFormat == ExifTag.TYPE_UNDEFINED)) { - byte[] buf = new byte[(int) numOfComp]; - System.arraycopy(mDataAboveIfd0, (int) offset - DEFAULT_IFD0_OFFSET, - buf, 0, (int) numOfComp); - tag.setValue(buf); - } else { - tag.setOffset((int) offset); - } - } else { - boolean defCount = tag.hasDefinedCount(); - // Set defined count to 0 so we can add \0 to non-terminated strings - tag.setHasDefinedCount(false); - // Read value - readFullTagValue(tag); - tag.setHasDefinedCount(defCount); - mTiffStream.skip(4 - dataSize); - // Set the offset to the position of value. - tag.setOffset(mTiffStream.getReadByteCount() - 4); - } - return tag; - } - - /** - * Check the tag, if the tag is one of the offset tag that points to the IFD - * or image the caller is interested in, register the IFD or image. - */ - private void checkOffsetOrImageTag(ExifTag tag) { - // Some invalid formattd image contains tag with 0 size. - if (tag.getComponentCount() == 0) { - return; - } - short tid = tag.getTagId(); - int ifd = tag.getIfd(); - if (tid == TAG_EXIF_IFD && checkAllowed(ifd, ExifInterface.TAG_EXIF_IFD)) { - if (isIfdRequested(IfdId.TYPE_IFD_EXIF) - || isIfdRequested(IfdId.TYPE_IFD_INTEROPERABILITY)) { - registerIfd(IfdId.TYPE_IFD_EXIF, tag.getValueAt(0)); - } - } else if (tid == TAG_GPS_IFD && checkAllowed(ifd, ExifInterface.TAG_GPS_IFD)) { - if (isIfdRequested(IfdId.TYPE_IFD_GPS)) { - registerIfd(IfdId.TYPE_IFD_GPS, tag.getValueAt(0)); - } - } else if (tid == TAG_INTEROPERABILITY_IFD - && checkAllowed(ifd, ExifInterface.TAG_INTEROPERABILITY_IFD)) { - if (isIfdRequested(IfdId.TYPE_IFD_INTEROPERABILITY)) { - registerIfd(IfdId.TYPE_IFD_INTEROPERABILITY, tag.getValueAt(0)); - } - } else if (tid == TAG_JPEG_INTERCHANGE_FORMAT - && checkAllowed(ifd, ExifInterface.TAG_JPEG_INTERCHANGE_FORMAT)) { - if (isThumbnailRequested()) { - registerCompressedImage(tag.getValueAt(0)); - } - } else if (tid == TAG_JPEG_INTERCHANGE_FORMAT_LENGTH - && checkAllowed(ifd, ExifInterface.TAG_JPEG_INTERCHANGE_FORMAT_LENGTH)) { - if (isThumbnailRequested()) { - mJpegSizeTag = tag; - } - } else if (tid == TAG_STRIP_OFFSETS && checkAllowed(ifd, ExifInterface.TAG_STRIP_OFFSETS)) { - if (isThumbnailRequested()) { - if (tag.hasValue()) { - for (int i = 0; i < tag.getComponentCount(); i++) { - if (tag.getDataType() == ExifTag.TYPE_UNSIGNED_SHORT) { - registerUncompressedStrip(i, tag.getValueAt(i)); - } else { - registerUncompressedStrip(i, tag.getValueAt(i)); - } - } - } else { - mCorrespondingEvent.put(tag.getOffset(), new ExifTagEvent(tag, false)); - } - } - } else if (tid == TAG_STRIP_BYTE_COUNTS - && checkAllowed(ifd, ExifInterface.TAG_STRIP_BYTE_COUNTS) - &&isThumbnailRequested() && tag.hasValue()) { - mStripSizeTag = tag; - } - } - - private boolean checkAllowed(int ifd, int tagId) { - int info = mInterface.getTagInfo().get(tagId); - return info != ExifInterface.DEFINITION_NULL && ExifInterface.isIfdAllowed(info, ifd); - } - - protected void readFullTagValue(ExifTag tag) throws IOException { - // Some invalid images contains tags with wrong size, check it here - short type = tag.getDataType(); - if (type == ExifTag.TYPE_ASCII || type == ExifTag.TYPE_UNDEFINED || - type == ExifTag.TYPE_UNSIGNED_BYTE) { - int size = tag.getComponentCount(); - if (mCorrespondingEvent.size() > 0) { - if (mCorrespondingEvent.firstEntry().getKey() < mTiffStream.getReadByteCount() - + size) { - Object event = mCorrespondingEvent.firstEntry().getValue(); - if (event instanceof ImageEvent) { - // Tag value overlaps thumbnail, ignore thumbnail. - Log.w(TAG, "Thumbnail overlaps value for tag: \n" + tag.toString()); - Entry<Integer, Object> entry = mCorrespondingEvent.pollFirstEntry(); - Log.w(TAG, "Invalid thumbnail offset: " + entry.getKey()); - } else { - // Tag value overlaps another tag, shorten count - if (event instanceof IfdEvent) { - Log.w(TAG, "Ifd " + ((IfdEvent) event).ifd - + " overlaps value for tag: \n" + tag.toString()); - } else if (event instanceof ExifTagEvent) { - Log.w(TAG, "Tag value for tag: \n" - + ((ExifTagEvent) event).tag.toString() - + " overlaps value for tag: \n" + tag.toString()); - } - size = mCorrespondingEvent.firstEntry().getKey() - - mTiffStream.getReadByteCount(); - Log.w(TAG, "Invalid size of tag: \n" + tag.toString() - + " setting count to: " + size); - tag.forceSetComponentCount(size); - } - } - } - } - switch (tag.getDataType()) { - case ExifTag.TYPE_UNSIGNED_BYTE: - case ExifTag.TYPE_UNDEFINED: { - byte buf[] = new byte[tag.getComponentCount()]; - read(buf); - tag.setValue(buf); - } - break; - case ExifTag.TYPE_ASCII: - tag.setValue(readString(tag.getComponentCount())); - break; - case ExifTag.TYPE_UNSIGNED_LONG: { - long value[] = new long[tag.getComponentCount()]; - for (int i = 0, n = value.length; i < n; i++) { - value[i] = readUnsignedLong(); - } - tag.setValue(value); - } - break; - case ExifTag.TYPE_UNSIGNED_RATIONAL: { - Rational value[] = new Rational[tag.getComponentCount()]; - for (int i = 0, n = value.length; i < n; i++) { - value[i] = readUnsignedRational(); - } - tag.setValue(value); - } - break; - case ExifTag.TYPE_UNSIGNED_SHORT: { - int value[] = new int[tag.getComponentCount()]; - for (int i = 0, n = value.length; i < n; i++) { - value[i] = readUnsignedShort(); - } - tag.setValue(value); - } - break; - case ExifTag.TYPE_LONG: { - int value[] = new int[tag.getComponentCount()]; - for (int i = 0, n = value.length; i < n; i++) { - value[i] = readLong(); - } - tag.setValue(value); - } - break; - case ExifTag.TYPE_RATIONAL: { - Rational value[] = new Rational[tag.getComponentCount()]; - for (int i = 0, n = value.length; i < n; i++) { - value[i] = readRational(); - } - tag.setValue(value); - } - break; - } - if (LOGV) { - Log.v(TAG, "\n" + tag.toString()); - } - } - - private void parseTiffHeader() throws IOException, - ExifInvalidFormatException { - short byteOrder = mTiffStream.readShort(); - if (LITTLE_ENDIAN_TAG == byteOrder) { - mTiffStream.setByteOrder(ByteOrder.LITTLE_ENDIAN); - } else if (BIG_ENDIAN_TAG == byteOrder) { - mTiffStream.setByteOrder(ByteOrder.BIG_ENDIAN); - } else { - throw new ExifInvalidFormatException("Invalid TIFF header"); - } - - if (mTiffStream.readShort() != TIFF_HEADER_TAIL) { - throw new ExifInvalidFormatException("Invalid TIFF header"); - } - } - - private boolean seekTiffData(InputStream inputStream) throws IOException, - ExifInvalidFormatException { - CountedDataInputStream dataStream = new CountedDataInputStream(inputStream); - if (dataStream.readShort() != JpegHeader.SOI) { - throw new ExifInvalidFormatException("Invalid JPEG format"); - } - - short marker = dataStream.readShort(); - while (marker != JpegHeader.EOI - && !JpegHeader.isSofMarker(marker)) { - int length = dataStream.readUnsignedShort(); - // Some invalid formatted image contains multiple APP1, - // try to find the one with Exif data. - if (marker == JpegHeader.APP1) { - int header = 0; - short headerTail = 0; - if (length >= 8) { - header = dataStream.readInt(); - headerTail = dataStream.readShort(); - length -= 6; - if (header == EXIF_HEADER && headerTail == EXIF_HEADER_TAIL) { - mTiffStartPosition = dataStream.getReadByteCount(); - mApp1End = length; - mOffsetToApp1EndFromSOF = mTiffStartPosition + mApp1End; - return true; - } - } - } - if (length < 2 || (length - 2) != dataStream.skip(length - 2)) { - Log.w(TAG, "Invalid JPEG format."); - return false; - } - marker = dataStream.readShort(); - } - return false; - } - - protected int getOffsetToExifEndFromSOF() { - return mOffsetToApp1EndFromSOF; - } - - protected int getTiffStartPosition() { - return mTiffStartPosition; - } - - /** - * Reads bytes from the InputStream. - */ - protected int read(byte[] buffer, int offset, int length) throws IOException { - return mTiffStream.read(buffer, offset, length); - } - - /** - * Equivalent to read(buffer, 0, buffer.length). - */ - protected int read(byte[] buffer) throws IOException { - return mTiffStream.read(buffer); - } - - /** - * Reads a String from the InputStream with US-ASCII charset. The parser - * will read n bytes and convert it to ascii string. This is used for - * reading values of type {@link ExifTag#TYPE_ASCII}. - */ - protected String readString(int n) throws IOException { - return readString(n, US_ASCII); - } - - /** - * Reads a String from the InputStream with the given charset. The parser - * will read n bytes and convert it to string. This is used for reading - * values of type {@link ExifTag#TYPE_ASCII}. - */ - protected String readString(int n, Charset charset) throws IOException { - if (n > 0) { - return mTiffStream.readString(n, charset); - } else { - return ""; - } - } - - /** - * Reads value of type {@link ExifTag#TYPE_UNSIGNED_SHORT} from the - * InputStream. - */ - protected int readUnsignedShort() throws IOException { - return mTiffStream.readShort() & 0xffff; - } - - /** - * Reads value of type {@link ExifTag#TYPE_UNSIGNED_LONG} from the - * InputStream. - */ - protected long readUnsignedLong() throws IOException { - return readLong() & 0xffffffffL; - } - - /** - * Reads value of type {@link ExifTag#TYPE_UNSIGNED_RATIONAL} from the - * InputStream. - */ - protected Rational readUnsignedRational() throws IOException { - long nomi = readUnsignedLong(); - long denomi = readUnsignedLong(); - return new Rational(nomi, denomi); - } - - /** - * Reads value of type {@link ExifTag#TYPE_LONG} from the InputStream. - */ - protected int readLong() throws IOException { - return mTiffStream.readInt(); - } - - /** - * Reads value of type {@link ExifTag#TYPE_RATIONAL} from the InputStream. - */ - protected Rational readRational() throws IOException { - int nomi = readLong(); - int denomi = readLong(); - return new Rational(nomi, denomi); - } - - private static class ImageEvent { - int stripIndex; - int type; - - ImageEvent(int type) { - this.stripIndex = 0; - this.type = type; - } - - ImageEvent(int type, int stripIndex) { - this.type = type; - this.stripIndex = stripIndex; - } - } - - private static class IfdEvent { - int ifd; - boolean isRequested; - - IfdEvent(int ifd, boolean isInterestedIfd) { - this.ifd = ifd; - this.isRequested = isInterestedIfd; - } - } - - private static class ExifTagEvent { - ExifTag tag; - boolean isRequested; - - ExifTagEvent(ExifTag tag, boolean isRequireByUser) { - this.tag = tag; - this.isRequested = isRequireByUser; - } - } - - /** - * Gets the byte order of the current InputStream. - */ - protected ByteOrder getByteOrder() { - return mTiffStream.getByteOrder(); - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/exif/ExifReader.java b/QKSMS/src/main/java/com/moez/QKSMS/exif/ExifReader.java deleted file mode 100644 index 457d3a769..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/exif/ExifReader.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright (C) 2012 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.moez.QKSMS.exif; - -import android.util.Log; - -import java.io.IOException; -import java.io.InputStream; - -/** - * This class reads the EXIF header of a JPEG file and stores it in - * {@link ExifData}. - */ -class ExifReader { - private static final String TAG = "ExifReader"; - - private final ExifInterface mInterface; - - ExifReader(ExifInterface iRef) { - mInterface = iRef; - } - - /** - * Parses the inputStream and and returns the EXIF data in an - * {@link ExifData}. - * - * @throws ExifInvalidFormatException - * @throws java.io.IOException - */ - protected ExifData read(InputStream inputStream) throws ExifInvalidFormatException, - IOException { - ExifParser parser = ExifParser.parse(inputStream, mInterface); - ExifData exifData = new ExifData(parser.getByteOrder()); - ExifTag tag = null; - - int event = parser.next(); - while (event != ExifParser.EVENT_END) { - switch (event) { - case ExifParser.EVENT_START_OF_IFD: - exifData.addIfdData(new IfdData(parser.getCurrentIfd())); - break; - case ExifParser.EVENT_NEW_TAG: - tag = parser.getTag(); - if (!tag.hasValue()) { - parser.registerForTagValue(tag); - } else { - exifData.getIfdData(tag.getIfd()).setTag(tag); - } - break; - case ExifParser.EVENT_VALUE_OF_REGISTERED_TAG: - tag = parser.getTag(); - if (tag.getDataType() == ExifTag.TYPE_UNDEFINED) { - parser.readFullTagValue(tag); - } - exifData.getIfdData(tag.getIfd()).setTag(tag); - break; - case ExifParser.EVENT_COMPRESSED_IMAGE: - byte buf[] = new byte[parser.getCompressedImageSize()]; - if (buf.length == parser.read(buf)) { - exifData.setCompressedThumbnail(buf); - } else { - Log.w(TAG, "Failed to read the compressed thumbnail"); - } - break; - case ExifParser.EVENT_UNCOMPRESSED_STRIP: - buf = new byte[parser.getStripSize()]; - if (buf.length == parser.read(buf)) { - exifData.setStripBytes(parser.getStripIndex(), buf); - } else { - Log.w(TAG, "Failed to read the strip bytes"); - } - break; - } - event = parser.next(); - } - return exifData; - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/exif/ExifTag.java b/QKSMS/src/main/java/com/moez/QKSMS/exif/ExifTag.java deleted file mode 100644 index ee4541162..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/exif/ExifTag.java +++ /dev/null @@ -1,996 +0,0 @@ -/* - * Copyright (C) 2012 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.moez.QKSMS.exif; - -import java.nio.charset.Charset; -import java.text.SimpleDateFormat; -import java.util.Arrays; -import java.util.Date; - -/** - * This class stores information of an EXIF tag. For more information about - * defined EXIF tags, please read the Jeita EXIF 2.2 standard. Tags should be - * instantiated using {@link ExifInterface#buildTag}. - * - * @see ExifInterface - */ -public class ExifTag { - /** - * The BYTE type in the EXIF standard. An 8-bit unsigned integer. - */ - public static final short TYPE_UNSIGNED_BYTE = 1; - /** - * The ASCII type in the EXIF standard. An 8-bit byte containing one 7-bit - * ASCII code. The final byte is terminated with NULL. - */ - public static final short TYPE_ASCII = 2; - /** - * The SHORT type in the EXIF standard. A 16-bit (2-byte) unsigned integer - */ - public static final short TYPE_UNSIGNED_SHORT = 3; - /** - * The LONG type in the EXIF standard. A 32-bit (4-byte) unsigned integer - */ - public static final short TYPE_UNSIGNED_LONG = 4; - /** - * The RATIONAL type of EXIF standard. It consists of two LONGs. The first - * one is the numerator and the second one expresses the denominator. - */ - public static final short TYPE_UNSIGNED_RATIONAL = 5; - /** - * The UNDEFINED type in the EXIF standard. An 8-bit byte that can take any - * value depending on the field definition. - */ - public static final short TYPE_UNDEFINED = 7; - /** - * The SLONG type in the EXIF standard. A 32-bit (4-byte) signed integer - * (2's complement notation). - */ - public static final short TYPE_LONG = 9; - /** - * The SRATIONAL type of EXIF standard. It consists of two SLONGs. The first - * one is the numerator and the second one is the denominator. - */ - public static final short TYPE_RATIONAL = 10; - - private static Charset US_ASCII = Charset.forName("US-ASCII"); - private static final int TYPE_TO_SIZE_MAP[] = new int[11]; - private static final int UNSIGNED_SHORT_MAX = 65535; - private static final long UNSIGNED_LONG_MAX = 4294967295L; - private static final long LONG_MAX = Integer.MAX_VALUE; - private static final long LONG_MIN = Integer.MIN_VALUE; - - static { - TYPE_TO_SIZE_MAP[TYPE_UNSIGNED_BYTE] = 1; - TYPE_TO_SIZE_MAP[TYPE_ASCII] = 1; - TYPE_TO_SIZE_MAP[TYPE_UNSIGNED_SHORT] = 2; - TYPE_TO_SIZE_MAP[TYPE_UNSIGNED_LONG] = 4; - TYPE_TO_SIZE_MAP[TYPE_UNSIGNED_RATIONAL] = 8; - TYPE_TO_SIZE_MAP[TYPE_UNDEFINED] = 1; - TYPE_TO_SIZE_MAP[TYPE_LONG] = 4; - TYPE_TO_SIZE_MAP[TYPE_RATIONAL] = 8; - } - - static final int SIZE_UNDEFINED = 0; - - // Exif TagId - private final short mTagId; - // Exif Tag Type - private final short mDataType; - // If tag has defined count - private boolean mHasDefinedDefaultComponentCount; - // Actual data count in tag (should be number of elements in value array) - private int mComponentCountActual; - // The ifd that this tag should be put in - private int mIfd; - // The value (array of elements of type Tag Type) - private Object mValue; - // Value offset in exif header. - private int mOffset; - - private static final SimpleDateFormat TIME_FORMAT = new SimpleDateFormat("yyyy:MM:dd kk:mm:ss"); - - /** - * Returns true if the given IFD is a valid IFD. - */ - public static boolean isValidIfd(int ifdId) { - return ifdId == IfdId.TYPE_IFD_0 || ifdId == IfdId.TYPE_IFD_1 - || ifdId == IfdId.TYPE_IFD_EXIF || ifdId == IfdId.TYPE_IFD_INTEROPERABILITY - || ifdId == IfdId.TYPE_IFD_GPS; - } - - /** - * Returns true if a given type is a valid tag type. - */ - public static boolean isValidType(short type) { - return type == TYPE_UNSIGNED_BYTE || type == TYPE_ASCII || - type == TYPE_UNSIGNED_SHORT || type == TYPE_UNSIGNED_LONG || - type == TYPE_UNSIGNED_RATIONAL || type == TYPE_UNDEFINED || - type == TYPE_LONG || type == TYPE_RATIONAL; - } - - // Use builtTag in ExifInterface instead of constructor. - ExifTag(short tagId, short type, int componentCount, int ifd, - boolean hasDefinedComponentCount) { - mTagId = tagId; - mDataType = type; - mComponentCountActual = componentCount; - mHasDefinedDefaultComponentCount = hasDefinedComponentCount; - mIfd = ifd; - mValue = null; - } - - /** - * Gets the element size of the given data type in bytes. - * - * @see #TYPE_ASCII - * @see #TYPE_LONG - * @see #TYPE_RATIONAL - * @see #TYPE_UNDEFINED - * @see #TYPE_UNSIGNED_BYTE - * @see #TYPE_UNSIGNED_LONG - * @see #TYPE_UNSIGNED_RATIONAL - * @see #TYPE_UNSIGNED_SHORT - */ - public static int getElementSize(short type) { - return TYPE_TO_SIZE_MAP[type]; - } - - /** - * Returns the ID of the IFD this tag belongs to. - * - * @see IfdId#TYPE_IFD_0 - * @see IfdId#TYPE_IFD_1 - * @see IfdId#TYPE_IFD_EXIF - * @see IfdId#TYPE_IFD_GPS - * @see IfdId#TYPE_IFD_INTEROPERABILITY - */ - public int getIfd() { - return mIfd; - } - - protected void setIfd(int ifdId) { - mIfd = ifdId; - } - - /** - * Gets the TID of this tag. - */ - public short getTagId() { - return mTagId; - } - - /** - * Gets the data type of this tag - * - * @see #TYPE_ASCII - * @see #TYPE_LONG - * @see #TYPE_RATIONAL - * @see #TYPE_UNDEFINED - * @see #TYPE_UNSIGNED_BYTE - * @see #TYPE_UNSIGNED_LONG - * @see #TYPE_UNSIGNED_RATIONAL - * @see #TYPE_UNSIGNED_SHORT - */ - public short getDataType() { - return mDataType; - } - - /** - * Gets the total data size in bytes of the value of this tag. - */ - public int getDataSize() { - return getComponentCount() * getElementSize(getDataType()); - } - - /** - * Gets the component count of this tag. - */ - - // TODO: fix integer overflows with this - public int getComponentCount() { - return mComponentCountActual; - } - - /** - * Sets the component count of this tag. Call this function before - * setValue() if the length of value does not match the component count. - */ - protected void forceSetComponentCount(int count) { - mComponentCountActual = count; - } - - /** - * Returns true if this ExifTag contains value; otherwise, this tag will - * contain an offset value that is determined when the tag is written. - */ - public boolean hasValue() { - return mValue != null; - } - - /** - * Sets integer values into this tag. This method should be used for tags of - * type {@link #TYPE_UNSIGNED_SHORT}. This method will fail if: - * <ul> - * <li>The component type of this tag is not {@link #TYPE_UNSIGNED_SHORT}, - * {@link #TYPE_UNSIGNED_LONG}, or {@link #TYPE_LONG}.</li> - * <li>The value overflows.</li> - * <li>The value.length does NOT match the component count in the definition - * for this tag.</li> - * </ul> - */ - public boolean setValue(int[] value) { - if (checkBadComponentCount(value.length)) { - return false; - } - if (mDataType != TYPE_UNSIGNED_SHORT && mDataType != TYPE_LONG && - mDataType != TYPE_UNSIGNED_LONG) { - return false; - } - if (mDataType == TYPE_UNSIGNED_SHORT && checkOverflowForUnsignedShort(value)) { - return false; - } else if (mDataType == TYPE_UNSIGNED_LONG && checkOverflowForUnsignedLong(value)) { - return false; - } - - long[] data = new long[value.length]; - for (int i = 0; i < value.length; i++) { - data[i] = value[i]; - } - mValue = data; - mComponentCountActual = value.length; - return true; - } - - /** - * Sets integer value into this tag. This method should be used for tags of - * type {@link #TYPE_UNSIGNED_SHORT}, or {@link #TYPE_LONG}. This method - * will fail if: - * <ul> - * <li>The component type of this tag is not {@link #TYPE_UNSIGNED_SHORT}, - * {@link #TYPE_UNSIGNED_LONG}, or {@link #TYPE_LONG}.</li> - * <li>The value overflows.</li> - * <li>The component count in the definition of this tag is not 1.</li> - * </ul> - */ - public boolean setValue(int value) { - return setValue(new int[] { - value - }); - } - - /** - * Sets long values into this tag. This method should be used for tags of - * type {@link #TYPE_UNSIGNED_LONG}. This method will fail if: - * <ul> - * <li>The component type of this tag is not {@link #TYPE_UNSIGNED_LONG}.</li> - * <li>The value overflows.</li> - * <li>The value.length does NOT match the component count in the definition - * for this tag.</li> - * </ul> - */ - public boolean setValue(long[] value) { - if (checkBadComponentCount(value.length) || mDataType != TYPE_UNSIGNED_LONG) { - return false; - } - if (checkOverflowForUnsignedLong(value)) { - return false; - } - mValue = value; - mComponentCountActual = value.length; - return true; - } - - /** - * Sets long values into this tag. This method should be used for tags of - * type {@link #TYPE_UNSIGNED_LONG}. This method will fail if: - * <ul> - * <li>The component type of this tag is not {@link #TYPE_UNSIGNED_LONG}.</li> - * <li>The value overflows.</li> - * <li>The component count in the definition for this tag is not 1.</li> - * </ul> - */ - public boolean setValue(long value) { - return setValue(new long[] { - value - }); - } - - /** - * Sets a string value into this tag. This method should be used for tags of - * type {@link #TYPE_ASCII}. The string is converted to an ASCII string. - * Characters that cannot be converted are replaced with '?'. The length of - * the string must be equal to either (component count -1) or (component - * count). The final byte will be set to the string null terminator '\0', - * overwriting the last character in the string if the value.length is equal - * to the component count. This method will fail if: - * <ul> - * <li>The data type is not {@link #TYPE_ASCII} or {@link #TYPE_UNDEFINED}.</li> - * <li>The length of the string is not equal to (component count -1) or - * (component count) in the definition for this tag.</li> - * </ul> - */ - public boolean setValue(String value) { - if (mDataType != TYPE_ASCII && mDataType != TYPE_UNDEFINED) { - return false; - } - - byte[] buf = value.getBytes(US_ASCII); - byte[] finalBuf = buf; - if (buf.length > 0) { - finalBuf = (buf[buf.length - 1] == 0 || mDataType == TYPE_UNDEFINED) ? buf : Arrays - .copyOf(buf, buf.length + 1); - } else if (mDataType == TYPE_ASCII && mComponentCountActual == 1) { - finalBuf = new byte[] { 0 }; - } - int count = finalBuf.length; - if (checkBadComponentCount(count)) { - return false; - } - mComponentCountActual = count; - mValue = finalBuf; - return true; - } - - /** - * Sets Rational values into this tag. This method should be used for tags - * of type {@link #TYPE_UNSIGNED_RATIONAL}, or {@link #TYPE_RATIONAL}. This - * method will fail if: - * <ul> - * <li>The component type of this tag is not {@link #TYPE_UNSIGNED_RATIONAL} - * or {@link #TYPE_RATIONAL}.</li> - * <li>The value overflows.</li> - * <li>The value.length does NOT match the component count in the definition - * for this tag.</li> - * </ul> - * - * @see Rational - */ - public boolean setValue(Rational[] value) { - if (checkBadComponentCount(value.length)) { - return false; - } - if (mDataType != TYPE_UNSIGNED_RATIONAL && mDataType != TYPE_RATIONAL) { - return false; - } - if (mDataType == TYPE_UNSIGNED_RATIONAL && checkOverflowForUnsignedRational(value)) { - return false; - } else if (mDataType == TYPE_RATIONAL && checkOverflowForRational(value)) { - return false; - } - - mValue = value; - mComponentCountActual = value.length; - return true; - } - - /** - * Sets a Rational value into this tag. This method should be used for tags - * of type {@link #TYPE_UNSIGNED_RATIONAL}, or {@link #TYPE_RATIONAL}. This - * method will fail if: - * <ul> - * <li>The component type of this tag is not {@link #TYPE_UNSIGNED_RATIONAL} - * or {@link #TYPE_RATIONAL}.</li> - * <li>The value overflows.</li> - * <li>The component count in the definition for this tag is not 1.</li> - * </ul> - * - * @see Rational - */ - public boolean setValue(Rational value) { - return setValue(new Rational[] { - value - }); - } - - /** - * Sets byte values into this tag. This method should be used for tags of - * type {@link #TYPE_UNSIGNED_BYTE} or {@link #TYPE_UNDEFINED}. This method - * will fail if: - * <ul> - * <li>The component type of this tag is not {@link #TYPE_UNSIGNED_BYTE} or - * {@link #TYPE_UNDEFINED} .</li> - * <li>The length does NOT match the component count in the definition for - * this tag.</li> - * </ul> - */ - public boolean setValue(byte[] value, int offset, int length) { - if (checkBadComponentCount(length)) { - return false; - } - if (mDataType != TYPE_UNSIGNED_BYTE && mDataType != TYPE_UNDEFINED) { - return false; - } - mValue = new byte[length]; - System.arraycopy(value, offset, mValue, 0, length); - mComponentCountActual = length; - return true; - } - - /** - * Equivalent to setValue(value, 0, value.length). - */ - public boolean setValue(byte[] value) { - return setValue(value, 0, value.length); - } - - /** - * Sets byte value into this tag. This method should be used for tags of - * type {@link #TYPE_UNSIGNED_BYTE} or {@link #TYPE_UNDEFINED}. This method - * will fail if: - * <ul> - * <li>The component type of this tag is not {@link #TYPE_UNSIGNED_BYTE} or - * {@link #TYPE_UNDEFINED} .</li> - * <li>The component count in the definition for this tag is not 1.</li> - * </ul> - */ - public boolean setValue(byte value) { - return setValue(new byte[] { - value - }); - } - - /** - * Sets the value for this tag using an appropriate setValue method for the - * given object. This method will fail if: - * <ul> - * <li>The corresponding setValue method for the class of the object passed - * in would fail.</li> - * <li>There is no obvious way to cast the object passed in into an EXIF tag - * type.</li> - * </ul> - */ - public boolean setValue(Object obj) { - if (obj == null) { - return false; - } else if (obj instanceof Short) { - return setValue(((Short) obj).shortValue() & 0x0ffff); - } else if (obj instanceof String) { - return setValue((String) obj); - } else if (obj instanceof int[]) { - return setValue((int[]) obj); - } else if (obj instanceof long[]) { - return setValue((long[]) obj); - } else if (obj instanceof Rational) { - return setValue((Rational) obj); - } else if (obj instanceof Rational[]) { - return setValue((Rational[]) obj); - } else if (obj instanceof byte[]) { - return setValue((byte[]) obj); - } else if (obj instanceof Integer) { - return setValue(((Integer) obj).intValue()); - } else if (obj instanceof Long) { - return setValue(((Long) obj).longValue()); - } else if (obj instanceof Byte) { - return setValue(((Byte) obj).byteValue()); - } else if (obj instanceof Short[]) { - // Nulls in this array are treated as zeroes. - Short[] arr = (Short[]) obj; - int[] fin = new int[arr.length]; - for (int i = 0; i < arr.length; i++) { - fin[i] = (arr[i] == null) ? 0 : arr[i].shortValue() & 0x0ffff; - } - return setValue(fin); - } else if (obj instanceof Integer[]) { - // Nulls in this array are treated as zeroes. - Integer[] arr = (Integer[]) obj; - int[] fin = new int[arr.length]; - for (int i = 0; i < arr.length; i++) { - fin[i] = (arr[i] == null) ? 0 : arr[i].intValue(); - } - return setValue(fin); - } else if (obj instanceof Long[]) { - // Nulls in this array are treated as zeroes. - Long[] arr = (Long[]) obj; - long[] fin = new long[arr.length]; - for (int i = 0; i < arr.length; i++) { - fin[i] = (arr[i] == null) ? 0 : arr[i].longValue(); - } - return setValue(fin); - } else if (obj instanceof Byte[]) { - // Nulls in this array are treated as zeroes. - Byte[] arr = (Byte[]) obj; - byte[] fin = new byte[arr.length]; - for (int i = 0; i < arr.length; i++) { - fin[i] = (arr[i] == null) ? 0 : arr[i].byteValue(); - } - return setValue(fin); - } else { - return false; - } - } - - /** - * Sets a timestamp to this tag. The method converts the timestamp with the - * format of "yyyy:MM:dd kk:mm:ss" and calls {@link #setValue(String)}. This - * method will fail if the data type is not {@link #TYPE_ASCII} or the - * component count of this tag is not 20 or undefined. - * - * @param time the number of milliseconds since Jan. 1, 1970 GMT - * @return true on success - */ - public boolean setTimeValue(long time) { - // synchronized on TIME_FORMAT as SimpleDateFormat is not thread safe - synchronized (TIME_FORMAT) { - return setValue(TIME_FORMAT.format(new Date(time))); - } - } - - /** - * Gets the value as a String. This method should be used for tags of type - * {@link #TYPE_ASCII}. - * - * @return the value as a String, or null if the tag's value does not exist - * or cannot be converted to a String. - */ - public String getValueAsString() { - if (mValue == null) { - return null; - } else if (mValue instanceof String) { - return (String) mValue; - } else if (mValue instanceof byte[]) { - return new String((byte[]) mValue, US_ASCII); - } - return null; - } - - /** - * Gets the value as a String. This method should be used for tags of type - * {@link #TYPE_ASCII}. - * - * @param defaultValue the String to return if the tag's value does not - * exist or cannot be converted to a String. - * @return the tag's value as a String, or the defaultValue. - */ - public String getValueAsString(String defaultValue) { - String s = getValueAsString(); - if (s == null) { - return defaultValue; - } - return s; - } - - /** - * Gets the value as a byte array. This method should be used for tags of - * type {@link #TYPE_UNDEFINED} or {@link #TYPE_UNSIGNED_BYTE}. - * - * @return the value as a byte array, or null if the tag's value does not - * exist or cannot be converted to a byte array. - */ - public byte[] getValueAsBytes() { - if (mValue instanceof byte[]) { - return (byte[]) mValue; - } - return null; - } - - /** - * Gets the value as a byte. If there are more than 1 bytes in this value, - * gets the first byte. This method should be used for tags of type - * {@link #TYPE_UNDEFINED} or {@link #TYPE_UNSIGNED_BYTE}. - * - * @param defaultValue the byte to return if tag's value does not exist or - * cannot be converted to a byte. - * @return the tag's value as a byte, or the defaultValue. - */ - public byte getValueAsByte(byte defaultValue) { - byte[] b = getValueAsBytes(); - if (b == null || b.length < 1) { - return defaultValue; - } - return b[0]; - } - - /** - * Gets the value as an array of Rationals. This method should be used for - * tags of type {@link #TYPE_RATIONAL} or {@link #TYPE_UNSIGNED_RATIONAL}. - * - * @return the value as as an array of Rationals, or null if the tag's value - * does not exist or cannot be converted to an array of Rationals. - */ - public Rational[] getValueAsRationals() { - if (mValue instanceof Rational[]) { - return (Rational[]) mValue; - } - return null; - } - - /** - * Gets the value as a Rational. If there are more than 1 Rationals in this - * value, gets the first one. This method should be used for tags of type - * {@link #TYPE_RATIONAL} or {@link #TYPE_UNSIGNED_RATIONAL}. - * - * @param defaultValue the Rational to return if tag's value does not exist - * or cannot be converted to a Rational. - * @return the tag's value as a Rational, or the defaultValue. - */ - public Rational getValueAsRational(Rational defaultValue) { - Rational[] r = getValueAsRationals(); - if (r == null || r.length < 1) { - return defaultValue; - } - return r[0]; - } - - /** - * Gets the value as a Rational. If there are more than 1 Rationals in this - * value, gets the first one. This method should be used for tags of type - * {@link #TYPE_RATIONAL} or {@link #TYPE_UNSIGNED_RATIONAL}. - * - * @param defaultValue the numerator of the Rational to return if tag's - * value does not exist or cannot be converted to a Rational (the - * denominator will be 1). - * @return the tag's value as a Rational, or the defaultValue. - */ - public Rational getValueAsRational(long defaultValue) { - Rational defaultVal = new Rational(defaultValue, 1); - return getValueAsRational(defaultVal); - } - - /** - * Gets the value as an array of ints. This method should be used for tags - * of type {@link #TYPE_UNSIGNED_SHORT}, {@link #TYPE_UNSIGNED_LONG}. - * - * @return the value as as an array of ints, or null if the tag's value does - * not exist or cannot be converted to an array of ints. - */ - public int[] getValueAsInts() { - if (mValue == null) { - return null; - } else if (mValue instanceof long[]) { - long[] val = (long[]) mValue; - int[] arr = new int[val.length]; - for (int i = 0; i < val.length; i++) { - arr[i] = (int) val[i]; // Truncates - } - return arr; - } - return null; - } - - /** - * Gets the value as an int. If there are more than 1 ints in this value, - * gets the first one. This method should be used for tags of type - * {@link #TYPE_UNSIGNED_SHORT}, {@link #TYPE_UNSIGNED_LONG}. - * - * @param defaultValue the int to return if tag's value does not exist or - * cannot be converted to an int. - * @return the tag's value as a int, or the defaultValue. - */ - public int getValueAsInt(int defaultValue) { - int[] i = getValueAsInts(); - if (i == null || i.length < 1) { - return defaultValue; - } - return i[0]; - } - - /** - * Gets the value as an array of longs. This method should be used for tags - * of type {@link #TYPE_UNSIGNED_LONG}. - * - * @return the value as as an array of longs, or null if the tag's value - * does not exist or cannot be converted to an array of longs. - */ - public long[] getValueAsLongs() { - if (mValue instanceof long[]) { - return (long[]) mValue; - } - return null; - } - - /** - * Gets the value or null if none exists. If there are more than 1 longs in - * this value, gets the first one. This method should be used for tags of - * type {@link #TYPE_UNSIGNED_LONG}. - * - * @param defaultValue the long to return if tag's value does not exist or - * cannot be converted to a long. - * @return the tag's value as a long, or the defaultValue. - */ - public long getValueAsLong(long defaultValue) { - long[] l = getValueAsLongs(); - if (l == null || l.length < 1) { - return defaultValue; - } - return l[0]; - } - - /** - * Gets the tag's value or null if none exists. - */ - public Object getValue() { - return mValue; - } - - /** - * Gets a long representation of the value. - * - * @param defaultValue value to return if there is no value or value is a - * rational with a denominator of 0. - * @return the tag's value as a long, or defaultValue if no representation - * exists. - */ - public long forceGetValueAsLong(long defaultValue) { - long[] l = getValueAsLongs(); - if (l != null && l.length >= 1) { - return l[0]; - } - byte[] b = getValueAsBytes(); - if (b != null && b.length >= 1) { - return b[0]; - } - Rational[] r = getValueAsRationals(); - if (r != null && r.length >= 1 && r[0].getDenominator() != 0) { - return (long) r[0].toDouble(); - } - return defaultValue; - } - - /** - * Gets a string representation of the value. - */ - public String forceGetValueAsString() { - if (mValue == null) { - return ""; - } else if (mValue instanceof byte[]) { - if (mDataType == TYPE_ASCII) { - return new String((byte[]) mValue, US_ASCII); - } else { - return Arrays.toString((byte[]) mValue); - } - } else if (mValue instanceof long[]) { - if (((long[]) mValue).length == 1) { - return String.valueOf(((long[]) mValue)[0]); - } else { - return Arrays.toString((long[]) mValue); - } - } else if (mValue instanceof Object[]) { - if (((Object[]) mValue).length == 1) { - Object val = ((Object[]) mValue)[0]; - if (val == null) { - return ""; - } else { - return val.toString(); - } - } else { - return Arrays.toString((Object[]) mValue); - } - } else { - return mValue.toString(); - } - } - - /** - * Gets the value for type {@link #TYPE_ASCII}, {@link #TYPE_LONG}, - * {@link #TYPE_UNDEFINED}, {@link #TYPE_UNSIGNED_BYTE}, - * {@link #TYPE_UNSIGNED_LONG}, or {@link #TYPE_UNSIGNED_SHORT}. For - * {@link #TYPE_RATIONAL} or {@link #TYPE_UNSIGNED_RATIONAL}, call - * {@link #getRational(int)} instead. - * - * @exception IllegalArgumentException if the data type is - * {@link #TYPE_RATIONAL} or {@link #TYPE_UNSIGNED_RATIONAL}. - */ - protected long getValueAt(int index) { - if (mValue instanceof long[]) { - return ((long[]) mValue)[index]; - } else if (mValue instanceof byte[]) { - return ((byte[]) mValue)[index]; - } - throw new IllegalArgumentException("Cannot get integer value from " - + convertTypeToString(mDataType)); - } - - /** - * Gets the {@link #TYPE_ASCII} data. - * - * @exception IllegalArgumentException If the type is NOT - * {@link #TYPE_ASCII}. - */ - protected String getString() { - if (mDataType != TYPE_ASCII) { - throw new IllegalArgumentException("Cannot get ASCII value from " - + convertTypeToString(mDataType)); - } - return new String((byte[]) mValue, US_ASCII); - } - - /* - * Get the converted ascii byte. Used by ExifOutputStream. - */ - protected byte[] getStringByte() { - return (byte[]) mValue; - } - - /** - * Gets the {@link #TYPE_RATIONAL} or {@link #TYPE_UNSIGNED_RATIONAL} data. - * - * @exception IllegalArgumentException If the type is NOT - * {@link #TYPE_RATIONAL} or {@link #TYPE_UNSIGNED_RATIONAL}. - */ - protected Rational getRational(int index) { - if ((mDataType != TYPE_RATIONAL) && (mDataType != TYPE_UNSIGNED_RATIONAL)) { - throw new IllegalArgumentException("Cannot get RATIONAL value from " - + convertTypeToString(mDataType)); - } - return ((Rational[]) mValue)[index]; - } - - /** - * Equivalent to getBytes(buffer, 0, buffer.length). - */ - protected void getBytes(byte[] buf) { - getBytes(buf, 0, buf.length); - } - - /** - * Gets the {@link #TYPE_UNDEFINED} or {@link #TYPE_UNSIGNED_BYTE} data. - * - * @param buf the byte array in which to store the bytes read. - * @param offset the initial position in buffer to store the bytes. - * @param length the maximum number of bytes to store in buffer. If length > - * component count, only the valid bytes will be stored. - * @exception IllegalArgumentException If the type is NOT - * {@link #TYPE_UNDEFINED} or {@link #TYPE_UNSIGNED_BYTE}. - */ - protected void getBytes(byte[] buf, int offset, int length) { - if ((mDataType != TYPE_UNDEFINED) && (mDataType != TYPE_UNSIGNED_BYTE)) { - throw new IllegalArgumentException("Cannot get BYTE value from " - + convertTypeToString(mDataType)); - } - System.arraycopy(mValue, 0, buf, offset, - (length > mComponentCountActual) ? mComponentCountActual : length); - } - - /** - * Gets the offset of this tag. This is only valid if this data size > 4 and - * contains an offset to the location of the actual value. - */ - protected int getOffset() { - return mOffset; - } - - /** - * Sets the offset of this tag. - */ - protected void setOffset(int offset) { - mOffset = offset; - } - - protected void setHasDefinedCount(boolean d) { - mHasDefinedDefaultComponentCount = d; - } - - protected boolean hasDefinedCount() { - return mHasDefinedDefaultComponentCount; - } - - private boolean checkBadComponentCount(int count) { - return mHasDefinedDefaultComponentCount && (mComponentCountActual != count); - } - - private static String convertTypeToString(short type) { - switch (type) { - case TYPE_UNSIGNED_BYTE: - return "UNSIGNED_BYTE"; - case TYPE_ASCII: - return "ASCII"; - case TYPE_UNSIGNED_SHORT: - return "UNSIGNED_SHORT"; - case TYPE_UNSIGNED_LONG: - return "UNSIGNED_LONG"; - case TYPE_UNSIGNED_RATIONAL: - return "UNSIGNED_RATIONAL"; - case TYPE_UNDEFINED: - return "UNDEFINED"; - case TYPE_LONG: - return "LONG"; - case TYPE_RATIONAL: - return "RATIONAL"; - default: - return ""; - } - } - - private boolean checkOverflowForUnsignedShort(int[] value) { - for (int v : value) { - if (v > UNSIGNED_SHORT_MAX || v < 0) { - return true; - } - } - return false; - } - - private boolean checkOverflowForUnsignedLong(long[] value) { - for (long v : value) { - if (v < 0 || v > UNSIGNED_LONG_MAX) { - return true; - } - } - return false; - } - - private boolean checkOverflowForUnsignedLong(int[] value) { - for (int v : value) { - if (v < 0) { - return true; - } - } - return false; - } - - private boolean checkOverflowForUnsignedRational(Rational[] value) { - for (Rational v : value) { - if (v.getNumerator() < 0 || v.getDenominator() < 0 - || v.getNumerator() > UNSIGNED_LONG_MAX - || v.getDenominator() > UNSIGNED_LONG_MAX) { - return true; - } - } - return false; - } - - private boolean checkOverflowForRational(Rational[] value) { - for (Rational v : value) { - if (v.getNumerator() < LONG_MIN || v.getDenominator() < LONG_MIN - || v.getNumerator() > LONG_MAX - || v.getDenominator() > LONG_MAX) { - return true; - } - } - return false; - } - - @Override - public boolean equals(Object obj) { - if (obj == null) { - return false; - } - if (obj instanceof ExifTag) { - ExifTag tag = (ExifTag) obj; - if (tag.mTagId != this.mTagId - || tag.mComponentCountActual != this.mComponentCountActual - || tag.mDataType != this.mDataType) { - return false; - } - if (mValue != null) { - if (tag.mValue == null) { - return false; - } else if (mValue instanceof long[]) { - return tag.mValue instanceof long[] && Arrays.equals((long[]) mValue, (long[]) tag.mValue); - } else if (mValue instanceof Rational[]) { - return tag.mValue instanceof Rational[] && Arrays.equals((Rational[]) mValue, (Rational[]) tag.mValue); - } else if (mValue instanceof byte[]) { - return tag.mValue instanceof byte[] && Arrays.equals((byte[]) mValue, (byte[]) tag.mValue); - } else { - return mValue.equals(tag.mValue); - } - } else { - return tag.mValue == null; - } - } - return false; - } - - @Override - public String toString() { - return String.format("tag id: %04X\n", mTagId) + "ifd id: " + mIfd + "\ntype: " - + convertTypeToString(mDataType) + "\ncount: " + mComponentCountActual - + "\noffset: " + mOffset + "\nvalue: " + forceGetValueAsString() + "\n"; - } - -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/exif/IfdData.java b/QKSMS/src/main/java/com/moez/QKSMS/exif/IfdData.java deleted file mode 100644 index bb94ecec1..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/exif/IfdData.java +++ /dev/null @@ -1,152 +0,0 @@ -/* - * Copyright (C) 2012 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.moez.QKSMS.exif; - -import java.util.HashMap; -import java.util.Map; - -/** - * This class stores all the tags in an IFD. - * - * @see ExifData - * @see ExifTag - */ -class IfdData { - - private final int mIfdId; - private final Map<Short, ExifTag> mExifTags = new HashMap<>(); - private int mOffsetToNextIfd = 0; - private static final int[] sIfds = { - IfdId.TYPE_IFD_0, IfdId.TYPE_IFD_1, IfdId.TYPE_IFD_EXIF, - IfdId.TYPE_IFD_INTEROPERABILITY, IfdId.TYPE_IFD_GPS - }; - /** - * Creates an IfdData with given IFD ID. - * - * @see IfdId#TYPE_IFD_0 - * @see IfdId#TYPE_IFD_1 - * @see IfdId#TYPE_IFD_EXIF - * @see IfdId#TYPE_IFD_GPS - * @see IfdId#TYPE_IFD_INTEROPERABILITY - */ - IfdData(int ifdId) { - mIfdId = ifdId; - } - - static protected int[] getIfds() { - return sIfds; - } - - /** - * Get a array the contains all {@link ExifTag} in this IFD. - */ - protected ExifTag[] getAllTags() { - return mExifTags.values().toArray(new ExifTag[mExifTags.size()]); - } - - /** - * Gets the ID of this IFD. - * - * @see IfdId#TYPE_IFD_0 - * @see IfdId#TYPE_IFD_1 - * @see IfdId#TYPE_IFD_EXIF - * @see IfdId#TYPE_IFD_GPS - * @see IfdId#TYPE_IFD_INTEROPERABILITY - */ - protected int getId() { - return mIfdId; - } - - /** - * Gets the {@link ExifTag} with given tag id. Return null if there is no - * such tag. - */ - protected ExifTag getTag(short tagId) { - return mExifTags.get(tagId); - } - - /** - * Adds or replaces a {@link ExifTag}. - */ - protected ExifTag setTag(ExifTag tag) { - tag.setIfd(mIfdId); - return mExifTags.put(tag.getTagId(), tag); - } - - protected boolean checkCollision(short tagId) { - return mExifTags.get(tagId) != null; - } - - /** - * Removes the tag of the given ID - */ - protected void removeTag(short tagId) { - mExifTags.remove(tagId); - } - - /** - * Gets the tags count in the IFD. - */ - protected int getTagCount() { - return mExifTags.size(); - } - - /** - * Sets the offset of next IFD. - */ - protected void setOffsetToNextIfd(int offset) { - mOffsetToNextIfd = offset; - } - - /** - * Gets the offset of next IFD. - */ - protected int getOffsetToNextIfd() { - return mOffsetToNextIfd; - } - - /** - * Returns true if all tags in this two IFDs are equal. Note that tags of - * IFDs offset or thumbnail offset will be ignored. - */ - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (obj instanceof IfdData) { - IfdData data = (IfdData) obj; - if (data.getId() == mIfdId && data.getTagCount() == getTagCount()) { - ExifTag[] tags = data.getAllTags(); - for (ExifTag tag : tags) { - if (ExifInterface.isOffsetTag(tag.getTagId())) { - continue; - } - ExifTag tag2 = mExifTags.get(tag.getTagId()); - if (!tag.equals(tag2)) { - return false; - } - } - return true; - } - } - return false; - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/exif/IfdId.java b/QKSMS/src/main/java/com/moez/QKSMS/exif/IfdId.java deleted file mode 100644 index e4ade25f1..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/exif/IfdId.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (C) 2012 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.moez.QKSMS.exif; - -/** - * The constants of the IFD ID defined in EXIF spec. - */ -public interface IfdId { - public static final int TYPE_IFD_0 = 0; - public static final int TYPE_IFD_1 = 1; - public static final int TYPE_IFD_EXIF = 2; - public static final int TYPE_IFD_INTEROPERABILITY = 3; - public static final int TYPE_IFD_GPS = 4; - /* This is used in ExifData to allocate enough IfdData */ - static final int TYPE_IFD_COUNT = 5; - -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/exif/JpegHeader.java b/QKSMS/src/main/java/com/moez/QKSMS/exif/JpegHeader.java deleted file mode 100644 index ad2e53aaa..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/exif/JpegHeader.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (C) 2012 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.moez.QKSMS.exif; - -class JpegHeader { - public static final short SOI = (short) 0xFFD8; - public static final short APP1 = (short) 0xFFE1; - public static final short APP0 = (short) 0xFFE0; - public static final short EOI = (short) 0xFFD9; - - /** - * SOF (start of frame). All value between SOF0 and SOF15 is SOF marker except for DHT, JPG, - * and DAC marker. - */ - public static final short SOF0 = (short) 0xFFC0; - public static final short SOF15 = (short) 0xFFCF; - public static final short DHT = (short) 0xFFC4; - public static final short JPG = (short) 0xFFC8; - public static final short DAC = (short) 0xFFCC; - - public static final boolean isSofMarker(short marker) { - return marker >= SOF0 && marker <= SOF15 && marker != DHT && marker != JPG - && marker != DAC; - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/exif/OrderedDataOutputStream.java b/QKSMS/src/main/java/com/moez/QKSMS/exif/OrderedDataOutputStream.java deleted file mode 100644 index bd00353b6..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/exif/OrderedDataOutputStream.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (C) 2012 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.moez.QKSMS.exif; - -import java.io.FilterOutputStream; -import java.io.IOException; -import java.io.OutputStream; -import java.nio.ByteBuffer; -import java.nio.ByteOrder; - -class OrderedDataOutputStream extends FilterOutputStream { - private final ByteBuffer mByteBuffer = ByteBuffer.allocate(4); - - public OrderedDataOutputStream(OutputStream out) { - super(out); - } - - public OrderedDataOutputStream setByteOrder(ByteOrder order) { - mByteBuffer.order(order); - return this; - } - - public OrderedDataOutputStream writeShort(short value) throws IOException { - mByteBuffer.rewind(); - mByteBuffer.putShort(value); - out.write(mByteBuffer.array(), 0, 2); - return this; - } - - public OrderedDataOutputStream writeInt(int value) throws IOException { - mByteBuffer.rewind(); - mByteBuffer.putInt(value); - out.write(mByteBuffer.array()); - return this; - } - - public OrderedDataOutputStream writeRational(Rational rational) throws IOException { - writeInt((int) rational.getNumerator()); - writeInt((int) rational.getDenominator()); - return this; - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/exif/Rational.java b/QKSMS/src/main/java/com/moez/QKSMS/exif/Rational.java deleted file mode 100644 index 5d0494036..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/exif/Rational.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright (C) 2012 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.moez.QKSMS.exif; - -/** - * The rational data type of EXIF tag. Contains a pair of longs representing the - * numerator and denominator of a Rational number. - */ -public class Rational { - - private final long mNumerator; - private final long mDenominator; - - /** - * Create a Rational with a given numerator and denominator. - * - * @param nominator - * @param denominator - */ - public Rational(long nominator, long denominator) { - mNumerator = nominator; - mDenominator = denominator; - } - - /** - * Create a copy of a Rational. - */ - public Rational(Rational r) { - mNumerator = r.mNumerator; - mDenominator = r.mDenominator; - } - - /** - * Gets the numerator of the rational. - */ - public long getNumerator() { - return mNumerator; - } - - /** - * Gets the denominator of the rational - */ - public long getDenominator() { - return mDenominator; - } - - /** - * Gets the rational value as type double. Will cause a divide-by-zero error - * if the denominator is 0. - */ - public double toDouble() { - return mNumerator / (double) mDenominator; - } - - @Override - public boolean equals(Object obj) { - if (obj == null) { - return false; - } - if (this == obj) { - return true; - } - if (obj instanceof Rational) { - Rational data = (Rational) obj; - return mNumerator == data.mNumerator && mDenominator == data.mDenominator; - } - return false; - } - - @Override - public String toString() { - return mNumerator + "/" + mDenominator; - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/external/iab/Base64.java b/QKSMS/src/main/java/com/moez/QKSMS/external/iab/Base64.java deleted file mode 100644 index c5352f21d..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/external/iab/Base64.java +++ /dev/null @@ -1,570 +0,0 @@ -// Portions copyright 2002, Google, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package com.moez.QKSMS.external.iab; - -// This code was converted from code at http://iharder.sourceforge.net/base64/ -// Lots of extraneous features were removed. -/* The original code said: - * <p> - * I am placing this code in the Public Domain. Do with it as you will. - * This software comes with no guarantees or warranties but with - * plenty of well-wishing instead! - * Please visit - * <a href="http://iharder.net/xmlizable">http://iharder.net/xmlizable</a> - * periodically to check for updates or to contribute improvements. - * </p> - * - * @author Robert Harder - * @author rharder@usa.net - * @version 1.3 - */ - -/** - * Base64 converter class. This code is not a complete MIME encoder; - * it simply converts binary data to base64 data and back. - * - * <p>Note {@link CharBase64} is a GWT-compatible implementation of this - * class. - */ -public class Base64 { - /** Specify encoding (value is {@code true}). */ - public static final boolean ENCODE = true; - - /** Specify decoding (value is {@code false}). */ - public static final boolean DECODE = false; - - /** The equals sign (=) as a byte. */ - private static final byte EQUALS_SIGN = (byte) '='; - - /** The new line character (\n) as a byte. */ - private static final byte NEW_LINE = (byte) '\n'; - - /** - * The 64 valid Base64 values. - */ - private static final byte[] ALPHABET = - {(byte) 'A', (byte) 'B', (byte) 'C', (byte) 'D', (byte) 'E', (byte) 'F', - (byte) 'G', (byte) 'H', (byte) 'I', (byte) 'J', (byte) 'K', - (byte) 'L', (byte) 'M', (byte) 'N', (byte) 'O', (byte) 'P', - (byte) 'Q', (byte) 'R', (byte) 'S', (byte) 'T', (byte) 'U', - (byte) 'V', (byte) 'W', (byte) 'X', (byte) 'Y', (byte) 'Z', - (byte) 'a', (byte) 'b', (byte) 'c', (byte) 'd', (byte) 'e', - (byte) 'f', (byte) 'g', (byte) 'h', (byte) 'i', (byte) 'j', - (byte) 'k', (byte) 'l', (byte) 'm', (byte) 'n', (byte) 'o', - (byte) 'p', (byte) 'q', (byte) 'r', (byte) 's', (byte) 't', - (byte) 'u', (byte) 'v', (byte) 'w', (byte) 'x', (byte) 'y', - (byte) 'z', (byte) '0', (byte) '1', (byte) '2', (byte) '3', - (byte) '4', (byte) '5', (byte) '6', (byte) '7', (byte) '8', - (byte) '9', (byte) '+', (byte) '/'}; - - /** - * The 64 valid web safe Base64 values. - */ - private static final byte[] WEBSAFE_ALPHABET = - {(byte) 'A', (byte) 'B', (byte) 'C', (byte) 'D', (byte) 'E', (byte) 'F', - (byte) 'G', (byte) 'H', (byte) 'I', (byte) 'J', (byte) 'K', - (byte) 'L', (byte) 'M', (byte) 'N', (byte) 'O', (byte) 'P', - (byte) 'Q', (byte) 'R', (byte) 'S', (byte) 'T', (byte) 'U', - (byte) 'V', (byte) 'W', (byte) 'X', (byte) 'Y', (byte) 'Z', - (byte) 'a', (byte) 'b', (byte) 'c', (byte) 'd', (byte) 'e', - (byte) 'f', (byte) 'g', (byte) 'h', (byte) 'i', (byte) 'j', - (byte) 'k', (byte) 'l', (byte) 'm', (byte) 'n', (byte) 'o', - (byte) 'p', (byte) 'q', (byte) 'r', (byte) 's', (byte) 't', - (byte) 'u', (byte) 'v', (byte) 'w', (byte) 'x', (byte) 'y', - (byte) 'z', (byte) '0', (byte) '1', (byte) '2', (byte) '3', - (byte) '4', (byte) '5', (byte) '6', (byte) '7', (byte) '8', - (byte) '9', (byte) '-', (byte) '_'}; - - /** - * Translates a Base64 value to either its 6-bit reconstruction value - * or a negative number indicating some other meaning. - **/ - private static final byte[] DECODABET = {-9, -9, -9, -9, -9, -9, -9, -9, -9, // Decimal 0 - 8 - -5, -5, // Whitespace: Tab and Linefeed - -9, -9, // Decimal 11 - 12 - -5, // Whitespace: Carriage Return - -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, // Decimal 14 - 26 - -9, -9, -9, -9, -9, // Decimal 27 - 31 - -5, // Whitespace: Space - -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, // Decimal 33 - 42 - 62, // Plus sign at decimal 43 - -9, -9, -9, // Decimal 44 - 46 - 63, // Slash at decimal 47 - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, // Numbers zero through nine - -9, -9, -9, // Decimal 58 - 60 - -1, // Equals sign at decimal 61 - -9, -9, -9, // Decimal 62 - 64 - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, // Letters 'A' through 'N' - 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, // Letters 'O' through 'Z' - -9, -9, -9, -9, -9, -9, // Decimal 91 - 96 - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, // Letters 'a' through 'm' - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, // Letters 'n' through 'z' - -9, -9, -9, -9, -9 // Decimal 123 - 127 - /* ,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 128 - 139 - -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 140 - 152 - -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 153 - 165 - -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 166 - 178 - -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 179 - 191 - -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 192 - 204 - -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 205 - 217 - -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 218 - 230 - -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 231 - 243 - -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9 // Decimal 244 - 255 */ - }; - - /** The web safe decodabet */ - private static final byte[] WEBSAFE_DECODABET = - {-9, -9, -9, -9, -9, -9, -9, -9, -9, // Decimal 0 - 8 - -5, -5, // Whitespace: Tab and Linefeed - -9, -9, // Decimal 11 - 12 - -5, // Whitespace: Carriage Return - -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, // Decimal 14 - 26 - -9, -9, -9, -9, -9, // Decimal 27 - 31 - -5, // Whitespace: Space - -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, // Decimal 33 - 44 - 62, // Dash '-' sign at decimal 45 - -9, -9, // Decimal 46-47 - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, // Numbers zero through nine - -9, -9, -9, // Decimal 58 - 60 - -1, // Equals sign at decimal 61 - -9, -9, -9, // Decimal 62 - 64 - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, // Letters 'A' through 'N' - 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, // Letters 'O' through 'Z' - -9, -9, -9, -9, // Decimal 91-94 - 63, // Underscore '_' at decimal 95 - -9, // Decimal 96 - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, // Letters 'a' through 'm' - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, // Letters 'n' through 'z' - -9, -9, -9, -9, -9 // Decimal 123 - 127 - /* ,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 128 - 139 - -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 140 - 152 - -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 153 - 165 - -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 166 - 178 - -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 179 - 191 - -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 192 - 204 - -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 205 - 217 - -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 218 - 230 - -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 231 - 243 - -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9 // Decimal 244 - 255 */ - }; - - // Indicates white space in encoding - private static final byte WHITE_SPACE_ENC = -5; - // Indicates equals sign in encoding - private static final byte EQUALS_SIGN_ENC = -1; - - /** Defeats instantiation. */ - private Base64() { - } - - /* ******** E N C O D I N G M E T H O D S ******** */ - - /** - * Encodes up to three bytes of the array <var>source</var> - * and writes the resulting four Base64 bytes to <var>destination</var>. - * The source and destination arrays can be manipulated - * anywhere along their length by specifying - * <var>srcOffset</var> and <var>destOffset</var>. - * This method does not check to make sure your arrays - * are large enough to accommodate <var>srcOffset</var> + 3 for - * the <var>source</var> array or <var>destOffset</var> + 4 for - * the <var>destination</var> array. - * The actual number of significant bytes in your array is - * given by <var>numSigBytes</var>. - * - * @param source the array to convert - * @param srcOffset the index where conversion begins - * @param numSigBytes the number of significant bytes in your array - * @param destination the array to hold the conversion - * @param destOffset the index where output will be put - * @param alphabet is the encoding alphabet - * @return the <var>destination</var> array - * @since 1.3 - */ - private static byte[] encode3to4(byte[] source, int srcOffset, - int numSigBytes, byte[] destination, int destOffset, byte[] alphabet) { - // 1 2 3 - // 01234567890123456789012345678901 Bit position - // --------000000001111111122222222 Array position from threeBytes - // --------| || || || | Six bit groups to index alphabet - // >>18 >>12 >> 6 >> 0 Right shift necessary - // 0x3f 0x3f 0x3f Additional AND - - // Create buffer with zero-padding if there are only one or two - // significant bytes passed in the array. - // We have to shift left 24 in order to flush out the 1's that appear - // when Java treats a value as negative that is cast from a byte to an int. - int inBuff = - (numSigBytes > 0 ? ((source[srcOffset] << 24) >>> 8) : 0) - | (numSigBytes > 1 ? ((source[srcOffset + 1] << 24) >>> 16) : 0) - | (numSigBytes > 2 ? ((source[srcOffset + 2] << 24) >>> 24) : 0); - - switch (numSigBytes) { - case 3: - destination[destOffset] = alphabet[inBuff >>> 18]; - destination[destOffset + 1] = alphabet[(inBuff >>> 12) & 0x3f]; - destination[destOffset + 2] = alphabet[(inBuff >>> 6) & 0x3f]; - destination[destOffset + 3] = alphabet[(inBuff) & 0x3f]; - return destination; - case 2: - destination[destOffset] = alphabet[inBuff >>> 18]; - destination[destOffset + 1] = alphabet[(inBuff >>> 12) & 0x3f]; - destination[destOffset + 2] = alphabet[(inBuff >>> 6) & 0x3f]; - destination[destOffset + 3] = EQUALS_SIGN; - return destination; - case 1: - destination[destOffset] = alphabet[inBuff >>> 18]; - destination[destOffset + 1] = alphabet[(inBuff >>> 12) & 0x3f]; - destination[destOffset + 2] = EQUALS_SIGN; - destination[destOffset + 3] = EQUALS_SIGN; - return destination; - default: - return destination; - } // end switch - } // end encode3to4 - - /** - * Encodes a byte array into Base64 notation. - * Equivalent to calling - * {@code encodeBytes(source, 0, source.length)} - * - * @param source The data to convert - * @since 1.4 - */ - public static String encode(byte[] source) { - return encode(source, 0, source.length, ALPHABET, true); - } - - /** - * Encodes a byte array into web safe Base64 notation. - * - * @param source The data to convert - * @param doPadding is {@code true} to pad result with '=' chars - * if it does not fall on 3 byte boundaries - */ - public static String encodeWebSafe(byte[] source, boolean doPadding) { - return encode(source, 0, source.length, WEBSAFE_ALPHABET, doPadding); - } - - /** - * Encodes a byte array into Base64 notation. - * - * @param source the data to convert - * @param off offset in array where conversion should begin - * @param len length of data to convert - * @param alphabet the encoding alphabet - * @param doPadding is {@code true} to pad result with '=' chars - * if it does not fall on 3 byte boundaries - * @since 1.4 - */ - public static String encode(byte[] source, int off, int len, byte[] alphabet, - boolean doPadding) { - byte[] outBuff = encode(source, off, len, alphabet, Integer.MAX_VALUE); - int outLen = outBuff.length; - - // If doPadding is false, set length to truncate '=' - // padding characters - while (!doPadding && outLen > 0) { - if (outBuff[outLen - 1] != '=') { - break; - } - outLen -= 1; - } - - return new String(outBuff, 0, outLen); - } - - /** - * Encodes a byte array into Base64 notation. - * - * @param source the data to convert - * @param off offset in array where conversion should begin - * @param len length of data to convert - * @param alphabet is the encoding alphabet - * @param maxLineLength maximum length of one line. - * @return the BASE64-encoded byte array - */ - public static byte[] encode(byte[] source, int off, int len, byte[] alphabet, - int maxLineLength) { - int lenDiv3 = (len + 2) / 3; // ceil(len / 3) - int len43 = lenDiv3 * 4; - byte[] outBuff = new byte[len43 // Main 4:3 - + (len43 / maxLineLength)]; // New lines - - int d = 0; - int e = 0; - int len2 = len - 2; - int lineLength = 0; - for (; d < len2; d += 3, e += 4) { - - // The following block of code is the same as - // encode3to4( source, d + off, 3, outBuff, e, alphabet ); - // but inlined for faster encoding (~20% improvement) - int inBuff = - ((source[d + off] << 24) >>> 8) - | ((source[d + 1 + off] << 24) >>> 16) - | ((source[d + 2 + off] << 24) >>> 24); - outBuff[e] = alphabet[inBuff >>> 18]; - outBuff[e + 1] = alphabet[(inBuff >>> 12) & 0x3f]; - outBuff[e + 2] = alphabet[(inBuff >>> 6) & 0x3f]; - outBuff[e + 3] = alphabet[(inBuff) & 0x3f]; - - lineLength += 4; - if (lineLength == maxLineLength) { - outBuff[e + 4] = NEW_LINE; - e++; - lineLength = 0; - } // end if: end of line - } // end for: each piece of array - - if (d < len) { - encode3to4(source, d + off, len - d, outBuff, e, alphabet); - - lineLength += 4; - if (lineLength == maxLineLength) { - // Add a last newline - outBuff[e + 4] = NEW_LINE; - e++; - } - e += 4; - } - - assert e == outBuff.length; - return outBuff; - } - - - /* ******** D E C O D I N G M E T H O D S ******** */ - - - /** - * Decodes four bytes from array <var>source</var> - * and writes the resulting bytes (up to three of them) - * to <var>destination</var>. - * The source and destination arrays can be manipulated - * anywhere along their length by specifying - * <var>srcOffset</var> and <var>destOffset</var>. - * This method does not check to make sure your arrays - * are large enough to accommodate <var>srcOffset</var> + 4 for - * the <var>source</var> array or <var>destOffset</var> + 3 for - * the <var>destination</var> array. - * This method returns the actual number of bytes that - * were converted from the Base64 encoding. - * - * - * @param source the array to convert - * @param srcOffset the index where conversion begins - * @param destination the array to hold the conversion - * @param destOffset the index where output will be put - * @param decodabet the decodabet for decoding Base64 content - * @return the number of decoded bytes converted - * @since 1.3 - */ - private static int decode4to3(byte[] source, int srcOffset, - byte[] destination, int destOffset, byte[] decodabet) { - // Example: Dk== - if (source[srcOffset + 2] == EQUALS_SIGN) { - int outBuff = - ((decodabet[source[srcOffset]] << 24) >>> 6) - | ((decodabet[source[srcOffset + 1]] << 24) >>> 12); - - destination[destOffset] = (byte) (outBuff >>> 16); - return 1; - } else if (source[srcOffset + 3] == EQUALS_SIGN) { - // Example: DkL= - int outBuff = - ((decodabet[source[srcOffset]] << 24) >>> 6) - | ((decodabet[source[srcOffset + 1]] << 24) >>> 12) - | ((decodabet[source[srcOffset + 2]] << 24) >>> 18); - - destination[destOffset] = (byte) (outBuff >>> 16); - destination[destOffset + 1] = (byte) (outBuff >>> 8); - return 2; - } else { - // Example: DkLE - int outBuff = - ((decodabet[source[srcOffset]] << 24) >>> 6) - | ((decodabet[source[srcOffset + 1]] << 24) >>> 12) - | ((decodabet[source[srcOffset + 2]] << 24) >>> 18) - | ((decodabet[source[srcOffset + 3]] << 24) >>> 24); - - destination[destOffset] = (byte) (outBuff >> 16); - destination[destOffset + 1] = (byte) (outBuff >> 8); - destination[destOffset + 2] = (byte) (outBuff); - return 3; - } - } // end decodeToBytes - - - /** - * Decodes data from Base64 notation. - * - * @param s the string to decode (decoded in default encoding) - * @return the decoded data - * @since 1.4 - */ - public static byte[] decode(String s) throws Base64DecoderException { - byte[] bytes = s.getBytes(); - return decode(bytes, 0, bytes.length); - } - - /** - * Decodes data from web safe Base64 notation. - * Web safe encoding uses '-' instead of '+', '_' instead of '/' - * - * @param s the string to decode (decoded in default encoding) - * @return the decoded data - */ - public static byte[] decodeWebSafe(String s) throws Base64DecoderException { - byte[] bytes = s.getBytes(); - return decodeWebSafe(bytes, 0, bytes.length); - } - - /** - * Decodes Base64 content in byte array format and returns - * the decoded byte array. - * - * @param source The Base64 encoded data - * @return decoded data - * @since 1.3 - * @throws Base64DecoderException - */ - public static byte[] decode(byte[] source) throws Base64DecoderException { - return decode(source, 0, source.length); - } - - /** - * Decodes web safe Base64 content in byte array format and returns - * the decoded data. - * Web safe encoding uses '-' instead of '+', '_' instead of '/' - * - * @param source the string to decode (decoded in default encoding) - * @return the decoded data - */ - public static byte[] decodeWebSafe(byte[] source) - throws Base64DecoderException { - return decodeWebSafe(source, 0, source.length); - } - - /** - * Decodes Base64 content in byte array format and returns - * the decoded byte array. - * - * @param source the Base64 encoded data - * @param off the offset of where to begin decoding - * @param len the length of characters to decode - * @return decoded data - * @since 1.3 - * @throws Base64DecoderException - */ - public static byte[] decode(byte[] source, int off, int len) - throws Base64DecoderException { - return decode(source, off, len, DECODABET); - } - - /** - * Decodes web safe Base64 content in byte array format and returns - * the decoded byte array. - * Web safe encoding uses '-' instead of '+', '_' instead of '/' - * - * @param source the Base64 encoded data - * @param off the offset of where to begin decoding - * @param len the length of characters to decode - * @return decoded data - */ - public static byte[] decodeWebSafe(byte[] source, int off, int len) - throws Base64DecoderException { - return decode(source, off, len, WEBSAFE_DECODABET); - } - - /** - * Decodes Base64 content using the supplied decodabet and returns - * the decoded byte array. - * - * @param source the Base64 encoded data - * @param off the offset of where to begin decoding - * @param len the length of characters to decode - * @param decodabet the decodabet for decoding Base64 content - * @return decoded data - */ - public static byte[] decode(byte[] source, int off, int len, byte[] decodabet) - throws Base64DecoderException { - int len34 = len * 3 / 4; - byte[] outBuff = new byte[2 + len34]; // Upper limit on size of output - int outBuffPosn = 0; - - byte[] b4 = new byte[4]; - int b4Posn = 0; - int i = 0; - byte sbiCrop = 0; - byte sbiDecode = 0; - for (i = 0; i < len; i++) { - sbiCrop = (byte) (source[i + off] & 0x7f); // Only the low seven bits - sbiDecode = decodabet[sbiCrop]; - - if (sbiDecode >= WHITE_SPACE_ENC) { // White space Equals sign or better - if (sbiDecode >= EQUALS_SIGN_ENC) { - // An equals sign (for padding) must not occur at position 0 or 1 - // and must be the last byte[s] in the encoded value - if (sbiCrop == EQUALS_SIGN) { - int bytesLeft = len - i; - byte lastByte = (byte) (source[len - 1 + off] & 0x7f); - if (b4Posn == 0 || b4Posn == 1) { - throw new Base64DecoderException( - "invalid padding byte '=' at byte offset " + i); - } else if ((b4Posn == 3 && bytesLeft > 2) - || (b4Posn == 4 && bytesLeft > 1)) { - throw new Base64DecoderException( - "padding byte '=' falsely signals end of encoded value " - + "at offset " + i); - } else if (lastByte != EQUALS_SIGN && lastByte != NEW_LINE) { - throw new Base64DecoderException( - "encoded value has invalid trailing byte"); - } - break; - } - - b4[b4Posn++] = sbiCrop; - if (b4Posn == 4) { - outBuffPosn += decode4to3(b4, 0, outBuff, outBuffPosn, decodabet); - b4Posn = 0; - } - } - } else { - throw new Base64DecoderException("Bad Base64 input character at " + i - + ": " + source[i + off] + "(decimal)"); - } - } - - // Because web safe encoding allows non padding base64 encodes, we - // need to pad the rest of the b4 buffer with equal signs when - // b4Posn != 0. There can be at most 2 equal signs at the end of - // four characters, so the b4 buffer must have two or three - // characters. This also catches the case where the input is - // padded with EQUALS_SIGN - if (b4Posn != 0) { - if (b4Posn == 1) { - throw new Base64DecoderException("single trailing character at offset " - + (len - 1)); - } - b4[b4Posn++] = EQUALS_SIGN; - outBuffPosn += decode4to3(b4, 0, outBuff, outBuffPosn, decodabet); - } - - byte[] out = new byte[outBuffPosn]; - System.arraycopy(outBuff, 0, out, 0, outBuffPosn); - return out; - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/external/iab/Base64DecoderException.java b/QKSMS/src/main/java/com/moez/QKSMS/external/iab/Base64DecoderException.java deleted file mode 100644 index d96458f75..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/external/iab/Base64DecoderException.java +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright 2002, Google, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package com.moez.QKSMS.external.iab; - -/** - * Exception thrown when encountering an invalid Base64 input character. - * - * @author nelson - */ -public class Base64DecoderException extends Exception { - public Base64DecoderException() { - super(); - } - - public Base64DecoderException(String s) { - super(s); - } - - private static final long serialVersionUID = 1L; -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/external/iab/IabException.java b/QKSMS/src/main/java/com/moez/QKSMS/external/iab/IabException.java deleted file mode 100644 index 7a47277ce..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/external/iab/IabException.java +++ /dev/null @@ -1,43 +0,0 @@ -/* Copyright (c) 2012 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.moez.QKSMS.external.iab; - -/** - * Exception thrown when something went wrong with in-app billing. - * An IabException has an associated IabResult (an error). - * To get the IAB result that caused this exception to be thrown, - * call {@link #getResult()}. - */ -public class IabException extends Exception { - IabResult mResult; - - public IabException(IabResult r) { - this(r, null); - } - public IabException(int response, String message) { - this(new IabResult(response, message)); - } - public IabException(IabResult r, Exception cause) { - super(r.getMessage(), cause); - mResult = r; - } - public IabException(int response, String message, Exception cause) { - this(new IabResult(response, message), cause); - } - - /** Returns the IAB result (error) that this exception signals. */ - public IabResult getResult() { return mResult; } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/external/iab/IabHelper.java b/QKSMS/src/main/java/com/moez/QKSMS/external/iab/IabHelper.java deleted file mode 100644 index b2f012214..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/external/iab/IabHelper.java +++ /dev/null @@ -1,1009 +0,0 @@ -/* Copyright (c) 2012 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.moez.QKSMS.external.iab; - -import android.app.Activity; -import android.app.PendingIntent; -import android.content.ComponentName; -import android.content.Context; -import android.content.Intent; -import android.content.IntentSender.SendIntentException; -import android.content.ServiceConnection; -import android.content.pm.ResolveInfo; -import android.os.Bundle; -import android.os.Handler; -import android.os.IBinder; -import android.os.RemoteException; -import android.text.TextUtils; -import android.util.Log; - -import com.android.vending.billing.IInAppBillingService; - -import org.json.JSONException; - -import java.util.ArrayList; -import java.util.List; - - -/** - * Provides convenience methods for in-app billing. You can create one instance of this - * class for your application and use it to process in-app billing operations. - * It provides synchronous (blocking) and asynchronous (non-blocking) methods for - * many common in-app billing operations, as well as automatic signature - * verification. - * - * After instantiating, you must perform setup in order to start using the object. - * To perform setup, call the {@link #startSetup} method and provide a listener; - * that listener will be notified when setup is complete, after which (and not before) - * you may call other methods. - * - * After setup is complete, you will typically want to request an inventory of owned - * items and subscriptions. See {@link #queryInventory}, {@link #queryInventoryAsync} - * and related methods. - * - * When you are done with this object, don't forget to call {@link #dispose} - * to ensure proper cleanup. This object holds a binding to the in-app billing - * service, which will leak unless you dispose of it correctly. If you created - * the object on an Activity's onCreate method, then the recommended - * place to dispose of it is the Activity's onDestroy method. - * - * A note about threading: When using this object from a background thread, you may - * call the blocking versions of methods; when using from a UI thread, call - * only the asynchronous versions and handle the results via callbacks. - * Also, notice that you can only call one asynchronous operation at a time; - * attempting to start a second asynchronous operation while the first one - * has not yet completed will result in an exception being thrown. - * - * @author Bruno Oliveira (Google) - * - */ -public class IabHelper { - // Is debug logging enabled? - boolean mDebugLog = false; - String mDebugTag = "IabHelper"; - - // Is setup done? - boolean mSetupDone = false; - - // Has this object been disposed of? (If so, we should ignore callbacks, etc) - boolean mDisposed = false; - - boolean mIsBound = false; - - // Are subscriptions supported? - boolean mSubscriptionsSupported = false; - - // Is an asynchronous operation in progress? - // (only one at a time can be in progress) - boolean mAsyncInProgress = false; - - // (for logging/debugging) - // if mAsyncInProgress == true, what asynchronous operation is in progress? - String mAsyncOperation = ""; - - // Context we were passed during initialization - Context mContext; - - // Connection to the service - IInAppBillingService mService; - ServiceConnection mServiceConn; - - // The request code used to launch purchase flow - int mRequestCode; - - // The item type of the current purchase flow - String mPurchasingItemType; - - // Public key for verifying signature, in base64 encoding - String mSignatureBase64 = null; - - // Billing response codes - public static final int BILLING_RESPONSE_RESULT_OK = 0; - public static final int BILLING_RESPONSE_RESULT_USER_CANCELED = 1; - public static final int BILLING_RESPONSE_RESULT_BILLING_UNAVAILABLE = 3; - public static final int BILLING_RESPONSE_RESULT_ITEM_UNAVAILABLE = 4; - public static final int BILLING_RESPONSE_RESULT_DEVELOPER_ERROR = 5; - public static final int BILLING_RESPONSE_RESULT_ERROR = 6; - public static final int BILLING_RESPONSE_RESULT_ITEM_ALREADY_OWNED = 7; - public static final int BILLING_RESPONSE_RESULT_ITEM_NOT_OWNED = 8; - - // IAB Helper error codes - public static final int IABHELPER_ERROR_BASE = -1000; - public static final int IABHELPER_REMOTE_EXCEPTION = -1001; - public static final int IABHELPER_BAD_RESPONSE = -1002; - public static final int IABHELPER_VERIFICATION_FAILED = -1003; - public static final int IABHELPER_SEND_INTENT_FAILED = -1004; - public static final int IABHELPER_USER_CANCELLED = -1005; - public static final int IABHELPER_UNKNOWN_PURCHASE_RESPONSE = -1006; - public static final int IABHELPER_MISSING_TOKEN = -1007; - public static final int IABHELPER_UNKNOWN_ERROR = -1008; - public static final int IABHELPER_SUBSCRIPTIONS_NOT_AVAILABLE = -1009; - public static final int IABHELPER_INVALID_CONSUMPTION = -1010; - - // Keys for the responses from InAppBillingService - public static final String RESPONSE_CODE = "RESPONSE_CODE"; - public static final String RESPONSE_GET_SKU_DETAILS_LIST = "DETAILS_LIST"; - public static final String RESPONSE_BUY_INTENT = "BUY_INTENT"; - public static final String RESPONSE_INAPP_PURCHASE_DATA = "INAPP_PURCHASE_DATA"; - public static final String RESPONSE_INAPP_SIGNATURE = "INAPP_DATA_SIGNATURE"; - public static final String RESPONSE_INAPP_ITEM_LIST = "INAPP_PURCHASE_ITEM_LIST"; - public static final String RESPONSE_INAPP_PURCHASE_DATA_LIST = "INAPP_PURCHASE_DATA_LIST"; - public static final String RESPONSE_INAPP_SIGNATURE_LIST = "INAPP_DATA_SIGNATURE_LIST"; - public static final String INAPP_CONTINUATION_TOKEN = "INAPP_CONTINUATION_TOKEN"; - - // Item types - public static final String ITEM_TYPE_INAPP = "inapp"; - public static final String ITEM_TYPE_SUBS = "subs"; - - // some fields on the getSkuDetails response bundle - public static final String GET_SKU_DETAILS_ITEM_LIST = "ITEM_ID_LIST"; - public static final String GET_SKU_DETAILS_ITEM_TYPE_LIST = "ITEM_TYPE_LIST"; - - /** - * Creates an instance. After creation, it will not yet be ready to use. You must perform - * setup by calling {@link #startSetup} and wait for setup to complete. This constructor does not - * block and is safe to call from a UI thread. - * - * @param ctx Your application or Activity context. Needed to bind to the in-app billing service. - * @param base64PublicKey Your application's public key, encoded in base64. - * This is used for verification of purchase signatures. You can find your app's base64-encoded - * public key in your application's page on Google Play Developer Console. Note that this - * is NOT your "developer public key". - */ - public IabHelper(Context ctx, String base64PublicKey) { - mContext = ctx.getApplicationContext(); - mSignatureBase64 = base64PublicKey; - logDebug("IAB helper created."); - } - - /** - * Enables or disable debug logging through LogCat. - */ - public void enableDebugLogging(boolean enable, String tag) { - checkNotDisposed(); - mDebugLog = enable; - mDebugTag = tag; - } - - public void enableDebugLogging(boolean enable) { - checkNotDisposed(); - mDebugLog = enable; - } - - /** - * Callback for setup process. This listener's {@link #onIabSetupFinished} method is called - * when the setup process is complete. - */ - public interface OnIabSetupFinishedListener { - /** - * Called to notify that setup is complete. - * - * @param result The result of the setup process. - */ - public void onIabSetupFinished(IabResult result); - } - - /** - * Starts the setup process. This will start up the setup process asynchronously. - * You will be notified through the listener when the setup process is complete. - * This method is safe to call from a UI thread. - * - * @param listener The listener to notify when the setup process is complete. - */ - public void startSetup(final OnIabSetupFinishedListener listener) { - // If already set up, can't do it again. - checkNotDisposed(); - if (mSetupDone) throw new IllegalStateException("IAB helper is already set up."); - - // Connection to IAB service - logDebug("Starting in-app billing setup."); - mServiceConn = new ServiceConnection() { - @Override - public void onServiceDisconnected(ComponentName name) { - logDebug("Billing service disconnected."); - mService = null; - } - - @Override - public void onServiceConnected(ComponentName name, IBinder service) { - if (mDisposed) return; - logDebug("Billing service connected."); - mService = IInAppBillingService.Stub.asInterface(service); - String packageName = mContext.getPackageName(); - try { - logDebug("Checking for in-app billing 3 support."); - - // check for in-app billing v3 support - int response = mService.isBillingSupported(3, packageName, ITEM_TYPE_INAPP); - if (response != BILLING_RESPONSE_RESULT_OK) { - if (listener != null) listener.onIabSetupFinished(new IabResult(response, - "Error checking for billing v3 support.")); - - // if in-app purchases aren't supported, neither are subscriptions. - mSubscriptionsSupported = false; - return; - } - logDebug("In-app billing version 3 supported for " + packageName); - - // check for v3 subscriptions support - response = mService.isBillingSupported(3, packageName, ITEM_TYPE_SUBS); - if (response == BILLING_RESPONSE_RESULT_OK) { - logDebug("Subscriptions AVAILABLE."); - mSubscriptionsSupported = true; - } - else { - logDebug("Subscriptions NOT AVAILABLE. Response: " + response); - } - - mSetupDone = true; - } - catch (RemoteException e) { - if (listener != null) { - listener.onIabSetupFinished(new IabResult(IABHELPER_REMOTE_EXCEPTION, - "RemoteException while setting up in-app billing.")); - } - e.printStackTrace(); - return; - } - - if (listener != null) { - listener.onIabSetupFinished(new IabResult(BILLING_RESPONSE_RESULT_OK, "Setup successful.")); - } - } - }; - - Intent serviceIntent = new Intent("com.android.vending.billing.InAppBillingService.BIND"); - serviceIntent.setPackage("com.android.vending"); - List<ResolveInfo> ri = mContext.getPackageManager().queryIntentServices(serviceIntent, 0); - - if (ri != null && !ri.isEmpty()) { - // service available to handle that Intent - mIsBound = mContext.bindService(serviceIntent, mServiceConn, Context.BIND_AUTO_CREATE); - } - else { - // no service available to handle that Intent - if (listener != null) { - listener.onIabSetupFinished( - new IabResult(BILLING_RESPONSE_RESULT_BILLING_UNAVAILABLE, - "Billing service unavailable on device.")); - } - } - } - - /** - * Dispose of object, releasing resources. It's very important to call this - * method when you are done with this object. It will release any resources - * used by it such as service connections. Naturally, once the object is - * disposed of, it can't be used again. - */ - public void dispose() { - logDebug("Disposing."); - mSetupDone = false; - if (mServiceConn != null) { - logDebug("Unbinding from service."); - if (mContext != null && mIsBound) { - mContext.unbindService(mServiceConn); - } - } - mDisposed = true; - mContext = null; - mServiceConn = null; - mService = null; - mPurchaseListener = null; - } - - private void checkNotDisposed() { - if (mDisposed) throw new IllegalStateException("IabHelper was disposed of, so it cannot be used."); - } - - /** Returns whether subscriptions are supported. */ - public boolean subscriptionsSupported() { - checkNotDisposed(); - return mSubscriptionsSupported; - } - - - /** - * Callback that notifies when a purchase is finished. - */ - public interface OnIabPurchaseFinishedListener { - /** - * Called to notify that an in-app purchase finished. If the purchase was successful, - * then the sku parameter specifies which item was purchased. If the purchase failed, - * the sku and extraData parameters may or may not be null, depending on how far the purchase - * process went. - * - * @param result The result of the purchase. - * @param info The purchase information (null if purchase failed) - */ - public void onIabPurchaseFinished(IabResult result, Purchase info); - } - - // The listener registered on launchPurchaseFlow, which we have to call back when - // the purchase finishes - OnIabPurchaseFinishedListener mPurchaseListener; - - public void launchPurchaseFlow(Activity act, String sku, int requestCode, OnIabPurchaseFinishedListener listener) { - launchPurchaseFlow(act, sku, requestCode, listener, ""); - } - - public void launchPurchaseFlow(Activity act, String sku, int requestCode, - OnIabPurchaseFinishedListener listener, String extraData) { - launchPurchaseFlow(act, sku, ITEM_TYPE_INAPP, requestCode, listener, extraData); - } - - public void launchSubscriptionPurchaseFlow(Activity act, String sku, int requestCode, - OnIabPurchaseFinishedListener listener) { - launchSubscriptionPurchaseFlow(act, sku, requestCode, listener, ""); - } - - public void launchSubscriptionPurchaseFlow(Activity act, String sku, int requestCode, - OnIabPurchaseFinishedListener listener, String extraData) { - launchPurchaseFlow(act, sku, ITEM_TYPE_SUBS, requestCode, listener, extraData); - } - - /** - * Initiate the UI flow for an in-app purchase. Call this method to initiate an in-app purchase, - * which will involve bringing up the Google Play screen. The calling activity will be paused while - * the user interacts with Google Play, and the result will be delivered via the activity's - * {@link android.app.Activity#onActivityResult} method, at which point you must call - * this object's {@link #handleActivityResult} method to continue the purchase flow. This method - * MUST be called from the UI thread of the Activity. - * - * @param act The calling activity. - * @param sku The sku of the item to purchase. - * @param itemType indicates if it's a product or a subscription (ITEM_TYPE_INAPP or ITEM_TYPE_SUBS) - * @param requestCode A request code (to differentiate from other responses -- - * as in {@link android.app.Activity#startActivityForResult}). - * @param listener The listener to notify when the purchase process finishes - * @param extraData Extra data (developer payload), which will be returned with the purchase data - * when the purchase completes. This extra data will be permanently bound to that purchase - * and will always be returned when the purchase is queried. - */ - public void launchPurchaseFlow(Activity act, String sku, String itemType, int requestCode, - OnIabPurchaseFinishedListener listener, String extraData) { - checkNotDisposed(); - checkSetupDone("launchPurchaseFlow"); - flagStartAsync("launchPurchaseFlow"); - IabResult result; - - if (itemType.equals(ITEM_TYPE_SUBS) && !mSubscriptionsSupported) { - IabResult r = new IabResult(IABHELPER_SUBSCRIPTIONS_NOT_AVAILABLE, - "Subscriptions are not available."); - flagEndAsync(); - if (listener != null) listener.onIabPurchaseFinished(r, null); - return; - } - - try { - logDebug("Constructing buy intent for " + sku + ", item type: " + itemType); - Bundle buyIntentBundle = mService.getBuyIntent(3, mContext.getPackageName(), sku, itemType, extraData); - int response = getResponseCodeFromBundle(buyIntentBundle); - if (response != BILLING_RESPONSE_RESULT_OK) { - logError("Unable to buy item, Error response: " + getResponseDesc(response)); - flagEndAsync(); - result = new IabResult(response, "Unable to buy item"); - if (listener != null) listener.onIabPurchaseFinished(result, null); - return; - } - - PendingIntent pendingIntent = buyIntentBundle.getParcelable(RESPONSE_BUY_INTENT); - logDebug("Launching buy intent for " + sku + ". Request code: " + requestCode); - mRequestCode = requestCode; - mPurchaseListener = listener; - mPurchasingItemType = itemType; - act.startIntentSenderForResult(pendingIntent.getIntentSender(), - requestCode, new Intent(), - Integer.valueOf(0), Integer.valueOf(0), - Integer.valueOf(0)); - } - catch (SendIntentException e) { - logError("SendIntentException while launching purchase flow for sku " + sku); - e.printStackTrace(); - flagEndAsync(); - - result = new IabResult(IABHELPER_SEND_INTENT_FAILED, "Failed to send intent."); - if (listener != null) listener.onIabPurchaseFinished(result, null); - } - catch (RemoteException e) { - logError("RemoteException while launching purchase flow for sku " + sku); - e.printStackTrace(); - flagEndAsync(); - - result = new IabResult(IABHELPER_REMOTE_EXCEPTION, "Remote exception while starting purchase flow"); - if (listener != null) listener.onIabPurchaseFinished(result, null); - } - } - - /** - * Handles an activity result that's part of the purchase flow in in-app billing. If you - * are calling {@link #launchPurchaseFlow}, then you must call this method from your - * Activity's {@link android.app.Activity@onActivityResult} method. This method - * MUST be called from the UI thread of the Activity. - * - * @param requestCode The requestCode as you received it. - * @param resultCode The resultCode as you received it. - * @param data The data (Intent) as you received it. - * @return Returns true if the result was related to a purchase flow and was handled; - * false if the result was not related to a purchase, in which case you should - * handle it normally. - */ - public boolean handleActivityResult(int requestCode, int resultCode, Intent data) { - IabResult result; - if (requestCode != mRequestCode) return false; - - checkNotDisposed(); - checkSetupDone("handleActivityResult"); - - // end of async purchase operation that started on launchPurchaseFlow - flagEndAsync(); - - if (data == null) { - logError("Null data in IAB activity result."); - result = new IabResult(IABHELPER_BAD_RESPONSE, "Null data in IAB result"); - if (mPurchaseListener != null) mPurchaseListener.onIabPurchaseFinished(result, null); - return true; - } - - int responseCode = getResponseCodeFromIntent(data); - String purchaseData = data.getStringExtra(RESPONSE_INAPP_PURCHASE_DATA); - String dataSignature = data.getStringExtra(RESPONSE_INAPP_SIGNATURE); - - if (resultCode == Activity.RESULT_OK && responseCode == BILLING_RESPONSE_RESULT_OK) { - logDebug("Successful resultcode from purchase activity."); - logDebug("Purchase data: " + purchaseData); - logDebug("Data signature: " + dataSignature); - logDebug("Extras: " + data.getExtras()); - logDebug("Expected item type: " + mPurchasingItemType); - - if (purchaseData == null || dataSignature == null) { - logError("BUG: either purchaseData or dataSignature is null."); - logDebug("Extras: " + data.getExtras().toString()); - result = new IabResult(IABHELPER_UNKNOWN_ERROR, "IAB returned null purchaseData or dataSignature"); - if (mPurchaseListener != null) mPurchaseListener.onIabPurchaseFinished(result, null); - return true; - } - - Purchase purchase = null; - try { - purchase = new Purchase(mPurchasingItemType, purchaseData, dataSignature); - String sku = purchase.getSku(); - - // Verify signature - if (!Security.verifyPurchase(mSignatureBase64, purchaseData, dataSignature)) { - logError("Purchase signature verification FAILED for sku " + sku); - result = new IabResult(IABHELPER_VERIFICATION_FAILED, "Signature verification failed for sku " + sku); - if (mPurchaseListener != null) mPurchaseListener.onIabPurchaseFinished(result, purchase); - return true; - } - logDebug("Purchase signature successfully verified."); - } - catch (JSONException e) { - logError("Failed to parse purchase data."); - e.printStackTrace(); - result = new IabResult(IABHELPER_BAD_RESPONSE, "Failed to parse purchase data."); - if (mPurchaseListener != null) mPurchaseListener.onIabPurchaseFinished(result, null); - return true; - } - - if (mPurchaseListener != null) { - mPurchaseListener.onIabPurchaseFinished(new IabResult(BILLING_RESPONSE_RESULT_OK, "Success"), purchase); - } - } - else if (resultCode == Activity.RESULT_OK) { - // result code was OK, but in-app billing response was not OK. - logDebug("Result code was OK but in-app billing response was not OK: " + getResponseDesc(responseCode)); - if (mPurchaseListener != null) { - result = new IabResult(responseCode, "Problem purchashing item."); - mPurchaseListener.onIabPurchaseFinished(result, null); - } - } - else if (resultCode == Activity.RESULT_CANCELED) { - logDebug("Purchase canceled - Response: " + getResponseDesc(responseCode)); - result = new IabResult(IABHELPER_USER_CANCELLED, "User canceled."); - if (mPurchaseListener != null) mPurchaseListener.onIabPurchaseFinished(result, null); - } - else { - logError("Purchase failed. Result code: " + Integer.toString(resultCode) - + ". Response: " + getResponseDesc(responseCode)); - result = new IabResult(IABHELPER_UNKNOWN_PURCHASE_RESPONSE, "Unknown purchase response."); - if (mPurchaseListener != null) mPurchaseListener.onIabPurchaseFinished(result, null); - } - return true; - } - - public Inventory queryInventory(boolean querySkuDetails, List<String> moreSkus) throws IabException { - return queryInventory(querySkuDetails, moreSkus, null); - } - - /** - * Queries the inventory. This will query all owned items from the server, as well as - * information on additional skus, if specified. This method may block or take long to execute. - * Do not call from a UI thread. For that, use the non-blocking version {@link #refreshInventoryAsync}. - * - * @param querySkuDetails if true, SKU details (price, description, etc) will be queried as well - * as purchase information. - * @param moreItemSkus additional PRODUCT skus to query information on, regardless of ownership. - * Ignored if null or if querySkuDetails is false. - * @param moreSubsSkus additional SUBSCRIPTIONS skus to query information on, regardless of ownership. - * Ignored if null or if querySkuDetails is false. - * @throws IabException if a problem occurs while refreshing the inventory. - */ - public Inventory queryInventory(boolean querySkuDetails, List<String> moreItemSkus, - List<String> moreSubsSkus) throws IabException { - checkNotDisposed(); - checkSetupDone("queryInventory"); - try { - Inventory inv = new Inventory(); - int r = queryPurchases(inv, ITEM_TYPE_INAPP); - if (r != BILLING_RESPONSE_RESULT_OK) { - throw new IabException(r, "Error refreshing inventory (querying owned items)."); - } - - if (querySkuDetails) { - r = querySkuDetails(ITEM_TYPE_INAPP, inv, moreItemSkus); - if (r != BILLING_RESPONSE_RESULT_OK) { - throw new IabException(r, "Error refreshing inventory (querying prices of items)."); - } - } - - // if subscriptions are supported, then also query for subscriptions - if (mSubscriptionsSupported) { - r = queryPurchases(inv, ITEM_TYPE_SUBS); - if (r != BILLING_RESPONSE_RESULT_OK) { - throw new IabException(r, "Error refreshing inventory (querying owned subscriptions)."); - } - - if (querySkuDetails) { - r = querySkuDetails(ITEM_TYPE_SUBS, inv, moreItemSkus); - if (r != BILLING_RESPONSE_RESULT_OK) { - throw new IabException(r, "Error refreshing inventory (querying prices of subscriptions)."); - } - } - } - - return inv; - } - catch (RemoteException e) { - throw new IabException(IABHELPER_REMOTE_EXCEPTION, "Remote exception while refreshing inventory.", e); - } - catch (JSONException e) { - throw new IabException(IABHELPER_BAD_RESPONSE, "Error parsing JSON response while refreshing inventory.", e); - } - // Catch NPE; we might want to look into alternatives to IabHelper, since it's apparently a - // pretty poorly written class. [1] - // [1]: http://stackoverflow.com/questions/15456434/billing-api-v3-iabhelper-nullpointerexception - catch (NullPointerException e) { - throw new IabException(IABHELPER_UNKNOWN_ERROR, "NullPointer while refreshing inventory."); - } - } - - /** - * Listener that notifies when an inventory query operation completes. - */ - public interface QueryInventoryFinishedListener { - /** - * Called to notify that an inventory query operation completed. - * - * @param result The result of the operation. - * @param inv The inventory. - */ - public void onQueryInventoryFinished(IabResult result, Inventory inv); - } - - - /** - * Asynchronous wrapper for inventory query. This will perform an inventory - * query as described in {@link #queryInventory}, but will do so asynchronously - * and call back the specified listener upon completion. This method is safe to - * call from a UI thread. - * - * @param querySkuDetails as in {@link #queryInventory} - * @param moreSkus as in {@link #queryInventory} - * @param listener The listener to notify when the refresh operation completes. - */ - public void queryInventoryAsync(final boolean querySkuDetails, - final List<String> moreSkus, - final QueryInventoryFinishedListener listener) { - final Handler handler = new Handler(); - checkNotDisposed(); - checkSetupDone("queryInventory"); - flagStartAsync("refresh inventory"); - (new Thread(new Runnable() { - @Override - public void run() { - IabResult result = new IabResult(BILLING_RESPONSE_RESULT_OK, "Inventory refresh successful."); - Inventory inv = null; - try { - inv = queryInventory(querySkuDetails, moreSkus); - } - catch (IabException ex) { - result = ex.getResult(); - } - - flagEndAsync(); - - final IabResult result_f = result; - final Inventory inv_f = inv; - if (!mDisposed && listener != null) { - handler.post(new Runnable() { - @Override - public void run() { - listener.onQueryInventoryFinished(result_f, inv_f); - } - }); - } - } - })).start(); - } - - public void queryInventoryAsync(QueryInventoryFinishedListener listener) { - queryInventoryAsync(true, null, listener); - } - - public void queryInventoryAsync(boolean querySkuDetails, QueryInventoryFinishedListener listener) { - queryInventoryAsync(querySkuDetails, null, listener); - } - - - /** - * Consumes a given in-app product. Consuming can only be done on an item - * that's owned, and as a result of consumption, the user will no longer own it. - * This method may block or take long to return. Do not call from the UI thread. - * For that, see {@link #consumeAsync}. - * - * @param itemInfo The PurchaseInfo that represents the item to consume. - * @throws IabException if there is a problem during consumption. - */ - void consume(Purchase itemInfo) throws IabException { - checkNotDisposed(); - checkSetupDone("consume"); - - if (!itemInfo.mItemType.equals(ITEM_TYPE_INAPP)) { - throw new IabException(IABHELPER_INVALID_CONSUMPTION, - "Items of type '" + itemInfo.mItemType + "' can't be consumed."); - } - - try { - String token = itemInfo.getToken(); - String sku = itemInfo.getSku(); - if (token == null || token.equals("")) { - logError("Can't consume "+ sku + ". No token."); - throw new IabException(IABHELPER_MISSING_TOKEN, "PurchaseInfo is missing token for sku: " - + sku + " " + itemInfo); - } - - logDebug("Consuming sku: " + sku + ", token: " + token); - int response = mService.consumePurchase(3, mContext.getPackageName(), token); - if (response == BILLING_RESPONSE_RESULT_OK) { - logDebug("Successfully consumed sku: " + sku); - } - else { - logDebug("Error consuming consuming sku " + sku + ". " + getResponseDesc(response)); - throw new IabException(response, "Error consuming sku " + sku); - } - } - catch (RemoteException e) { - throw new IabException(IABHELPER_REMOTE_EXCEPTION, "Remote exception while consuming. PurchaseInfo: " + itemInfo, e); - } - } - - /** - * Callback that notifies when a consumption operation finishes. - */ - public interface OnConsumeFinishedListener { - /** - * Called to notify that a consumption has finished. - * - * @param purchase The purchase that was (or was to be) consumed. - * @param result The result of the consumption operation. - */ - public void onConsumeFinished(Purchase purchase, IabResult result); - } - - /** - * Callback that notifies when a multi-item consumption operation finishes. - */ - public interface OnConsumeMultiFinishedListener { - /** - * Called to notify that a consumption of multiple items has finished. - * - * @param purchases The purchases that were (or were to be) consumed. - * @param results The results of each consumption operation, corresponding to each - * sku. - */ - public void onConsumeMultiFinished(List<Purchase> purchases, List<IabResult> results); - } - - /** - * Asynchronous wrapper to item consumption. Works like {@link #consume}, but - * performs the consumption in the background and notifies completion through - * the provided listener. This method is safe to call from a UI thread. - * - * @param purchase The purchase to be consumed. - * @param listener The listener to notify when the consumption operation finishes. - */ - public void consumeAsync(Purchase purchase, OnConsumeFinishedListener listener) { - checkNotDisposed(); - checkSetupDone("consume"); - List<Purchase> purchases = new ArrayList<>(); - purchases.add(purchase); - consumeAsyncInternal(purchases, listener, null); - } - - /** - * Same as {@link consumeAsync}, but for multiple items at once. - * @param purchases The list of PurchaseInfo objects representing the purchases to consume. - * @param listener The listener to notify when the consumption operation finishes. - */ - public void consumeAsync(List<Purchase> purchases, OnConsumeMultiFinishedListener listener) { - checkNotDisposed(); - checkSetupDone("consume"); - consumeAsyncInternal(purchases, null, listener); - } - - /** - * Returns a human-readable description for the given response code. - * - * @param code The response code - * @return A human-readable string explaining the result code. - * It also includes the result code numerically. - */ - public static String getResponseDesc(int code) { - String[] iab_msgs = ("0:OK/1:User Canceled/2:Unknown/" + - "3:Billing Unavailable/4:Item unavailable/" + - "5:Developer Error/6:Error/7:Item Already Owned/" + - "8:Item not owned").split("/"); - String[] iabhelper_msgs = ("0:OK/-1001:Remote exception during initialization/" + - "-1002:Bad response received/" + - "-1003:Purchase signature verification failed/" + - "-1004:Send intent failed/" + - "-1005:User cancelled/" + - "-1006:Unknown purchase response/" + - "-1007:Missing token/" + - "-1008:Unknown error/" + - "-1009:Subscriptions not available/" + - "-1010:Invalid consumption attempt").split("/"); - - if (code <= IABHELPER_ERROR_BASE) { - int index = IABHELPER_ERROR_BASE - code; - if (index >= 0 && index < iabhelper_msgs.length) return iabhelper_msgs[index]; - else return String.valueOf(code) + ":Unknown IAB Helper Error"; - } - else if (code < 0 || code >= iab_msgs.length) - return String.valueOf(code) + ":Unknown"; - else - return iab_msgs[code]; - } - - - // Checks that setup was done; if not, throws an exception. - void checkSetupDone(String operation) { - if (!mSetupDone) { - logError("Illegal state for operation (" + operation + "): IAB helper is not set up."); - throw new IllegalStateException("IAB helper is not set up. Can't perform operation: " + operation); - } - } - - // Workaround to bug where sometimes response codes come as Long instead of Integer - int getResponseCodeFromBundle(Bundle b) { - Object o = b.get(RESPONSE_CODE); - if (o == null) { - logDebug("Bundle with null response code, assuming OK (known issue)"); - return BILLING_RESPONSE_RESULT_OK; - } - else if (o instanceof Integer) return ((Integer)o).intValue(); - else if (o instanceof Long) return (int)((Long)o).longValue(); - else { - logError("Unexpected type for bundle response code."); - logError(o.getClass().getName()); - throw new RuntimeException("Unexpected type for bundle response code: " + o.getClass().getName()); - } - } - - // Workaround to bug where sometimes response codes come as Long instead of Integer - int getResponseCodeFromIntent(Intent i) { - Object o = i.getExtras().get(RESPONSE_CODE); - if (o == null) { - logError("Intent with no response code, assuming OK (known issue)"); - return BILLING_RESPONSE_RESULT_OK; - } - else if (o instanceof Integer) return ((Integer)o).intValue(); - else if (o instanceof Long) return (int)((Long)o).longValue(); - else { - logError("Unexpected type for intent response code."); - logError(o.getClass().getName()); - throw new RuntimeException("Unexpected type for intent response code: " + o.getClass().getName()); - } - } - - public void flagStartAsync(String operation) { - if (mAsyncInProgress) throw new IllegalStateException("Can't start async operation (" + - operation + ") because another async operation(" + mAsyncOperation + ") is in progress."); - mAsyncOperation = operation; - mAsyncInProgress = true; - logDebug("Starting async operation: " + operation); - } - - public void flagEndAsync() { - logDebug("Ending async operation: " + mAsyncOperation); - mAsyncOperation = ""; - mAsyncInProgress = false; - } - - - int queryPurchases(Inventory inv, String itemType) throws JSONException, RemoteException { - // Query purchases - logDebug("Querying owned items, item type: " + itemType); - logDebug("Package name: " + mContext.getPackageName()); - boolean verificationFailed = false; - String continueToken = null; - - do { - logDebug("Calling getPurchases with continuation token: " + continueToken); - Bundle ownedItems = mService.getPurchases(3, mContext.getPackageName(), - itemType, continueToken); - - int response = getResponseCodeFromBundle(ownedItems); - logDebug("Owned items response: " + String.valueOf(response)); - if (response != BILLING_RESPONSE_RESULT_OK) { - logDebug("getPurchases() failed: " + getResponseDesc(response)); - return response; - } - if (!ownedItems.containsKey(RESPONSE_INAPP_ITEM_LIST) - || !ownedItems.containsKey(RESPONSE_INAPP_PURCHASE_DATA_LIST) - || !ownedItems.containsKey(RESPONSE_INAPP_SIGNATURE_LIST)) { - logError("Bundle returned from getPurchases() doesn't contain required fields."); - return IABHELPER_BAD_RESPONSE; - } - - ArrayList<String> ownedSkus = ownedItems.getStringArrayList( - RESPONSE_INAPP_ITEM_LIST); - ArrayList<String> purchaseDataList = ownedItems.getStringArrayList( - RESPONSE_INAPP_PURCHASE_DATA_LIST); - ArrayList<String> signatureList = ownedItems.getStringArrayList( - RESPONSE_INAPP_SIGNATURE_LIST); - - for (int i = 0; i < purchaseDataList.size(); ++i) { - String purchaseData = purchaseDataList.get(i); - String signature = signatureList.get(i); - String sku = ownedSkus.get(i); - if (Security.verifyPurchase(mSignatureBase64, purchaseData, signature)) { - logDebug("Sku is owned: " + sku); - Purchase purchase = new Purchase(itemType, purchaseData, signature); - - if (TextUtils.isEmpty(purchase.getToken())) { - logWarn("BUG: empty/null token!"); - logDebug("Purchase data: " + purchaseData); - } - - // Record ownership and token - inv.addPurchase(purchase); - } - else { - logWarn("Purchase signature verification **FAILED**. Not adding item."); - logDebug(" Purchase data: " + purchaseData); - logDebug(" Signature: " + signature); - verificationFailed = true; - } - } - - continueToken = ownedItems.getString(INAPP_CONTINUATION_TOKEN); - logDebug("Continuation token: " + continueToken); - } while (!TextUtils.isEmpty(continueToken)); - - return verificationFailed ? IABHELPER_VERIFICATION_FAILED : BILLING_RESPONSE_RESULT_OK; - } - - int querySkuDetails(String itemType, Inventory inv, List<String> moreSkus) - throws RemoteException, JSONException { - logDebug("Querying SKU details."); - ArrayList<String> skuList = new ArrayList<>(); - skuList.addAll(inv.getAllOwnedSkus(itemType)); - if (moreSkus != null) { - for (String sku : moreSkus) { - if (!skuList.contains(sku)) { - skuList.add(sku); - } - } - } - - if (skuList.isEmpty()) { - logDebug("queryPrices: nothing to do because there are no SKUs."); - return BILLING_RESPONSE_RESULT_OK; - } - - Bundle querySkus = new Bundle(); - querySkus.putStringArrayList(GET_SKU_DETAILS_ITEM_LIST, skuList); - Bundle skuDetails = mService.getSkuDetails(3, mContext.getPackageName(), - itemType, querySkus); - - if (!skuDetails.containsKey(RESPONSE_GET_SKU_DETAILS_LIST)) { - int response = getResponseCodeFromBundle(skuDetails); - if (response != BILLING_RESPONSE_RESULT_OK) { - logDebug("getSkuDetails() failed: " + getResponseDesc(response)); - return response; - } - else { - logError("getSkuDetails() returned a bundle with neither an error nor a detail list."); - return IABHELPER_BAD_RESPONSE; - } - } - - ArrayList<String> responseList = skuDetails.getStringArrayList( - RESPONSE_GET_SKU_DETAILS_LIST); - - for (String thisResponse : responseList) { - SkuDetails d = new SkuDetails(itemType, thisResponse); - logDebug("Got sku details: " + d); - inv.addSkuDetails(d); - } - return BILLING_RESPONSE_RESULT_OK; - } - - - void consumeAsyncInternal(final List<Purchase> purchases, - final OnConsumeFinishedListener singleListener, - final OnConsumeMultiFinishedListener multiListener) { - final Handler handler = new Handler(); - flagStartAsync("consume"); - (new Thread(new Runnable() { - @Override - public void run() { - final List<IabResult> results = new ArrayList<>(); - for (Purchase purchase : purchases) { - try { - consume(purchase); - results.add(new IabResult(BILLING_RESPONSE_RESULT_OK, "Successful consume of sku " + purchase.getSku())); - } - catch (IabException ex) { - results.add(ex.getResult()); - } - } - - flagEndAsync(); - if (!mDisposed && singleListener != null) { - handler.post(new Runnable() { - @Override - public void run() { - singleListener.onConsumeFinished(purchases.get(0), results.get(0)); - } - }); - } - if (!mDisposed && multiListener != null) { - handler.post(new Runnable() { - @Override - public void run() { - multiListener.onConsumeMultiFinished(purchases, results); - } - }); - } - } - })).start(); - } - - void logDebug(String msg) { - if (mDebugLog) Log.d(mDebugTag, msg); - } - - void logError(String msg) { - Log.e(mDebugTag, "In-app billing error: " + msg); - } - - void logWarn(String msg) { - Log.w(mDebugTag, "In-app billing warning: " + msg); - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/external/iab/IabResult.java b/QKSMS/src/main/java/com/moez/QKSMS/external/iab/IabResult.java deleted file mode 100644 index 0d39be8de..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/external/iab/IabResult.java +++ /dev/null @@ -1,45 +0,0 @@ -/* Copyright (c) 2012 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.moez.QKSMS.external.iab; - -/** - * Represents the result of an in-app billing operation. - * A result is composed of a response code (an integer) and possibly a - * message (String). You can get those by calling - * {@link #getResponse} and {@link #getMessage()}, respectively. You - * can also inquire whether a result is a success or a failure by - * calling {@link #isSuccess()} and {@link #isFailure()}. - */ -public class IabResult { - int mResponse; - String mMessage; - - public IabResult(int response, String message) { - mResponse = response; - if (message == null || message.trim().length() == 0) { - mMessage = IabHelper.getResponseDesc(response); - } - else { - mMessage = message + " (response: " + IabHelper.getResponseDesc(response) + ")"; - } - } - public int getResponse() { return mResponse; } - public String getMessage() { return mMessage; } - public boolean isSuccess() { return mResponse == IabHelper.BILLING_RESPONSE_RESULT_OK; } - public boolean isFailure() { return !isSuccess(); } - public String toString() { return "IabResult: " + getMessage(); } -} - diff --git a/QKSMS/src/main/java/com/moez/QKSMS/external/iab/Inventory.java b/QKSMS/src/main/java/com/moez/QKSMS/external/iab/Inventory.java deleted file mode 100644 index 2a8062ac5..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/external/iab/Inventory.java +++ /dev/null @@ -1,91 +0,0 @@ -/* Copyright (c) 2012 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.moez.QKSMS.external.iab; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * Represents a block of information about in-app items. - * An Inventory is returned by such methods as {@link IabHelper#queryInventory}. - */ -public class Inventory { - Map<String,SkuDetails> mSkuMap = new HashMap<>(); - Map<String,Purchase> mPurchaseMap = new HashMap<>(); - - Inventory() { } - - /** Returns the listing details for an in-app product. */ - public SkuDetails getSkuDetails(String sku) { - return mSkuMap.get(sku); - } - - /** Returns purchase information for a given product, or null if there is no purchase. */ - public Purchase getPurchase(String sku) { - return mPurchaseMap.get(sku); - } - - /** Returns whether or not there exists a purchase of the given product. */ - public boolean hasPurchase(String sku) { - return mPurchaseMap.containsKey(sku); - } - - /** Return whether or not details about the given product are available. */ - public boolean hasDetails(String sku) { - return mSkuMap.containsKey(sku); - } - - /** - * Erase a purchase (locally) from the inventory, given its product ID. This just - * modifies the Inventory object locally and has no effect on the server! This is - * useful when you have an existing Inventory object which you know to be up to date, - * and you have just consumed an item successfully, which means that erasing its - * purchase data from the Inventory you already have is quicker than querying for - * a new Inventory. - */ - public void erasePurchase(String sku) { - if (mPurchaseMap.containsKey(sku)) mPurchaseMap.remove(sku); - } - - /** Returns a list of all owned product IDs. */ - List<String> getAllOwnedSkus() { - return new ArrayList<String>(mPurchaseMap.keySet()); - } - - /** Returns a list of all owned product IDs of a given type */ - List<String> getAllOwnedSkus(String itemType) { - List<String> result = new ArrayList<>(); - for (Purchase p : mPurchaseMap.values()) { - if (p.getItemType().equals(itemType)) result.add(p.getSku()); - } - return result; - } - - /** Returns a list of all purchases. */ - List<Purchase> getAllPurchases() { - return new ArrayList<Purchase>(mPurchaseMap.values()); - } - - void addSkuDetails(SkuDetails d) { - mSkuMap.put(d.getSku(), d); - } - - void addPurchase(Purchase p) { - mPurchaseMap.put(p.getSku(), p); - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/external/iab/Purchase.java b/QKSMS/src/main/java/com/moez/QKSMS/external/iab/Purchase.java deleted file mode 100644 index 3f61b66bc..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/external/iab/Purchase.java +++ /dev/null @@ -1,63 +0,0 @@ -/* Copyright (c) 2012 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.moez.QKSMS.external.iab; - -import org.json.JSONException; -import org.json.JSONObject; - -/** - * Represents an in-app billing purchase. - */ -public class Purchase { - String mItemType; // ITEM_TYPE_INAPP or ITEM_TYPE_SUBS - String mOrderId; - String mPackageName; - String mSku; - long mPurchaseTime; - int mPurchaseState; - String mDeveloperPayload; - String mToken; - String mOriginalJson; - String mSignature; - - public Purchase(String itemType, String jsonPurchaseInfo, String signature) throws JSONException { - mItemType = itemType; - mOriginalJson = jsonPurchaseInfo; - JSONObject o = new JSONObject(mOriginalJson); - mOrderId = o.optString("orderId"); - mPackageName = o.optString("packageName"); - mSku = o.optString("productId"); - mPurchaseTime = o.optLong("purchaseTime"); - mPurchaseState = o.optInt("purchaseState"); - mDeveloperPayload = o.optString("developerPayload"); - mToken = o.optString("token", o.optString("purchaseToken")); - mSignature = signature; - } - - public String getItemType() { return mItemType; } - public String getOrderId() { return mOrderId; } - public String getPackageName() { return mPackageName; } - public String getSku() { return mSku; } - public long getPurchaseTime() { return mPurchaseTime; } - public int getPurchaseState() { return mPurchaseState; } - public String getDeveloperPayload() { return mDeveloperPayload; } - public String getToken() { return mToken; } - public String getOriginalJson() { return mOriginalJson; } - public String getSignature() { return mSignature; } - - @Override - public String toString() { return "PurchaseInfo(type:" + mItemType + "):" + mOriginalJson; } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/external/iab/Security.java b/QKSMS/src/main/java/com/moez/QKSMS/external/iab/Security.java deleted file mode 100644 index f6f78efd1..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/external/iab/Security.java +++ /dev/null @@ -1,119 +0,0 @@ -/* Copyright (c) 2012 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.moez.QKSMS.external.iab; - -import android.text.TextUtils; -import android.util.Log; - -import java.security.InvalidKeyException; -import java.security.KeyFactory; -import java.security.NoSuchAlgorithmException; -import java.security.PublicKey; -import java.security.Signature; -import java.security.SignatureException; -import java.security.spec.InvalidKeySpecException; -import java.security.spec.X509EncodedKeySpec; - -/** - * Security-related methods. For a secure implementation, all of this code - * should be implemented on a server that communicates with the - * application on the device. For the sake of simplicity and clarity of this - * example, this code is included here and is executed on the device. If you - * must verify the purchases on the phone, you should obfuscate this code to - * make it harder for an attacker to replace the code with stubs that treat all - * purchases as verified. - */ -public class Security { - private static final String TAG = "IABUtil/Security"; - - private static final String KEY_FACTORY_ALGORITHM = "RSA"; - private static final String SIGNATURE_ALGORITHM = "SHA1withRSA"; - - /** - * Verifies that the data was signed with the given signature, and returns - * the verified purchase. The data is in JSON format and signed - * with a private key. The data also contains the {@link PurchaseState} - * and product ID of the purchase. - * @param base64PublicKey the base64-encoded public key to use for verifying. - * @param signedData the signed JSON string (signed, not encrypted) - * @param signature the signature for the data, signed with the private key - */ - public static boolean verifyPurchase(String base64PublicKey, String signedData, String signature) { - if (TextUtils.isEmpty(signedData) || TextUtils.isEmpty(base64PublicKey) || - TextUtils.isEmpty(signature)) { - Log.e(TAG, "Purchase verification failed: missing data."); - return false; - } - - PublicKey key = Security.generatePublicKey(base64PublicKey); - return Security.verify(key, signedData, signature); - } - - /** - * Generates a PublicKey instance from a string containing the - * Base64-encoded public key. - * - * @param encodedPublicKey Base64-encoded public key - * @throws IllegalArgumentException if encodedPublicKey is invalid - */ - public static PublicKey generatePublicKey(String encodedPublicKey) { - try { - byte[] decodedKey = Base64.decode(encodedPublicKey); - KeyFactory keyFactory = KeyFactory.getInstance(KEY_FACTORY_ALGORITHM); - return keyFactory.generatePublic(new X509EncodedKeySpec(decodedKey)); - } catch (NoSuchAlgorithmException e) { - throw new RuntimeException(e); - } catch (InvalidKeySpecException e) { - Log.e(TAG, "Invalid key specification."); - throw new IllegalArgumentException(e); - } catch (Base64DecoderException e) { - Log.e(TAG, "Base64 decoding failed."); - throw new IllegalArgumentException(e); - } - } - - /** - * Verifies that the signature from the server matches the computed - * signature on the data. Returns true if the data is correctly signed. - * - * @param publicKey public key associated with the developer account - * @param signedData signed data from server - * @param signature server signature - * @return true if the data and signature match - */ - public static boolean verify(PublicKey publicKey, String signedData, String signature) { - Signature sig; - try { - sig = Signature.getInstance(SIGNATURE_ALGORITHM); - sig.initVerify(publicKey); - sig.update(signedData.getBytes()); - if (!sig.verify(Base64.decode(signature))) { - Log.e(TAG, "Signature verification failed."); - return false; - } - return true; - } catch (NoSuchAlgorithmException e) { - Log.e(TAG, "NoSuchAlgorithmException."); - } catch (InvalidKeyException e) { - Log.e(TAG, "Invalid key specification."); - } catch (SignatureException e) { - Log.e(TAG, "Signature exception."); - } catch (Base64DecoderException e) { - Log.e(TAG, "Base64 decoding failed."); - } - return false; - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/external/iab/SkuDetails.java b/QKSMS/src/main/java/com/moez/QKSMS/external/iab/SkuDetails.java deleted file mode 100644 index d6417cd01..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/external/iab/SkuDetails.java +++ /dev/null @@ -1,58 +0,0 @@ -/* Copyright (c) 2012 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.moez.QKSMS.external.iab; - -import org.json.JSONException; -import org.json.JSONObject; - -/** - * Represents an in-app product's listing details. - */ -public class SkuDetails { - String mItemType; - String mSku; - String mType; - String mPrice; - String mTitle; - String mDescription; - String mJson; - - public SkuDetails(String jsonSkuDetails) throws JSONException { - this(IabHelper.ITEM_TYPE_INAPP, jsonSkuDetails); - } - - public SkuDetails(String itemType, String jsonSkuDetails) throws JSONException { - mItemType = itemType; - mJson = jsonSkuDetails; - JSONObject o = new JSONObject(mJson); - mSku = o.optString("productId"); - mType = o.optString("type"); - mPrice = o.optString("price"); - mTitle = o.optString("title"); - mDescription = o.optString("description"); - } - - public String getSku() { return mSku; } - public String getType() { return mType; } - public String getPrice() { return mPrice; } - public String getTitle() { return mTitle; } - public String getDescription() { return mDescription; } - - @Override - public String toString() { - return "SkuDetails:" + mJson; - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/interfaces/ActivityLauncher.java b/QKSMS/src/main/java/com/moez/QKSMS/interfaces/ActivityLauncher.java deleted file mode 100644 index ef8f4ea4d..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/interfaces/ActivityLauncher.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.moez.QKSMS.interfaces; - -import android.content.Intent; - -/** - * An interface for launching activities for results. - */ -public interface ActivityLauncher { - public void startActivityForResult(Intent request, int requestCode); - public void onActivityResult(int requestCode, int resultCode, Intent data); -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/interfaces/AdaptableSlideViewInterface.java b/QKSMS/src/main/java/com/moez/QKSMS/interfaces/AdaptableSlideViewInterface.java deleted file mode 100644 index fd9075361..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/interfaces/AdaptableSlideViewInterface.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (C) 2008 Esmertec AG. - * Copyright (C) 2008 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.moez.QKSMS.interfaces; - -/** - * The view interface of a slide which elements can be resize. - */ -public interface AdaptableSlideViewInterface extends SlideViewInterface { - /** - * Set the display region of the text view. - */ - void setTextRegion(int left, int top, int width, int height); - /** - * Set the display region of the image view. - */ - void setImageRegion(int left, int top, int width, int height); - /** - * Set the display region of the video view. - */ - void setVideoRegion(int left, int top, int width, int height); - /** - * Set the listener which will be triggered when the size of - * the view is changed. - */ - void setOnSizeChangedListener(OnSizeChangedListener l); - - public interface OnSizeChangedListener { - void onSizeChanged(int width, int height); - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/interfaces/ConversationDetails.java b/QKSMS/src/main/java/com/moez/QKSMS/interfaces/ConversationDetails.java deleted file mode 100644 index 77aeddb1c..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/interfaces/ConversationDetails.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.moez.QKSMS.interfaces; - -import com.moez.QKSMS.data.Conversation; - -public interface ConversationDetails { - void showDetails(Conversation c); -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/interfaces/LiveView.java b/QKSMS/src/main/java/com/moez/QKSMS/interfaces/LiveView.java deleted file mode 100644 index e9f85de27..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/interfaces/LiveView.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.moez.QKSMS.interfaces; - -public interface LiveView { - void refresh(String key); -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/interfaces/RecipientProvider.java b/QKSMS/src/main/java/com/moez/QKSMS/interfaces/RecipientProvider.java deleted file mode 100644 index ef8270ac7..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/interfaces/RecipientProvider.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.moez.QKSMS.interfaces; - -public interface RecipientProvider { - public String[] getRecipientAddresses(); -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/interfaces/SlideViewInterface.java b/QKSMS/src/main/java/com/moez/QKSMS/interfaces/SlideViewInterface.java deleted file mode 100644 index b2d5c7be0..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/interfaces/SlideViewInterface.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (C) 2008 Esmertec AG. - * Copyright (C) 2008 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.moez.QKSMS.interfaces; - -import android.graphics.Bitmap; -import android.net.Uri; - -import java.util.Map; - -/** - * Defines the interfaces of the view to show contents of a slide. - */ -public interface SlideViewInterface extends ViewInterface { - void setImage(String name, Bitmap bitmap); - void setImageRegionFit(String fit); - void setImageVisibility(boolean visible); - - void setVideo(String name, Uri video); - void setVideoThumbnail(String name, Bitmap bitmap); - void setVideoVisibility(boolean visible); - void startVideo(); - void stopVideo(); - void pauseVideo(); - void seekVideo(int seekTo); - - void setAudio(Uri audio, String name, Map<String, ?> extras); - void startAudio(); - void stopAudio(); - void pauseAudio(); - void seekAudio(int seekTo); - - void setText(String name, String text); - void setTextVisibility(boolean visible); -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/interfaces/ViewInterface.java b/QKSMS/src/main/java/com/moez/QKSMS/interfaces/ViewInterface.java deleted file mode 100644 index edbb2944e..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/interfaces/ViewInterface.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (C) 2008 Esmertec AG. - * Copyright (C) 2008 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.moez.QKSMS.interfaces; - -/** - * Top-level interfaces of views. - */ -public interface ViewInterface { - /** - * Get the width of the View object. - */ - int getWidth(); - /** - * Get the height of the View object. - */ - int getHeight(); - /** - * Reset the view (for next presentation). - */ - void reset(); - /** - * Set the visibility of the View object. - */ - void setVisibility(boolean visible); -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/mmssms/Apn.java b/QKSMS/src/main/java/com/moez/QKSMS/mmssms/Apn.java deleted file mode 100644 index 9f7bde732..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/mmssms/Apn.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (C) 2015 QK Labs - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.moez.QKSMS.mmssms; - -/** - * @author shane - */ -public class Apn { - public String name; - public String mmsc; - public String proxy; - public String port; - - public Apn() { - } - - public Apn(String name, String mmsc, String proxy, String port) { - this.name = name; - this.mmsc = mmsc; - this.proxy = proxy; - this.port = port; - } - - @Override - public boolean equals(Object other) { - if (other == null || !(other instanceof Apn)) { - return false; - } else { - Apn apn = (Apn) other; - return (apn.name == null ? name == null : apn.name.equals(name)) - && (apn.mmsc == null ? mmsc == null : apn.mmsc.equals(mmsc)) - && (apn.proxy == null ? proxy == null : apn.proxy.equals(proxy)) - && (apn.port == null ? port == null : apn.port.equals(port)); - } - } - - @Override - public int hashCode() { - // http://stackoverflow.com/questions/113511/hash-code-implementation - int result = 7; - result = 37 * result + (name == null ? 0 : name.hashCode()); - result = 37 * result + (mmsc == null ? 0 : mmsc.hashCode()); - result = 37 * result + (proxy == null ? 0 : proxy.hashCode()); - result = 37 * result + (port == null ? 0 : port.hashCode()); - return result; - } - - @Override - public String toString() { - return String.format("{name:%s, mmsc:%s, proxy:%s, port:%s}", name, mmsc, proxy, port); - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/mmssms/ApnUtils.java b/QKSMS/src/main/java/com/moez/QKSMS/mmssms/ApnUtils.java deleted file mode 100644 index 3c5d56bda..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/mmssms/ApnUtils.java +++ /dev/null @@ -1,200 +0,0 @@ -/* - * Copyright (C) 2015 QK Labs - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.moez.QKSMS.mmssms; - -import android.content.Context; -import android.content.res.XmlResourceParser; -import android.preference.PreferenceManager; -import android.telephony.TelephonyManager; -import android.text.TextUtils; -import android.util.Log; -import com.moez.QKSMS.R; -import org.xmlpull.v1.XmlPullParser; -import org.xmlpull.v1.XmlPullParserException; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -public class ApnUtils { - @SuppressWarnings("unused") - private static final String TAG = "ApnUtils"; - @SuppressWarnings("unused") - private static final boolean LOCAL_LOGV = false; - - public static String[] getSimOperatorCodes(Context context) { - TelephonyManager telephonyManager = (TelephonyManager) - context.getSystemService(Context.TELEPHONY_SERVICE); - String simOperator = telephonyManager.getSimOperator(); - String[] mccmnc = new String[]{ null, null }; - if (!TextUtils.isEmpty(simOperator)) { - mccmnc[0] = simOperator.substring(0, 3); - mccmnc[1] = simOperator.substring(3); - } - return mccmnc; - } - - public static String[] getNetworkOperatorCodes(Context context) { - TelephonyManager telephonyManager = (TelephonyManager) - context.getSystemService(Context.TELEPHONY_SERVICE); - String simOperator = telephonyManager.getNetworkOperator(); - String[] mccmnc = new String[]{ null, null }; - if (!TextUtils.isEmpty(simOperator)) { - mccmnc[0] = simOperator.substring(0, 3); - mccmnc[1] = simOperator.substring(3); - } - return mccmnc; - } - - /** - * Query for apns using mcc and mnc codes found on the sim card or in the network settings. - * - * @param context context - */ - public static List<Apn> query(Context context) { - String[] simCodes = getSimOperatorCodes(context); - String[] networkCodes = getNetworkOperatorCodes(context); - - Set<Apn> resultSet = new HashSet<>(); - resultSet.addAll(query(context, simCodes[0], simCodes[1])); - resultSet.addAll(query(context, networkCodes[0], networkCodes[1])); - - List<Apn> result = new ArrayList<>(resultSet.size()); - result.addAll(resultSet); - return result; - } - - /** - * Query for apns using mcc and mnc codes found on the sim card or in the network settings. - * - * @param mcc mobile country code - * @param mnc mobile network code - * @param context context - */ - @SuppressWarnings("TryFinallyCanBeTryWithResources") - public static List<Apn> query(Context context, String mcc, String mnc) { - ArrayList<Apn> result = new ArrayList<>(); - - if (TextUtils.isEmpty(mcc) || TextUtils.isEmpty(mnc)) { - Log.e(TAG, "Invalid mcc or mnc. {mcc:\"" + mcc + "\", mnc=\"" + mnc + "\"}"); - return result; - } - - // Scan the apns master list to identify compatible APNs. - XmlResourceParser parser = context.getResources().getXml(R.xml.apns); - try { - int eventType = parser.getEventType(); - while (eventType != XmlPullParser.END_DOCUMENT) { - if (isAPNStartTag(parser) && matches(parser, mcc, mnc)) { - Apn apn = apnFromParser(parser); - // Don't return duplicates! - if (!result.contains(apn)) { - result.add(apn); - } - } - - eventType = parser.next(); - } - } catch (XmlPullParserException|IOException e) { - Log.e(TAG, "Exception thrown while getting APNs", e); - } finally { - parser.close(); - } - - return result; - } - - /** - * Searches the attributes of this tag to determine if - * - * 1) this is an mms apn tag; and - * 2) the mcc and mnc match - */ - private static boolean matches(XmlPullParser parser, String mcc, String mnc) { - boolean mccMatches = false; - boolean mncMatches = false; - boolean isMMSType = false; - for (int i = 0; i < parser.getAttributeCount(); i++) { - String name = parser.getAttributeName(i); - String value = parser.getAttributeValue(i); - if ("mcc".equals(name) && mcc.equals(value)) { - mccMatches = true; - } else if ("mnc".equals(name) && mnc.equals(value)) { - mncMatches = true; - } else if ("type".equals(name) && - !TextUtils.isEmpty(value) && value.contains("mms")) { - isMMSType = true; - } - } - return mccMatches && mncMatches && isMMSType; - } - - private static Apn apnFromParser(XmlPullParser parser) { - Apn apn = new Apn(); - String port = null; - for (int i = 0; i < parser.getAttributeCount(); i++) { - String name = parser.getAttributeName(i); - String value = parser.getAttributeValue(i); - switch (name) { - case "mmsc": - apn.mmsc = value; - break; - case "mmsproxy": - apn.proxy = value; - break; - case "mmsport": - apn.port = value; - break; - case "carrier": - apn.name = value; - break; - case "port": - port = value; - break; - } - } - - // Some apn listings don't use the mmsport attribute, but rather the port - // attribute. - // grep ' type=".*mms.*"' apns.xml | grep -v 'mmsport' | grep 'port' - if (TextUtils.isEmpty(apn.port)) { - apn.port = port; - } - return apn; - } - - private static boolean isAPNStartTag(XmlPullParser parser) throws XmlPullParserException { - return XmlPullParser.START_TAG == parser.getEventType() - && "apn".equals(parser.getName()); - } - - /** - * Saves the APN information to SharedPreferences. - * - * @param context context - * @param apn the apn to save - */ - public static void persistApn(Context context, Apn apn) { - PreferenceManager.getDefaultSharedPreferences(context) - .edit() - .putString("mmsc_url", apn.mmsc) - .putString("mms_proxy", apn.proxy) - .putString("mms_port", apn.port) - .apply(); - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/mmssms/DeliveredReceiver.java b/QKSMS/src/main/java/com/moez/QKSMS/mmssms/DeliveredReceiver.java deleted file mode 100644 index 036a721dc..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/mmssms/DeliveredReceiver.java +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Copyright (C) 2015 QK Labs - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.moez.QKSMS.mmssms; - -import android.app.Activity; -import android.content.BroadcastReceiver; -import android.content.ContentValues; -import android.content.Context; -import android.content.Intent; -import android.database.Cursor; -import android.net.Uri; -import android.util.Log; - -import java.util.Calendar; - -public class DeliveredReceiver extends BroadcastReceiver { - private static final String TAG = "DeliveredReceiver"; - private static final boolean LOCAL_LOGV = false; - - @Override - public void onReceive(Context context, Intent intent) { - if (LOCAL_LOGV) Log.v(TAG, "marking message as delivered"); - Uri uri; - - try { - uri = Uri.parse(intent.getStringExtra("message_uri")); - - if (uri.equals("")) { - uri = null; - } - } catch (Exception e) { - uri = null; - } - - switch (getResultCode()) { - case Activity.RESULT_OK: - // notify user that message was delivered - Intent delivered = new Intent(Transaction.NOTIFY_OF_DELIVERY); - delivered.putExtra("result", true); - delivered.putExtra("message_uri", uri == null ? "" : uri.toString()); - context.sendBroadcast(delivered); - - if (uri != null) { - ContentValues values = new ContentValues(); - values.put("status", "0"); - values.put("date_sent", Calendar.getInstance().getTimeInMillis()); - values.put("read", true); - context.getContentResolver().update(uri, values, null, null); - } else { - Cursor query = context.getContentResolver().query(Uri.parse("content://sms/sent"), null, null, null, "date desc"); - - // mark message as delivered in database - if (query.moveToFirst()) { - String id = query.getString(query.getColumnIndex("_id")); - ContentValues values = new ContentValues(); - values.put("status", "0"); - values.put("date_sent", Calendar.getInstance().getTimeInMillis()); - values.put("read", true); - context.getContentResolver().update(Uri.parse("content://sms/sent"), values, "_id=" + id, null); - } - - query.close(); - } - - break; - case Activity.RESULT_CANCELED: - // notify user that message failed to be delivered - Intent notDelivered = new Intent(Transaction.NOTIFY_OF_DELIVERY); - notDelivered.putExtra("result", false); - notDelivered.putExtra("message_uri", uri == null ? "" : uri.toString()); - context.sendBroadcast(notDelivered); - - if (uri != null) { - ContentValues values = new ContentValues(); - values.put("status", "64"); - values.put("date_sent", Calendar.getInstance().getTimeInMillis()); - values.put("read", true); - values.put("error_code", getResultCode()); - context.getContentResolver().update(uri, values, null, null); - } else { - Cursor query2 = context.getContentResolver().query(Uri.parse("content://sms/sent"), null, null, null, "date desc"); - - // mark failed in database - if (query2.moveToFirst()) { - String id = query2.getString(query2.getColumnIndex("_id")); - ContentValues values = new ContentValues(); - values.put("status", "64"); - values.put("read", true); - values.put("error_code", getResultCode()); - context.getContentResolver().update(Uri.parse("content://sms/sent"), values, "_id=" + id, null); - } - - query2.close(); - } - break; - } - - context.sendBroadcast(new Intent("com.moez.QKSMS.send_message.REFRESH")); - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/mmssms/DisconnectWifi.java b/QKSMS/src/main/java/com/moez/QKSMS/mmssms/DisconnectWifi.java deleted file mode 100644 index f815ebaf2..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/mmssms/DisconnectWifi.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (C) 2015 QK Labs - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.moez.QKSMS.mmssms; - -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import android.net.wifi.SupplicantState; -import android.net.wifi.WifiManager; - -public class DisconnectWifi extends BroadcastReceiver { - - @Override - public void onReceive(Context c, Intent intent) { - // if wifi tries to connect while we are sending an MMS, disable it until that message is done sending - WifiManager wifi = (WifiManager) c.getSystemService(Context.WIFI_SERVICE); - if (!intent.getParcelableExtra(WifiManager.EXTRA_NEW_STATE).toString().equals(SupplicantState.SCANNING)) - wifi.disconnect(); - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/mmssms/Message.java b/QKSMS/src/main/java/com/moez/QKSMS/mmssms/Message.java deleted file mode 100644 index 2b7050dab..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/mmssms/Message.java +++ /dev/null @@ -1,496 +0,0 @@ -/* - * Copyright (C) 2015 QK Labs - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.moez.QKSMS.mmssms; - -import android.graphics.Bitmap; -import android.util.Log; - -import java.io.ByteArrayOutputStream; - -/** - * Class to hold all relevant message information to send - */ -public class Message { - private static final String TAG = "Message"; - private static final boolean LOCAL_LOGV = false; - - private String text; - private String subject; - private String[] addresses; - private Bitmap[] images; - private String[] imageNames; - private byte[] media; - private String mediaMimeType; - private boolean save; - private int type; - private int delay; - - /** - * Default send type, to be sent through SMS or MMS depending on contents - */ - public static final int TYPE_SMSMMS = 0; - - /** - * Google Voice send type - */ - public static final int TYPE_VOICE = 1; - - /** - * Default constructor - */ - public Message() { - this("", new String[]{""}); - } - - /** - * Constructor - * - * @param text is the message to send - * @param address is the phone number to send to - */ - public Message(String text, String address) { - this(text, address.trim().split(" ")); - } - - /** - * Constructor - * - * @param text is the message to send - * @param address is the phone number to send to - * @param subject is the subject of the mms message - */ - public Message(String text, String address, String subject) { - this(text, address.trim().split(" "), subject); - } - - /** - * Constructor - * - * @param text is the message to send - * @param addresses is an array of phone numbers to send to - */ - public Message(String text, String[] addresses) { - this.text = text; - this.addresses = addresses; - this.images = new Bitmap[0]; - this.subject = null; - this.media = new byte[0]; - this.mediaMimeType = null; - this.save = true; - this.type = TYPE_SMSMMS; - this.delay = 0; - } - - /** - * Constructor - * - * @param text is the message to send - * @param addresses is an array of phone numbers to send to - * @param subject is the subject of the mms message - */ - public Message(String text, String[] addresses, String subject) { - this.text = text; - this.addresses = addresses; - this.images = new Bitmap[0]; - this.subject = subject; - this.media = new byte[0]; - this.mediaMimeType = null; - this.save = true; - this.type = TYPE_SMSMMS; - this.delay = 0; - } - - /** - * Constructor - * - * @param text is the message to send - * @param address is the phone number to send to - * @param image is the image that you want to send - */ - public Message(String text, String address, Bitmap image) { - this(text, address.trim().split(" "), new Bitmap[]{image}); - } - - /** - * Constructor - * - * @param text is the message to send - * @param address is the phone number to send to - * @param image is the image that you want to send - * @param subject is the subject of the mms message - */ - public Message(String text, String address, Bitmap image, String subject) { - this(text, address.trim().split(" "), new Bitmap[]{image}, subject); - } - - /** - * Constructor - * - * @param text is the message to send - * @param addresses is an array of phone numbers to send to - * @param image is the image that you want to send - */ - public Message(String text, String[] addresses, Bitmap image) { - this(text, addresses, new Bitmap[]{image}); - } - - /** - * Constructor - * - * @param text is the message to send - * @param addresses is an array of phone numbers to send to - * @param image is the image that you want to send - * @param subject is the subject of the mms message - */ - public Message(String text, String[] addresses, Bitmap image, String subject) { - this(text, addresses, new Bitmap[]{image}, subject); - } - - /** - * Constructor - * - * @param text is the message to send - * @param address is the phone number to send to - * @param images is an array of images that you want to send - */ - public Message(String text, String address, Bitmap[] images) { - this(text, address.trim().split(" "), images); - } - - /** - * Constructor - * - * @param text is the message to send - * @param address is the phone number to send to - * @param images is an array of images that you want to send - * @param subject is the subject of the mms message - */ - public Message(String text, String address, Bitmap[] images, String subject) { - this(text, address.trim().split(" "), images, subject); - } - - /** - * Constructor - * - * @param text is the message to send - * @param addresses is an array of phone numbers to send to - * @param images is an array of images that you want to send - */ - public Message(String text, String[] addresses, Bitmap[] images) { - this.text = text; - this.addresses = addresses; - this.images = images; - this.subject = null; - this.media = new byte[0]; - this.mediaMimeType = null; - this.save = true; - this.type = TYPE_SMSMMS; - this.delay = 0; - } - - /** - * Constructor - * - * @param text is the message to send - * @param addresses is an array of phone numbers to send to - * @param images is an array of images that you want to send - * @param subject is the subject of the mms message - */ - public Message(String text, String[] addresses, Bitmap[] images, String subject) { - this.text = text; - this.addresses = addresses; - this.images = images; - this.subject = subject; - this.media = new byte[0]; - this.mediaMimeType = null; - this.save = true; - this.type = TYPE_SMSMMS; - this.delay = 0; - } - - /** - * Sets the message - * - * @param text is the string to set message to - */ - public void setText(String text) { - this.text = text; - } - - /** - * Sets recipients - * - * @param addresses is the array of recipients to send to - */ - public void setAddresses(String[] addresses) { - this.addresses = addresses; - } - - /** - * Sets single recipient - * - * @param address is the phone number of the recipient - */ - public void setAddress(String address) { - this.addresses = new String[1]; - this.addresses[0] = address; - } - - /** - * Sets images - * - * @param images is the array of images to send to recipient - */ - public void setImages(Bitmap[] images) { - this.images = images; - } - - /** - * Sets image names - * - * @param names - */ - public void setImageNames(String[] names) { - this.imageNames = names; - } - - /** - * Sets image - * - * @param image is the single image to send to recipient - */ - public void setImage(Bitmap image) { - this.images = new Bitmap[1]; - this.images[0] = image; - } - - /** - * Sets audio file - * - * @param audio is the single audio sample to send to recipient - */ - public void setAudio(byte[] audio) { - this.media = audio; - this.mediaMimeType = "audio/wav"; - } - - /** - * Sets video file - * - * @param video is the single video sample to send to recipient - */ - public void setVideo(byte[] video) { - this.media = video; - this.mediaMimeType = "video/3gpp"; - } - - /** - * Sets other media - * - * @param media is the media you want to send - * @param mimeType is the mimeType of the media - */ - public void setMedia(byte[] media, String mimeType) { - this.media = media; - this.mediaMimeType = mimeType; - } - - /** - * Sets the subject - * - * @param subject is the subject of the mms message - */ - public void setSubject(String subject) { - this.subject = subject; - } - - /** - * Sets whether or not to save a message to the database - * - * @param save is whether or not to save the message - */ - public void setSave(boolean save) { - this.save = save; - } - - /** - * Sets the time delay before sending a message - * NOTE: this is only applicable for SMS messages - * - * @param delay the time delay in milliseconds - */ - public void setDelay(int delay) { - this.delay = delay; - } - - /** - * Method to add another recipient to the object - * - * @param address is the string of the recipients phone number to add to end of recipients array - */ - public void addAddress(String address) { - String[] temp = this.addresses; - - if (temp == null) { - temp = new String[0]; - } - - this.addresses = new String[temp.length + 1]; - - for (int i = 0; i < temp.length; i++) { - this.addresses[i] = temp[i]; - } - - this.addresses[temp.length] = address; - } - - /** - * Add another image to the object - * - * @param image is the image that you want to add to the end of the bitmaps array - */ - public void addImage(Bitmap image) { - Bitmap[] temp = this.images; - - if (temp == null) { - temp = new Bitmap[0]; - } - - this.images = new Bitmap[temp.length + 1]; - - for (int i = 0; i < temp.length; i++) { - this.images[i] = temp[i]; - } - - this.images[temp.length] = image; - } - - /** - * Sets the type of the message, could be any type definied in Message, for example - * Message.TYPE_SMSMMS, Message.TYPE_VOICE, or Message.TYPE_FACEBOOK - * - * @param type the type of message to send - */ - public void setType(int type) { - this.type = type; - } - - /** - * Gets the text of the message to send - * - * @return the string of the message to send - */ - public String getText() { - return this.text; - } - - /** - * Gets the addresses of the message - * - * @return an array of strings with all of the addresses - */ - public String[] getAddresses() { - return this.addresses; - } - - /** - * Gets the images in the message - * - * @return an array of bitmaps with all of the images - */ - public Bitmap[] getImages() { - return this.images; - } - - /** - * Gets image names for the message - * - * @return - */ - public String[] getImageNames() { - return this.imageNames; - } - - /** - * Gets the audio sample in the message - * - * @return an array of bytes with audio information for the message - */ - public byte[] getMedia() { - return this.media; - } - - /** - * Gets the mimetype of the extra media (eg, audio or video) - * - * @return a string of the mimetype - */ - public String getMediaMimeType() { - return this.mediaMimeType; - } - - /** - * Gets the subject of the mms message - * - * @return a string with the subject of the message - */ - public String getSubject() { - return this.subject; - } - - /** - * Gets whether or not to save the message to the database - * - * @return a boolean of whether or not to save - */ - public boolean getSave() { - return this.save; - } - - /** - * Gets the time to delay before sending the message - * - * @return the delay time in milliseconds - */ - public int getDelay() { - return this.delay; - } - - /** - * Gets the type of message to be sent, see Message.TYPE_SMSMMS, Message.TYPE_FACEBOOK, or Message.TYPE_VOICE - * - * @return the type of the message - */ - public int getType() { return this.type; } - - /** - * Static method to convert a bitmap into a byte array to easily send it over http - * - * @param image is the image to convert - * @return a byte array of the image data - */ - public static byte[] bitmapToByteArray(Bitmap image) { - if (image == null) { - if (LOCAL_LOGV) Log.v(TAG, "image is null, returning byte array of size 0"); - return new byte[0]; - } - - ByteArrayOutputStream stream = new ByteArrayOutputStream(); - image.compress(Bitmap.CompressFormat.JPEG, 90, stream); - return stream.toByteArray(); - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/mmssms/SentReceiver.java b/QKSMS/src/main/java/com/moez/QKSMS/mmssms/SentReceiver.java deleted file mode 100644 index 157c66554..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/mmssms/SentReceiver.java +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Copyright (C) 2015 QK Labs - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.moez.QKSMS.mmssms; - -import android.app.Activity; -import android.content.BroadcastReceiver; -import android.content.ContentValues; -import android.content.Context; -import android.content.Intent; -import android.database.Cursor; -import android.net.Uri; -import android.telephony.SmsManager; -import android.util.Log; - -public class SentReceiver extends BroadcastReceiver { - private static final String TAG = "SentReceiver"; - private static final boolean LOCAL_LOGV = false; - - @Override - public void onReceive(Context context, Intent intent) { - if (LOCAL_LOGV) Log.v(TAG, "marking message as sent"); - Uri uri; - - try { - uri = Uri.parse(intent.getStringExtra("message_uri")); - - if (uri.equals("")) { - uri = null; - } - } catch (Exception e) { - uri = null; - } - - switch (getResultCode()) { - case Activity.RESULT_OK: - if (uri != null) { - try { - if (LOCAL_LOGV) Log.v(TAG, "using supplied uri"); - ContentValues values = new ContentValues(); - values.put("type", 2); - values.put("read", 1); - context.getContentResolver().update(uri, values, null, null); - } catch (NullPointerException e) { - markFirstAsSent(context); - } - } else { - markFirstAsSent(context); - } - - break; - case SmsManager.RESULT_ERROR_GENERIC_FAILURE: - case SmsManager.RESULT_ERROR_NO_SERVICE: - case SmsManager.RESULT_ERROR_NULL_PDU: - case SmsManager.RESULT_ERROR_RADIO_OFF: - if (uri != null) { - if (LOCAL_LOGV) Log.v(TAG, "using supplied uri"); - ContentValues values = new ContentValues(); - values.put("type", 5); - values.put("read", true); - values.put("error_code", getResultCode()); - context.getContentResolver().update(uri, values, null, null); - } else { - if (LOCAL_LOGV) Log.v(TAG, "using first message"); - Cursor query = context.getContentResolver().query(Uri.parse("content://sms/outbox"), null, null, null, null); - - // mark message failed - if (query != null && query.moveToFirst()) { - String id = query.getString(query.getColumnIndex("_id")); - ContentValues values = new ContentValues(); - values.put("type", 5); - values.put("read", 1); - values.put("error_code", getResultCode()); - context.getContentResolver().update(Uri.parse("content://sms/outbox"), values, "_id=" + id, null); - } - } - - context.sendBroadcast(new Intent(Transaction.NOTIFY_SMS_FAILURE)); - - break; - } - - context.sendBroadcast(new Intent("com.moez.QKSMS.send_message.REFRESH")); - } - - private void markFirstAsSent(Context context) { - if (LOCAL_LOGV) Log.v(TAG, "using first message"); - Cursor query = context.getContentResolver().query(Uri.parse("content://sms/outbox"), null, null, null, null); - - // mark message as sent successfully - if (query != null && query.moveToFirst()) { - String id = query.getString(query.getColumnIndex("_id")); - ContentValues values = new ContentValues(); - values.put("type", 2); - values.put("read", 1); - context.getContentResolver().update(Uri.parse("content://sms/outbox"), values, "_id=" + id, null); - } - - query.close(); - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/mmssms/Settings.java b/QKSMS/src/main/java/com/moez/QKSMS/mmssms/Settings.java deleted file mode 100644 index 8e4adaf75..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/mmssms/Settings.java +++ /dev/null @@ -1,465 +0,0 @@ -/* - * Copyright (C) 2015 QK Labs - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.moez.QKSMS.mmssms; - -import android.net.wifi.WifiInfo; - -/** - * Class to house all of the settings that can be used to send a message - */ -public class Settings { - - public static final long MAX_ATTACHMENT_SIZE_UNLIMITED = -1; - public static final long MAX_ATTACHMENT_SIZE_300KB = 300 * 1024; - public static final long MAX_ATTACHMENT_SIZE_600KB = 600 * 1024; - public static final long MAX_ATTACHMENT_SIZE_1MB = 1024 * 1024; - - // MMS options - private String mmsc; - private String proxy; - private String port; - private String userAgent; - private String uaProfUrl; - private String uaProfTagName; - private boolean group; - private long maxAttachmentSize; - - // SMS options - private boolean deliveryReports; - private boolean split; - private boolean splitCounter; - private boolean stripUnicode; - private String signature; - private String preText; - private boolean sendLongAsMms; - private int sendLongAsMmsAfter; - - // Google Voice settings - private String account; - private String rnrSe; - - /** - * Default constructor to set everything to default values - */ - public Settings() { - this("", "", "0", true, MAX_ATTACHMENT_SIZE_UNLIMITED, false, false, false, false, false, "", "", true, 3, "", null); - } - - /** - * Copy constuctor - * @param s is the Settings object to copy from - */ - public Settings(Settings s) { - this.mmsc = s.getMmsc(); - this.proxy = s.getProxy(); - this.port = s.getPort(); - this.userAgent = s.getAgent(); - this.uaProfUrl = s.getUserProfileUrl(); - this.uaProfTagName = s.getUaProfTagName(); - this.group = s.getGroup(); - this.maxAttachmentSize = s.getMaxAttachmentSize(); - this.wifiMmsFix = s.getWifiMmsFix(); - this.deliveryReports = s.getDeliveryReports(); - this.split = s.getSplit(); - this.splitCounter = s.getSplitCounter(); - this.stripUnicode = s.getStripUnicode(); - this.signature = s.getSignature(); - this.preText = s.getPreText(); - this.sendLongAsMms = s.getSendLongAsMms(); - this.sendLongAsMmsAfter = s.getSendLongAsMmsAfter(); - this.account = s.getAccount(); - this.rnrSe = s.getRnrSe(); - } - - /** - * @param mmsc is the address contained by the apn to send MMS to - * @param proxy is the proxy address in the apn to send MMS through - * @param port is the port from the apn to send MMS through - * @param group is a boolean specifying whether or not to send messages with multiple recipients as a group MMS message - * @param maxAttachmentSize is a long specifying the maximum number of bytes that an MMS attachment can be, or -1 if no maximum - * @param wifiMmsFix is a boolean to toggle on and off wifi when sending MMS (MMS will not work currently when WiFi is enabled) - * @param deliveryReports is a boolean to retrieve delivery reports from SMS messages - * @param split is a boolean to manually split messages (shouldn't be necessary, but some carriers do not split on their own) - * @param splitCounter adds a split counter to the front of all split messages - * @param stripUnicode replaces many unicode characters with their gsm compatible equivalent to allow for sending 160 characters instead of 70 - * @param signature a signature to attach at the end of each message - * @param sendLongAsMms if a message is too long to be multiple SMS, convert it to a single MMS - * @param sendLongAsMmsAfter is an int of how many pages long an SMS must be before it is split - * @param account is the google account to send Google Voice messages through - * @param rnrSe is the token to use to send Google Voice messages (nullify if you don't know what this is) - * @deprecated Constructor to create object of all values - */ - public Settings(String mmsc, String proxy, String port, boolean group, long maxAttachmentSize, boolean wifiMmsFix, boolean deliveryReports, boolean split, boolean splitCounter, boolean stripUnicode, String signature, String preText, boolean sendLongAsMms, int sendLongAsMmsAfter, String account, String rnrSe) { - this.mmsc = mmsc; - this.proxy = proxy; - this.port = port; - this.userAgent = ""; - this.uaProfUrl = ""; - this.uaProfTagName = ""; - this.group = group; - this.maxAttachmentSize = maxAttachmentSize; - this.wifiMmsFix = wifiMmsFix; - this.deliveryReports = deliveryReports; - this.split = split; - this.splitCounter = splitCounter; - this.stripUnicode = stripUnicode; - this.signature = signature; - this.preText = preText; - this.sendLongAsMms = sendLongAsMms; - this.sendLongAsMmsAfter = sendLongAsMmsAfter; - this.account = account; - this.rnrSe = rnrSe; - } - - /** - * @param mmsc is the address contained by the apn to send MMS to - * @param proxy is the proxy address in the apn to send MMS through - * @param port is the port from the apn to send MMS through - * @param group is a boolean specifying whether or not to send messages with multiple recipients as a group MMS message - * @param maxAttachmentSize is a long specifying the maximum number of bytes that an MMS attachment can be, or -1 if no maximum - * @param deliveryReports is a boolean to retrieve delivery reports from SMS messages - * @param split is a boolean to manually split messages (shouldn't be necessary, but some carriers do not split on their own) - * @param splitCounter adds a split counter to the front of all split messages - * @param stripUnicode replaces many unicode characters with their gsm compatible equivalent to allow for sending 160 characters instead of 70 - * @param signature a signature to attach at the end of each message - * @param preText text to be inserted before a message - * @param sendLongAsMms if a message is too long to be multiple SMS, convert it to a single MMS - * @param sendLongAsMmsAfter is an int of how many pages long an SMS must be before it is split - * @param account is the google account to send Google Voice messages through - * @param rnrSe is the token to use to send Google Voice messages (nullify if you don't know what this is) - */ - public Settings(String mmsc, String proxy, String port, boolean group, long maxAttachmentSize, boolean deliveryReports, boolean split, boolean splitCounter, boolean stripUnicode, String signature, String preText, boolean sendLongAsMms, int sendLongAsMmsAfter, String account, String rnrSe) { - this(mmsc, proxy, port, group, maxAttachmentSize, false, deliveryReports, split, splitCounter, stripUnicode, signature, preText, sendLongAsMms, sendLongAsMmsAfter, account, rnrSe); - } - - /** - * Sets MMSC - * - * @param mmsc is the mmsc from the apns - */ - public void setMmsc(String mmsc) { - this.mmsc = mmsc; - } - - /** - * Sets the MMS Proxy - * - * @param proxy is the proxy from the apns - */ - public void setProxy(String proxy) { - this.proxy = proxy; - } - - /** - * Sets the Port - * - * @param port is the port from the apns - */ - public void setPort(String port) { - this.port = port; - } - - /** - * Sets the user agent - * - * @param agent is the agent to send http request with - */ - public void setAgent(String agent) { this.userAgent = agent; } - - /** - * Sets the user agent profile url - * - * @param userProfileUrl is the user agent profile url - */ - public void setUserProfileUrl(String userProfileUrl) { this.uaProfUrl = userProfileUrl; } - - /** - * Sets the user agent profile tag name - * - * @param tagName the tag name to use - */ - public void setUaProfTagName(String tagName) { this.uaProfTagName = tagName; } - - /** - * Sets group MMS messages - * - * @param group is a boolean specifying whether or not to send messages with multiple recipients as a group MMS message - */ - public void setGroup(boolean group) { - this.group = group; - } - - /** - * Sets the max attachment size - * - * @param maxAttachmentSize is a long specifying the maximum number of bytes that an MMS attachment can be, or -1 if no maximum - */ - public void setMaxAttachmentSize(long maxAttachmentSize) { - this.maxAttachmentSize = maxAttachmentSize; - } - - /** - * Sets whether to receive delivery reports from SMS messages - * - * @param deliveryReports is a boolean to retrieve delivery reports from SMS messages - */ - public void setDeliveryReports(boolean deliveryReports) { - this.deliveryReports = deliveryReports; - } - - /** - * Sets whether to manually split an SMS or not - * - * @param split is a boolean to manually split messages (shouldn't be necessary, but some carriers do not split on their own) - */ - public void setSplit(boolean split) { - this.split = split; - } - - /** - * Adds a split counter to the front of each split SMS - * - * @param splitCounter adds a split counter to the front of all split messages - */ - public void setSplitCounter(boolean splitCounter) { - this.splitCounter = splitCounter; - } - - /** - * Sets whether or not unicode characters should be sent or converted to their GSM compatible alternative - * - * @param stripUnicode replaces many unicode characters with their gsm compatible equivalent to allow for sending 160 characters instead of 70 - */ - public void setStripUnicode(boolean stripUnicode) { - this.stripUnicode = stripUnicode; - } - - /** - * Sets a signature to be attached to each message - * - * @param signature a signature to attach at the end of each message - */ - public void setSignature(String signature) { - this.signature = signature; - } - - /** - * Sets the text to be sent before an SMS message - * - * @param preText text to be attached to the beginning of each message - */ - public void setPreText(String preText) { - this.preText = preText; - } - - /** - * Sets whether long SMS or Voice messages should instead be sent by a single MMS - * - * @param sendLongAsMms if a message is too long to be multiple SMS, convert it to a single MMS - */ - public void setSendLongAsMms(boolean sendLongAsMms) { - this.sendLongAsMms = sendLongAsMms; - } - - /** - * Sets when we should convert SMS or Voice into an MMS message - * - * @param sendLongAsMmsAfter is an int of how many pages long an SMS must be before it is split - */ - public void setSendLongAsMmsAfter(int sendLongAsMmsAfter) { - this.sendLongAsMmsAfter = sendLongAsMmsAfter; - } - - /** - * Sets the Google account to send Voice messages through - * - * @param account is the google account to send Google Voice messages through - */ - public void setAccount(String account) { - this.account = account; - } - - /** - * Sets the token to use to authenticate voice messages - * - * @param rnrSe is the token to use to send Google Voice messages (nullify if you don't know what this is) - */ - public void setRnrSe(String rnrSe) { - this.rnrSe = rnrSe; - } - - /** - * @return MMSC to send through - */ - public String getMmsc() { - return this.mmsc; - } - - /** - * @return the proxy to send MMS through - */ - public String getProxy() { - return this.proxy; - } - - /** - * @return the port to send MMS through - */ - public String getPort() { - return this.port; - } - - /** - * @return the user agent to send mms with - */ - public String getAgent() { return this.userAgent; } - - /** - * @return the user agent profile url to send mms with - */ - public String getUserProfileUrl() { return this.uaProfUrl; } - - /** - * @return the user agent profile tag name - */ - public String getUaProfTagName() { return this.uaProfTagName; } - - /** - * @return whether or not to send Group MMS or multiple SMS/Voice messages - */ - public boolean getGroup() { - return this.group; - } - - /** - * @return maxAttachmentSize is a long specifying the maximum number of bytes that an MMS attachment can be, or -1 if no maximum - */ - public long getMaxAttachmentSize() { - return this.maxAttachmentSize; - } - - /** - * @return whether or not to request delivery reports on SMS messages - */ - public boolean getDeliveryReports() { - return this.deliveryReports; - } - - /** - * @return whether or not SMS should be split manually - */ - public boolean getSplit() { - return this.split; - } - - /** - * @return whether or not a split counter should be attached to manually split messages - */ - public boolean getSplitCounter() { - return this.splitCounter; - } - - /** - * @return whether or not unicode chars should be substituted with gms characters - */ - public boolean getStripUnicode() { - return this.stripUnicode; - } - - /** - * @return the signature attached to SMS messages - */ - public String getSignature() { - return this.signature; - } - - /** - * @return the text attached to the beginning of each SMS - */ - public String getPreText() { - return this.preText; - } - - /** - * @return whether or not to send long SMS or Voice as single MMS - */ - public boolean getSendLongAsMms() { - return this.sendLongAsMms; - } - - /** - * @return number of pages sms must be to send instead as MMS - */ - public int getSendLongAsMmsAfter() { - return this.sendLongAsMmsAfter; - } - - /** - * @return Google account to send Voice messages through - */ - public String getAccount() { - return this.account; - } - - /** - * @return auth token to be used for Voice messages - */ - public String getRnrSe() { - return this.rnrSe; - } - - /** - * @deprecated - */ - private boolean wifiMmsFix; - - /** - * @deprecated - */ - public WifiInfo currentWifi; - - /** - * @deprecated - */ - public boolean currentWifiState; - - /** - * @deprecated - */ - public DisconnectWifi discon; - - /** - * @deprecated - */ - public boolean currentDataState; - - /** - * @param wifiMmsFix is a boolean to toggle on and off wifi when sending MMS - * @deprecated Sets wifi mms fix - */ - public void setWifiMmsFix(boolean wifiMmsFix) { - this.wifiMmsFix = wifiMmsFix; - } - - /** - * @return whether or not to toggle wifi when sending MMS - * @deprecated - */ - public boolean getWifiMmsFix() { - return this.wifiMmsFix; - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/mmssms/StripAccents.java b/QKSMS/src/main/java/com/moez/QKSMS/mmssms/StripAccents.java deleted file mode 100644 index 58ad65f27..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/mmssms/StripAccents.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (C) 2015 QK Labs - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.moez.QKSMS.mmssms; - -import android.telephony.SmsMessage; - -public class StripAccents { - - public static String characters = "\u03B1\u03B2\u03B3\u03B4\u03B5\u03B6\u03B7\u03B8\u03B9\u03BA\u03BB\u03BC\u03BD" + - "\u03BE\u03BF\u03C0\u03C1\u03C3\u03C2\u03C4\u03C5\u03C6\u03C7\u03C8\u03C9\u03AC\u03AD" + - "\u03AE\u03AF\u03CC\u03CD\u03CE\u03CA\u03CB\u0390\u03B0\u0391\u0392\u0395\u0396\u0397\u0399" + - "\u039A\u039C\u039D\u039F\u03A1\u03A4\u03A5\u03A7\u0386\u0388\u0389\u038A\u038C\u038F\u03AA" + - "\u03AB\u0170\u0171\u0150\u0151\u0105\u0107\u0119\u0142\u0144\u015B\u017A\u017C\u0104\u0106" + - "\u0118\u0141\u0143\u015A\u0179\u017B\u00C0\u00C2\u00C3\u00C8\u00CA\u00CC\u00CE\u00D2\u00D5" + - "\u00D9\u00DB\u00E2\u00E3\u00EA\u00EE\u00F5\u00FA\u00FB\u00E7\u011B\u0161\u010D\u0159\u017E\u010F" + - "\u0165\u0148\u00E1\u00ED\u00E9\u00F3\u00FD\u016F\u011A\u0160\u010C\u0158\u017D\u010E\u0164\u0147" + - "\u00C1\u00C9\u00CD\u00D3\u00DD\u00DA\u016E\u0155\u013A\u013E\u00F4\u0154\u0139\u013D\u00D4\u00CF\u00EF\u00EB\u00CB" + - "\u0110\u0111"; - - public static String gsm = "AB\u0393\u0394EZH\u0398IK\u039BMN\u039EO\u03A0P\u03A3\u03A3TY\u03A6X\u03A8\u03A9AEHIOY" + - "\u03A9IYIYABEZHIKMNOPTYXAEHIO\u03A9IY\u00DC\u00FC\u00D6\u00F6acelnszzACELNSZZAAAEEIIOOUU" + - "aaeiouucescrzdtnaieoyuESCRZDTNAEIOYUUrlloRLLOIIeeDd"; - - public static String stripAccents(String s) { - int[] messageData = SmsMessage.calculateLength(s, false); - - if (messageData[0] != 1) { - for (int i = 0; i < characters.length(); i++) { - s = s.replaceAll(characters.substring(i, i + 1), gsm.substring(i, i + 1)); - } - } - - return s; - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/mmssms/Transaction.java b/QKSMS/src/main/java/com/moez/QKSMS/mmssms/Transaction.java deleted file mode 100644 index cf3b4ed3c..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/mmssms/Transaction.java +++ /dev/null @@ -1,1257 +0,0 @@ -/* - * Copyright (C) 2015 QK Labs - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.moez.QKSMS.mmssms; - -import android.app.Activity; -import android.app.PendingIntent; -import android.content.BroadcastReceiver; -import android.content.ContentValues; -import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; -import android.database.Cursor; -import android.graphics.Bitmap; -import android.net.ConnectivityManager; -import android.net.NetworkInfo; -import android.net.Uri; -import android.net.wifi.WifiManager; -import android.os.Handler; -import android.os.Looper; -import android.telephony.PhoneNumberUtils; -import android.telephony.SmsManager; -import android.telephony.SmsMessage; -import android.telephony.TelephonyManager; -import android.text.TextUtils; -import android.util.Log; -import android.widget.Toast; -import android.preference.PreferenceManager; - -import com.android.mms.dom.smil.parser.SmilXmlSerializer; -import com.android.mms.transaction.HttpUtils; -import com.android.mms.transaction.MmsMessageSender; -import com.android.mms.transaction.ProgressCallbackEntity; -import com.android.mms.util.DownloadManager; -import com.android.mms.util.RateController; -import com.google.android.mms.APN; -import com.google.android.mms.APNHelper; -import com.google.android.mms.ContentType; -import com.google.android.mms.MMSPart; -import com.google.android.mms.MmsException; -import com.google.android.mms.pdu_alt.CharacterSets; -import com.google.android.mms.pdu_alt.EncodedStringValue; -import com.google.android.mms.pdu_alt.PduBody; -import com.google.android.mms.pdu_alt.PduComposer; -import com.google.android.mms.pdu_alt.PduPart; -import com.google.android.mms.pdu_alt.PduPersister; -import com.google.android.mms.pdu_alt.SendReq; -import com.google.android.mms.smil.SmilHelper; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.koushikdutta.ion.Ion; -import com.moez.QKSMS.common.QKPreferences; -import com.moez.QKSMS.enums.QKPreference; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.OutputStream; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Calendar; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.ExecutionException; - -/** - * Class to process transaction requests for sending - */ -public class Transaction { - private static final String TAG = "Transaction"; - private static final boolean LOCAL_LOGV = false; - - public static Settings settings; - private Context context; - private ConnectivityManager mConnMgr; - - private boolean saveMessage = true; - - public String SMS_SENT = ".SMS_SENT"; - public String SMS_DELIVERED = ".SMS_DELIVERED"; - - public static String NOTIFY_SMS_FAILURE = ".NOTIFY_SMS_FAILURE"; - public static final String MMS_ERROR = "com.moez.QKSMS.send_message.MMS_ERROR"; - public static final String REFRESH = "com.moez.QKSMS.send_message.REFRESH"; - public static final String MMS_PROGRESS = "com.moez.QKSMS.send_message.MMS_PROGRESS"; - public static final String VOICE_FAILED = "com.moez.QKSMS.send_message.VOICE_FAILED"; - public static final String VOICE_TOKEN = "com.moez.QKSMS.send_message.RNRSE"; - public static final String NOTIFY_OF_DELIVERY = "com.moez.QKSMS.send_message.NOTIFY_DELIVERY"; - public static final String NOTIFY_OF_MMS = "com.moez.QKSMS.messaging.NEW_MMS_DOWNLOADED"; - - public static final long NO_THREAD_ID = 0; - - /** - * Sets context and initializes settings to default values - * - * @param context is the context of the activity or service - */ - public Transaction(Context context) { - this(context, new Settings()); - } - - /** - * Sets context and settings - * - * @param context is the context of the activity or service - * @param settings is the settings object to process send requests through - */ - public Transaction(Context context, Settings settings) { - this.settings = settings; - this.context = context; - - SMS_SENT = context.getPackageName() + SMS_SENT; - SMS_DELIVERED = context.getPackageName() + SMS_DELIVERED; - - if (NOTIFY_SMS_FAILURE.equals(".NOTIFY_SMS_FAILURE")) { - NOTIFY_SMS_FAILURE = context.getPackageName() + NOTIFY_SMS_FAILURE; - } - } - - /** - * Called to send a new message depending on settings and provided Message object - * If you want to send message as mms, call this from the UI thread - * - * @param message is the message that you want to send - * @param threadId is the thread id of who to send the message to (can also be set to Transaction.NO_THREAD_ID) - */ - public void sendNewMessage(Message message, long threadId) { - this.saveMessage = message.getSave(); - boolean mmsShortCircuit = QKPreferences.getBoolean(QKPreference.TEXT_VIA_MMS); - // if message: - // 1) Has images attached - // or - // 1) is enabled to send long messages as mms - // 2) number of pages for that sms exceeds value stored in settings for when to send the mms by - // 3) prefer voice is disabled - // or - // 1) more than one address is attached - // 2) group messaging is enabled - // - // then, send as MMS, else send as Voice or SMS - if (checkMMS(message) || mmsShortCircuit) { - try { Looper.prepare(); } catch (Exception e) { } - RateController.init(context); - DownloadManager.init(context); - sendMmsMessage(message.getText(), message.getAddresses(), message.getImages(), message.getImageNames(), message.getMedia(), message.getMediaMimeType(), message.getSubject()); - } else { - if (message.getType() == Message.TYPE_VOICE) { - sendVoiceMessage(message.getText(), message.getAddresses(), threadId); - } else if (message.getType() == Message.TYPE_SMSMMS) { - if (LOCAL_LOGV) Log.v(TAG, "sending sms"); - sendSmsMessage(message.getText(), message.getAddresses(), threadId, message.getDelay()); - } else { - if (LOCAL_LOGV) Log.v(TAG, "error with message type, aborting..."); - } - } - - } - - private void sendSmsMessage(String text, String[] addresses, long threadId, int delay) { - if (LOCAL_LOGV) Log.v(TAG, "message text: " + text); - Uri messageUri = null; - int messageId = 0; - if (saveMessage) { - if (LOCAL_LOGV) Log.v(TAG, "saving message"); - // add signature to original text to be saved in database (does not strip unicode for saving though) - if (!settings.getSignature().equals("")) { - text += "\n" + settings.getSignature(); - } - - // save the message for each of the addresses - for (int i = 0; i < addresses.length; i++) { - Calendar cal = Calendar.getInstance(); - ContentValues values = new ContentValues(); - values.put("address", addresses[i]); - values.put("body", settings.getStripUnicode() ? StripAccents.stripAccents(text) : text); - values.put("date", cal.getTimeInMillis() + ""); - values.put("read", 1); - values.put("type", 4); - - // attempt to create correct thread id if one is not supplied - if (threadId == NO_THREAD_ID || addresses.length > 1) { - threadId = Utils.getOrCreateThreadId(context, addresses[i]); - } - - if (LOCAL_LOGV) Log.v(TAG, "saving message with thread id: " + threadId); - - values.put("thread_id", threadId); - messageUri = context.getContentResolver().insert(Uri.parse("content://sms/"), values); - - if (LOCAL_LOGV) Log.v(TAG, "inserted to uri: " + messageUri); - - Cursor query = context.getContentResolver().query(messageUri, new String[] {"_id"}, null, null, null); - if (query != null && query.moveToFirst()) { - messageId = query.getInt(0); - } - - if (LOCAL_LOGV) Log.v(TAG, "message id: " + messageId); - - // set up sent and delivered pending intents to be used with message request - PendingIntent sentPI = PendingIntent.getBroadcast(context, messageId, new Intent(SMS_SENT) - .putExtra("message_uri", messageUri == null ? "" : messageUri.toString()), PendingIntent.FLAG_UPDATE_CURRENT); - PendingIntent deliveredPI = PendingIntent.getBroadcast(context, messageId, new Intent(SMS_DELIVERED) - .putExtra("message_uri", messageUri == null ? "" : messageUri.toString()), PendingIntent.FLAG_UPDATE_CURRENT); - - ArrayList<PendingIntent> sPI = new ArrayList<>(); - ArrayList<PendingIntent> dPI = new ArrayList<>(); - - String body = text; - - // edit the body of the text if unicode needs to be stripped - if (settings.getStripUnicode()) { - body = StripAccents.stripAccents(body); - } - - if (!settings.getPreText().equals("")) { - body = settings.getPreText() + " " + body; - } - - SmsManager smsManager = SmsManager.getDefault(); - if (LOCAL_LOGV) Log.v(TAG, "found sms manager"); - - if (QKPreferences.getBoolean(QKPreference.SPLIT_SMS)) { - if (LOCAL_LOGV) Log.v(TAG, "splitting message"); - // figure out the length of supported message - int[] splitData = SmsMessage.calculateLength(body, false); - - // we take the current length + the remaining length to get the total number of characters - // that message set can support, and then divide by the number of message that will require - // to get the length supported by a single message - int length = (body.length() + splitData[2]) / splitData[0]; - if (LOCAL_LOGV) Log.v(TAG, "length: " + length); - - boolean counter = false; - if (settings.getSplitCounter() && body.length() > length) { - counter = true; - length -= 6; - } - - // get the split messages - String[] textToSend = splitByLength(body, length, counter); - - // send each message part to each recipient attached to message - for (int j = 0; j < textToSend.length; j++) { - ArrayList<String> parts = smsManager.divideMessage(textToSend[j]); - - for (int k = 0; k < parts.size(); k++) { - sPI.add(saveMessage ? sentPI : null); - dPI.add(settings.getDeliveryReports() && saveMessage ? deliveredPI : null); - } - - if (LOCAL_LOGV) Log.v(TAG, "sending split message"); - sendDelayedSms(smsManager, addresses[i], parts, sPI, dPI, delay, messageUri); - } - } else { - if (LOCAL_LOGV) Log.v(TAG, "sending without splitting"); - // send the message normally without forcing anything to be split - ArrayList<String> parts = smsManager.divideMessage(body); - - for (int j = 0; j < parts.size(); j++) { - sPI.add(saveMessage ? sentPI : null); - dPI.add(settings.getDeliveryReports() && saveMessage ? deliveredPI : null); - } - - try { - if (LOCAL_LOGV) Log.v(TAG, "sent message"); - sendDelayedSms(smsManager, addresses[i], parts, sPI, dPI, delay, messageUri); - } catch (Exception e) { - // whoops... - if (LOCAL_LOGV) Log.v(TAG, "error sending message"); - Log.e(TAG, "exception thrown", e); - - try { - ((Activity) context).getWindow().getDecorView().findViewById(android.R.id.content).post(new Runnable() { - - @Override - public void run() { - Toast.makeText(context, "Message could not be sent", Toast.LENGTH_LONG).show(); - } - }); - } catch (Exception f) { } - } - } - } - } - } - - private void sendDelayedSms(final SmsManager smsManager, final String address, - final ArrayList<String> parts, final ArrayList<PendingIntent> sPI, - final ArrayList<PendingIntent> dPI, final int delay, final Uri messageUri) { - new Thread(new Runnable() { - @Override - public void run() { - try { - Thread.sleep(delay); - } catch (Exception e) { } - - if (checkIfMessageExistsAfterDelay(messageUri)) { - if (LOCAL_LOGV) Log.v(TAG, "message sent after delay"); - try { - smsManager.sendMultipartTextMessage(address, null, parts, sPI, dPI); - } catch (Exception e) { - Log.e(TAG, "exception thrown", e); - } - } else { - if (LOCAL_LOGV) Log.v(TAG, "message not sent after delay, no longer exists"); - } - } - }).start(); - } - - private boolean checkIfMessageExistsAfterDelay(Uri messageUti) { - Cursor query = context.getContentResolver().query(messageUti, new String[] {"_id"}, null, null, null); - return query != null && query.moveToFirst(); - } - - private void sendMmsMessage(String text, String[] addresses, Bitmap[] image, String[] imageNames, byte[] media, String mimeType, String subject) { - // merge the string[] of addresses into a single string so they can be inserted into the database easier - String address = ""; - - for (int i = 0; i < addresses.length; i++) { - address += addresses[i] + " "; - } - - address = address.trim(); - - // create the parts to send - ArrayList<MMSPart> data = new ArrayList<>(); - - for (int i = 0; i < image.length; i++) { - // turn bitmap into byte array to be stored - byte[] imageBytes = Message.bitmapToByteArray(image[i]); - - MMSPart part = new MMSPart(); - part.MimeType = "image/jpeg"; - part.Name = (imageNames != null) ? imageNames[i] : ("image" + i); - part.Data = imageBytes; - data.add(part); - } - - // add any extra media according to their mimeType set in the message - // eg. videos, audio, contact cards, location maybe? - if (media.length > 0 && mimeType != null) { - MMSPart part = new MMSPart(); - part.MimeType = mimeType; - part.Name = mimeType.split("/")[0]; - part.Data = media; - data.add(part); - } - - if (!text.equals("")) { - // add text to the end of the part and send - MMSPart part = new MMSPart(); - part.Name = "text"; - part.MimeType = "text/plain"; - part.Data = text.getBytes(); - data.add(part); - } - - MessageInfo info; - - try { - info = getBytes(context, saveMessage, address.split(" "), data.toArray(new MMSPart[data.size()]), subject); - } catch (MmsException e) { - Toast.makeText(context, e.getMessage(), Toast.LENGTH_SHORT).show(); - return; - } - - try { - MmsMessageSender sender = new MmsMessageSender(context, info.location, info.bytes.length); - sender.sendMessage(info.token); - - IntentFilter filter = new IntentFilter(); - filter.addAction(ProgressCallbackEntity.PROGRESS_STATUS_ACTION); - BroadcastReceiver receiver = new BroadcastReceiver() { - - @Override - public void onReceive(Context context, Intent intent) { - int progress = intent.getIntExtra("progress", -3); - if (LOCAL_LOGV) Log.v(TAG, "progress: " + progress); - - // send progress broadcast to update ui if desired... - Intent progressIntent = new Intent(MMS_PROGRESS); - progressIntent.putExtra("progress", progress); - context.sendBroadcast(progressIntent); - - if (progress == ProgressCallbackEntity.PROGRESS_COMPLETE) { - context.sendBroadcast(new Intent(REFRESH)); - - try { - context.unregisterReceiver(this); - } catch (Exception e) { - // TODO fix me - // receiver is not registered force close error... hmm. - } - } else if (progress == ProgressCallbackEntity.PROGRESS_ABORT) { - // This seems to get called only after the progress has reached 100 and then something else goes wrong, so here we will try and send again and see if it works - if (LOCAL_LOGV) Log.v(TAG, "sending aborted for some reason..."); - } - } - - }; - - context.registerReceiver(receiver, filter); - } catch (Throwable e) { - Log.e(TAG, "exception thrown", e); - // insert the pdu into the database and return the bytes to send - if (settings.getWifiMmsFix()) { - sendMMS(info.bytes); - } else { - sendMMSWiFi(info.bytes); - } - } - } - - public static MessageInfo getBytes(Context context, boolean saveMessage, String[] recipients, MMSPart[] parts, String subject) - throws MmsException { - final SendReq sendRequest = new SendReq(); - - // create send request addresses - for (int i = 0; i < recipients.length; i++) { - final EncodedStringValue[] phoneNumbers = EncodedStringValue.extract(recipients[i]); - - if (phoneNumbers != null && phoneNumbers.length > 0) { - sendRequest.addTo(phoneNumbers[0]); - } - } - - if (subject != null) { - sendRequest.setSubject(new EncodedStringValue(subject)); - } - - sendRequest.setDate(Calendar.getInstance().getTimeInMillis() / 1000L); - - try { - sendRequest.setFrom(new EncodedStringValue(Utils.getMyPhoneNumber(context))); - } catch (Exception e) { - // my number is nothing - } - - final PduBody pduBody = new PduBody(); - - // assign parts to the pdu body which contains sending data - if (parts != null) { - for (int i = 0; i < parts.length; i++) { - MMSPart part = parts[i]; - if (part != null) { - try { - PduPart partPdu = new PduPart(); - partPdu.setName(part.Name.getBytes()); - partPdu.setContentType(part.MimeType.getBytes()); - - if (part.MimeType.startsWith("text")) { - partPdu.setCharset(CharacterSets.UTF_8); - } - - partPdu.setData(part.Data); - - pduBody.addPart(partPdu); - } catch (Exception e) { - - } - } - } - } - - ByteArrayOutputStream out = new ByteArrayOutputStream(); - SmilXmlSerializer.serialize(SmilHelper.createSmilDocument(pduBody), out); - PduPart smilPart = new PduPart(); - smilPart.setContentId("smil".getBytes()); - smilPart.setContentLocation("smil.xml".getBytes()); - smilPart.setContentType(ContentType.APP_SMIL.getBytes()); - smilPart.setData(out.toByteArray()); - pduBody.addPart(0, smilPart); - - sendRequest.setBody(pduBody); - - // create byte array which will actually be sent - final PduComposer composer = new PduComposer(context, sendRequest); - final byte[] bytesToSend; - - try { - bytesToSend = composer.make(); - } catch (OutOfMemoryError e) { - throw new MmsException("Out of memory!"); - } - - MessageInfo info = new MessageInfo(); - info.bytes = bytesToSend; - - if (saveMessage) { - try { - PduPersister persister = PduPersister.getPduPersister(context); - info.location = persister.persist(sendRequest, Uri.parse("content://mms/outbox"), true, settings.getGroup(), null); - } catch (Exception e) { - if (LOCAL_LOGV) Log.v(TAG, "error saving mms message"); - Log.e(TAG, "exception thrown", e); - - // use the old way if something goes wrong with the persister - insert(context, recipients, parts, subject); - } - } - - try { - Cursor query = context.getContentResolver().query(info.location, new String[] {"thread_id"}, null, null, null); - if (query != null && query.moveToFirst()) { - info.token = query.getLong(query.getColumnIndex("thread_id")); - } else { - // just default sending token for what I had before - info.token = 4444L; - } - } catch (Exception e) { - Log.e(TAG, "exception thrown", e); - info.token = 4444L; - } - - return info; - } - - public static class MessageInfo { - public long token; - public Uri location; - public byte[] bytes; - } - - private void sendVoiceMessage(String text, String[] addresses, long threadId) { - // send a voice message to each recipient based off of koush's voice implementation in Voice+ - for (int i = 0; i < addresses.length; i++) { - if (saveMessage) { - Calendar cal = Calendar.getInstance(); - ContentValues values = new ContentValues(); - values.put("address", addresses[i]); - values.put("body", text); - values.put("date", cal.getTimeInMillis() + ""); - values.put("read", 1); - values.put("status", 2); // if you want to be able to tell the difference between sms and voice, look for this value. SMS will be -1, 0, 64, 128 and voice will be 2 - - // attempt to create correct thread id if one is not supplied - if (threadId == NO_THREAD_ID || addresses.length > 1) { - threadId = Utils.getOrCreateThreadId(context, addresses[i]); - } - - values.put("thread_id", threadId); - context.getContentResolver().insert(Uri.parse("content://sms/outbox"), values); - } - - if (!settings.getSignature().equals("")) { - text += "\n" + settings.getSignature(); - } - - sendVoiceMessage(addresses[i], text); - } - } - - // splits text and adds split counter when applicable - private String[] splitByLength(String s, int chunkSize, boolean counter) { - int arraySize = (int) Math.ceil((double) s.length() / chunkSize); - - String[] returnArray = new String[arraySize]; - - int index = 0; - for (int i = 0; i < s.length(); i = i + chunkSize) { - if (s.length() - i < chunkSize) { - returnArray[index++] = s.substring(i); - } else { - returnArray[index++] = s.substring(i, i + chunkSize); - } - } - - if (counter && returnArray.length > 1) { - for (int i = 0; i < returnArray.length; i++) { - returnArray[i] = "(" + (i + 1) + "/" + returnArray.length + ") " + returnArray[i]; - } - } - - return returnArray; - } - - private boolean alreadySending = false; - - private void sendMMS(final byte[] bytesToSend) { - revokeWifi(true); - - // enable mms connection to mobile data - mConnMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); - int result = beginMmsConnectivity(); - - if (LOCAL_LOGV) Log.v(TAG, "result of connectivity: " + result + " "); - - if (result != 0) { - // if mms feature is not already running (most likely isn't...) then register a receiver and wait for it to be active - IntentFilter filter = new IntentFilter(); - filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); - final BroadcastReceiver receiver = new BroadcastReceiver() { - - @Override - public void onReceive(Context context1, Intent intent) { - String action = intent.getAction(); - - if (!action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) { - return; - } - - @SuppressWarnings("deprecation") - NetworkInfo mNetworkInfo = intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO); - - if ((mNetworkInfo == null) || (mNetworkInfo.getType() != ConnectivityManager.TYPE_MOBILE)) { - return; - } - - if (!mNetworkInfo.isConnected()) { - return; - } else { - // ready to send the message now - if (LOCAL_LOGV) Log.v(TAG, "sending through broadcast receiver"); - alreadySending = true; - sendData(bytesToSend); - - context.unregisterReceiver(this); - } - - } - - }; - - context.registerReceiver(receiver, filter); - - try { - Looper.prepare(); - } catch (Exception e) { - // Already on UI thread probably - } - - // try sending after 3 seconds anyways if for some reason the receiver doesn't work - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - if (!alreadySending) { - try { - if (LOCAL_LOGV) Log.v(TAG, "sending through handler"); - context.unregisterReceiver(receiver); - } catch (Exception e) { - - } - - sendData(bytesToSend); - } - } - }, 7000); - } else { - // mms connection already active, so send the message - if (LOCAL_LOGV) Log.v(TAG, "sending right away, already ready"); - sendData(bytesToSend); - } - } - - private void sendMMSWiFi(final byte[] bytesToSend) { - // enable mms connection to mobile data - mConnMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); - NetworkInfo.State state = mConnMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE_MMS).getState(); - - if ((0 == state.compareTo(NetworkInfo.State.CONNECTED) || 0 == state.compareTo(NetworkInfo.State.CONNECTING))) { - sendData(bytesToSend); - } else { - int resultInt = mConnMgr.startUsingNetworkFeature(ConnectivityManager.TYPE_MOBILE, "enableMMS"); - - if (resultInt == 0) { - try { - Utils.ensureRouteToHost(context, settings.getMmsc(), settings.getProxy()); - sendData(bytesToSend); - } catch (Exception e) { - Log.e(TAG, "exception thrown", e); - sendData(bytesToSend); - } - } else { - // if mms feature is not already running (most likely isn't...) then register a receiver and wait for it to be active - IntentFilter filter = new IntentFilter(); - filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); - final BroadcastReceiver receiver = new BroadcastReceiver() { - - @Override - public void onReceive(Context context1, Intent intent) { - String action = intent.getAction(); - - if (!action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) { - return; - } - - NetworkInfo mNetworkInfo = mConnMgr.getActiveNetworkInfo(); - if ((mNetworkInfo == null) || (mNetworkInfo.getType() != ConnectivityManager.TYPE_MOBILE_MMS)) { - return; - } - - if (!mNetworkInfo.isConnected()) { - return; - } else { - alreadySending = true; - - try { - Utils.ensureRouteToHost(context, settings.getMmsc(), settings.getProxy()); - sendData(bytesToSend); - } catch (Exception e) { - Log.e(TAG, "exception thrown", e); - sendData(bytesToSend); - } - - context.unregisterReceiver(this); - } - - } - - }; - - context.registerReceiver(receiver, filter); - - try { - Looper.prepare(); - } catch (Exception e) { - // Already on UI thread probably - } - - // try sending after 3 seconds anyways if for some reason the receiver doesn't work - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - if (!alreadySending) { - try { - context.unregisterReceiver(receiver); - } catch (Exception e) { - - } - - try { - Utils.ensureRouteToHost(context, settings.getMmsc(), settings.getProxy()); - sendData(bytesToSend); - } catch (Exception e) { - Log.e(TAG, "exception thrown", e); - sendData(bytesToSend); - } - } - } - }, 7000); - } - } - } - - private void sendData(final byte[] bytesToSend) { - // be sure this is running on new thread, not UI - if (LOCAL_LOGV) Log.v(TAG, "starting new thread to send on"); - new Thread(new Runnable() { - - @Override - public void run() { - List<APN> apns = new ArrayList<>(); - - try { - APN apn = new APN(settings.getMmsc(), settings.getPort(), settings.getProxy()); - apns.add(apn); - - String mmscUrl = apns.get(0).MMSCenterUrl != null ? apns.get(0).MMSCenterUrl.trim() : null; - apns.get(0).MMSCenterUrl = mmscUrl; - - if (apns.get(0).MMSCenterUrl.equals("")) { - // attempt to get apns from internal databases, most likely will fail due to insignificant permissions - APNHelper helper = new APNHelper(context); - apns = helper.getMMSApns(); - } - } catch (Exception e) { - // error in the apns, none are available most likely causing an index out of bounds - // exception. cant send a message, so therefore mark as failed - markMmsFailed(); - return; - } - - try { - // attempts to send the message using given apns - if (LOCAL_LOGV) Log.v(TAG, apns.get(0).MMSCenterUrl + " " + apns.get(0).MMSProxy + " " + apns.get(0).MMSPort); - if (LOCAL_LOGV) Log.v(TAG, "initial attempt at sending starting now"); - trySending(apns.get(0), bytesToSend, 0); - } catch (Exception e) { - // some type of apn error, so notify user of failure - if (LOCAL_LOGV) Log.v(TAG, "weird error, not sure how this could even be called other than apn stuff"); - markMmsFailed(); - } - - } - - }).start(); - } - - public static final int NUM_RETRIES = 2; - - private void trySending(final APN apns, final byte[] bytesToSend, final int numRetries) { - try { - IntentFilter filter = new IntentFilter(); - filter.addAction(ProgressCallbackEntity.PROGRESS_STATUS_ACTION); - BroadcastReceiver receiver = new BroadcastReceiver() { - - @Override - public void onReceive(Context context, Intent intent) { - int progress = intent.getIntExtra("progress", -3); - if (LOCAL_LOGV) Log.v(TAG, "progress: " + progress); - - // send progress broadcast to update ui if desired... - Intent progressIntent = new Intent(MMS_PROGRESS); - progressIntent.putExtra("progress", progress); - context.sendBroadcast(progressIntent); - - if (progress == ProgressCallbackEntity.PROGRESS_COMPLETE) { - if (saveMessage) { - Cursor query = context.getContentResolver().query(Uri.parse("content://mms"), new String[]{"_id"}, null, null, "date desc"); - if (query != null && query.moveToFirst()) { - String id = query.getString(query.getColumnIndex("_id")); - query.close(); - - // move to the sent box - ContentValues values = new ContentValues(); - values.put("msg_box", 2); - String where = "_id" + " = '" + id + "'"; - context.getContentResolver().update(Uri.parse("content://mms"), values, where, null); - } - } - - context.sendBroadcast(new Intent(REFRESH)); - - try { context.unregisterReceiver(this); } catch (Exception e) { /* Receiver not registered */ } - - // give everything time to finish up, may help the abort being shown after the progress is already 100 - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - mConnMgr.stopUsingNetworkFeature(ConnectivityManager.TYPE_MOBILE_MMS, "enableMMS"); - if (settings.getWifiMmsFix()) { - reinstateWifi(); - } - } - }, 1000); - } else if (progress == ProgressCallbackEntity.PROGRESS_ABORT) { - // This seems to get called only after the progress has reached 100 and then something else goes wrong, so here we will try and send again and see if it works - if (LOCAL_LOGV) Log.v(TAG, "sending aborted for some reason..."); - context.unregisterReceiver(this); - - if (numRetries < NUM_RETRIES) { - // sleep and try again in three seconds to see if that give wifi and mobile data a chance to toggle in time - try { - Thread.sleep(3000); - } catch (Exception f) { - - } - - if (settings.getWifiMmsFix()) { - sendMMS(bytesToSend); - } else { - sendMMSWiFi(bytesToSend); - } - } else { - markMmsFailed(); - } - } - } - - }; - - context.registerReceiver(receiver, filter); - - // This is where the actual post request is made to send the bytes we previously created through the given apns - if (LOCAL_LOGV) Log.v(TAG, "attempt: " + numRetries); - Utils.ensureRouteToHost(context, apns.MMSCenterUrl, apns.MMSProxy); - HttpUtils.httpConnection(context, 4444L, apns.MMSCenterUrl, bytesToSend, HttpUtils.HTTP_POST_METHOD, !TextUtils.isEmpty(apns.MMSProxy), apns.MMSProxy, Integer.parseInt(apns.MMSPort)); - } catch (IOException e) { - if (LOCAL_LOGV) Log.v(TAG, "some type of error happened when actually sending maybe?"); - Log.e(TAG, "exception thrown", e); - - if (numRetries < NUM_RETRIES) { - // sleep and try again in three seconds to see if that give wifi and mobile data a chance to toggle in time - try { - Thread.sleep(3000); - } catch (Exception f) { - - } - - trySending(apns, bytesToSend, numRetries + 1); - } else { - markMmsFailed(); - } - } - } - - private void markMmsFailed() { - // if it still fails, then mark message as failed - if (settings.getWifiMmsFix()) { - reinstateWifi(); - } - - if (saveMessage) { - Cursor query = context.getContentResolver().query(Uri.parse("content://mms"), new String[]{"_id"}, null, null, "date desc"); - if (query != null && query.moveToFirst()) { - String id = query.getString(query.getColumnIndex("_id")); - query.close(); - - // mark message as failed - ContentValues values = new ContentValues(); - values.put("msg_box", 5); - String where = "_id" + " = '" + id + "'"; - context.getContentResolver().update(Uri.parse("content://mms"), values, where, null); - } - } - - ((Activity) context).getWindow().getDecorView().findViewById(android.R.id.content).post(new Runnable() { - - @Override - public void run() { - context.sendBroadcast(new Intent(REFRESH)); - context.sendBroadcast(new Intent(NOTIFY_SMS_FAILURE)); - - // broadcast that mms has failed and you can notify user from there if you would like - context.sendBroadcast(new Intent(MMS_ERROR)); - - } - - }); - } - - private void sendVoiceMessage(final String destAddr, final String text) { - new Thread(new Runnable() { - @Override - public void run() { - String rnrse = settings.getRnrSe(); - String account = settings.getAccount(); - String authToken; - - try { - authToken = Utils.getAuthToken(account, context); - - if (rnrse == null) { - rnrse = fetchRnrSe(authToken, context); - } - } catch (Exception e) { - failVoice(); - return; - } - - try { - sendRnrSe(authToken, rnrse, destAddr, text); - successVoice(); - return; - } catch (Exception e) { - } - - try { - // try again... - rnrse = fetchRnrSe(authToken, context); - sendRnrSe(authToken, rnrse, destAddr, text); - successVoice(); - } catch (Exception e) { - failVoice(); - } - } - }).start(); - } - - // hit the google voice api to send a text - private void sendRnrSe(String authToken, String rnrse, String number, String text) throws Exception { - JsonObject json = Ion.with(context) - .load("https://www.google.com/voice/sms/send/") - .setHeader("Authorization", "GoogleLogin auth=" + authToken) - .setBodyParameter("phoneNumber", number) - .setBodyParameter("sendErrorSms", "0") - .setBodyParameter("text", text) - .setBodyParameter("_rnr_se", rnrse) - .asJsonObject() - .get(); - - if (!json.get("ok").getAsBoolean()) - throw new Exception(json.toString()); - } - - private void failVoice() { - if (saveMessage) { - Cursor query = context.getContentResolver().query(Uri.parse("content://sms/outbox"), null, null, null, null); - - // mark message as failed - if (query.moveToFirst()) { - String id = query.getString(query.getColumnIndex("_id")); - ContentValues values = new ContentValues(); - values.put("type", "5"); - values.put("read", true); - context.getContentResolver().update(Uri.parse("content://sms/outbox"), values, "_id=" + id, null); - } - - query.close(); - } - - context.sendBroadcast(new Intent(REFRESH)); - context.sendBroadcast(new Intent(VOICE_FAILED)); - } - - private void successVoice() { - if (saveMessage) { - Cursor query = context.getContentResolver().query(Uri.parse("content://sms/outbox"), null, null, null, null); - - // mark message as sent successfully - if (query.moveToFirst()) { - String id = query.getString(query.getColumnIndex("_id")); - ContentValues values = new ContentValues(); - values.put("type", "2"); - values.put("read", true); - context.getContentResolver().update(Uri.parse("content://sms/outbox"), values, "_id=" + id, null); - } - - query.close(); - } - - context.sendBroadcast(new Intent(REFRESH)); - } - - private String fetchRnrSe(String authToken, Context context) throws ExecutionException, InterruptedException { - JsonObject userInfo = Ion.with(context) - .load("https://www.google.com/voice/request/user") - .setHeader("Authorization", "GoogleLogin auth=" + authToken) - .asJsonObject() - .get(); - - String rnrse = userInfo.get("r").getAsString(); - - try { - TelephonyManager tm = (TelephonyManager) context.getSystemService(Activity.TELEPHONY_SERVICE); - String number = tm.getLine1Number(); - if (number != null) { - JsonObject phones = userInfo.getAsJsonObject("phones"); - for (Map.Entry<String, JsonElement> entry : phones.entrySet()) { - JsonObject phone = entry.getValue().getAsJsonObject(); - if (!PhoneNumberUtils.compare(number, phone.get("phoneNumber").getAsString())) - continue; - if (!phone.get("smsEnabled").getAsBoolean()) - break; - - Ion.with(context) - .load("https://www.google.com/voice/settings/editForwardingSms/") - .setHeader("Authorization", "GoogleLogin auth=" + authToken) - .setBodyParameter("phoneId", entry.getKey()) - .setBodyParameter("enabled", "0") - .setBodyParameter("_rnr_se", rnrse) - .asJsonObject(); - break; - } - } - } catch (Exception e) { - - } - - // broadcast so you can save it to your shared prefs or something so that it doesn't need to be retrieved every time - Intent intent = new Intent(VOICE_TOKEN); - intent.putExtra("_rnr_se", rnrse); - context.sendBroadcast(intent); - - return rnrse; - } - - private static Uri insert(Context context, String[] to, MMSPart[] parts, String subject) { - try { - Uri destUri = Uri.parse("content://mms"); - - Set<String> recipients = new HashSet<>(); - recipients.addAll(Arrays.asList(to)); - long thread_id = Utils.getOrCreateThreadId(context, recipients); - - // Create a dummy sms - ContentValues dummyValues = new ContentValues(); - dummyValues.put("thread_id", thread_id); - dummyValues.put("body", " "); - Uri dummySms = context.getContentResolver().insert(Uri.parse("content://sms/sent"), dummyValues); - - // Create a new message entry - long now = System.currentTimeMillis(); - ContentValues mmsValues = new ContentValues(); - mmsValues.put("thread_id", thread_id); - mmsValues.put("date", now / 1000L); - mmsValues.put("msg_box", 4); - //mmsValues.put("m_id", System.currentTimeMillis()); - mmsValues.put("read", true); - mmsValues.put("sub", subject != null ? subject : ""); - mmsValues.put("sub_cs", 106); - mmsValues.put("ct_t", "application/vnd.wap.multipart.related"); - - long imageBytes = 0; - - for (MMSPart part : parts) { - imageBytes += part.Data.length; - } - - mmsValues.put("exp", imageBytes); - - mmsValues.put("m_cls", "personal"); - mmsValues.put("m_type", 128); // 132 (RETRIEVE CONF) 130 (NOTIF IND) 128 (SEND REQ) - mmsValues.put("v", 19); - mmsValues.put("pri", 129); - mmsValues.put("tr_id", "T" + Long.toHexString(now)); - mmsValues.put("resp_st", 128); - - // Insert message - Uri res = context.getContentResolver().insert(destUri, mmsValues); - String messageId = res.getLastPathSegment().trim(); - - // Create part - for (MMSPart part : parts) { - if (part.MimeType.startsWith("image")) { - createPartImage(context, messageId, part.Data, part.MimeType); - } else if (part.MimeType.startsWith("text")) { - createPartText(context, messageId, new String(part.Data, "UTF-8")); - } - } - - // Create addresses - for (String addr : to) { - createAddr(context, messageId, addr); - } - - //res = Uri.parse(destUri + "/" + messageId); - - // Delete dummy sms - context.getContentResolver().delete(dummySms, null, null); - - return res; - } catch (Exception e) { - if (LOCAL_LOGV) Log.v(TAG, "still an error saving... :("); - Log.e(TAG, "exception thrown", e); - } - - return null; - } - - // create the image part to be stored in database - private static Uri createPartImage(Context context, String id, byte[] imageBytes, String mimeType) throws Exception { - ContentValues mmsPartValue = new ContentValues(); - mmsPartValue.put("mid", id); - mmsPartValue.put("ct", mimeType); - mmsPartValue.put("cid", "<" + System.currentTimeMillis() + ">"); - Uri partUri = Uri.parse("content://mms/" + id + "/part"); - Uri res = context.getContentResolver().insert(partUri, mmsPartValue); - - // Add data to part - OutputStream os = context.getContentResolver().openOutputStream(res); - ByteArrayInputStream is = new ByteArrayInputStream(imageBytes); - byte[] buffer = new byte[256]; - - for (int len = 0; (len = is.read(buffer)) != -1; ) { - os.write(buffer, 0, len); - } - - os.close(); - is.close(); - - return res; - } - - // create the text part to be stored in database - private static Uri createPartText(Context context, String id, String text) throws Exception { - ContentValues mmsPartValue = new ContentValues(); - mmsPartValue.put("mid", id); - mmsPartValue.put("ct", "text/plain"); - mmsPartValue.put("cid", "<" + System.currentTimeMillis() + ">"); - mmsPartValue.put("text", text); - Uri partUri = Uri.parse("content://mms/" + id + "/part"); - Uri res = context.getContentResolver().insert(partUri, mmsPartValue); - - return res; - } - - // add address to the request - private static Uri createAddr(Context context, String id, String addr) throws Exception { - ContentValues addrValues = new ContentValues(); - addrValues.put("address", addr); - addrValues.put("charset", "106"); - addrValues.put("type", 151); // TO - Uri addrUri = Uri.parse("content://mms/" + id + "/addr"); - Uri res = context.getContentResolver().insert(addrUri, addrValues); - - return res; - } - - /** - * A method for checking whether or not a certain message will be sent as mms depending on its contents and the settings - * - * @param message is the message that you are checking against - * @return true if the message will be mms, otherwise false - */ - public boolean checkMMS(Message message) { - return message.getImages().length != 0 || - (message.getMedia().length != 0 && message.getMediaMimeType() != null) || - (settings.getSendLongAsMms() && Utils.getNumPages(settings, message.getText()) > settings.getSendLongAsMmsAfter() && message.getType() != Message.TYPE_VOICE) || - (message.getAddresses().length > 1 && settings.getGroup()) || - message.getSubject() != null; - } - - /** - * @deprecated - */ - private void reinstateWifi() { - try { - context.unregisterReceiver(settings.discon); - } catch (Exception f) { - - } - - WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); - wifi.setWifiEnabled(false); - wifi.setWifiEnabled(settings.currentWifiState); - wifi.reconnect(); - Utils.setMobileDataEnabled(context, settings.currentDataState); - } - - /** - * @deprecated - */ - private void revokeWifi(boolean saveState) { - WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); - - if (saveState) { - settings.currentWifi = wifi.getConnectionInfo(); - settings.currentWifiState = wifi.isWifiEnabled(); - wifi.disconnect(); - settings.discon = new DisconnectWifi(); - context.registerReceiver(settings.discon, new IntentFilter(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION)); - settings.currentDataState = Utils.isMobileDataEnabled(context); - Utils.setMobileDataEnabled(context, true); - } else { - wifi.disconnect(); - wifi.disconnect(); - settings.discon = new DisconnectWifi(); - context.registerReceiver(settings.discon, new IntentFilter(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION)); - Utils.setMobileDataEnabled(context, true); - } - } - - /** - * @deprecated - */ - private int beginMmsConnectivity() { - if (LOCAL_LOGV) Log.v(TAG, "starting mms service"); - return mConnMgr.startUsingNetworkFeature(ConnectivityManager.TYPE_MOBILE, "enableMMS"); - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/mmssms/Utils.java b/QKSMS/src/main/java/com/moez/QKSMS/mmssms/Utils.java deleted file mode 100644 index 04a125a92..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/mmssms/Utils.java +++ /dev/null @@ -1,426 +0,0 @@ -/* - * Copyright (C) 2015 QK Labs - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.moez.QKSMS.mmssms; - -import android.accounts.Account; -import android.accounts.AccountManager; -import android.accounts.AuthenticatorException; -import android.accounts.OperationCanceledException; -import android.content.Context; -import android.content.SharedPreferences; -import android.database.Cursor; -import android.net.ConnectivityManager; -import android.net.Uri; -import android.os.Build; -import android.os.Bundle; -import android.preference.PreferenceManager; -import android.provider.Telephony; -import android.telephony.SmsMessage; -import android.telephony.TelephonyManager; -import android.text.TextUtils; -import android.util.Log; - -import com.google.android.mms.util_alt.SqliteWrapper; - -import java.io.IOException; -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.util.HashSet; -import java.util.Random; -import java.util.Set; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * Common methods to be used for data connectivity/sending messages ect - */ -public class Utils { - private static final String TAG = "Utils"; - private static final boolean LOCAL_LOGV = false; - /** - * characters to compare against when checking for 160 character sending compatibility - */ - public static final String GSM_CHARACTERS_REGEX = "^[A-Za-z0-9 \\r\\n@Ł$ĽčéůěňÇŘřĹĺ\u0394_\u03A6\u0393\u039B\u03A9\u03A0\u03A8\u03A3\u0398\u039EĆćßÉ!\"#$%&'()*+,\\-./:;<=>?ĄÄÖŃܧżäöńüŕ^{}\\\\\\[~\\]|\u20AC]*$"; - - /** - * Gets the current users phone number - * - * @param context is the context of the activity or service - * @return a string of the phone number on the device - */ - public static String getMyPhoneNumber(Context context) { - TelephonyManager mTelephonyMgr; - mTelephonyMgr = (TelephonyManager) - context.getSystemService(Context.TELEPHONY_SERVICE); - return mTelephonyMgr.getLine1Number(); - } - - /** - * Enable mobile connection for a specific address - * - * @param address the address to enable - * @return true for success, else false - */ - public static void forceMobileConnectionForAddress(ConnectivityManager mConnMgr, String address) { - //find the host name to route - String hostName = extractAddressFromUrl(address); - if (TextUtils.isEmpty(hostName)) hostName = address; - - //create a route for the specified address - int hostAddress = lookupHost(hostName); - mConnMgr.requestRouteToHost(ConnectivityManager.TYPE_MOBILE_MMS, hostAddress); - } - - /** - * Function for getting the weird auth token used to send or receive google voice messages - * - * @param account is the string of the account name to get the auth token for - * @param context is the context of the activity or service - * @return a string of the auth token to be saved for later - * @throws java.io.IOException - * @throws android.accounts.OperationCanceledException - * @throws android.accounts.AuthenticatorException - */ - public static String getAuthToken(String account, Context context) throws IOException, OperationCanceledException, AuthenticatorException { - Bundle bundle = AccountManager.get(context).getAuthToken(new Account(account, "com.google"), "grandcentral", true, null, null).getResult(); - return bundle.getString(AccountManager.KEY_AUTHTOKEN); - } - - /** - * This method extracts from address the hostname - * - * @param url eg. http://some.where.com:8080/sync - * @return some.where.com - */ - public static String extractAddressFromUrl(String url) { - String urlToProcess = null; - - //find protocol - int protocolEndIndex = url.indexOf("://"); - if (protocolEndIndex > 0) { - urlToProcess = url.substring(protocolEndIndex + 3); - } else { - urlToProcess = url; - } - - // If we have port number in the address we strip everything - // after the port number - int pos = urlToProcess.indexOf(':'); - if (pos >= 0) { - urlToProcess = urlToProcess.substring(0, pos); - } - - // If we have resource location in the address then we strip - // everything after the '/' - pos = urlToProcess.indexOf('/'); - if (pos >= 0) { - urlToProcess = urlToProcess.substring(0, pos); - } - - // If we have ? in the address then we strip - // everything after the '?' - pos = urlToProcess.indexOf('?'); - if (pos >= 0) { - urlToProcess = urlToProcess.substring(0, pos); - } - return urlToProcess; - } - - /** - * Transform host name in int value used by ConnectivityManager.requestRouteToHost - * method - * - * @param hostname - * @return -1 if the host doesn't exists, elsewhere its translation - * to an integer - */ - public static int lookupHost(String hostname) { - InetAddress inetAddress; - - try { - inetAddress = InetAddress.getByName(hostname); - } catch (UnknownHostException e) { - return -1; - } - - byte[] addrBytes; - int addr; - addrBytes = inetAddress.getAddress(); - addr = ((addrBytes[3] & 0xff) << 24) - | ((addrBytes[2] & 0xff) << 16) - | ((addrBytes[1] & 0xff) << 8) - | (addrBytes[0] & 0xff); - - return addr; - } - - /** - * Ensures that the host MMSC is reachable - * - * @param context is the context of the activity or service - * @param url is the MMSC to check - * @param proxy is the proxy of the APN to check - * @throws java.io.IOException when route cannot be established - */ - public static void ensureRouteToHost(Context context, String url, String proxy) throws IOException { - ConnectivityManager connMgr = - (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); - connMgr.startUsingNetworkFeature(ConnectivityManager.TYPE_MOBILE_HIPRI, "enableMMS"); - - if (LOCAL_LOGV) Log.v(TAG, "ensuring route to host"); - - int inetAddr; - if (proxy != null && !proxy.equals("")) { - String proxyAddr = proxy; - inetAddr = lookupHost(proxyAddr); - if (inetAddr == -1) { - throw new IOException("Cannot establish route for " + url + ": Unknown host"); - } else { - if (!connMgr.requestRouteToHost( - ConnectivityManager.TYPE_MOBILE_MMS, inetAddr)) { - throw new IOException("Cannot establish route to proxy " + inetAddr); - } - } - } else { - Uri uri = Uri.parse(url); - inetAddr = lookupHost(uri.getHost()); - if (inetAddr == -1) { - throw new IOException("Cannot establish route for " + url + ": Unknown host"); - } else { - if (!connMgr.requestRouteToHost( - ConnectivityManager.TYPE_MOBILE_MMS, inetAddr)) { - throw new IOException("Cannot establish route to " + inetAddr + " for " + url); - } - } - } - } - - /** - * Checks whether or not mobile data is enabled and returns the result - * - * @param context is the context of the activity or service - * @return true if data is enabled or false if disabled - */ - public static Boolean isMobileDataEnabled(Context context) { - ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); - - try { - Class<?> c = Class.forName(cm.getClass().getName()); - Method m = c.getDeclaredMethod("getMobileDataEnabled"); - m.setAccessible(true); - return (Boolean) m.invoke(cm); - } catch (Exception e) { - Log.e(TAG, "exception thrown", e); - // Make sure to return FALSE instead of null, or else you will get a NPE when you try - // to access the boolean value of this. - return Boolean.FALSE; - } - } - - /** - * Toggles mobile data - * - * @param context is the context of the activity or service - * @param enabled is whether to enable or disable data - */ - public static void setMobileDataEnabled(Context context, boolean enabled) { - if (PreferenceManager.getDefaultSharedPreferences(context).getBoolean("pref_key_auto_data", true)) { - try { - ConnectivityManager conman = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); - Class conmanClass = Class.forName(conman.getClass().getName()); - Field iConnectivityManagerField = conmanClass.getDeclaredField("mService"); - iConnectivityManagerField.setAccessible(true); - Object iConnectivityManager = iConnectivityManagerField.get(conman); - Class iConnectivityManagerClass = Class.forName(iConnectivityManager.getClass().getName()); - Method setMobileDataEnabledMethod = iConnectivityManagerClass.getDeclaredMethod("setMobileDataEnabled", Boolean.TYPE); - setMobileDataEnabledMethod.setAccessible(true); - - setMobileDataEnabledMethod.invoke(iConnectivityManager, enabled); - } catch (Exception e) { - Log.e(TAG, "exception thrown", e); - } - } - - } - - /** - * Gets the number of pages in the SMS based on settings and the length of string - * - * @param settings is the settings object to check against - * @param text is the text from the message object to be sent - * @return the number of pages required to hold message - */ - public static int getNumPages(Settings settings, String text) { - if (settings.getStripUnicode()) { - text = StripAccents.stripAccents(text); - } - - int[] data = SmsMessage.calculateLength(text, false); - return data[0]; - } - - /** - * Gets the current thread_id or creates a new one for the given recipient - * @param context is the context of the activity or service - * @param recipient is the person message is being sent to - * @return the thread_id to use in the database - */ - public static long getOrCreateThreadId(Context context, String recipient) { - Set<String> recipients = new HashSet<>(); - recipients.add(recipient); - return getOrCreateThreadId(context, recipients); - } - - /** - * Gets the current thread_id or creates a new one for the given recipient - * @param context is the context of the activity or service - * @param recipients is the set of people message is being sent to - * @return the thread_id to use in the database - */ - public static long getOrCreateThreadId(Context context, Set<String> recipients) { - long threadId = getThreadId(context, recipients); - Random random = new Random(); - return threadId == -1 ? random.nextLong() : threadId; - } - - /** - * Gets the current thread_id or -1 if none found - * @param context is the context of the activity or service - * @param recipient is the person message is being sent to - * @return the thread_id to use in the database, -1 if none found - */ - public static long getThreadId(Context context, String recipient) { - Set<String> recipients = new HashSet<>(); - recipients.add(recipient); - return getThreadId(context, recipients); - } - - /** - * Gets the current thread_id or -1 if none found - * @param context is the context of the activity or service - * @param recipients is the set of people message is being sent to - * @return the thread_id to use in the database, -1 if none found - */ - public static long getThreadId(Context context, Set<String> recipients) { - Uri.Builder uriBuilder = Uri.parse("content://mms-sms/threadID").buildUpon(); - - for (String recipient : recipients) { - if (isEmailAddress(recipient)) { - recipient = extractAddrSpec(recipient); - } - - uriBuilder.appendQueryParameter("recipient", recipient); - } - - Uri uri = uriBuilder.build(); - Cursor cursor = SqliteWrapper.query(context, context.getContentResolver(), - uri, new String[]{"_id"}, null, null, null); - if (cursor != null) { - try { - if (cursor.moveToFirst()) { - return cursor.getLong(0); - } else { - - } - } finally { - cursor.close(); - } - } - - return -1; - } - - private static boolean isEmailAddress(String address) { - if (TextUtils.isEmpty(address)) { - return false; - } - - String s = extractAddrSpec(address); - Matcher match = EMAIL_ADDRESS_PATTERN.matcher(s); - return match.matches(); - } - - private static final Pattern EMAIL_ADDRESS_PATTERN - = Pattern.compile( - "[a-zA-Z0-9\\+\\.\\_\\%\\-]{1,256}" + - "\\@" + - "[a-zA-Z0-9][a-zA-Z0-9\\-]{0,64}" + - "(" + - "\\." + - "[a-zA-Z0-9][a-zA-Z0-9\\-]{0,25}" + - ")+" - ); - - private static final Pattern NAME_ADDR_EMAIL_PATTERN = - Pattern.compile("\\s*(\"[^\"]*\"|[^<>\"]+)\\s*<([^<>]+)>\\s*"); - - private static String extractAddrSpec(String address) { - Matcher match = NAME_ADDR_EMAIL_PATTERN.matcher(address); - - if (match.matches()) { - return match.group(2); - } - return address; - } - - /** - * Gets the default settings from a shared preferences file associated with your app - * @param context is the context of the activity or service - * @return the settings object to send with - */ - public static Settings getDefaultSendSettings(Context context) { - SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(context); - Settings sendSettings = new Settings(); - - sendSettings.setMmsc(sharedPrefs.getString("mmsc_url", "")); - sendSettings.setProxy(sharedPrefs.getString("mms_proxy", "")); - sendSettings.setPort(sharedPrefs.getString("mms_port", "")); - sendSettings.setAgent(sharedPrefs.getString("mms_agent", "")); - sendSettings.setUserProfileUrl(sharedPrefs.getString("mms_user_agent_profile_url", "")); - sendSettings.setUaProfTagName(sharedPrefs.getString("mms_user_agent_tag_name", "")); - sendSettings.setGroup(sharedPrefs.getBoolean("group_message", true)); - sendSettings.setDeliveryReports(sharedPrefs.getBoolean("delivery_reports", false)); - sendSettings.setSplit(sharedPrefs.getBoolean("split_sms", false)); - sendSettings.setSplitCounter(sharedPrefs.getBoolean("split_counter", false)); - sendSettings.setStripUnicode(sharedPrefs.getBoolean("strip_unicode", false)); - sendSettings.setSignature(sharedPrefs.getString("signature", "")); - sendSettings.setSendLongAsMms(true); - sendSettings.setSendLongAsMmsAfter(3); - sendSettings.setAccount(null); - sendSettings.setRnrSe(null); - - return sendSettings; - } - - /** - * Determines whether or not the user has Android 4.4 KitKat - * @return true if version code on device is >= kitkat - */ - public static boolean hasKitKat() { - return Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT; - } - - /** - * Determines whether or not the app is the default SMS app on a device - * @param context - * @return true if app is default - */ - public static boolean isDefaultSmsApp(Context context) { - return !hasKitKat() || context.getPackageName().equals(Telephony.Sms.getDefaultSmsPackage(context)); - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/model/AudioModel.java b/QKSMS/src/main/java/com/moez/QKSMS/model/AudioModel.java deleted file mode 100644 index 53f7dc019..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/model/AudioModel.java +++ /dev/null @@ -1,160 +0,0 @@ -/* - * Copyright (C) 2008 Esmertec AG. - * Copyright (C) 2008 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.moez.QKSMS.model; - -import android.content.ContentResolver; -import android.content.Context; -import android.database.Cursor; -import android.database.sqlite.SqliteWrapper; -import android.net.Uri; -import android.provider.MediaStore.Audio; -import android.provider.Telephony.Mms.Part; -import android.text.TextUtils; -import android.util.Log; - -import com.android.mms.dom.events.EventImpl; -import com.android.mms.dom.smil.SmilMediaElementImpl; -import com.google.android.mms.MmsException; -import com.google.android.mms.smil.SmilHelper; -import com.moez.QKSMS.ContentRestrictionException; - -import org.w3c.dom.events.Event; - -import java.util.HashMap; -import java.util.Map; - -public class AudioModel extends MediaModel { - private static final String TAG = MediaModel.TAG; - private static final boolean DEBUG = false; - private static final boolean LOCAL_LOGV = false; - - private final HashMap<String, String> mExtras; - - public AudioModel(Context context, Uri uri) throws MmsException { - this(context, null, null, uri); - initModelFromUri(uri); - checkContentRestriction(); - } - - public AudioModel(Context context, String contentType, String src, Uri uri) throws MmsException { - super(context, SmilHelper.ELEMENT_TAG_AUDIO, contentType, src, uri); - mExtras = new HashMap<String, String>(); - } - - private void initModelFromUri(Uri uri) throws MmsException { - ContentResolver cr = mContext.getContentResolver(); - Cursor c = SqliteWrapper.query(mContext, cr, uri, null, null, null, null); - - if (c != null) { - try { - if (c.moveToFirst()) { - String path; - boolean isFromMms = isMmsUri(uri); - - // FIXME We suppose that there should be only two sources - // of the audio, one is the media store, the other is - // our MMS database. - if (isFromMms) { - path = c.getString(c.getColumnIndexOrThrow(Part._DATA)); - mContentType = c.getString(c.getColumnIndexOrThrow(Part.CONTENT_TYPE)); - } else { - path = c.getString(c.getColumnIndexOrThrow(Audio.Media.DATA)); - mContentType = c.getString(c.getColumnIndexOrThrow( - Audio.Media.MIME_TYPE)); - // Get more extras information which would be useful - // to the user. - String album = c.getString(c.getColumnIndexOrThrow("album")); - if (!TextUtils.isEmpty(album)) { - mExtras.put("album", album); - } - - String artist = c.getString(c.getColumnIndexOrThrow("artist")); - if (!TextUtils.isEmpty(artist)) { - mExtras.put("artist", artist); - } - } - mSrc = path.substring(path.lastIndexOf('/') + 1); - - if (TextUtils.isEmpty(mContentType)) { - throw new MmsException("Type of media is unknown."); - } - - if (LOCAL_LOGV) { - Log.v(TAG, "New AudioModel created:" - + " mSrc=" + mSrc - + " mContentType=" + mContentType - + " mUri=" + uri - + " mExtras=" + mExtras); - } - } else { - throw new MmsException("Nothing found: " + uri); - } - } finally { - c.close(); - } - } else { - throw new MmsException("Bad URI: " + uri); - } - - initMediaDuration(); - } - - public void stop() { - appendAction(MediaAction.STOP); - notifyModelChanged(false); - } - - public void handleEvent(Event evt) { - String evtType = evt.getType(); - if (LOCAL_LOGV) { - Log.v(TAG, "Handling event: " + evtType + " on " + this); - } - - MediaAction action = MediaAction.NO_ACTIVE_ACTION; - if (evtType.equals(SmilMediaElementImpl.SMIL_MEDIA_START_EVENT)) { - action = MediaAction.START; - // if the Music player app is playing audio, we should pause that so it won't - // interfere with us playing audio here. - pauseMusicPlayer(); - } else if (evtType.equals(SmilMediaElementImpl.SMIL_MEDIA_END_EVENT)) { - action = MediaAction.STOP; - } else if (evtType.equals(SmilMediaElementImpl.SMIL_MEDIA_PAUSE_EVENT)) { - action = MediaAction.PAUSE; - } else if (evtType.equals(SmilMediaElementImpl.SMIL_MEDIA_SEEK_EVENT)) { - action = MediaAction.SEEK; - mSeekTo = ((EventImpl) evt).getSeekTo(); - } - - appendAction(action); - notifyModelChanged(false); - } - - public Map<String, ?> getExtras() { - return mExtras; - } - - protected void checkContentRestriction() throws ContentRestrictionException { - ContentRestriction cr = ContentRestrictionFactory.getContentRestriction(); - cr.checkAudioContentType(mContentType); - } - - @Override - protected boolean isPlayable() { - return true; - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/model/CarrierContentRestriction.java b/QKSMS/src/main/java/com/moez/QKSMS/model/CarrierContentRestriction.java deleted file mode 100644 index 7ef62dbfe..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/model/CarrierContentRestriction.java +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Copyright (C) 2008 Esmertec AG. - * Copyright (C) 2008 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.moez.QKSMS.model; - -import android.content.ContentResolver; -import android.util.Log; - -import com.google.android.mms.ContentType; -import com.moez.QKSMS.ContentRestrictionException; -import com.moez.QKSMS.ExceedMessageSizeException; -import com.moez.QKSMS.LogTag; -import com.moez.QKSMS.MmsConfig; -import com.moez.QKSMS.ResolutionException; -import com.moez.QKSMS.UnsupportContentTypeException; - -import java.util.ArrayList; - -public class CarrierContentRestriction implements ContentRestriction { - private static final ArrayList<String> sSupportedImageTypes; - private static final ArrayList<String> sSupportedAudioTypes; - private static final ArrayList<String> sSupportedVideoTypes; - private static final boolean DEBUG = true; - - static { - sSupportedImageTypes = ContentType.getImageTypes(); - sSupportedAudioTypes = ContentType.getAudioTypes(); - sSupportedVideoTypes = ContentType.getVideoTypes(); - } - - public CarrierContentRestriction() { - } - - public void checkMessageSize(int messageSize, int increaseSize, ContentResolver resolver) - throws ContentRestrictionException { - if (DEBUG) { - Log.d(LogTag.APP, "CarrierContentRestriction.checkMessageSize messageSize: " + - messageSize + " increaseSize: " + increaseSize + - " MmsConfig.getMaxMessageSize: " + MmsConfig.getMaxMessageSize()); - } - if ( (messageSize < 0) || (increaseSize < 0) ) { - throw new ContentRestrictionException("Negative message size" - + " or increase size"); - } - int newSize = messageSize + increaseSize; - - if ( (newSize < 0) || (newSize > MmsConfig.getMaxMessageSize()) ) { - throw new ExceedMessageSizeException("Exceed message size limitation"); - } - } - - public void checkResolution(int width, int height) throws ContentRestrictionException { - if ( (width > MmsConfig.getMaxImageWidth()) || (height > MmsConfig.getMaxImageHeight()) ) { - throw new ResolutionException("content resolution exceeds restriction."); - } - } - - public void checkImageContentType(String contentType) - throws ContentRestrictionException { - if (null == contentType) { - throw new ContentRestrictionException("Null content type to be check"); - } - - if (!sSupportedImageTypes.contains(contentType)) { - throw new UnsupportContentTypeException("Unsupported image content type : " - + contentType); - } - } - - public void checkAudioContentType(String contentType) - throws ContentRestrictionException { - if (null == contentType) { - throw new ContentRestrictionException("Null content type to be check"); - } - - if (!sSupportedAudioTypes.contains(contentType)) { - throw new UnsupportContentTypeException("Unsupported audio content type : " - + contentType); - } - } - - public void checkVideoContentType(String contentType) - throws ContentRestrictionException { - if (null == contentType) { - throw new ContentRestrictionException("Null content type to be check"); - } - - if (!sSupportedVideoTypes.contains(contentType)) { - throw new UnsupportContentTypeException("Unsupported video content type : " - + contentType); - } - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/model/ChangeModel.java b/QKSMS/src/main/java/com/moez/QKSMS/model/ChangeModel.java deleted file mode 100644 index decab0105..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/model/ChangeModel.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.moez.QKSMS.model; - -import com.google.gson.annotations.SerializedName; - -import java.util.ArrayList; -import java.util.Comparator; - -public class ChangeModel implements Comparator<Long> { - @SerializedName("version_name") private String mVersion; - @SerializedName("release_date") private String mDate; - @SerializedName("changes") private ArrayList<String> mChanges; - - long mDateLong = 0; - - public String getVersion() { - if (mVersion == null) { - return ""; - } - - return mVersion; - } - - public void setVersion(String version) { - mVersion = version; - } - - public String getDate() { - if (mDate == null) { - return ""; - } - - return mDate; - } - - public void setDate(String date) { - mDate = date; - } - - public ArrayList<String> getChanges() { - if (mChanges == null) { - return new ArrayList<>(); - } - - return mChanges; - } - - public void setChanges(ArrayList<String> changes) { - mChanges = changes; - } - - public long getDateLong() { - return mDateLong; - } - - public void setDateLong(long date) { - mDateLong = date; - } - - @Override - public int compare(Long lhs, Long rhs) { - return lhs.compareTo(rhs); - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/model/ContentRestriction.java b/QKSMS/src/main/java/com/moez/QKSMS/model/ContentRestriction.java deleted file mode 100644 index 40dbdcae0..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/model/ContentRestriction.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (C) 2008 Esmertec AG. - * Copyright (C) 2008 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.moez.QKSMS.model; - -import android.content.ContentResolver; - -import com.moez.QKSMS.ContentRestrictionException; - -public interface ContentRestriction { - void checkMessageSize(int messageSize, int increaseSize, ContentResolver resolver) - throws ContentRestrictionException; - - void checkImageContentType(String contentType) throws ContentRestrictionException; - - void checkAudioContentType(String contentType) throws ContentRestrictionException; - - void checkVideoContentType(String contentType) throws ContentRestrictionException; - - void checkResolution(int width, int height) throws ContentRestrictionException; -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/model/ContentRestrictionFactory.java b/QKSMS/src/main/java/com/moez/QKSMS/model/ContentRestrictionFactory.java deleted file mode 100644 index 3e879d942..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/model/ContentRestrictionFactory.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (C) 2008 Esmertec AG. - * Copyright (C) 2008 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.moez.QKSMS.model; - -public class ContentRestrictionFactory { - private static ContentRestriction sContentRestriction; - - private ContentRestrictionFactory() { - } - - public static ContentRestriction getContentRestriction() { - if (null == sContentRestriction) { - sContentRestriction = new CarrierContentRestriction(); - } - return sContentRestriction; - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/model/IModelChangedObserver.java b/QKSMS/src/main/java/com/moez/QKSMS/model/IModelChangedObserver.java deleted file mode 100644 index 4afe0da24..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/model/IModelChangedObserver.java +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright (C) 2008 Esmertec AG. - * Copyright (C) 2008 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.moez.QKSMS.model; - -public interface IModelChangedObserver { - void onModelChanged(Model model, boolean dataChanged); -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/model/ImageModel.java b/QKSMS/src/main/java/com/moez/QKSMS/model/ImageModel.java deleted file mode 100644 index 6505431a0..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/model/ImageModel.java +++ /dev/null @@ -1,255 +0,0 @@ -/* - * Copyright (C) 2008 Esmertec AG. - * Copyright (C) 2008 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.moez.QKSMS.model; - -import android.content.Context; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.net.Uri; -import android.text.TextUtils; -import android.util.Log; - -import com.android.mms.dom.smil.SmilMediaElementImpl; -import com.google.android.mms.MmsException; -import com.google.android.mms.pdu_alt.PduPart; -import com.google.android.mms.pdu_alt.PduPersister; -import com.google.android.mms.smil.SmilHelper; -import com.moez.QKSMS.ContentRestrictionException; -import com.moez.QKSMS.ExceedMessageSizeException; -import com.moez.QKSMS.LogTag; -import com.moez.QKSMS.QKSMSApp; -import com.moez.QKSMS.MmsConfig; -import com.moez.QKSMS.common.google.ItemLoadedCallback; -import com.moez.QKSMS.common.google.ItemLoadedFuture; -import com.moez.QKSMS.common.google.ThumbnailManager; -import com.moez.QKSMS.common.google.UriImage; - -import org.w3c.dom.events.Event; -import org.w3c.dom.smil.ElementTime; - -import java.lang.ref.SoftReference; -import java.util.Arrays; -import java.util.HashSet; -import java.util.Set; - - -public class ImageModel extends RegionMediaModel { - private static final String TAG = "Mms/image"; - private static final boolean DEBUG = false; - private static final boolean LOCAL_LOGV = false; - - private static final int PICTURE_SIZE_LIMIT = 100 * 1024; - - /** - * These are the image content types that MMS supports. Anything else needs to be transcoded - * into one of these content types before being sent over MMS. - */ - private static final Set<String> SUPPORTED_MMS_IMAGE_CONTENT_TYPES = - new HashSet<>(Arrays.asList(new String[] { - "image/jpeg", - })); - - private int mWidth; - private int mHeight; - private SoftReference<Bitmap> mFullSizeBitmapCache = new SoftReference<>(null); - private ItemLoadedFuture mItemLoadedFuture; - - public ImageModel(Context context, Uri uri, RegionModel region) - throws MmsException { - super(context, SmilHelper.ELEMENT_TAG_IMAGE, uri, region); - initModelFromUri(uri); - checkContentRestriction(); - } - - public ImageModel(Context context, String contentType, String src, - Uri uri, RegionModel region) throws MmsException { - super(context, SmilHelper.ELEMENT_TAG_IMAGE, - contentType, src, uri, region); - decodeImageBounds(uri); - } - - private void initModelFromUri(Uri uri) throws MmsException { - UriImage uriImage = new UriImage(mContext, uri); - - mContentType = uriImage.getContentType(); - if (TextUtils.isEmpty(mContentType)) { - throw new MmsException("Type of media is unknown."); - } - mSrc = uriImage.getSrc(); - mWidth = uriImage.getWidth(); - mHeight = uriImage.getHeight(); - - if (LOCAL_LOGV) { - Log.v(TAG, "New ImageModel created:" - + " mSrc=" + mSrc - + " mContentType=" + mContentType - + " mUri=" + uri); - } - } - - private void decodeImageBounds(Uri uri) { - UriImage uriImage = new UriImage(mContext, uri); - mWidth = uriImage.getWidth(); - mHeight = uriImage.getHeight(); - - if (LOCAL_LOGV) { - Log.v(TAG, "Image bounds: " + mWidth + "x" + mHeight); - } - } - - // EventListener Interface - @Override - public void handleEvent(Event evt) { - if (evt.getType().equals(SmilMediaElementImpl.SMIL_MEDIA_START_EVENT)) { - mVisible = true; - } else if (mFill != ElementTime.FILL_FREEZE) { - mVisible = false; - } - - notifyModelChanged(false); - } - - public int getWidth() { - return mWidth; - } - - public int getHeight() { - return mHeight; - } - - protected void checkContentRestriction() throws ContentRestrictionException { - ContentRestriction cr = ContentRestrictionFactory.getContentRestriction(); - cr.checkImageContentType(mContentType); - } - - public ItemLoadedFuture loadThumbnailBitmap(ItemLoadedCallback callback) { - ThumbnailManager thumbnailManager = QKSMSApp.getApplication().getThumbnailManager(); - mItemLoadedFuture = thumbnailManager.getThumbnail(getUri(), callback); - return mItemLoadedFuture; - } - - public void cancelThumbnailLoading() { - if (mItemLoadedFuture != null && !mItemLoadedFuture.isDone()) { - if (Log.isLoggable(LogTag.APP, Log.DEBUG)) { - Log.v(TAG, "cancelThumbnailLoading for: " + this); - } - mItemLoadedFuture.cancel(getUri()); - mItemLoadedFuture = null; - } - } - - private Bitmap createBitmap(int thumbnailBoundsLimit, Uri uri) { - byte[] data = UriImage.getResizedImageData(mWidth, mHeight, - thumbnailBoundsLimit, thumbnailBoundsLimit, PICTURE_SIZE_LIMIT, uri, mContext); - if (LOCAL_LOGV) { - Log.v(TAG, "createBitmap size: " + (data == null ? data : data.length)); - } - return data == null ? null : BitmapFactory.decodeByteArray(data, 0, data.length); - } - - public Bitmap getBitmap(int width, int height) { - Bitmap bm = mFullSizeBitmapCache.get(); - if (bm == null) { - try { - bm = createBitmap(Math.max(width, height), getUri()); - if (bm != null) { - mFullSizeBitmapCache = new SoftReference<Bitmap>(bm); - } - } catch (OutOfMemoryError ex) { - // fall through and return a null bitmap. The callers can handle a null - // result and show R.drawable.ic_missing_thumbnail_picture - } - } - return bm; - } - - @Override - public boolean getMediaResizable() { - return true; - } - - @Override - protected void resizeMedia(int byteLimit, long messageId) throws MmsException { - UriImage image = new UriImage(mContext, getUri()); - - int widthLimit = MmsConfig.getMaxImageWidth(); - int heightLimit = MmsConfig.getMaxImageHeight(); - int size = getMediaSize(); - // In mms_config.xml, the max width has always been declared larger than the max height. - // Swap the width and height limits if necessary so we scale the picture as little as - // possible. - if (image.getHeight() > image.getWidth()) { - int temp = widthLimit; - widthLimit = heightLimit; - heightLimit = temp; - } - - if (Log.isLoggable(LogTag.APP, Log.VERBOSE)) { - Log.v(TAG, "resizeMedia size: " + size + " image.getWidth(): " - + image.getWidth() + " widthLimit: " + widthLimit - + " image.getHeight(): " + image.getHeight() - + " heightLimit: " + heightLimit - + " image.getContentType(): " + image.getContentType()); - } - - // Check if we're already within the limits - in which case we don't need to resize. - // The size can be zero here, even when the media has content. See the comment in - // MediaModel.initMediaSize. Sometimes it'll compute zero and it's costly to read the - // whole stream to compute the size. When we call getResizedImageAsPart(), we'll correctly - // set the size. - if (size != 0 && size <= byteLimit && - image.getWidth() <= widthLimit && - image.getHeight() <= heightLimit && - SUPPORTED_MMS_IMAGE_CONTENT_TYPES.contains(image.getContentType())) { - if (Log.isLoggable(LogTag.APP, Log.VERBOSE)) { - Log.v(TAG, "resizeMedia - already sized"); - } - return; - } - - PduPart part = image.getResizedImageAsPart( - widthLimit, - heightLimit, - byteLimit); - - if (part == null) { - throw new ExceedMessageSizeException("Not enough memory to turn image into part: " + - getUri()); - } - - // Update the content type because it may have changed due to resizing/recompressing - mContentType = new String(part.getContentType()); - - String src = getSrc(); - byte[] srcBytes = src.getBytes(); - part.setContentLocation(srcBytes); - int period = src.lastIndexOf("."); - byte[] contentId = period != -1 ? src.substring(0, period).getBytes() : srcBytes; - part.setContentId(contentId); - - PduPersister persister = PduPersister.getPduPersister(mContext); - this.mSize = part.getData().length; - - if (Log.isLoggable(LogTag.APP, Log.VERBOSE)) { - Log.v(TAG, "resizeMedia mSize: " + mSize); - } - - Uri newUri = persister.persistPart(part, messageId, null); - setUri(newUri); - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/model/LayoutModel.java b/QKSMS/src/main/java/com/moez/QKSMS/model/LayoutModel.java deleted file mode 100644 index f8940323b..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/model/LayoutModel.java +++ /dev/null @@ -1,271 +0,0 @@ -/* - * Copyright (C) 2008 Esmertec AG. - * Copyright (C) 2008 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.moez.QKSMS.model; - -import android.util.Config; -import android.util.Log; - -import com.moez.QKSMS.ui.mms.layout.LayoutManager; -import com.moez.QKSMS.ui.mms.layout.LayoutParameters; - -import java.util.ArrayList; - -public class LayoutModel extends Model { - private static final String TAG = SlideModel.TAG; - private static final boolean DEBUG = false; - private static final boolean LOCAL_LOGV = DEBUG ? Config.LOGD : Config.LOGV; - - public static final String IMAGE_REGION_ID = "Image"; - public static final String TEXT_REGION_ID = "Text"; - - public static final int LAYOUT_BOTTOM_TEXT = 0; - public static final int LAYOUT_TOP_TEXT = 1; - public static final int DEFAULT_LAYOUT_TYPE = LAYOUT_BOTTOM_TEXT; - - private int mLayoutType = DEFAULT_LAYOUT_TYPE; - private RegionModel mRootLayout; - private RegionModel mImageRegion; - private RegionModel mTextRegion; - private ArrayList<RegionModel> mNonStdRegions; - private LayoutParameters mLayoutParams; - - public LayoutModel() { - mLayoutParams = LayoutManager.getInstance().getLayoutParameters(); - // Create default root-layout and regions. - createDefaultRootLayout(); - createDefaultImageRegion(); - createDefaultTextRegion(); - } - - public LayoutModel(RegionModel rootLayout, ArrayList<RegionModel> regions) { - mLayoutParams = LayoutManager.getInstance().getLayoutParameters(); - mRootLayout = rootLayout; - mNonStdRegions = new ArrayList<RegionModel>(); - - for (RegionModel r : regions) { - String rId = r.getRegionId(); - if (rId.equals(IMAGE_REGION_ID)) { - mImageRegion = r; - } else if (rId.equals(TEXT_REGION_ID)) { - mTextRegion = r; - } else { - if (LOCAL_LOGV) { - Log.v(TAG, "Found non-standard region: " + rId); - } - mNonStdRegions.add(r); - } - } - - validateLayouts(); - } - - private void createDefaultRootLayout() { - mRootLayout = new RegionModel(null, 0, 0, mLayoutParams.getWidth(), mLayoutParams.getHeight()); - } - - private void createDefaultImageRegion() { - if (mRootLayout == null) { - throw new IllegalStateException("Root-Layout uninitialized."); - } - - mImageRegion = new RegionModel(IMAGE_REGION_ID, 0, 0, mRootLayout.getWidth(), mLayoutParams.getImageHeight()); - } - - private void createDefaultTextRegion() { - if (mRootLayout == null) { - throw new IllegalStateException("Root-Layout uninitialized."); - } - - mTextRegion = new RegionModel(TEXT_REGION_ID, 0, mLayoutParams.getImageHeight(), mRootLayout.getWidth(), mLayoutParams.getTextHeight()); - } - - private void validateLayouts() { - if (mRootLayout == null) { - createDefaultRootLayout(); - } - - if (mImageRegion == null) { - createDefaultImageRegion(); - } - - if (mTextRegion == null) { - createDefaultTextRegion(); - } - // LayoutModel will re-construct when orientation changes, so we need to - // initialize mLayoutType here. Otherwise, the mLayoutType is alway default - // value (LAYOUT_BOTTOM_TEXT) after LayoutModel re-construct. - mLayoutType = - (mImageRegion.getTop() == 0) ? LAYOUT_BOTTOM_TEXT : LAYOUT_TOP_TEXT; - } - - public RegionModel getRootLayout() { - return mRootLayout; - } - - public void setRootLayout(RegionModel rootLayout) { - mRootLayout = rootLayout; - } - - public RegionModel getImageRegion() { - return mImageRegion; - } - - public void setImageRegion(RegionModel imageRegion) { - mImageRegion = imageRegion; - } - - public RegionModel getTextRegion() { - return mTextRegion; - } - - public void setTextRegion(RegionModel textRegion) { - mTextRegion = textRegion; - } - - /** - * Get all regions except root-layout. The result is READ-ONLY. - */ - public ArrayList<RegionModel> getRegions() { - ArrayList<RegionModel> regions = new ArrayList<>(); - if (mImageRegion != null) { - regions.add(mImageRegion); - } - if (mTextRegion != null) { - regions.add(mTextRegion); - } - return regions; - } - - public RegionModel findRegionById(String rId) { - if (IMAGE_REGION_ID.equals(rId)) { - return mImageRegion; - } else if (TEXT_REGION_ID.equals(rId)) { - return mTextRegion; - } else { - for (RegionModel r : mNonStdRegions) { - if (r.getRegionId().equals(rId)) { - return r; - } - } - - if (LOCAL_LOGV) { - Log.v(TAG, "Region not found: " + rId); - } - return null; - } - } - - public int getLayoutWidth() { - return mRootLayout.getWidth(); - } - - public int getLayoutHeight() { - return mRootLayout.getHeight(); - } - - public String getBackgroundColor() { - return mRootLayout.getBackgroundColor(); - } - - public void changeTo(int layout) { - if (mRootLayout == null) { - throw new IllegalStateException("Root-Layout uninitialized."); - } - - if (mLayoutParams == null) { - mLayoutParams = LayoutManager.getInstance().getLayoutParameters(); - } - - if (mLayoutType != layout) { - switch (layout) { - case LAYOUT_BOTTOM_TEXT: { - mImageRegion.setTop(0); - mTextRegion.setTop(mLayoutParams.getImageHeight()); - mLayoutType = layout; - notifyModelChanged(true); - } - break; - case LAYOUT_TOP_TEXT: { - mImageRegion.setTop(mLayoutParams.getTextHeight()); - mTextRegion.setTop(0); - mLayoutType = layout; - notifyModelChanged(true); - } - break; - default: { - Log.w(TAG, "Unknown layout type: " + layout); - } - } - } else { - if (LOCAL_LOGV) { - Log.v(TAG, "Skip changing layout."); - } - } - } - - public int getLayoutType() { - return mLayoutType; - } - - @Override - protected void registerModelChangedObserverInDescendants( - IModelChangedObserver observer) { - if (mRootLayout != null) { - mRootLayout.registerModelChangedObserver(observer); - } - - if (mImageRegion != null) { - mImageRegion.registerModelChangedObserver(observer); - } - - if (mTextRegion != null) { - mTextRegion.registerModelChangedObserver(observer); - } - } - - @Override - protected void unregisterModelChangedObserverInDescendants( - IModelChangedObserver observer) { - if (mRootLayout != null) { - mRootLayout.unregisterModelChangedObserver(observer); - } - - if (mImageRegion != null) { - mImageRegion.unregisterModelChangedObserver(observer); - } - - if (mTextRegion != null) { - mTextRegion.unregisterModelChangedObserver(observer); - } - } - - @Override - protected void unregisterAllModelChangedObserversInDescendants() { - if (mRootLayout != null) { - mRootLayout.unregisterAllModelChangedObservers(); - } - - if (mImageRegion != null) { - mImageRegion.unregisterAllModelChangedObservers(); - } - - if (mTextRegion != null) { - mTextRegion.unregisterAllModelChangedObservers(); - } - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/model/MediaModel.java b/QKSMS/src/main/java/com/moez/QKSMS/model/MediaModel.java deleted file mode 100644 index d97edc23a..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/model/MediaModel.java +++ /dev/null @@ -1,313 +0,0 @@ -/* - * Copyright (C) 2008 Esmertec AG. - * Copyright (C) 2008 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.moez.QKSMS.model; - -import android.content.ContentResolver; -import android.content.Context; -import android.content.Intent; -import android.net.Uri; -import android.util.Log; -import com.google.android.mms.MmsException; -import com.google.android.mms.smil.SmilHelper; -import com.moez.QKSMS.LogTag; -import com.moez.QKSMS.MmsConfig; -import org.w3c.dom.events.EventListener; - -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; -import java.util.ArrayList; -// TODO: remove dependency for SDK build - -public abstract class MediaModel extends Model implements EventListener { - protected static final String TAG = "Mms/media"; - - private final static String MUSIC_SERVICE_ACTION = "com.android.music.musicservicecommand"; - - protected Context mContext; - protected int mBegin; - protected int mDuration; - protected String mTag; - protected String mSrc; - protected String mContentType; - private Uri mUri; - private byte[] mData; - protected short mFill; - protected int mSize; - protected int mSeekTo; - protected boolean mMediaResizeable; - - private final ArrayList<MediaAction> mMediaActions; - public static enum MediaAction { - NO_ACTIVE_ACTION, - START, - STOP, - PAUSE, - SEEK, - } - - public MediaModel(Context context, String tag, String contentType, - String src, Uri uri) throws MmsException { - mContext = context; - mTag = tag; - mContentType = contentType; - mSrc = src; - mUri = uri; - initMediaSize(); - mMediaActions = new ArrayList<MediaAction>(); - } - - public MediaModel(Context context, String tag, String contentType, - String src, byte[] data) { - if (data == null) { - throw new IllegalArgumentException("data may not be null."); - } - - mContext = context; - mTag = tag; - mContentType = contentType; - mSrc = src; - mData = data; - mSize = data.length; - mMediaActions = new ArrayList<MediaAction>(); - } - - public int getBegin() { - return mBegin; - } - - public void setBegin(int begin) { - mBegin = begin; - notifyModelChanged(true); - } - - public int getDuration() { - return mDuration; - } - - public void setDuration(int duration) { - if (isPlayable() && (duration < 0)) { - // 'indefinite' duration, we should try to find its exact value; - try { - initMediaDuration(); - } catch (MmsException e) { - // On error, keep default duration. - Log.e(TAG, e.getMessage(), e); - return; - } - } else { - mDuration = duration; - } - notifyModelChanged(true); - } - - public String getTag() { - return mTag; - } - - public String getContentType() { - return mContentType; - } - - /** - * Get the URI of the media. - * - * @return The URI of the media. - */ - public Uri getUri() { - return mUri; - } - - public byte[] getData() { - if (mData != null) { - byte[] data = new byte[mData.length]; - System.arraycopy(mData, 0, data, 0, mData.length); - return data; - } - return null; - } - - /** - * @param uri the mUri to set - */ - void setUri(Uri uri) { - mUri = uri; - } - - /** - * @return the mSrc - */ - public String getSrc() { - return mSrc; - } - - /** - * @return the mFill - */ - public short getFill() { - return mFill; - } - - /** - * @param fill the mFill to set - */ - public void setFill(short fill) { - mFill = fill; - notifyModelChanged(true); - } - - /** - * @return whether the media is resizable or not. For instance, a picture can be resized - * to smaller dimensions or lower resolution. Other media, such as video and sounds, aren't - * currently able to be resized. - */ - public boolean getMediaResizable() { - return mMediaResizeable; - } - - /** - * @return the size of the attached media - */ - public int getMediaSize() { - return mSize; - } - - public boolean isText() { - return mTag.equals(SmilHelper.ELEMENT_TAG_TEXT); - } - - public boolean isImage() { - return mTag.equals(SmilHelper.ELEMENT_TAG_IMAGE); - } - - public boolean isVideo() { - return mTag.equals(SmilHelper.ELEMENT_TAG_VIDEO); - } - - public boolean isAudio() { - return mTag.equals(SmilHelper.ELEMENT_TAG_AUDIO); - } - - protected void initMediaDuration() throws MmsException { - // TODO Stagefright - /* REMOVED FOR STAGEFRIGHT BUG - if (mUri == null) { - throw new IllegalArgumentException("Uri may not be null."); - } - - MediaMetadataRetriever retriever = new MediaMetadataRetriever(); - int duration = 0; - try { - retriever.setDataSource(mContext, mUri); - String dur = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION); - if (dur != null) { - duration = Integer.parseInt(dur); - } - mDuration = duration; - } catch (Exception ex) { - Log.e(TAG, "MediaMetadataRetriever failed to get duration for " + mUri.getPath(), ex); - throw new MmsException(ex); - } finally { - retriever.release(); - } */ - } - - private void initMediaSize() throws MmsException { - ContentResolver cr = mContext.getContentResolver(); - InputStream input = null; - try { - input = cr.openInputStream(mUri); - if (input instanceof FileInputStream) { - // avoid reading the whole stream to get its length - FileInputStream f = (FileInputStream) input; - mSize = (int) f.getChannel().size(); - // sometimes mSize will be zero here. It's tempting to count the bytes as the code - // does below, but that turns out to be very slow. We'll deal with a zero size - // when we resize the media. - - if (isVideo() && mSize > MmsConfig.getMaxMessageSize()) { - Log.w(TAG, "initMediaSize: Video size: f.getChannel().size(): " + mSize + - " larger than max message size: " + MmsConfig.getMaxMessageSize()); - } - } else if (input != null) { - while (-1 != input.read()) { - mSize++; - } - } - - } catch (IOException e) { - // Ignore - Log.e(TAG, "IOException caught while opening or reading stream", e); - if (e instanceof FileNotFoundException) { - throw new MmsException(e.getMessage()); - } - } finally { - if (null != input) { - try { - input.close(); - } catch (IOException e) { - // Ignore - Log.e(TAG, "IOException caught while closing stream", e); - } - } - } - } - - public static boolean isMmsUri(Uri uri) { - return uri.getAuthority().startsWith("mms"); - } - - public int getSeekTo() { - return mSeekTo; - } - - public void appendAction(MediaAction action) { - mMediaActions.add(action); - } - - public MediaAction getCurrentAction() { - if (mMediaActions.isEmpty()) { - return MediaAction.NO_ACTIVE_ACTION; - } - return mMediaActions.remove(0); - } - - protected boolean isPlayable() { - return false; - } - - protected void pauseMusicPlayer() { - if (Log.isLoggable(LogTag.APP, Log.VERBOSE)) { - Log.d(TAG, "pauseMusicPlayer"); - } - - Intent i = new Intent(MUSIC_SERVICE_ACTION); - i.putExtra("command", "pause"); - mContext.sendBroadcast(i); - } - - /** - * If the attached media is resizeable, resize it to fit within the byteLimit. Save the - * new part in the pdu. - * @param byteLimit the max size of the media attachment - * @throws com.google.android.mms.MmsException - */ - protected void resizeMedia(int byteLimit, long messageId) throws MmsException { - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/model/MediaModelFactory.java b/QKSMS/src/main/java/com/moez/QKSMS/model/MediaModelFactory.java deleted file mode 100644 index cce8c1007..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/model/MediaModelFactory.java +++ /dev/null @@ -1,501 +0,0 @@ -/* - * Copyright (C) 2008 Esmertec AG. - * Copyright (C) 2008 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.moez.QKSMS.model; - -import android.content.Context; -import android.preference.PreferenceManager; -import android.util.Log; - -import com.google.android.mms.ContentType; -import com.google.android.mms.MmsException; -import com.google.android.mms.pdu_alt.PduBody; -import com.google.android.mms.pdu_alt.PduPart; -import com.moez.QKSMS.LogTag; -import com.moez.QKSMS.MmsConfig; - -import org.json.JSONArray; -import org.json.JSONObject; -import org.w3c.dom.smil.SMILMediaElement; -import org.w3c.dom.smil.SMILRegionElement; -import org.w3c.dom.smil.SMILRegionMediaElement; -import org.w3c.dom.smil.Time; -import org.w3c.dom.smil.TimeList; - -import java.io.IOException; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; -import java.util.ArrayList; -import java.util.Collections; - -public class MediaModelFactory { - private static final String TAG = "Mms:media"; - private static final boolean LOCAL_LOGV = false; - - /** - * Returns the media model for the given SMILMediaElement in the PduBody. - * - * @param context Context - * @param sme The SMILMediaElement to find - * @param srcs String array of sources - * @param layouts LayoutModel - * @param pb PduBuddy - * @return MediaModel - * @throws IOException - * @throws IllegalArgumentException - * @throws MmsException - */ - public static MediaModel getMediaModel(Context context, SMILMediaElement sme, - ArrayList<String> srcs, LayoutModel layouts, - PduBody pb) - - throws IOException, IllegalArgumentException, MmsException { - - String tag = sme.getTagName(); - String src = sme.getSrc(); - - PduPart part = findPart(context, pb, src, srcs); - - if (sme instanceof SMILRegionMediaElement) { - return getRegionMediaModel( - context, tag, src, (SMILRegionMediaElement) sme, layouts, part); - } else { - return getGenericMediaModel( - context, tag, src, sme, part, null); - } - } - - /** - * This method is meant to identify the part in the given PduBody that corresponds to the given - * src string. - * - * Essentially, a SMIL MMS is formatted as follows: - * - * 1. A smil/application part, which contains XML-like formatting for images, text, audio, - * slideshows, videos, etc. - * 2. One or more parts that correspond to one of the elements that was mentioned in the - * formatting above. - * - * In the smil/application part, elements are identified by a "src" attribute in an XML-like - * element. The challenge of this method lies in the fact that sometimes, the src string isn't - * located at all in the part that it is meant to identify. - * - * We employ several methods of pairing src strings up to parts, using certain patterns we've - * seen in failed MMS messages. These are described in this method. - * TODO TODO TODO: Create a testing suite for this! - */ - private static PduPart findPart(final Context context, PduBody pb, String src, - ArrayList<String> srcs) { - - PduPart result = null; - - if (src != null) { - src = unescapeXML(src); - - // Sometimes, src takes the form of "cid:[NUMBER]". - if (contentIdSrc(src)) { - - // Extract the content ID, and try finding the part using that. - result = pb.getPartByContentId("<" + src.substring("cid:".length()) + ">"); - - if (result == null) { - // Another thing that can happen is that there is a slideshow of images, each with - // "cid:[NUMBER]" src, but the parts aren't labelled with the content ID. If - // this is the case, then we just return the ith image part, where i is the position - // of src if all the srcs are sorted in ascending order as content IDs. srcs may - // include duplicates; we remove those and then identify i when the list is free from - // duplicates. - // - // i.e., for srcs = [ "cid:755", "cid:755", "cid:756", "cid:757", "cid:758" ], - // the i of "cid:755" is 0; for "cid:756" is 1, etc. - - // First check that all the src strings are content IDs. - boolean allContentIDs = true; - for (String _src : srcs) { - if (!contentIdSrc(_src)) { - allContentIDs = false; - break; - } - } - - if (allContentIDs) { - // Now, build a list of long IDs, sort them, and remove the duplicates. - ArrayList<Long> cids = new ArrayList<>(); - for (String _src : srcs) { - cids.add(getContentId(_src)); - } - Collections.sort(cids); - - int removed = 0; - long previous = -1; - for (int i = 0; i < cids.size() - removed; i++) { - long cid = cids.get(i); - - if (cid == previous) { - cids.remove(i); - removed++; - } else { - previous = cid; - } - } - - // Find the i such that getContentId(src) == cids[i] - long cid = getContentId(src); - int i = cids.indexOf(cid); - - // Finally, since the SMIL formatted part will come first, we expect to see - // 1 + cids.size() parts, and the right part for this particular cid will be - // 1 + i. - if (1 + i < pb.getPartsNum()) { - result = pb.getPart(i + 1); - } - } - } - - } else if (textSrc(src)) { - // This is just a text src, so look for the PduPart that is has the "text/plain" - // content type. - for (int i = 0; i < pb.getPartsNum(); i++) { - PduPart part = pb.getPart(i); - String contentType = byteArrayToString(part.getContentType()); - if ("text/plain".equals(contentType)) { - result = part; - break; - } - } - } - - // Try a few more things in case the previous processing didn't work correctly: - - // Search by name - if (result == null) { - result = pb.getPartByName(src); - } - - // Search by filename - if (result == null) { - result = pb.getPartByFileName(src); - } - - // Search by content location - if (result == null) { - result = pb.getPartByContentLocation(src); - } - - // Try treating the src string as a content ID, and searching by content ID. - if (result == null) { - result = pb.getPartByContentId("<" + src + ">"); - } - - // TODO: - // four remaining cases currently in Firebase: - // 1. src: "image:[NUMBER]" (broken formatting) - // 2. src: "[NUMBER]" (broken formatting) - // 3. src: "[name].vcf" (we don't support x-vcard) - // 3. src: "Current Location.loc.vcf" (we don't support x-vcard) - - } - - if (result != null) { - return result; - } - - if (pb.getPartsNum() > 0) { - - final JSONArray array = new JSONArray(); - - for (int i = 0; i < pb.getPartsNum(); i++) { - - JSONObject object = new JSONObject(); - - try { - object.put("part_number", i); - } catch (Exception e) { - e.printStackTrace(); - } - - try { - object.put("location", i); - } catch (Exception e) { - e.printStackTrace(); - } - - try { - object.put("charset", pb.getPart(i).getCharset()); - } catch (Exception e) { - e.printStackTrace(); - } - - try { - object.put("content_disposition", byteArrayToString(pb.getPart(i).getContentDisposition())); - } catch (Exception e) { - e.printStackTrace(); - } - - try { - object.put("content_id", byteArrayToString(pb.getPart(i).getContentId())); - } catch (Exception e) { - e.printStackTrace(); - } - - try { - object.put("content_location", byteArrayToString(pb.getPart(i).getContentLocation())); - } catch (Exception e) { - e.printStackTrace(); - } - - try { - object.put("content_transfer_encoding", byteArrayToString(pb.getPart(i).getContentTransferEncoding())); - } catch (Exception e) { - e.printStackTrace(); - } - - try { - object.put("content_type", byteArrayToString(pb.getPart(i).getContentType())); - } catch (Exception e) { - e.printStackTrace(); - } - - try { - object.put("data", byteArrayToString(pb.getPart(i).getData())); - } catch (Exception e) { - e.printStackTrace(); - } - - try { - object.put("data_uri", pb.getPart(i).getDataUri()); - } catch (Exception e) { - e.printStackTrace(); - } - - try { - object.put("file_name", byteArrayToString(pb.getPart(i).getFilename())); - } catch (Exception e) { - e.printStackTrace(); - } - - try { - object.put("name", byteArrayToString(pb.getPart(i).getName())); - } catch (Exception e) { - e.printStackTrace(); - } - - if (pb.getPart(i).generateLocation() != null) { - Log.d(TAG, "Location: " + pb.getPart(i).generateLocation()); - if (pb.getPart(i).generateLocation().contains(src)) { - return pb.getPart(i); - } - } - - array.put(object); - } - } - - throw new IllegalArgumentException("No part found for the model."); - } - - private static boolean textSrc(String src) { - return src != null && src.startsWith("text") && src.endsWith(".txt"); - } - - private static boolean contentIdSrc(String src) { - return src != null && src.startsWith("cid:"); - } - - private static long getContentId(String src) { - if (src == null) { - return -1; - } else { - if (LOCAL_LOGV) { - Log.v(TAG, "Initial contentId: " + src); - } - src = src.substring("cid:".length()); - src = unescapeXML(src); - // Strip any leading < or trailing > ... they are present sometimes and causing error(s) - src = src.replaceAll("(^\\<)|(\\>$)", ""); - if (LOCAL_LOGV) { - Log.v(TAG, "Final contentId: " + src); - } - return Long.parseLong(src); - } - } - - private static String byteArrayToString(byte[] bytes) { - if (bytes != null) { - return new String(bytes); - } - - return "null"; - } - - private static boolean hasBeenPosted(Context context, JSONArray array) throws NoSuchAlgorithmException { - MessageDigest messageDigest = MessageDigest.getInstance("SHA-256"); - messageDigest.update(array.toString().getBytes()); - String encryptedString = new String(messageDigest.digest()); - - return PreferenceManager.getDefaultSharedPreferences(context).getBoolean(encryptedString, false); - } - - private static void savePostStatus(Context context, JSONArray array, boolean posted) throws NoSuchAlgorithmException { - MessageDigest messageDigest = MessageDigest.getInstance("SHA-256"); - messageDigest.update(array.toString().getBytes()); - String encryptedString = new String(messageDigest.digest()); - - PreferenceManager.getDefaultSharedPreferences(context).edit().putBoolean(encryptedString, true); - } - - private static String unescapeXML(String str) { - return str.replaceAll("<", "<") - .replaceAll(">", ">") - .replaceAll(""", "\"") - .replaceAll("'", "'") - .replaceAll("&", "&"); - } - - private static MediaModel getRegionMediaModel(Context context, - String tag, String src, SMILRegionMediaElement srme, - LayoutModel layouts, PduPart part) throws IOException, MmsException { - SMILRegionElement sre = srme.getRegion(); - if (sre != null) { - RegionModel region = layouts.findRegionById(sre.getId()); - if (region != null) { - return getGenericMediaModel(context, tag, src, srme, part, region); - } - } else { - String rId; - - if (tag.equals(SmilHelper.ELEMENT_TAG_TEXT)) { - rId = LayoutModel.TEXT_REGION_ID; - } else { - rId = LayoutModel.IMAGE_REGION_ID; - } - - RegionModel region = layouts.findRegionById(rId); - if (region != null) { - return getGenericMediaModel(context, tag, src, srme, part, region); - } - } - - throw new IllegalArgumentException("Region not found or bad region ID."); - } - - // When we encounter a content type we can't handle, such as "application/vnd.smaf", instead - // of throwing an exception and crashing, insert an empty TextModel in its place. - private static MediaModel createEmptyTextModel(Context context, RegionModel regionModel) - throws IOException { - return new TextModel(context, ContentType.TEXT_PLAIN, null, regionModel); - } - - private static MediaModel getGenericMediaModel(Context context, - String tag, String src, SMILMediaElement sme, PduPart part, - RegionModel regionModel) throws IOException, MmsException { - byte[] bytes = part.getContentType(); - if (bytes == null) { - throw new IllegalArgumentException( - "Content-Type of the part may not be null."); - } - - String contentType = new String(bytes); - MediaModel media; - - switch (tag) { - case SmilHelper.ELEMENT_TAG_TEXT: - media = new TextModel(context, contentType, src, - part.getCharset(), part.getData(), regionModel); - break; - case SmilHelper.ELEMENT_TAG_IMAGE: - media = new ImageModel(context, contentType, src, - part.getDataUri(), regionModel); - break; - case SmilHelper.ELEMENT_TAG_VIDEO: - media = new VideoModel(context, contentType, src, - part.getDataUri(), regionModel); - break; - case SmilHelper.ELEMENT_TAG_AUDIO: - media = new AudioModel(context, contentType, src, - part.getDataUri()); - break; - case SmilHelper.ELEMENT_TAG_REF: - if (ContentType.isTextType(contentType)) { - media = new TextModel(context, contentType, src, - part.getCharset(), part.getData(), regionModel); - } else if (ContentType.isImageType(contentType)) { - media = new ImageModel(context, contentType, src, - part.getDataUri(), regionModel); - } else if (ContentType.isVideoType(contentType)) { - media = new VideoModel(context, contentType, src, - part.getDataUri(), regionModel); - } else if (ContentType.isAudioType(contentType)) { - media = new AudioModel(context, contentType, src, - part.getDataUri()); - } else { - Log.d(TAG, "[MediaModelFactory] getGenericMediaModel Unsupported Content-Type: " - + contentType); - media = createEmptyTextModel(context, regionModel); - } - break; - default: - throw new IllegalArgumentException("Unsupported TAG: " + tag); - } - - // Set 'begin' property. - int begin = 0; - TimeList tl = sme.getBegin(); - if ((tl != null) && (tl.getLength() > 0)) { - // We only support a single begin value. - Time t = tl.item(0); - begin = (int) (t.getResolvedOffset() * 1000); - } - media.setBegin(begin); - - // Set 'duration' property. - int duration = (int) (sme.getDur() * 1000); - if (duration <= 0) { - tl = sme.getEnd(); - if ((tl != null) && (tl.getLength() > 0)) { - // We only support a single end value. - Time t = tl.item(0); - if (t.getTimeType() != Time.SMIL_TIME_INDEFINITE) { - duration = (int) (t.getResolvedOffset() * 1000) - begin; - - if (duration == 0 && (media instanceof AudioModel || media instanceof VideoModel)) { - duration = MmsConfig.getMinimumSlideElementDuration(); - if (Log.isLoggable(TAG, Log.VERBOSE)) { - Log.v(TAG, "[MediaModelFactory] compute new duration for " + tag + ", duration=" + duration); - } - } - } - } - } - - media.setDuration(duration); - - if (!MmsConfig.getSlideDurationEnabled()) { - /** - * Because The slide duration is not supported by mmsc, - * the device has to set fill type as FILL_FREEZE. - * If not, the media will disappear while rotating the screen - * in the slide show play view. - */ - media.setFill(SMILMediaElement.FILL_FREEZE); - } else { - // Set 'fill' property. - media.setFill(sme.getFill()); - } - return media; - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/model/Model.java b/QKSMS/src/main/java/com/moez/QKSMS/model/Model.java deleted file mode 100644 index ea20f6c78..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/model/Model.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (C) 2008 Esmertec AG. - * Copyright (C) 2008 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.moez.QKSMS.model; - -import java.util.concurrent.CopyOnWriteArrayList; - -public class Model { - protected CopyOnWriteArrayList<IModelChangedObserver> mModelChangedObservers = - new CopyOnWriteArrayList<IModelChangedObserver>(); - - public void registerModelChangedObserver(IModelChangedObserver observer) { - if (!mModelChangedObservers.contains(observer)) { - mModelChangedObservers.add(observer); - registerModelChangedObserverInDescendants(observer); - } - } - - public void unregisterModelChangedObserver(IModelChangedObserver observer) { - mModelChangedObservers.remove(observer); - unregisterModelChangedObserverInDescendants(observer); - } - - public void unregisterAllModelChangedObservers() { - unregisterAllModelChangedObserversInDescendants(); - mModelChangedObservers.clear(); - } - - protected void notifyModelChanged(boolean dataChanged) { - for (IModelChangedObserver observer : mModelChangedObservers) { - observer.onModelChanged(this, dataChanged); - } - } - - protected void registerModelChangedObserverInDescendants( - IModelChangedObserver observer) { - // Dummy method. - } - - protected void unregisterModelChangedObserverInDescendants( - IModelChangedObserver observer) { - // Dummy method. - } - - protected void unregisterAllModelChangedObserversInDescendants() { - // Dummy method. - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/model/RegionMediaModel.java b/QKSMS/src/main/java/com/moez/QKSMS/model/RegionMediaModel.java deleted file mode 100644 index 21c093318..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/model/RegionMediaModel.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (C) 2008 Esmertec AG. - * Copyright (C) 2008 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.moez.QKSMS.model; - -import android.content.Context; -import android.net.Uri; - -import com.google.android.mms.MmsException; - -public abstract class RegionMediaModel extends MediaModel { - protected RegionModel mRegion; - protected boolean mVisible = true; - - public RegionMediaModel(Context context, String tag, Uri uri, - RegionModel region) throws MmsException { - this(context, tag, null, null, uri, region); - } - - public RegionMediaModel(Context context, String tag, String contentType, - String src, Uri uri, RegionModel region) throws MmsException { - super(context, tag, contentType, src, uri); - mRegion = region; - } - - public RegionMediaModel(Context context, String tag, String contentType, - String src, byte[] data, RegionModel region) { - super(context, tag, contentType, src, data); - mRegion = region; - } - - public RegionModel getRegion() { - return mRegion; - } - - public void setRegion(RegionModel region) { - mRegion = region; - notifyModelChanged(true); - } - - /** - * @return the mVisible - */ - public boolean isVisible() { - return mVisible; - } - - /** - * @param visible the mVisible to set - */ - public void setVisible(boolean visible) { - mVisible = visible; - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/model/RegionModel.java b/QKSMS/src/main/java/com/moez/QKSMS/model/RegionModel.java deleted file mode 100644 index 4b687426f..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/model/RegionModel.java +++ /dev/null @@ -1,147 +0,0 @@ -/* - * Copyright (C) 2008 Esmertec AG. - * Copyright (C) 2008 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.moez.QKSMS.model; - -public class RegionModel extends Model { - private static final String DEFAULT_FIT = "meet"; - private final String mRegionId; - private String mFit; - private int mLeft; - private int mTop; - private int mWidth; - private int mHeight; - private String mBackgroundColor; - - public RegionModel(String regionId, int left, int top, - int width, int height) { - this(regionId, DEFAULT_FIT, left, top, width, height); - } - - public RegionModel(String regionId, String fit, int left, int top, - int width, int height) { - this(regionId, fit, left, top, width, height, null); - } - - public RegionModel(String regionId, String fit, int left, int top, - int width, int height, String bgColor) { - mRegionId = regionId; - mFit = fit; - mLeft = left; - mTop = top; - mWidth = width; - mHeight = height; - mBackgroundColor = bgColor; - } - - /** - * @return the mRegionId - */ - public String getRegionId() { - return mRegionId; - } - - /** - * @return the mFit - */ - public String getFit() { - return mFit; - } - - /** - * @param fit the mFit to set - */ - public void setFit(String fit) { - mFit = fit; - notifyModelChanged(true); - } - - /** - * @return the mLeft - */ - public int getLeft() { - return mLeft; - } - - /** - * @param left the mLeft to set - */ - public void setLeft(int left) { - mLeft = left; - notifyModelChanged(true); - } - - /** - * @return the mTop - */ - public int getTop() { - return mTop; - } - - /** - * @param top the mTop to set - */ - public void setTop(int top) { - mTop = top; - notifyModelChanged(true); - } - - /** - * @return the mWidth - */ - public int getWidth() { - return mWidth; - } - - /** - * @param width the mWidth to set - */ - public void setWidth(int width) { - mWidth = width; - notifyModelChanged(true); - } - - /** - * @return the mHeight - */ - public int getHeight() { - return mHeight; - } - - /** - * @param height the mHeight to set - */ - public void setHeight(int height) { - mHeight = height; - notifyModelChanged(true); - } - - /** - * @return the mBackgroundColor - */ - public String getBackgroundColor() { - return mBackgroundColor; - } - - /** - * @param bgColor the mBackgroundColor to set - */ - public void setBackgroundColor(String bgColor) { - mBackgroundColor = bgColor; - notifyModelChanged(true); - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/model/SlideModel.java b/QKSMS/src/main/java/com/moez/QKSMS/model/SlideModel.java deleted file mode 100644 index bcea5e281..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/model/SlideModel.java +++ /dev/null @@ -1,574 +0,0 @@ -/* - * Copyright (C) 2008 Esmertec AG. - * Copyright (C) 2008 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.moez.QKSMS.model; - -import android.text.TextUtils; -import android.util.Config; -import android.util.Log; - -import com.android.mms.dom.smil.SmilParElementImpl; -import com.google.android.mms.ContentType; - -import org.w3c.dom.events.Event; -import org.w3c.dom.events.EventListener; -import org.w3c.dom.smil.ElementTime; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Iterator; -import java.util.List; -import java.util.ListIterator; - -public class SlideModel extends Model implements List<MediaModel>, EventListener { - public static final String TAG = "SlideModel"; - private static final boolean DEBUG = false; - private static final boolean LOCAL_LOGV = DEBUG ? Config.LOGD : Config.LOGV; - private static final int DEFAULT_SLIDE_DURATION = 5000; - - private final ArrayList<MediaModel> mMedia = new ArrayList<>(); - - private MediaModel mText; - private MediaModel mImage; - private MediaModel mAudio; - private MediaModel mVideo; - - private boolean mCanAddImage = true; - private boolean mCanAddAudio = true; - private boolean mCanAddVideo = true; - - private int mDuration; - private boolean mVisible = true; - private short mFill; - private int mSlideSize; - private SlideshowModel mParent; - - public SlideModel(SlideshowModel slideshow) { - this(DEFAULT_SLIDE_DURATION, slideshow); - } - - public SlideModel(int duration, SlideshowModel slideshow) { - mDuration = duration; - mParent = slideshow; - } - - /** - * Create a SlideModel with exist media collection. - * - * @param duration The duration of the slide. - * @param mediaList The exist media collection. - * - * @throws IllegalStateException One or more media in the mediaList cannot - * be added into the slide due to a slide cannot contain image - * and video or audio and video at the same time. - */ - public SlideModel(int duration, ArrayList<MediaModel> mediaList) { - mDuration = duration; - - int maxDur = 0; - for (MediaModel media : mediaList) { - internalAdd(media); - - int mediaDur = media.getDuration(); - if (mediaDur > maxDur) { - maxDur = mediaDur; - } - } - - updateDuration(maxDur); - } - - private void internalAdd(MediaModel media) throws IllegalStateException { - if (media == null) { - // Don't add null value into the list. - return; - } - - if (media.isText()) { - String contentType = media.getContentType(); - if (TextUtils.isEmpty(contentType) || ContentType.TEXT_PLAIN.equals(contentType) - || ContentType.TEXT_HTML.equals(contentType) - || ContentType.TEXT_VCARD.equals(contentType)) { - internalAddOrReplace(mText, media); - mText = media; - } else { - Log.w(TAG, "[SlideModel] content type " + media.getContentType() + - " isn't supported (as text)"); - } - } else if (media.isImage()) { - if (mCanAddImage) { - internalAddOrReplace(mImage, media); - mImage = media; - mCanAddVideo = false; - } else { - Log.w(TAG, "[SlideModel] content type " + media.getContentType() + - " - can't add image in this state"); - } - } else if (media.isAudio()) { - if (mCanAddAudio) { - internalAddOrReplace(mAudio, media); - mAudio = media; - mCanAddVideo = false; - } else { - Log.w(TAG, "[SlideModel] content type " + media.getContentType() + - " - can't add audio in this state"); - } - } else if (media.isVideo()) { - if (mCanAddVideo) { - internalAddOrReplace(mVideo, media); - mVideo = media; - mCanAddImage = false; - mCanAddAudio = false; - } else { - Log.w(TAG, "[SlideModel] content type " + media.getContentType() + - " - can't add video in this state"); - } - } - } - - private void internalAddOrReplace(MediaModel old, MediaModel media) { - // If the media is resizable, at this point consider it to be zero length. - // Just before we send the slideshow, we take the remaining space in the - // slideshow and equally allocate it to all the resizeable media items and resize them. - int addSize = media.getMediaResizable() ? 0 : media.getMediaSize(); - int removeSize; - if (old == null) { - if (null != mParent) { - mParent.checkMessageSize(addSize); - } - mMedia.add(media); - increaseSlideSize(addSize); - increaseMessageSize(addSize); - } else { - removeSize = old.getMediaResizable() ? 0 : old.getMediaSize(); - if (addSize > removeSize) { - if (null != mParent) { - mParent.checkMessageSize(addSize - removeSize); - } - increaseSlideSize(addSize - removeSize); - increaseMessageSize(addSize - removeSize); - } else { - decreaseSlideSize(removeSize - addSize); - decreaseMessageSize(removeSize - addSize); - } - mMedia.set(mMedia.indexOf(old), media); - old.unregisterAllModelChangedObservers(); - } - - for (IModelChangedObserver observer : mModelChangedObservers) { - media.registerModelChangedObserver(observer); - } - } - - private boolean internalRemove(Object object) { - if (mMedia.remove(object)) { - if (object instanceof TextModel) { - mText = null; - } else if (object instanceof ImageModel) { - mImage = null; - mCanAddVideo = true; - } else if (object instanceof AudioModel) { - mAudio = null; - mCanAddVideo = true; - } else if (object instanceof VideoModel) { - mVideo = null; - mCanAddImage = true; - mCanAddAudio = true; - } - // If the media is resizable, at this point consider it to be zero length. - // Just before we send the slideshow, we take the remaining space in the - // slideshow and equally allocate it to all the resizeable media items and resize them. - int decreaseSize = ((MediaModel) object).getMediaResizable() ? 0 - : ((MediaModel) object).getMediaSize(); - decreaseSlideSize(decreaseSize); - decreaseMessageSize(decreaseSize); - - ((Model) object).unregisterAllModelChangedObservers(); - - return true; - } - - return false; - } - - /** - * @return the mDuration - */ - public int getDuration() { - return mDuration; - } - - /** - * @param duration the mDuration to set - */ - public void setDuration(int duration) { - mDuration = duration; - notifyModelChanged(true); - } - - public int getSlideSize() { - return mSlideSize; - } - - public void increaseSlideSize(int increaseSize) { - if (increaseSize > 0) { - mSlideSize += increaseSize; - } - } - - public void decreaseSlideSize(int decreaseSize) { - if (decreaseSize > 0) { - mSlideSize -= decreaseSize; - if (mSlideSize < 0) { - mSlideSize = 0; - } - } - } - - public void setParent(SlideshowModel parent) { - mParent = parent; - } - - public void increaseMessageSize(int increaseSize) { - if ((increaseSize > 0) && (null != mParent)) { - int size = mParent.getCurrentMessageSize(); - size += increaseSize; - mParent.setCurrentMessageSize(size); - } - } - - public void decreaseMessageSize(int decreaseSize) { - if ((decreaseSize > 0) && (null != mParent)) { - int size = mParent.getCurrentMessageSize(); - size -= decreaseSize; - if (size < 0) { - size = 0; - } - mParent.setCurrentMessageSize(size); - } - } - - // - // Implement List<E> interface. - // - - /** - * Add a MediaModel to the slide. If the slide has already contained - * a media object in the same type, the media object will be replaced by - * the new one. - * - * @param object A media object to be added into the slide. - * @return true - * @throws IllegalStateException One or more media in the mediaList cannot - * be added into the slide due to a slide cannot contain image - * and video or audio and video at the same time. - * @throws ContentRestrictionException when can not add this object. - * - */ - @Override - public boolean add(MediaModel object) { - internalAdd(object); - notifyModelChanged(true); - return true; - } - - @Override - public boolean addAll(Collection<? extends MediaModel> collection) { - throw new UnsupportedOperationException("Operation not supported."); - } - - @Override - public void clear() { - if (mMedia.size() > 0) { - for (MediaModel media : mMedia) { - media.unregisterAllModelChangedObservers(); - int decreaseSize = media.getMediaSize(); - decreaseSlideSize(decreaseSize); - decreaseMessageSize(decreaseSize); - } - mMedia.clear(); - - mText = null; - mImage = null; - mAudio = null; - mVideo = null; - - mCanAddImage = true; - mCanAddAudio = true; - mCanAddVideo = true; - - notifyModelChanged(true); - } - } - - @Override - public boolean contains(Object object) { - return mMedia.contains(object); - } - - @Override - public boolean containsAll(Collection<?> collection) { - return mMedia.containsAll(collection); - } - - @Override - public boolean isEmpty() { - return mMedia.isEmpty(); - } - - @Override - public Iterator<MediaModel> iterator() { - return mMedia.iterator(); - } - - @Override - public boolean remove(Object object) { - if ((object != null) && (object instanceof MediaModel) - && internalRemove(object)) { - notifyModelChanged(true); - return true; - } - return false; - } - - @Override - public boolean removeAll(Collection<?> collection) { - throw new UnsupportedOperationException("Operation not supported."); - } - - @Override - public boolean retainAll(Collection<?> collection) { - throw new UnsupportedOperationException("Operation not supported."); - } - - @Override - public int size() { - return mMedia.size(); - } - - @Override - public Object[] toArray() { - return mMedia.toArray(); - } - - @Override - public <T> T[] toArray(T[] array) { - return mMedia.toArray(array); - } - - @Override - public void add(int location, MediaModel object) { - throw new UnsupportedOperationException("Operation not supported."); - } - - @Override - public boolean addAll(int location, - Collection<? extends MediaModel> collection) { - throw new UnsupportedOperationException("Operation not supported."); - } - - @Override - public MediaModel get(int location) { - if (mMedia.size() == 0) { - return null; - } - - return mMedia.get(location); - } - - @Override - public int indexOf(Object object) { - return mMedia.indexOf(object); - } - - @Override - public int lastIndexOf(Object object) { - return mMedia.lastIndexOf(object); - } - - @Override - public ListIterator<MediaModel> listIterator() { - return mMedia.listIterator(); - } - - @Override - public ListIterator<MediaModel> listIterator(int location) { - return mMedia.listIterator(location); - } - - @Override - public MediaModel remove(int location) { - MediaModel media = mMedia.get(location); - if ((media != null) && internalRemove(media)) { - notifyModelChanged(true); - } - return media; - } - - @Override - public MediaModel set(int location, MediaModel object) { - throw new UnsupportedOperationException("Operation not supported."); - } - - @Override - public List<MediaModel> subList(int start, int end) { - return mMedia.subList(start, end); - } - - /** - * @return the mVisible - */ - public boolean isVisible() { - return mVisible; - } - - /** - * @param visible the mVisible to set - */ - public void setVisible(boolean visible) { - mVisible = visible; - notifyModelChanged(true); - } - - /** - * @return the mFill - */ - public short getFill() { - return mFill; - } - - /** - * @param fill the mFill to set - */ - public void setFill(short fill) { - mFill = fill; - notifyModelChanged(true); - } - - @Override - protected void registerModelChangedObserverInDescendants( - IModelChangedObserver observer) { - for (MediaModel media : mMedia) { - media.registerModelChangedObserver(observer); - } - } - - @Override - protected void unregisterModelChangedObserverInDescendants( - IModelChangedObserver observer) { - for (MediaModel media : mMedia) { - media.unregisterModelChangedObserver(observer); - } - } - - @Override - protected void unregisterAllModelChangedObserversInDescendants() { - for (MediaModel media : mMedia) { - media.unregisterAllModelChangedObservers(); - } - } - - // EventListener Interface - public void handleEvent(Event evt) { - if (evt.getType().equals(SmilParElementImpl.SMIL_SLIDE_START_EVENT)) { - if (LOCAL_LOGV) { - Log.v(TAG, "Start to play slide: " + this); - } - mVisible = true; - } else if (mFill != ElementTime.FILL_FREEZE) { - if (LOCAL_LOGV) { - Log.v(TAG, "Stop playing slide: " + this); - } - mVisible = false; - } - - notifyModelChanged(false); - } - - public boolean hasText() { - return mText != null; - } - - public boolean hasImage() { - return mImage != null; - } - - public boolean hasAudio() { - return mAudio != null; - } - - public boolean hasVideo() { - return mVideo != null; - } - - public boolean removeText() { - return remove(mText); - } - - public boolean removeImage() { - return remove(mImage); - } - - public boolean removeAudio() { - boolean result = remove(mAudio); - resetDuration(); - return result; - } - - public boolean removeVideo() { - boolean result = remove(mVideo); - resetDuration(); - return result; - } - - public TextModel getText() { - return (TextModel) mText; - } - - public ImageModel getImage() { - return (ImageModel) mImage; - } - - public AudioModel getAudio() { - return (AudioModel) mAudio; - } - - public VideoModel getVideo() { - return (VideoModel) mVideo; - } - - public void resetDuration() { - // If we remove all the objects that have duration, reset the slide back to its - // default duration. If we don't do this, if the user replaces a 10 sec video with - // a 3 sec audio, the duration will remain at 10 sec (see the way updateDuration() below - // works). - if (!hasAudio() && !hasVideo()) { - mDuration = DEFAULT_SLIDE_DURATION; - } - } - - public void updateDuration(int duration) { - if (duration <= 0) { - return; - } - - if ((duration > mDuration) - || (mDuration == DEFAULT_SLIDE_DURATION)) { - mDuration = duration; - } - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/model/SlideshowModel.java b/QKSMS/src/main/java/com/moez/QKSMS/model/SlideshowModel.java deleted file mode 100644 index 1e6142b5a..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/model/SlideshowModel.java +++ /dev/null @@ -1,751 +0,0 @@ -/* - * Copyright (C) 2008 Esmertec AG. - * Copyright (C) 2008 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.moez.QKSMS.model; - - -import android.content.ContentResolver; -import android.content.ContentUris; -import android.content.Context; -import android.net.Uri; -import android.text.TextUtils; -import android.util.Log; - -import com.android.mms.dom.smil.parser.SmilXmlSerializer; -import com.google.android.mms.ContentType; -import com.google.android.mms.MmsException; -import com.google.android.mms.pdu_alt.GenericPdu; -import com.google.android.mms.pdu_alt.MultimediaMessagePdu; -import com.google.android.mms.pdu_alt.PduBody; -import com.google.android.mms.pdu_alt.PduHeaders; -import com.google.android.mms.pdu_alt.PduPart; -import com.google.android.mms.pdu_alt.PduPersister; -import com.moez.QKSMS.ContentRestrictionException; -import com.moez.QKSMS.ExceedMessageSizeException; -import com.moez.QKSMS.LogTag; -import com.moez.QKSMS.MmsConfig; -import com.moez.QKSMS.UnsupportContentTypeException; -import com.moez.QKSMS.ui.mms.layout.LayoutManager; - -import org.w3c.dom.NodeList; -import org.w3c.dom.events.EventTarget; -import org.w3c.dom.smil.SMILDocument; -import org.w3c.dom.smil.SMILElement; -import org.w3c.dom.smil.SMILLayoutElement; -import org.w3c.dom.smil.SMILMediaElement; -import org.w3c.dom.smil.SMILParElement; -import org.w3c.dom.smil.SMILRegionElement; -import org.w3c.dom.smil.SMILRootLayoutElement; - -import java.io.ByteArrayOutputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.ListIterator; - -public class SlideshowModel extends Model - implements List<SlideModel>, IModelChangedObserver { - private static final String TAG = "SlideshowModel"; - - private final LayoutModel mLayout; - private final ArrayList<SlideModel> mSlides; - private SMILDocument mDocumentCache; - private PduBody mPduBodyCache; - private int mCurrentMessageSize; // This is the current message size, not including - // attachments that can be resized (such as photos) - private int mTotalMessageSize; // This is the computed total message size - private Context mContext; - - // amount of space to leave in a slideshow for text and overhead. - public static final int SLIDESHOW_SLOP = 1024; - - private SlideshowModel(Context context) { - mLayout = new LayoutModel(); - mSlides = new ArrayList<SlideModel>(); - mContext = context; - } - - private SlideshowModel ( - LayoutModel layouts, ArrayList<SlideModel> slides, - SMILDocument documentCache, PduBody pbCache, - Context context) { - mLayout = layouts; - mSlides = slides; - mContext = context; - - mDocumentCache = documentCache; - mPduBodyCache = pbCache; - for (SlideModel slide : mSlides) { - increaseMessageSize(slide.getSlideSize()); - slide.setParent(this); - } - } - - public static SlideshowModel createNew(Context context) { - return new SlideshowModel(context); - } - - public static SlideshowModel createFromMessageUri( - Context context, Uri uri) throws MmsException { - return createFromPduBody(context, getPduBody(context, uri)); - } - - public static SlideshowModel createFromPduBody(Context context, PduBody pb) throws MmsException { - SMILDocument document = SmilHelper.getDocument(pb); - - // Create root-layout model. - SMILLayoutElement sle = document.getLayout(); - SMILRootLayoutElement srle = sle.getRootLayout(); - int w = srle.getWidth(); - int h = srle.getHeight(); - if ((w == 0) || (h == 0)) { - w = LayoutManager.getInstance().getLayoutParameters().getWidth(); - h = LayoutManager.getInstance().getLayoutParameters().getHeight(); - srle.setWidth(w); - srle.setHeight(h); - } - RegionModel rootLayout = new RegionModel( - null, 0, 0, w, h); - - // Create region models. - ArrayList<RegionModel> regions = new ArrayList<>(); - NodeList nlRegions = sle.getRegions(); - int regionsNum = nlRegions.getLength(); - - for (int i = 0; i < regionsNum; i++) { - SMILRegionElement sre = (SMILRegionElement) nlRegions.item(i); - RegionModel r = new RegionModel(sre.getId(), sre.getFit(), - sre.getLeft(), sre.getTop(), sre.getWidth(), sre.getHeight(), - sre.getBackgroundColor()); - regions.add(r); - } - LayoutModel layouts = new LayoutModel(rootLayout, regions); - - // Create slide models. - SMILElement docBody = document.getBody(); - NodeList slideNodes = docBody.getChildNodes(); - int slidesNum = slideNodes.getLength(); - ArrayList<SlideModel> slides = new ArrayList<>(slidesNum); - int totalMessageSize = 0; - - for (int i = 0; i < slidesNum; i++) { - // FIXME: This is NOT compatible with the SMILDocument which is - // generated by some other mobile phones. - SMILParElement par = (SMILParElement) slideNodes.item(i); - - // Create media models for each slide. - NodeList mediaNodes = par.getChildNodes(); - int mediaNum = mediaNodes.getLength(); - ArrayList<MediaModel> mediaSet = new ArrayList<>(mediaNum); - - ArrayList<String> srcs = new ArrayList<>(mediaNum); - for (int j = 0; j < mediaNum; j++) { - SMILMediaElement sme = (SMILMediaElement) mediaNodes.item(j); - srcs.add(sme.getSrc()); - } - for (int j = 0; j < mediaNum; j++) { - SMILMediaElement sme = (SMILMediaElement) mediaNodes.item(j); - try { - MediaModel media = MediaModelFactory.getMediaModel(context, sme, srcs, - layouts, pb); - - /* - * This is for slide duration value set. - * If mms server does not support slide duration. - */ - if (!MmsConfig.getSlideDurationEnabled()) { - int mediadur = media.getDuration(); - float dur = par.getDur(); - if (dur == 0) { - mediadur = MmsConfig.getMinimumSlideElementDuration() * 1000; - media.setDuration(mediadur); - } - - if ((int)mediadur / 1000 != dur) { - String tag = sme.getTagName(); - - if (ContentType.isVideoType(media.mContentType) - || tag.equals(SmilHelper.ELEMENT_TAG_VIDEO) - || ContentType.isAudioType(media.mContentType) - || tag.equals(SmilHelper.ELEMENT_TAG_AUDIO)) { - /* - * add 1 sec to release and close audio/video - * for guaranteeing the audio/video playing. - * because the mmsc does not support the slide duration. - */ - par.setDur((float)mediadur / 1000 + 1); - } else { - /* - * If a slide has an image and an audio/video element - * and the audio/video element has longer duration than the image, - * The Image disappear before the slide play done. so have to match - * an image duration to the slide duration. - */ - if ((int)mediadur / 1000 < dur) { - media.setDuration((int)dur * 1000); - } else { - if ((int)dur != 0) { - media.setDuration((int)dur * 1000); - } else { - par.setDur((float)mediadur / 1000); - } - } - } - } - } - SmilHelper.addMediaElementEventListeners( - (EventTarget) sme, media); - mediaSet.add(media); - totalMessageSize += media.getMediaSize(); - } catch (IOException e) { - Log.e(TAG, e.getMessage(), e); - } catch (IllegalArgumentException e) { - Log.e(TAG, e.getMessage(), e); - } catch (UnsupportContentTypeException e) { - Log.e(TAG, e.getMessage(), e); - } - } - - SlideModel slide = new SlideModel((int) (par.getDur() * 1000), mediaSet); - slide.setFill(par.getFill()); - SmilHelper.addParElementEventListeners((EventTarget) par, slide); - slides.add(slide); - } - - SlideshowModel slideshow = new SlideshowModel(layouts, slides, document, pb, context); - slideshow.mTotalMessageSize = totalMessageSize; - slideshow.registerModelChangedObserver(slideshow); - return slideshow; - } - - public PduBody toPduBody() { - if (mPduBodyCache == null) { - mDocumentCache = SmilHelper.getDocument(this); - mPduBodyCache = makePduBody(mDocumentCache); - } - return mPduBodyCache; - } - - private PduBody makePduBody(SMILDocument document) { - PduBody pb = new PduBody(); - - boolean hasForwardLock = false; - for (SlideModel slide : mSlides) { - for (MediaModel media : slide) { - PduPart part = new PduPart(); - - if (media.isText()) { - TextModel text = (TextModel) media; - // Don't create empty text part. - if (TextUtils.isEmpty(text.getText())) { - continue; - } - // Set Charset if it's a text media. - part.setCharset(text.getCharset()); - } - - // Set Content-Type. - part.setContentType(media.getContentType().getBytes()); - - String src = media.getSrc(); - String location; - boolean startWithContentId = src.startsWith("cid:"); - if (startWithContentId) { - location = src.substring("cid:".length()); - } else { - location = src; - } - - // Set Content-Location. - part.setContentLocation(location.getBytes()); - - // Set Content-Id. - if (startWithContentId) { - //Keep the original Content-Id. - part.setContentId(location.getBytes()); - } - else { - int index = location.lastIndexOf("."); - String contentId = (index == -1) ? location - : location.substring(0, index); - part.setContentId(contentId.getBytes()); - } - - if (media.isText()) { - part.setData(((TextModel) media).getText().getBytes()); - } else if (media.isImage() || media.isVideo() || media.isAudio()) { - part.setDataUri(media.getUri()); - } else { - Log.w(TAG, "Unsupport media: " + media); - } - - pb.addPart(part); - } - } - - // Create and insert SMIL part(as the first part) into the PduBody. - ByteArrayOutputStream out = new ByteArrayOutputStream(); - SmilXmlSerializer.serialize(document, out); - PduPart smilPart = new PduPart(); - smilPart.setContentId("smil".getBytes()); - smilPart.setContentLocation("smil.xml".getBytes()); - smilPart.setContentType(ContentType.APP_SMIL.getBytes()); - smilPart.setData(out.toByteArray()); - pb.addPart(0, smilPart); - - return pb; - } - - public HashMap<Uri, InputStream> openPartFiles(ContentResolver cr) { - HashMap<Uri, InputStream> openedFiles = null; // Don't create unless we have to - - for (SlideModel slide : mSlides) { - for (MediaModel media : slide) { - if (media.isText()) { - continue; - } - Uri uri = media.getUri(); - InputStream is; - try { - is = cr.openInputStream(uri); - if (is != null) { - if (openedFiles == null) { - openedFiles = new HashMap<Uri, InputStream>(); - } - openedFiles.put(uri, is); - } - } catch (FileNotFoundException e) { - Log.e(TAG, "openPartFiles couldn't open: " + uri, e); - } - } - } - return openedFiles; - } - - public PduBody makeCopy() { - return makePduBody(SmilHelper.getDocument(this)); - } - - public SMILDocument toSmilDocument() { - if (mDocumentCache == null) { - mDocumentCache = SmilHelper.getDocument(this); - } - return mDocumentCache; - } - - public static PduBody getPduBody(Context context, Uri msg) throws MmsException { - PduPersister p = PduPersister.getPduPersister(context); - GenericPdu pdu = p.load(msg); - - int msgType = pdu.getMessageType(); - if ((msgType == PduHeaders.MESSAGE_TYPE_SEND_REQ) - || (msgType == PduHeaders.MESSAGE_TYPE_RETRIEVE_CONF)) { - return ((MultimediaMessagePdu) pdu).getBody(); - } else { - throw new MmsException(); - } - } - - public void setCurrentMessageSize(int size) { - mCurrentMessageSize = size; - } - - // getCurrentMessageSize returns the size of the message, not including resizable attachments - // such as photos. mCurrentMessageSize is used when adding/deleting/replacing non-resizable - // attachments (movies, sounds, etc) in order to compute how much size is left in the message. - // The difference between mCurrentMessageSize and the maxSize allowed for a message is then - // divided up between the remaining resizable attachments. While this function is public, - // it is only used internally between various MMS classes. If the UI wants to know the - // size of a MMS message, it should call getTotalMessageSize() instead. - public int getCurrentMessageSize() { - return mCurrentMessageSize; - } - - // getTotalMessageSize returns the total size of the message, including resizable attachments - // such as photos. This function is intended to be used by the UI for displaying the size of the - // MMS message. - public int getTotalMessageSize() { - return mTotalMessageSize; - } - - public void increaseMessageSize(int increaseSize) { - if (increaseSize > 0) { - mCurrentMessageSize += increaseSize; - } - } - - public void decreaseMessageSize(int decreaseSize) { - if (decreaseSize > 0) { - mCurrentMessageSize -= decreaseSize; - } - } - - public LayoutModel getLayout() { - return mLayout; - } - - // - // Implement List<E> interface. - // - @Override - public boolean add(SlideModel object) { - int increaseSize = object.getSlideSize(); - checkMessageSize(increaseSize); - - if ((object != null) && mSlides.add(object)) { - increaseMessageSize(increaseSize); - object.registerModelChangedObserver(this); - for (IModelChangedObserver observer : mModelChangedObservers) { - object.registerModelChangedObserver(observer); - } - notifyModelChanged(true); - return true; - } - return false; - } - - @Override - public boolean addAll(Collection<? extends SlideModel> collection) { - throw new UnsupportedOperationException("Operation not supported."); - } - - @Override - public void clear() { - if (mSlides.size() > 0) { - for (SlideModel slide : mSlides) { - slide.unregisterModelChangedObserver(this); - for (IModelChangedObserver observer : mModelChangedObservers) { - slide.unregisterModelChangedObserver(observer); - } - } - mCurrentMessageSize = 0; - mSlides.clear(); - notifyModelChanged(true); - } - } - - @Override - public boolean contains(Object object) { - return mSlides.contains(object); - } - - @Override - public boolean containsAll(Collection<?> collection) { - return mSlides.containsAll(collection); - } - - @Override - public boolean isEmpty() { - return mSlides.isEmpty(); - } - - @Override - public Iterator<SlideModel> iterator() { - return mSlides.iterator(); - } - - @Override - public boolean remove(Object object) { - if ((object != null) && mSlides.remove(object)) { - SlideModel slide = (SlideModel) object; - decreaseMessageSize(slide.getSlideSize()); - slide.unregisterAllModelChangedObservers(); - notifyModelChanged(true); - return true; - } - return false; - } - - @Override - public boolean removeAll(Collection<?> collection) { - throw new UnsupportedOperationException("Operation not supported."); - } - - @Override - public boolean retainAll(Collection<?> collection) { - throw new UnsupportedOperationException("Operation not supported."); - } - - @Override - public int size() { - return mSlides.size(); - } - - @Override - public Object[] toArray() { - return mSlides.toArray(); - } - - @Override - public <T> T[] toArray(T[] array) { - return mSlides.toArray(array); - } - - @Override - public void add(int location, SlideModel object) { - if (object != null) { - int increaseSize = object.getSlideSize(); - checkMessageSize(increaseSize); - - mSlides.add(location, object); - increaseMessageSize(increaseSize); - object.registerModelChangedObserver(this); - for (IModelChangedObserver observer : mModelChangedObservers) { - object.registerModelChangedObserver(observer); - } - notifyModelChanged(true); - } - } - - @Override - public boolean addAll(int location, - Collection<? extends SlideModel> collection) { - throw new UnsupportedOperationException("Operation not supported."); - } - - @Override - public SlideModel get(int location) { - return (location >= 0 && location < mSlides.size()) ? mSlides.get(location) : null; - } - - @Override - public int indexOf(Object object) { - return mSlides.indexOf(object); - } - - @Override - public int lastIndexOf(Object object) { - return mSlides.lastIndexOf(object); - } - - @Override - public ListIterator<SlideModel> listIterator() { - return mSlides.listIterator(); - } - - @Override - public ListIterator<SlideModel> listIterator(int location) { - return mSlides.listIterator(location); - } - - @Override - public SlideModel remove(int location) { - SlideModel slide = mSlides.remove(location); - if (slide != null) { - decreaseMessageSize(slide.getSlideSize()); - slide.unregisterAllModelChangedObservers(); - notifyModelChanged(true); - } - return slide; - } - - @Override - public SlideModel set(int location, SlideModel object) { - SlideModel slide = mSlides.get(location); - if (null != object) { - int removeSize = 0; - int addSize = object.getSlideSize(); - if (null != slide) { - removeSize = slide.getSlideSize(); - } - if (addSize > removeSize) { - checkMessageSize(addSize - removeSize); - increaseMessageSize(addSize - removeSize); - } else { - decreaseMessageSize(removeSize - addSize); - } - } - - slide = mSlides.set(location, object); - if (slide != null) { - slide.unregisterAllModelChangedObservers(); - } - - if (object != null) { - object.registerModelChangedObserver(this); - for (IModelChangedObserver observer : mModelChangedObservers) { - object.registerModelChangedObserver(observer); - } - } - - notifyModelChanged(true); - return slide; - } - - public List<SlideModel> subList(int start, int end) { - return mSlides.subList(start, end); - } - - @Override - protected void registerModelChangedObserverInDescendants( - IModelChangedObserver observer) { - mLayout.registerModelChangedObserver(observer); - - for (SlideModel slide : mSlides) { - slide.registerModelChangedObserver(observer); - } - } - - @Override - protected void unregisterModelChangedObserverInDescendants( - IModelChangedObserver observer) { - mLayout.unregisterModelChangedObserver(observer); - - for (SlideModel slide : mSlides) { - slide.unregisterModelChangedObserver(observer); - } - } - - @Override - protected void unregisterAllModelChangedObserversInDescendants() { - mLayout.unregisterAllModelChangedObservers(); - - for (SlideModel slide : mSlides) { - slide.unregisterAllModelChangedObservers(); - } - } - - public void onModelChanged(Model model, boolean dataChanged) { - if (dataChanged) { - mDocumentCache = null; - mPduBodyCache = null; - } - } - - public void sync(PduBody pb) { - for (SlideModel slide : mSlides) { - for (MediaModel media : slide) { - PduPart part = pb.getPartByContentLocation(media.getSrc()); - if (part != null) { - media.setUri(part.getDataUri()); - } - } - } - } - - public void checkMessageSize(int increaseSize) throws ContentRestrictionException { - ContentRestriction cr = ContentRestrictionFactory.getContentRestriction(); - cr.checkMessageSize(mCurrentMessageSize, increaseSize, mContext.getContentResolver()); - } - - /** - * Determines whether this is a "simple" slideshow. - * Criteria: - * - Exactly one slide - * - Exactly one multimedia attachment, but no audio - * - It can optionally have a caption - */ - public boolean isSimple() { - // There must be one (and only one) slide. - if (size() != 1) - return false; - - SlideModel slide = get(0); - // The slide must have either an image or video, but not both. - if (!(slide.hasImage() ^ slide.hasVideo())) - return false; - - // No audio allowed. - return !slide.hasAudio(); - - } - - /** - * Make sure the text in slide 0 is no longer holding onto a reference to the text - * in the message text box. - */ - public void prepareForSend() { - if (size() == 1) { - TextModel text = get(0).getText(); - if (text != null) { - text.cloneText(); - } - } - } - - /** - * Resize all the resizeable media objects to fit in the remaining size of the slideshow. - * This should be called off of the UI thread. - * - * @throws com.google.android.mms.MmsException, ExceedMessageSizeException - */ - public void finalResize(Uri messageUri) throws MmsException, ExceedMessageSizeException { - - // Figure out if we have any media items that need to be resized and total up the - // sizes of the items that can't be resized. - int resizableCnt = 0; - int fixedSizeTotal = 0; - for (SlideModel slide : mSlides) { - for (MediaModel media : slide) { - if (media.getMediaResizable()) { - ++resizableCnt; - } else { - fixedSizeTotal += media.getMediaSize(); - } - } - } - if (Log.isLoggable(LogTag.APP, Log.VERBOSE)) { - Log.v(TAG, "finalResize: original message size: " + getCurrentMessageSize() + - " getMaxMessageSize: " + MmsConfig.getMaxMessageSize() + - " fixedSizeTotal: " + fixedSizeTotal); - } - if (resizableCnt > 0) { - int remainingSize = MmsConfig.getMaxMessageSize() - fixedSizeTotal - SLIDESHOW_SLOP; - if (remainingSize <= 0) { - throw new ExceedMessageSizeException("No room for pictures"); - } - long messageId = ContentUris.parseId(messageUri); - int bytesPerMediaItem = remainingSize / resizableCnt; - // Resize the resizable media items to fit within their byte limit. - for (SlideModel slide : mSlides) { - for (MediaModel media : slide) { - if (media.getMediaResizable()) { - media.resizeMedia(bytesPerMediaItem, messageId); - } - } - } - // One last time through to calc the real message size. - int totalSize = 0; - for (SlideModel slide : mSlides) { - for (MediaModel media : slide) { - totalSize += media.getMediaSize(); - } - } - if (Log.isLoggable(LogTag.APP, Log.VERBOSE)) { - Log.v(TAG, "finalResize: new message size: " + totalSize); - } - - if (totalSize > MmsConfig.getMaxMessageSize()) { - throw new ExceedMessageSizeException("After compressing pictures, message too big"); - } - setCurrentMessageSize(totalSize); - - onModelChanged(this, true); // clear the cached pdu body - PduBody pb = toPduBody(); - // This will write out all the new parts to: - // /data/data/com.android.providers.telephony/app_parts - // and at the same time delete the old parts. - PduPersister.getPduPersister(mContext).updateParts(messageUri, pb, null); - } - } - -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/model/SmilHelper.java b/QKSMS/src/main/java/com/moez/QKSMS/model/SmilHelper.java deleted file mode 100644 index 122bb1bf8..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/model/SmilHelper.java +++ /dev/null @@ -1,415 +0,0 @@ -/* - * Copyright (C) 2008 Esmertec AG. - * Copyright (C) 2008 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.moez.QKSMS.model; - -import android.drm.DrmManagerClient; -import android.text.TextUtils; -import android.util.Config; -import android.util.Log; - -import com.android.mms.dom.smil.SmilDocumentImpl; -import com.android.mms.dom.smil.parser.SmilXmlParser; -import com.android.mms.dom.smil.parser.SmilXmlSerializer; -import com.google.android.mms.ContentType; -import com.google.android.mms.MmsException; -import com.google.android.mms.pdu_alt.PduBody; -import com.google.android.mms.pdu_alt.PduPart; -import com.moez.QKSMS.QKSMSApp; - -import org.w3c.dom.events.EventTarget; -import org.w3c.dom.smil.SMILDocument; -import org.w3c.dom.smil.SMILElement; -import org.w3c.dom.smil.SMILLayoutElement; -import org.w3c.dom.smil.SMILMediaElement; -import org.w3c.dom.smil.SMILParElement; -import org.w3c.dom.smil.SMILRegionElement; -import org.w3c.dom.smil.SMILRegionMediaElement; -import org.w3c.dom.smil.SMILRootLayoutElement; -import org.xml.sax.SAXException; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; - -import static com.android.mms.dom.smil.SmilMediaElementImpl.SMIL_MEDIA_END_EVENT; -import static com.android.mms.dom.smil.SmilMediaElementImpl.SMIL_MEDIA_PAUSE_EVENT; -import static com.android.mms.dom.smil.SmilMediaElementImpl.SMIL_MEDIA_SEEK_EVENT; -import static com.android.mms.dom.smil.SmilMediaElementImpl.SMIL_MEDIA_START_EVENT; -import static com.android.mms.dom.smil.SmilParElementImpl.SMIL_SLIDE_END_EVENT; -import static com.android.mms.dom.smil.SmilParElementImpl.SMIL_SLIDE_START_EVENT; - -public class SmilHelper { - private static final String TAG = "Mms/smil"; - private static final boolean DEBUG = false; - private static final boolean LOCAL_LOGV = DEBUG ? Config.LOGD : Config.LOGV; - - public static final String ELEMENT_TAG_TEXT = "text"; - public static final String ELEMENT_TAG_IMAGE = "img"; - public static final String ELEMENT_TAG_AUDIO = "audio"; - public static final String ELEMENT_TAG_VIDEO = "video"; - public static final String ELEMENT_TAG_REF = "ref"; - - private SmilHelper() { - // Never instantiate this class. - } - - public static SMILDocument getDocument(PduBody pb) { - // Find SMIL part in the message. - PduPart smilPart = findSmilPart(pb); - SMILDocument document = null; - - // Try to load SMIL document from existing part. - if (smilPart != null) { - document = getSmilDocument(smilPart); - } - - if (document == null) { - // Create a new SMIL document. - document = createSmilDocument(pb); - } - - return document; - } - - public static SMILDocument getDocument(SlideshowModel model) { - return createSmilDocument(model); - } - - /** - * Find a SMIL part in the MM. - * - * @return The existing SMIL part or null if no SMIL part was found. - */ - private static PduPart findSmilPart(PduBody body) { - int partNum = body.getPartsNum(); - for(int i = 0; i < partNum; i++) { - PduPart part = body.getPart(i); - if (Arrays.equals(part.getContentType(), - ContentType.APP_SMIL.getBytes())) { - // Sure only one SMIL part. - return part; - } - } - return null; - } - - private static SMILDocument validate(SMILDocument in) { - // TODO: add more validating facilities. - return in; - } - - /** - * Parse SMIL message and retrieve SMILDocument. - * - * @return A SMILDocument or null if parsing failed. - */ - private static SMILDocument getSmilDocument(PduPart smilPart) { - try { - byte[] data = smilPart.getData(); - if (data != null) { - if (LOCAL_LOGV) { - Log.v(TAG, "Parsing SMIL document."); - Log.v(TAG, new String(data)); - } - - ByteArrayInputStream bais = new ByteArrayInputStream(data); - SMILDocument document = new SmilXmlParser().parse(bais); - return validate(document); - } - } catch (IOException e) { - Log.e(TAG, "Failed to parse SMIL document.", e); - } catch (SAXException e) { - Log.e(TAG, "Failed to parse SMIL document.", e); - } catch (MmsException e) { - Log.e(TAG, "Failed to parse SMIL document.", e); - } - return null; - } - - public static SMILParElement addPar(SMILDocument document) { - SMILParElement par = (SMILParElement) document.createElement("par"); - // Set duration to eight seconds by default. - par.setDur(8.0f); - document.getBody().appendChild(par); - return par; - } - - public static SMILMediaElement createMediaElement( - String tag, SMILDocument document, String src) { - SMILMediaElement mediaElement = - (SMILMediaElement) document.createElement(tag); - mediaElement.setSrc(escapeXML(src)); - return mediaElement; - } - - static public String escapeXML(String str) { - return str.replaceAll("&","&") - .replaceAll("<", "<") - .replaceAll(">", ">") - .replaceAll("\"", """) - .replaceAll("'", "'"); - } - - private static SMILDocument createSmilDocument(PduBody pb) { - if (Config.LOGV) { - Log.v(TAG, "Creating default SMIL document."); - } - - SMILDocument document = new SmilDocumentImpl(); - - // Create root element. - // FIXME: Should we create root element in the constructor of document? - SMILElement smil = (SMILElement) document.createElement("smil"); - smil.setAttribute("xmlns", "http://www.w3.org/2001/SMIL20/Language"); - document.appendChild(smil); - - // Create <head> and <layout> element. - SMILElement head = (SMILElement) document.createElement("head"); - smil.appendChild(head); - - SMILLayoutElement layout = (SMILLayoutElement) document.createElement("layout"); - head.appendChild(layout); - - // Create <body> element and add a empty <par>. - SMILElement body = (SMILElement) document.createElement("body"); - smil.appendChild(body); - SMILParElement par = addPar(document); - - // Create media objects for the parts in PDU. - int partsNum = pb.getPartsNum(); - if (partsNum == 0) { - return document; - } - - DrmManagerClient drmManagerClient = QKSMSApp.getApplication().getDrmManagerClient(); - - boolean hasText = false; - boolean hasMedia = false; - for (int i = 0; i < partsNum; i++) { - // Create new <par> element. - if ((par == null) || (hasMedia && hasText)) { - par = addPar(document); - hasText = false; - hasMedia = false; - } - - PduPart part = pb.getPart(i); - String contentType = new String(part.getContentType()); - - if (ContentType.isDrmType(contentType)) { - contentType = drmManagerClient.getOriginalMimeType(part.getDataUri()); - } - - if (contentType.equals(ContentType.TEXT_PLAIN) - || contentType.equalsIgnoreCase(ContentType.APP_WAP_XHTML) - || contentType.equals(ContentType.TEXT_HTML)) { - SMILMediaElement textElement = createMediaElement( - ELEMENT_TAG_TEXT, document, part.generateLocation()); - par.appendChild(textElement); - hasText = true; - } else if (ContentType.isImageType(contentType)) { - SMILMediaElement imageElement = createMediaElement( - ELEMENT_TAG_IMAGE, document, part.generateLocation()); - par.appendChild(imageElement); - hasMedia = true; - } else if (ContentType.isVideoType(contentType)) { - SMILMediaElement videoElement = createMediaElement( - ELEMENT_TAG_VIDEO, document, part.generateLocation()); - par.appendChild(videoElement); - hasMedia = true; - } else if (ContentType.isAudioType(contentType)) { - SMILMediaElement audioElement = createMediaElement( - ELEMENT_TAG_AUDIO, document, part.generateLocation()); - par.appendChild(audioElement); - hasMedia = true; - } else { - // TODO: handle other media types. - Log.w(TAG, "unsupport media type"); - } - } - - return document; - } - - private static SMILDocument createSmilDocument(SlideshowModel slideshow) { - if (Config.LOGV) { - Log.v(TAG, "Creating SMIL document from SlideshowModel."); - } - - SMILDocument document = new SmilDocumentImpl(); - - // Create SMIL and append it to document - SMILElement smilElement = (SMILElement) document.createElement("smil"); - document.appendChild(smilElement); - - // Create HEAD and append it to SMIL - SMILElement headElement = (SMILElement) document.createElement("head"); - smilElement.appendChild(headElement); - - // Create LAYOUT and append it to HEAD - SMILLayoutElement layoutElement = (SMILLayoutElement) - document.createElement("layout"); - headElement.appendChild(layoutElement); - - // Create ROOT-LAYOUT and append it to LAYOUT - SMILRootLayoutElement rootLayoutElement = - (SMILRootLayoutElement) document.createElement("root-layout"); - LayoutModel layouts = slideshow.getLayout(); - rootLayoutElement.setWidth(layouts.getLayoutWidth()); - rootLayoutElement.setHeight(layouts.getLayoutHeight()); - String bgColor = layouts.getBackgroundColor(); - if (!TextUtils.isEmpty(bgColor)) { - rootLayoutElement.setBackgroundColor(bgColor); - } - layoutElement.appendChild(rootLayoutElement); - - // Create REGIONs and append them to LAYOUT - ArrayList<RegionModel> regions = layouts.getRegions(); - ArrayList<SMILRegionElement> smilRegions = new ArrayList<>(); - for (RegionModel r : regions) { - SMILRegionElement smilRegion = (SMILRegionElement) document.createElement("region"); - smilRegion.setId(r.getRegionId()); - smilRegion.setLeft(r.getLeft()); - smilRegion.setTop(r.getTop()); - smilRegion.setWidth(r.getWidth()); - smilRegion.setHeight(r.getHeight()); - smilRegion.setFit(r.getFit()); - smilRegions.add(smilRegion); - } - - // Create BODY and append it to the document. - SMILElement bodyElement = (SMILElement) document.createElement("body"); - smilElement.appendChild(bodyElement); - - for (SlideModel slide : slideshow) { - boolean txtRegionPresentInLayout = false; - boolean imgRegionPresentInLayout = false; - - // Create PAR element. - SMILParElement par = addPar(document); - par.setDur(slide.getDuration() / 1000f); - - addParElementEventListeners((EventTarget) par, slide); - - // Add all media elements. - for (MediaModel media : slide) { - SMILMediaElement sme = null; - String src = media.getSrc(); - if (media instanceof TextModel) { - TextModel text = (TextModel) media; - if (TextUtils.isEmpty(text.getText())) { - if (LOCAL_LOGV) { - Log.v(TAG, "Empty text part ignored: " + text.getSrc()); - } - continue; - } - sme = SmilHelper.createMediaElement(SmilHelper.ELEMENT_TAG_TEXT, document, src); - txtRegionPresentInLayout = setRegion((SMILRegionMediaElement) sme, - smilRegions, - layoutElement, - LayoutModel.TEXT_REGION_ID, - txtRegionPresentInLayout); - } else if (media instanceof ImageModel) { - sme = SmilHelper.createMediaElement(SmilHelper.ELEMENT_TAG_IMAGE, document, src); - imgRegionPresentInLayout = setRegion((SMILRegionMediaElement) sme, - smilRegions, - layoutElement, - LayoutModel.IMAGE_REGION_ID, - imgRegionPresentInLayout); - } else if (media instanceof VideoModel) { - sme = SmilHelper.createMediaElement(SmilHelper.ELEMENT_TAG_VIDEO, document, src); - imgRegionPresentInLayout = setRegion((SMILRegionMediaElement) sme, - smilRegions, - layoutElement, - LayoutModel.IMAGE_REGION_ID, - imgRegionPresentInLayout); - } else if (media instanceof AudioModel) { - sme = SmilHelper.createMediaElement(SmilHelper.ELEMENT_TAG_AUDIO, document, src); - } else { - Log.w(TAG, "Unsupport media: " + media); - continue; - } - - // Set timing information. - int begin = media.getBegin(); - if (begin != 0) { - sme.setAttribute("begin", String.valueOf(begin / 1000)); - } - int duration = media.getDuration(); - if (duration != 0) { - sme.setDur((float) duration / 1000); - } - par.appendChild(sme); - - addMediaElementEventListeners((EventTarget) sme, media); - } - } - - if (LOCAL_LOGV) { - ByteArrayOutputStream out = new ByteArrayOutputStream(); - SmilXmlSerializer.serialize(document, out); - Log.v(TAG, out.toString()); - } - - return document; - } - - private static SMILRegionElement findRegionElementById( - ArrayList<SMILRegionElement> smilRegions, String rId) { - for (SMILRegionElement smilRegion : smilRegions) { - if (smilRegion.getId().equals(rId)) { - return smilRegion; - } - } - return null; - } - - private static boolean setRegion(SMILRegionMediaElement srme, - ArrayList<SMILRegionElement> smilRegions, - SMILLayoutElement smilLayout, - String regionId, - boolean regionPresentInLayout) { - SMILRegionElement smilRegion = findRegionElementById(smilRegions, regionId); - if (!regionPresentInLayout && smilRegion != null) { - srme.setRegion(smilRegion); - smilLayout.appendChild(smilRegion); - return true; - } - return false; - } - - static void addMediaElementEventListeners( - EventTarget target, MediaModel media) { - // To play the media with SmilPlayer, we should add them - // as EventListener into an EventTarget. - target.addEventListener(SMIL_MEDIA_START_EVENT, media, false); - target.addEventListener(SMIL_MEDIA_END_EVENT, media, false); - target.addEventListener(SMIL_MEDIA_PAUSE_EVENT, media, false); - target.addEventListener(SMIL_MEDIA_SEEK_EVENT, media, false); - } - - static void addParElementEventListeners( - EventTarget target, SlideModel slide) { - // To play the slide with SmilPlayer, we should add it - // as EventListener into an EventTarget. - target.addEventListener(SMIL_SLIDE_START_EVENT, slide, false); - target.addEventListener(SMIL_SLIDE_END_EVENT, slide, false); - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/model/TextModel.java b/QKSMS/src/main/java/com/moez/QKSMS/model/TextModel.java deleted file mode 100644 index eca5916fb..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/model/TextModel.java +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Copyright (C) 2008 Esmertec AG. - * Copyright (C) 2008 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.moez.QKSMS.model; - -import android.content.Context; -import android.util.Log; - -import com.android.mms.dom.smil.SmilMediaElementImpl; -import com.google.android.mms.pdu_alt.CharacterSets; -import com.google.android.mms.smil.SmilHelper; - -import org.w3c.dom.events.Event; -import org.w3c.dom.smil.ElementTime; - -import java.io.UnsupportedEncodingException; - -public class TextModel extends RegionMediaModel { - private static final String TAG = "Mms/text"; - - private CharSequence mText; - private final int mCharset; - - public TextModel(Context context, String contentType, String src, RegionModel region) { - this(context, contentType, src, CharacterSets.UTF_8, new byte[0], region); - } - - public TextModel(Context context, String contentType, String src, - int charset, byte[] data, RegionModel region) { - super(context, SmilHelper.ELEMENT_TAG_TEXT, contentType, src, - data != null ? data : new byte[0], region); - - if (charset == CharacterSets.ANY_CHARSET) { - // By default, we use ISO_8859_1 to decode the data - // which character set wasn't set. - charset = CharacterSets.ISO_8859_1; - } - mCharset = charset; - mText = extractTextFromData(data); - } - - private CharSequence extractTextFromData(byte[] data) { - if (data != null) { - try { - if (CharacterSets.ANY_CHARSET == mCharset) { - return new String(data); // system default encoding. - } else { - String name = CharacterSets.getMimeName(mCharset); - return new String(data, name); - } - } catch (UnsupportedEncodingException e) { - Log.e(TAG, "Unsupported encoding: " + mCharset, e); - return new String(data); // system default encoding. - } - } - return ""; - } - - public String getText() { - if (mText == null) { - mText = extractTextFromData(getData()); - } - - // If our internal CharSequence is not already a String, - // re-save it as a String so subsequent calls to getText will - // be less expensive. - if (!(mText instanceof String)) { - mText = mText.toString(); - } - - return mText.toString(); - } - - public void setText(CharSequence text) { - mText = text; - notifyModelChanged(true); - } - - public void cloneText() { - mText = new String((mText != null ? mText.toString() : "")); - } - - public int getCharset() { - return mCharset; - } - - // EventListener Interface - public void handleEvent(Event evt) { - if (evt.getType().equals(SmilMediaElementImpl.SMIL_MEDIA_START_EVENT)) { - mVisible = true; - } else if (mFill != ElementTime.FILL_FREEZE) { - mVisible = false; - } - - notifyModelChanged(false); - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/model/VideoModel.java b/QKSMS/src/main/java/com/moez/QKSMS/model/VideoModel.java deleted file mode 100644 index ac4281f6a..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/model/VideoModel.java +++ /dev/null @@ -1,221 +0,0 @@ -/* - * Copyright (C) 2008 Esmertec AG. - * Copyright (C) 2008 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.moez.QKSMS.model; - -import android.content.ContentResolver; -import android.content.Context; -import android.database.Cursor; -import android.database.sqlite.SqliteWrapper; -import android.net.Uri; -import android.provider.MediaStore.Images; -import android.provider.Telephony.Mms.Part; -import android.text.TextUtils; -import android.util.Log; -import android.webkit.MimeTypeMap; - -import com.android.mms.dom.events.EventImpl; -import com.android.mms.dom.smil.SmilMediaElementImpl; -import com.google.android.mms.ContentType; -import com.google.android.mms.MmsException; -import com.google.android.mms.smil.SmilHelper; -import com.moez.QKSMS.ContentRestrictionException; -import com.moez.QKSMS.LogTag; -import com.moez.QKSMS.QKSMSApp; -import com.moez.QKSMS.common.google.ItemLoadedCallback; -import com.moez.QKSMS.common.google.ItemLoadedFuture; -import com.moez.QKSMS.common.google.ThumbnailManager; - -import org.w3c.dom.events.Event; -import org.w3c.dom.smil.ElementTime; - -public class VideoModel extends RegionMediaModel { - private static final String TAG = MediaModel.TAG; - private static final boolean DEBUG = true; - private static final boolean LOCAL_LOGV = false; - private ItemLoadedFuture mItemLoadedFuture; - - public VideoModel(Context context, Uri uri, RegionModel region) - throws MmsException { - this(context, null, null, uri, region); - initModelFromUri(uri); - checkContentRestriction(); - } - - public VideoModel(Context context, String contentType, String src, - Uri uri, RegionModel region) throws MmsException { - super(context, SmilHelper.ELEMENT_TAG_VIDEO, contentType, src, uri, region); - } - - private void initModelFromUri(Uri uri) throws MmsException { - String scheme = uri.getScheme(); - if (scheme.equals("content")) { - initFromContentUri(uri); - } else if (uri.getScheme().equals("file")) { - initFromFile(uri); - } - initMediaDuration(); - } - - private void initFromFile(Uri uri) { - String path = uri.getPath(); - mSrc = path.substring(path.lastIndexOf('/') + 1); - MimeTypeMap mimeTypeMap = MimeTypeMap.getSingleton(); - String extension = MimeTypeMap.getFileExtensionFromUrl(mSrc); - if (TextUtils.isEmpty(extension)) { - // getMimeTypeFromExtension() doesn't handle spaces in filenames nor can it handle - // urlEncoded strings. Let's try one last time at finding the extension. - int dotPos = mSrc.lastIndexOf('.'); - if (0 <= dotPos) { - extension = mSrc.substring(dotPos + 1); - } - } - mContentType = mimeTypeMap.getMimeTypeFromExtension(extension); - // It's ok if mContentType is null. Eventually we'll show a toast telling the - // user the video couldn't be attached. - - if (Log.isLoggable(LogTag.APP, Log.VERBOSE)) { - Log.v(TAG, "New VideoModel initFromFile created:" - + " mSrc=" + mSrc - + " mContentType=" + mContentType - + " mUri=" + uri); - } - } - - private void initFromContentUri(Uri uri) throws MmsException { - ContentResolver cr = mContext.getContentResolver(); - Cursor c = SqliteWrapper.query(mContext, cr, uri, null, null, null, null); - - if (c != null) { - try { - if (c.moveToFirst()) { - String path; - try { - // Local videos will have a data column - path = c.getString(c.getColumnIndexOrThrow(Images.Media.DATA)); - } catch (IllegalArgumentException e) { - // For non-local videos, the path is the uri - path = uri.toString(); - } - mSrc = path.substring(path.lastIndexOf('/') + 1); - if (VideoModel.isMmsUri(uri)) { - mContentType = c.getString(c.getColumnIndexOrThrow( - Part.CONTENT_TYPE)); - } else { - mContentType = c.getString(c.getColumnIndexOrThrow( - Images.Media.MIME_TYPE)); - } - if (TextUtils.isEmpty(mContentType)) { - throw new MmsException("Type of media is unknown."); - } - - if (mContentType.equals(ContentType.VIDEO_MP4) && !(TextUtils.isEmpty(mSrc))) { - int index = mSrc.lastIndexOf("."); - if (index != -1) { - try { - String extension = mSrc.substring(index + 1); - if (!(TextUtils.isEmpty(extension)) && - (extension.equalsIgnoreCase("3gp") || - extension.equalsIgnoreCase("3gpp") || - extension.equalsIgnoreCase("3g2"))) { - mContentType = ContentType.VIDEO_3GPP; - } - } catch(IndexOutOfBoundsException ex) { - if (LOCAL_LOGV) { - Log.v(TAG, "Media extension is unknown."); - } - } - } - } - - if (Log.isLoggable(LogTag.APP, Log.VERBOSE)) { - Log.v(TAG, "New VideoModel initFromContentUri created:" - + " mSrc=" + mSrc - + " mContentType=" + mContentType - + " mUri=" + uri); - } - } else { - throw new MmsException("Nothing found: " + uri); - } - } finally { - c.close(); - } - } else { - throw new MmsException("Bad URI: " + uri); - } - } - - // EventListener Interface - public void handleEvent(Event evt) { - String evtType = evt.getType(); - if (LOCAL_LOGV || Log.isLoggable(LogTag.APP, Log.VERBOSE)) { - Log.v(TAG, "[VideoModel] handleEvent " + evt.getType() + " on " + this); - } - - MediaAction action = MediaAction.NO_ACTIVE_ACTION; - if (evtType.equals(SmilMediaElementImpl.SMIL_MEDIA_START_EVENT)) { - action = MediaAction.START; - - // if the Music player app is playing audio, we should pause that so it won't - // interfere with us playing video here. - pauseMusicPlayer(); - - mVisible = true; - } else if (evtType.equals(SmilMediaElementImpl.SMIL_MEDIA_END_EVENT)) { - action = MediaAction.STOP; - if (mFill != ElementTime.FILL_FREEZE) { - mVisible = false; - } - } else if (evtType.equals(SmilMediaElementImpl.SMIL_MEDIA_PAUSE_EVENT)) { - action = MediaAction.PAUSE; - mVisible = true; - } else if (evtType.equals(SmilMediaElementImpl.SMIL_MEDIA_SEEK_EVENT)) { - action = MediaAction.SEEK; - mSeekTo = ((EventImpl) evt).getSeekTo(); - mVisible = true; - } - - appendAction(action); - notifyModelChanged(false); - } - - protected void checkContentRestriction() throws ContentRestrictionException { - ContentRestriction cr = ContentRestrictionFactory.getContentRestriction(); - cr.checkVideoContentType(mContentType); - } - - @Override - protected boolean isPlayable() { - return true; - } - - public ItemLoadedFuture loadThumbnailBitmap(ItemLoadedCallback callback) { - ThumbnailManager thumbnailManager = QKSMSApp.getApplication().getThumbnailManager(); - mItemLoadedFuture = thumbnailManager.getVideoThumbnail(getUri(), callback); - return mItemLoadedFuture; - } - - public void cancelThumbnailLoading() { - if (mItemLoadedFuture != null && !mItemLoadedFuture.isDone()) { - if (Log.isLoggable(LogTag.APP, Log.DEBUG)) { - Log.v(TAG, "cancelThumbnailLoading for: " + this); - } - mItemLoadedFuture.cancel(getUri()); - mItemLoadedFuture = null; - } - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/receiver/AirplaneModeReceiver.java b/QKSMS/src/main/java/com/moez/QKSMS/receiver/AirplaneModeReceiver.java deleted file mode 100644 index 94adb18af..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/receiver/AirplaneModeReceiver.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.moez.QKSMS.receiver; - -import android.content.BroadcastReceiver; -import android.content.ContentUris; -import android.content.Context; -import android.content.Intent; -import android.database.Cursor; -import android.net.Uri; -import com.google.android.mms.MmsException; -import com.moez.QKSMS.data.Conversation; -import com.moez.QKSMS.mmssms.Message; -import com.moez.QKSMS.mmssms.Transaction; -import com.moez.QKSMS.transaction.SmsHelper; -import com.moez.QKSMS.ui.messagelist.MessageColumns; -import com.moez.QKSMS.ui.messagelist.MessageItem; - -/** - * Listen for changes to the Airplane Mode status, so that we can attempt to re-send failed messages - * once we have signal - */ -public class AirplaneModeReceiver extends BroadcastReceiver { - - @Override - public void onReceive(Context context, Intent intent) { - // If we're going into airplane mode, no need to do anything - if (intent.getBooleanExtra("state", true)) { - return; - } - - // Cursor to find the conversations that contain failed messages - Cursor conversationCursor = context.getContentResolver().query( - SmsHelper.CONVERSATIONS_CONTENT_PROVIDER, - Conversation.ALL_THREADS_PROJECTION, - Conversation.FAILED_SELECTION, null, - SmsHelper.sortDateDesc - ); - - // Loop through each of the conversations - while (conversationCursor.moveToNext()) { - Uri uri = ContentUris.withAppendedId(SmsHelper.MMS_SMS_CONTENT_PROVIDER, conversationCursor.getLong(Conversation.ID)); - - // Find the failed messages within the conversation - Cursor cursor = context.getContentResolver().query(uri, MessageColumns.PROJECTION, - SmsHelper.FAILED_SELECTION, null, SmsHelper.sortDateAsc); - - // Map the cursor row to a MessageItem, then re-send it - MessageColumns.ColumnsMap columnsMap = new MessageColumns.ColumnsMap(cursor); - while (cursor.moveToNext()) { - try { - MessageItem message = new MessageItem(context, cursor.getString(columnsMap.mColumnMsgType), - cursor, columnsMap, null, true); - sendSms(context, message); - } catch (MmsException e) { - e.printStackTrace(); - } - } - cursor.close(); - } - - conversationCursor.close(); - } - - private void sendSms(Context context, MessageItem messageItem) { - Transaction sendTransaction = new Transaction(context, SmsHelper.getSendSettings(context)); - - Message message = new Message(messageItem.mBody, messageItem.mAddress); - message.setType(Message.TYPE_SMSMMS); - - context.getContentResolver().delete(messageItem.mMessageUri, null, null); - - sendTransaction.sendNewMessage(message, 0); - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/receiver/BootReceiver.java b/QKSMS/src/main/java/com/moez/QKSMS/receiver/BootReceiver.java deleted file mode 100644 index e14dbc6eb..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/receiver/BootReceiver.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.moez.QKSMS.receiver; - -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import android.preference.PreferenceManager; -import com.moez.QKSMS.service.DeleteOldMessagesService; -import com.moez.QKSMS.transaction.NotificationManager; -import com.moez.QKSMS.ui.settings.SettingsFragment; - -public class BootReceiver extends BroadcastReceiver { - - @Override - public void onReceive(Context context, Intent intent) { - NotificationManager.initQuickCompose(context, false, false); - NotificationManager.create(context); - - SettingsFragment.updateAlarmManager(context, PreferenceManager.getDefaultSharedPreferences(context).getBoolean(SettingsFragment.NIGHT_AUTO, false)); - - DeleteOldMessagesService.setupAutoDeleteAlarm(context); - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/receiver/DeliveredReceiver.java b/QKSMS/src/main/java/com/moez/QKSMS/receiver/DeliveredReceiver.java deleted file mode 100644 index 57b0c8034..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/receiver/DeliveredReceiver.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.moez.QKSMS.receiver; - -import android.app.Activity; -import android.content.Context; -import android.content.Intent; -import android.os.Vibrator; -import android.preference.PreferenceManager; -import android.widget.Toast; -import com.moez.QKSMS.R; -import com.moez.QKSMS.ui.settings.SettingsFragment; - -public class DeliveredReceiver extends com.moez.QKSMS.mmssms.DeliveredReceiver { - - @Override - public void onReceive(Context context, Intent intent) { - super.onReceive(context, intent); - - switch (getResultCode()) { - case Activity.RESULT_OK: - if (PreferenceManager.getDefaultSharedPreferences(context).getBoolean(SettingsFragment.DELIVERY_TOAST, true)) { - Toast.makeText(context, R.string.message_delivered, Toast.LENGTH_LONG).show(); - } - - if (PreferenceManager.getDefaultSharedPreferences(context).getBoolean(SettingsFragment.DELIVERY_VIBRATE, true)) { - Vibrator vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE); - vibrator.vibrate(100); - } - break; - - case Activity.RESULT_CANCELED: - Toast.makeText(context, R.string.message_not_delivered, Toast.LENGTH_LONG).show(); - break; - } - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/receiver/IconColorReceiver.java b/QKSMS/src/main/java/com/moez/QKSMS/receiver/IconColorReceiver.java deleted file mode 100644 index e45bfefb8..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/receiver/IconColorReceiver.java +++ /dev/null @@ -1,91 +0,0 @@ -package com.moez.QKSMS.receiver; - -import android.content.BroadcastReceiver; -import android.content.ComponentName; -import android.content.Context; -import android.content.Intent; -import android.content.pm.PackageManager; -import android.preference.PreferenceManager; -import android.util.Log; - -/** - * The QKSMS icon color can be changed. When it's changed, the QKSMS app must be closed. This - * Receiver received the system broadcast that a package has changed, and re-launches QKSMS. - */ -public class IconColorReceiver extends BroadcastReceiver { - private static final String TAG = "IconColorReceiver"; - private static final boolean LOCAL_LOGV = false; - - /** - * Broadcast this intent when the user has changed the icon. - */ - public static final String ACTION_ICON_COLOR_CHANGED = - "com.moez.QKSMS.action.PENDING_PACKAGE_CHANGE"; - - /** - * When ACTION_ICON_COLOR_CHANGED is broadcast, make sure to add the component name to the - * intent so that we can restart the app here. - */ - public static final String EXTRA_COMPONENT_NAME = - "com.moez.QKSMS.extra.EXTRA_COMPONENT_NAME"; - - /** - * Non-null to specify the activity we need to start when we next receive an - * ACTION_PACKAGE_CHANGED broadcast. - */ - public static final String PREF_PENDING_COMPONENT = - "ColorIconReceiver:pending_activity_start"; - - /** - * This action is also used as the action to start the component specified in - * EXTRA_COMPONENT_NAME, so that it knows it was started in the context of "the icon has just - * changed". This is used, ex., in MainActivity to show a dialog saying "Check out your new - * icon!" - */ - public static final String EXTRA_ICON_COLOR_CHANGED = - "com.moez.QKSMS.extra.EXTRA_ICON_COLOR_CHANGED"; - - @Override - public void onReceive(Context context, Intent intent) { - intent = intent == null ? new Intent() : intent; - if (LOCAL_LOGV) Log.v(TAG, "[" + this + "] onReceive: " + intent); - - if (Intent.ACTION_PACKAGE_CHANGED.equals(intent.getAction())) { - - // When we receive the PACKAGE_CHANGED event, check if it was our package that changed. - // If so, launch the app now. - String component = PreferenceManager.getDefaultSharedPreferences(context) - .getString(PREF_PENDING_COMPONENT, null); - if (component != null) { - PreferenceManager.getDefaultSharedPreferences(context) - .edit() - .putString(PREF_PENDING_COMPONENT, null) - .commit(); - - Intent activity = new Intent(ACTION_ICON_COLOR_CHANGED); - activity.setComponent(new ComponentName(context, component)); - activity.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - activity.putExtra(EXTRA_ICON_COLOR_CHANGED, true); - context.startActivity(activity); - } - - } else if (ACTION_ICON_COLOR_CHANGED.equals(intent.getAction())) { - String component = intent.getStringExtra(EXTRA_COMPONENT_NAME); - - // Save the component class name for starting when we get the PACKAGE_CHANGED_ACTION - // broadcast. - PreferenceManager.getDefaultSharedPreferences(context) - .edit() - .putString(PREF_PENDING_COMPONENT, component) - .commit(); - - // Enable the new color and kill the app. - PackageManager packageManager = context.getPackageManager(); - packageManager.setComponentEnabledSetting( - new ComponentName(context, component), - PackageManager.COMPONENT_ENABLED_STATE_ENABLED, - 0 // no flags---i.e. no "DONT_KILL_APP" flag - ); - } - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/receiver/MarkReadReceiver.java b/QKSMS/src/main/java/com/moez/QKSMS/receiver/MarkReadReceiver.java deleted file mode 100644 index 235badcc6..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/receiver/MarkReadReceiver.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.moez.QKSMS.receiver; - -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import android.os.Bundle; - -import com.moez.QKSMS.service.MarkReadService; -import com.moez.QKSMS.ui.popup.QKReplyActivity; - -public class MarkReadReceiver extends BroadcastReceiver { - - @Override - public void onReceive(Context context, Intent intent) { - Bundle extras = intent.getExtras(); - long threadId = extras.getLong("thread_id"); - - Intent readIntent = new Intent(context, MarkReadService.class); - readIntent.putExtra("thread_id", threadId); - context.startService(readIntent); - - QKReplyActivity.dismiss(threadId); - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/receiver/MarkSeenReceiver.java b/QKSMS/src/main/java/com/moez/QKSMS/receiver/MarkSeenReceiver.java deleted file mode 100644 index 9bc82f870..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/receiver/MarkSeenReceiver.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.moez.QKSMS.receiver; - -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; - -import com.moez.QKSMS.service.MarkSeenService; - -public class MarkSeenReceiver extends BroadcastReceiver { - - @Override - public void onReceive(Context context, Intent intent) { - Intent seenIntent = new Intent(context, MarkSeenService.class); - context.startService(seenIntent); - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/receiver/MessageFailedReceiver.java b/QKSMS/src/main/java/com/moez/QKSMS/receiver/MessageFailedReceiver.java deleted file mode 100644 index f3b805d10..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/receiver/MessageFailedReceiver.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.moez.QKSMS.receiver; - -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import android.widget.Toast; - -import com.moez.QKSMS.R; -import com.moez.QKSMS.transaction.NotificationManager; - -public class MessageFailedReceiver extends BroadcastReceiver { - - @Override - public void onReceive(Context context, Intent intent) { - Toast.makeText(context, R.string.toast_message_failure, Toast.LENGTH_LONG).show(); - NotificationManager.notifyFailed(context); - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/receiver/MessagingReceiver.java b/QKSMS/src/main/java/com/moez/QKSMS/receiver/MessagingReceiver.java deleted file mode 100644 index 6808232fc..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/receiver/MessagingReceiver.java +++ /dev/null @@ -1,135 +0,0 @@ -package com.moez.QKSMS.receiver; - -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import android.content.SharedPreferences; -import android.net.Uri; -import android.os.PowerManager; -import android.preference.PreferenceManager; -import android.telephony.SmsMessage; -import android.util.Log; -import com.moez.QKSMS.common.BlockedConversationHelper; -import com.moez.QKSMS.common.ConversationPrefsHelper; -import com.moez.QKSMS.common.utils.PackageUtils; -import com.moez.QKSMS.data.Message; -import com.moez.QKSMS.service.NotificationService; -import com.moez.QKSMS.transaction.NotificationManager; -import com.moez.QKSMS.transaction.SmsHelper; -import com.moez.QKSMS.ui.settings.SettingsFragment; -import org.mistergroup.muzutozvednout.ShouldIAnswerBinder; - -public class MessagingReceiver extends BroadcastReceiver { - private final String TAG = "MessagingReceiver"; - - private Context mContext; - private SharedPreferences mPrefs; - - private String mAddress; - private String mBody; - private long mDate; - - private Uri mUri; - - @Override - public void onReceive(Context context, Intent intent) { - Log.i(TAG, "onReceive"); - abortBroadcast(); - - mContext = context; - mPrefs = PreferenceManager.getDefaultSharedPreferences(context); - - if (intent.getExtras() != null) { - Object[] pdus = (Object[]) intent.getExtras().get("pdus"); - SmsMessage[] messages = new SmsMessage[pdus.length]; - for (int i = 0; i < messages.length; i++) { - messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]); - } - - SmsMessage sms = messages[0]; - if (messages.length == 1 || sms.isReplace()) { - mBody = sms.getDisplayMessageBody(); - } else { - StringBuilder bodyText = new StringBuilder(); - for (SmsMessage message : messages) { - bodyText.append(message.getMessageBody()); - } - mBody = bodyText.toString(); - } - - mAddress = sms.getDisplayOriginatingAddress(); - mDate = sms.getTimestampMillis(); - - if (mPrefs.getBoolean(SettingsFragment.SHOULD_I_ANSWER, false) && - PackageUtils.isAppInstalled(mContext, "org.mistergroup.muzutozvednout")) { - - ShouldIAnswerBinder shouldIAnswerBinder = new ShouldIAnswerBinder(); - shouldIAnswerBinder.setCallback(new ShouldIAnswerBinder.Callback() { - @Override - public void onNumberRating(String number, int rating) { - Log.i(TAG, "onNumberRating " + number + ": " + String.valueOf(rating)); - shouldIAnswerBinder.unbind(context.getApplicationContext()); - if (rating != ShouldIAnswerBinder.RATING_NEGATIVE) { - insertMessageAndNotify(); - } - } - - @Override - public void onServiceConnected() { - try { - shouldIAnswerBinder.getNumberRating(mAddress); - } catch (Exception e) { - e.printStackTrace(); - } - } - - @Override - public void onServiceDisconnected() { - } - }); - - shouldIAnswerBinder.bind(context.getApplicationContext()); - } else { - insertMessageAndNotify(); - } - } - } - - private void insertMessageAndNotify() { - mUri = SmsHelper.addMessageToInbox(mContext, mAddress, mBody, mDate); - - Message message = new Message(mContext, mUri); - ConversationPrefsHelper conversationPrefs = new ConversationPrefsHelper(mContext, message.getThreadId()); - - // The user has set messages from this address to be blocked, but we at the time there weren't any - // messages from them already in the database, so we couldn't block any thread URI. Now that we have one, - // we can block it, so that the conversation list adapter knows to ignore this thread in the main list - if (BlockedConversationHelper.isFutureBlocked(mPrefs, mAddress)) { - BlockedConversationHelper.unblockFutureConversation(mPrefs, mAddress); - BlockedConversationHelper.blockConversation(mPrefs, message.getThreadId()); - message.markSeen(); - BlockedConversationHelper.FutureBlockedConversationObservable.getInstance().futureBlockedConversationReceived(); - - // If we have notifications enabled and this conversation isn't blocked - } else if (conversationPrefs.getNotificationsEnabled() && !BlockedConversationHelper.getBlockedConversationIds( - PreferenceManager.getDefaultSharedPreferences(mContext)).contains(message.getThreadId())) { - Intent messageHandlerIntent = new Intent(mContext, NotificationService.class); - messageHandlerIntent.putExtra(NotificationService.EXTRA_POPUP, true); - messageHandlerIntent.putExtra(NotificationService.EXTRA_URI, mUri.toString()); - mContext.startService(messageHandlerIntent); - - UnreadBadgeService.update(mContext); - NotificationManager.create(mContext); - - } else { // We shouldn't show a notification for this message - message.markSeen(); - } - - if (conversationPrefs.getWakePhoneEnabled()) { - PowerManager pm = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE); - PowerManager.WakeLock wakeLock = pm.newWakeLock((PowerManager.SCREEN_DIM_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP), "MessagingReceiver"); - wakeLock.acquire(); - wakeLock.release(); - } - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/receiver/MmsReceiver.java b/QKSMS/src/main/java/com/moez/QKSMS/receiver/MmsReceiver.java deleted file mode 100644 index 93c913cb0..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/receiver/MmsReceiver.java +++ /dev/null @@ -1,166 +0,0 @@ -package com.moez.QKSMS.receiver; - -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import android.net.ConnectivityManager; - -import com.android.mms.transaction.TransactionSettings; - -public class MmsReceiver extends BroadcastReceiver { - - private ConnectivityManager connectivityManager; - private TransactionSettings transactionSettings; - - @Override - public void onReceive(Context context, Intent intent) { - transactionSettings = new TransactionSettings(context, connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE_MMS).getExtraInfo()); - //byte[] rawPdu = HttpUtils.httpConnection(context, mContentLocation, null, HttpUtils.HTTP_GET_METHOD, transactionSettings.isProxySet(), transactionSettings.getProxyAddress(), transactionSettings.getProxyPort()); - } - - /*private boolean beginMmsConnectivity() { - try { - int result = connectivityManager.startUsingNetworkFeature(ConnectivityManager.TYPE_MOBILE, Phone.FEATURE_ENABLE_MMS); - NetworkInfo info = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE_MMS); - boolean isAvailable = info != null && info.isConnected() && result == Phone.APN_ALREADY_ACTIVE && !Phone.REASON_VOICE_CALL_ENDED.equals(info.getReason()); - return isAvailable; - } catch(Exception e) { - return false; - } - } - - private static void ensureRouteToHost(ConnectivityManager cm, String url, TransactionSettings settings) throws IOException { - int inetAddr; - if (settings.isProxySet()) { - String proxyAddr = settings.getProxyAddress(); - inetAddr = lookupHost(proxyAddr); - if (inetAddr == -1) { - throw new IOException("Cannot establish route for " + url + ": Unknown host"); - } else { - if (!cm.requestRouteToHost(ConnectivityManager.TYPE_MOBILE_MMS, inetAddr)) - throw new IOException("Cannot establish route to proxy " + inetAddr); - } - } else { - Uri uri = Uri.parse(url); - inetAddr = lookupHost(uri.getHost()); - if (inetAddr == -1) { - throw new IOException("Cannot establish route for " + url + ": Unknown host"); - } else { - if (!cm.requestRouteToHost(ConnectivityManager.TYPE_MOBILE_MMS, inetAddr)) - throw new IOException("Cannot establish route to " + inetAddr + " for " + url); - } - } - } - - private static int lookupHost(String hostname) { - InetAddress inetAddress; - try { - inetAddress = InetAddress.getByName(hostname); - } catch (UnknownHostException e) { - return -1; - } - byte[] addrBytes; - int addr; - addrBytes = inetAddress.getAddress(); - addr = ((addrBytes[3] & 0xff) << 24) | ((addrBytes[2] & 0xff) << 16) | ((addrBytes[1] & 0xff) << 8) | (addrBytes[0] & 0xff); - return addr; - } - - private static void ensureRouteToHostFancy(ConnectivityManager cm, String url, TransactionSettings settings) throws IOException, NoSuchMethodException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { - Method m = cm.getClass().getMethod("requestRouteToHostAddress", new Class[] { int.class, InetAddress.class }); - InetAddress inetAddr; - if (settings.isProxySet()) { - String proxyAddr = settings.getProxyAddress(); - try { - inetAddr = InetAddress.getByName(proxyAddr); - } catch (UnknownHostException e) { - throw new IOException("Cannot establish route for " + url + ": Unknown proxy " + proxyAddr); - } - if (!(Boolean) m.invoke(cm, new Object[] { ConnectivityManager.TYPE_MOBILE_MMS, inetAddr })) - throw new IOException("Cannot establish route to proxy " + inetAddr); - } else { - Uri uri = Uri.parse(url); - try { - inetAddr = InetAddress.getByName(uri.getHost()); - } catch (UnknownHostException e) { - throw new IOException("Cannot establish route for " + url + ": Unknown host"); - } - if (!(Boolean) m.invoke(cm, new Object[] { ConnectivityManager.TYPE_MOBILE_MMS, inetAddr })) - throw new IOException("Cannot establish route to " + inetAddr + " for " + url); - } - } - - private HashSet<String> getRecipients(GenericPdu pdu) { - PduHeaders header = pdu.getPduHeaders(); - HashMap<Integer, EncodedStringValue[]> addressMap = new HashMap<>(ADDRESS_FIELDS.length); - for (int addrType : ADDRESS_FIELDS) { - EncodedStringValue[] array = null; - if (addrType == PduHeaders.FROM) { - EncodedStringValue v = header.getEncodedStringValue(addrType); - if (v != null) { - array = new EncodedStringValue[1]; - array[0] = v; - } - } else { - array = header.getEncodedStringValues(addrType); - } - addressMap.put(addrType, array); - } - HashSet<String> recipients = new HashSet<>(); - loadRecipients(PduHeaders.FROM, recipients, addressMap, false); - loadRecipients(PduHeaders.TO, recipients, addressMap, true); - return recipients; - } - - private void loadRecipients(int addressType, HashSet<String> recipients, HashMap<Integer, EncodedStringValue[]> addressMap, boolean excludeMyNumber) { - EncodedStringValue[] array = addressMap.get(addressType); - if (array == null) { - return; - } - // If the TO recipients is only a single address, then we can skip loadRecipients when - // we're excluding our own number because we know that address is our own. - if (excludeMyNumber && array.length == 1) { - return; - } - String myNumber = excludeMyNumber ? TelephonyManager.getLine1Number() : null; - for (EncodedStringValue v : array) { - if (v != null) { - String number = v.getString(); - if ((myNumber == null || !PhoneNumberUtils.compare(number, myNumber)) && !recipients.contains(number)) { - // Only add numbers which aren't my own number. - recipients.add(number); - } - } - } - } - - private void processPduAttachments() throws Exception { - if (mGenericPdu instanceof MultimediaMessagePdu) { - PduBody body = ((MultimediaMessagePdu) mGenericPdu).getBody(); - if (body != null) { - int partsNum = body.getPartsNum(); - for (int i = 0; i < partsNum; i++) { - try { - PduPart part = body.getPart(i); - if (part == null || part.getData() == null || part.getContentType() == null || part.getName() == null) - continue; - String partType = new String(part.getContentType()); - String partName = new String(part.getName()); - Log.d(TAG, "Part Name: " + partName); - Log.d(TAG, "Part Type: " + partType); - if (ContentType.isTextType(partType)) { - } else if (ContentType.isImageType(partType)) { - } else if (ContentType.isVideoType(partType)) { - } else if (ContentType.isAudioType(partType)) { - } - } catch (Exception e) { - e.printStackTrace(); - // Bad part shouldn't ruin the party for the other parts - } - } - } - } else { - Log.d(TAG, "Not a MultimediaMessagePdu PDU"); - } - }*/ -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/receiver/NightModeAutoReceiver.java b/QKSMS/src/main/java/com/moez/QKSMS/receiver/NightModeAutoReceiver.java deleted file mode 100644 index c8cc1929d..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/receiver/NightModeAutoReceiver.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.moez.QKSMS.receiver; - -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import android.content.SharedPreferences; -import android.preference.PreferenceManager; -import android.util.Log; -import com.moez.QKSMS.ui.ThemeManager; -import com.moez.QKSMS.ui.settings.SettingsFragment; - -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Calendar; - - -public class NightModeAutoReceiver extends BroadcastReceiver { - private final String TAG = "NightModeAutoReceiver"; - - @Override - public void onReceive(Context context, Intent intent) { - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); - - if (prefs.getBoolean(SettingsFragment.NIGHT_AUTO, false)) { - Calendar calendar = Calendar.getInstance(); - calendar.setTimeInMillis(System.currentTimeMillis() + 300000); // add 5 mins in case receiver is called early - - SimpleDateFormat simpleDateFormat = new SimpleDateFormat("H:mm"); - Calendar day = Calendar.getInstance(); - Calendar night = Calendar.getInstance(); - try { - day.setTime(simpleDateFormat.parse(prefs.getString(SettingsFragment.DAY_START, "6:00"))); - night.setTime(simpleDateFormat.parse(prefs.getString(SettingsFragment.NIGHT_START, "21:00"))); - } catch (ParseException e) { - e.printStackTrace(); - } - - if ((calendar.get(Calendar.HOUR_OF_DAY) > night.get(Calendar.HOUR_OF_DAY)) || - (calendar.get(Calendar.HOUR_OF_DAY) == night.get(Calendar.HOUR_OF_DAY) && calendar.get(Calendar.MINUTE) >= night.get(Calendar.MINUTE)) || - (calendar.get(Calendar.HOUR_OF_DAY) < day.get(Calendar.HOUR_OF_DAY)) || - (calendar.get(Calendar.HOUR_OF_DAY) == day.get(Calendar.HOUR_OF_DAY) && calendar.get(Calendar.MINUTE) <= day.get(Calendar.MINUTE))) { - Log.i(TAG, "Switching to night mode"); - prefs.edit().putString(SettingsFragment.BACKGROUND, ThemeManager.Theme.PREF_GREY).apply(); - ThemeManager.setTheme(ThemeManager.Theme.DARK); - } else { - Log.i(TAG, "Switching to day mode"); - prefs.edit().putString(SettingsFragment.BACKGROUND, ThemeManager.Theme.PREF_OFFWHITE).apply(); - ThemeManager.setTheme(ThemeManager.Theme.LIGHT); - } - } - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/receiver/PushReceiver.java b/QKSMS/src/main/java/com/moez/QKSMS/receiver/PushReceiver.java deleted file mode 100644 index 5594be824..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/receiver/PushReceiver.java +++ /dev/null @@ -1,256 +0,0 @@ -package com.moez.QKSMS.receiver; - -import android.content.BroadcastReceiver; -import android.content.ContentResolver; -import android.content.ContentValues; -import android.content.Context; -import android.content.Intent; -import android.content.SharedPreferences; -import android.database.Cursor; -import android.database.DatabaseUtils; -import android.database.sqlite.SqliteWrapper; -import android.net.Uri; -import android.os.AsyncTask; -import android.os.Build; -import android.os.PowerManager; -import android.preference.PreferenceManager; -import android.util.Log; -import com.android.mms.transaction.NotificationTransaction; -import com.android.mms.transaction.Transaction; -import com.android.mms.transaction.TransactionBundle; -import com.android.mms.transaction.TransactionService; -import com.google.android.mms.ContentType; -import com.google.android.mms.MmsException; -import com.google.android.mms.pdu_alt.DeliveryInd; -import com.google.android.mms.pdu_alt.GenericPdu; -import com.google.android.mms.pdu_alt.NotificationInd; -import com.google.android.mms.pdu_alt.PduHeaders; -import com.google.android.mms.pdu_alt.PduParser; -import com.google.android.mms.pdu_alt.PduPersister; -import com.google.android.mms.pdu_alt.ReadOrigInd; -import com.moez.QKSMS.MmsConfig; -import com.moez.QKSMS.ui.settings.SettingsFragment; - -import static com.google.android.mms.pdu_alt.PduHeaders.MESSAGE_TYPE_DELIVERY_IND; -import static com.google.android.mms.pdu_alt.PduHeaders.MESSAGE_TYPE_NOTIFICATION_IND; -import static com.google.android.mms.pdu_alt.PduHeaders.MESSAGE_TYPE_READ_ORIG_IND; - -/** - * Receives Intent.WAP_PUSH_RECEIVED_ACTION intents and starts the - * TransactionService by passing the push-data to it. - */ -public class PushReceiver extends BroadcastReceiver { - private static final String TAG = "PushReceiver"; - private static final boolean LOCAL_LOGV = false; - - private class ReceivePushTask extends AsyncTask<Intent,Void,Void> { - private Context mContext; - public ReceivePushTask(Context context) { - mContext = context; - } - - @Override - protected Void doInBackground(Intent... intents) { - Intent intent = intents[0]; - - // Get raw PDU push-data from the message and parse it - byte[] pushData = intent.getByteArrayExtra("data"); - PduParser parser = new PduParser(pushData); - GenericPdu pdu = parser.parse(); - - if (null == pdu) { - Log.e(TAG, "Invalid PUSH data"); - return null; - } - - PduPersister p = PduPersister.getPduPersister(mContext); - ContentResolver cr = mContext.getContentResolver(); - int type = pdu.getMessageType(); - long threadId = -1; - - if (LOCAL_LOGV) Log.v(TAG, "Processing PUSH PDU: " + pdu.toString()); - - try { - switch (type) { - case MESSAGE_TYPE_DELIVERY_IND: - case MESSAGE_TYPE_READ_ORIG_IND: { - threadId = findThreadId(mContext, pdu, type); - if (threadId == -1) { - // The associated SendReq isn't found, therefore skip - // processing this PDU. - break; - } - - boolean group; - - try { - group = com.moez.QKSMS.mmssms.Transaction.settings.getGroup(); - } catch (Exception e) { - group = PreferenceManager.getDefaultSharedPreferences(mContext).getBoolean(SettingsFragment.COMPOSE_GROUP, true); - } - - Uri uri = p.persist(pdu, Uri.parse("content://mms/inbox"), true, - group, null); - // Update thread ID for ReadOrigInd & DeliveryInd. - ContentValues values = new ContentValues(1); - values.put("thread_id", threadId); - SqliteWrapper.update(mContext, cr, uri, values, null, null); - break; - } - case MESSAGE_TYPE_NOTIFICATION_IND: { - NotificationInd nInd = (NotificationInd) pdu; - - if (MmsConfig.getTransIdEnabled()) { - byte [] contentLocation = nInd.getContentLocation(); - if ('=' == contentLocation[contentLocation.length - 1]) { - byte [] transactionId = nInd.getTransactionId(); - byte [] contentLocationWithId = new byte [contentLocation.length - + transactionId.length]; - System.arraycopy(contentLocation, 0, contentLocationWithId, - 0, contentLocation.length); - System.arraycopy(transactionId, 0, contentLocationWithId, - contentLocation.length, transactionId.length); - nInd.setContentLocation(contentLocationWithId); - } - } - - boolean group; - - try { - group = com.moez.QKSMS.mmssms.Transaction.settings.getGroup(); - } catch (Exception e) { - group = PreferenceManager.getDefaultSharedPreferences(mContext).getBoolean(SettingsFragment.COMPOSE_GROUP, true); - } - - // Save the pdu. If we can start downloading the real pdu immediately, - // don't allow persist() to create a thread for the notificationInd - // because it causes UI jank. - Uri uri = p.persist(pdu, Uri.parse("content://mms/inbox"), - !NotificationTransaction.allowAutoDownload(mContext), - group, - null); - - if (NotificationTransaction.allowAutoDownload(mContext)) { - // Start service to finish the notification transaction. - Intent svc = new Intent(TransactionService.TRANSACTION_BUNDLE_ACTION, - null, mContext, TransactionService.class); - svc.putExtra(TransactionBundle.URI, uri.toString()); - svc.putExtra(TransactionBundle.TRANSACTION_TYPE, - Transaction.NOTIFICATION_TRANSACTION); - mContext.startService(svc); - } else { - Intent notificationBroadcast = new Intent(com.moez.QKSMS.mmssms.Transaction.NOTIFY_OF_MMS); - notificationBroadcast.putExtra("receive_through_stock", true); - mContext.sendBroadcast(notificationBroadcast); - } - - break; - } - default: - Log.e(TAG, "Received unrecognized PDU."); - } - } catch (MmsException e) { - Log.e(TAG, "Failed to save the data from PUSH: type=" + type, e); - } catch (RuntimeException e) { - Log.e(TAG, "Unexpected RuntimeException.", e); - } - - if (LOCAL_LOGV) Log.v(TAG, "PUSH Intent processed."); - - return null; - } - } - - @Override - public void onReceive(Context context, Intent intent) { - if ((intent.getAction().equals("android.provider.Telephony.WAP_PUSH_DELIVER") || intent.getAction().equals("android.provider.Telephony.WAP_PUSH_RECEIVED")) - && ContentType.MMS_MESSAGE.equals(intent.getType())) { - if (LOCAL_LOGV) Log.v(TAG, "Received PUSH Intent: " + intent); - - SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(context); - if ((!sharedPrefs.getBoolean("receive_with_stock", false) && Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT && sharedPrefs.getBoolean("override", true)) - || Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { - // Hold a wake lock for 5 seconds, enough to give any - // services we start time to take their own wake locks. - PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE); - PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, - "MMS PushReceiver"); - wl.acquire(5000); - new ReceivePushTask(context).execute(intent); - - Log.v("mms_receiver", context.getPackageName() + " received and aborted"); - - abortBroadcast(); - } else { - clearAbortBroadcast(); - Intent notificationBroadcast = new Intent(com.moez.QKSMS.mmssms.Transaction.NOTIFY_OF_MMS); - notificationBroadcast.putExtra("receive_through_stock", true); - context.sendBroadcast(notificationBroadcast); - - Log.v("mms_receiver", context.getPackageName() + " received and not aborted"); - } - } - } - - private static long findThreadId(Context context, GenericPdu pdu, int type) { - String messageId; - - if (type == MESSAGE_TYPE_DELIVERY_IND) { - messageId = new String(((DeliveryInd) pdu).getMessageId()); - } else { - messageId = new String(((ReadOrigInd) pdu).getMessageId()); - } - - StringBuilder sb = new StringBuilder('('); - sb.append("m_id"); - sb.append('='); - sb.append(DatabaseUtils.sqlEscapeString(messageId)); - sb.append(" AND "); - sb.append("m_type"); - sb.append('='); - sb.append(PduHeaders.MESSAGE_TYPE_SEND_REQ); - // TODO ContentResolver.query() appends closing ')' to the selection argument - // sb.append(')'); - - Cursor cursor = SqliteWrapper.query(context, context.getContentResolver(), - Uri.parse("content://mms"), new String[] { "thread_id" }, - sb.toString(), null, null); - if (cursor != null) { - try { - if ((cursor.getCount() == 1) && cursor.moveToFirst()) { - return cursor.getLong(0); - } - } finally { - cursor.close(); - } - } - - return -1; - } - - private static boolean isDuplicateNotification( - Context context, NotificationInd nInd) { - byte[] rawLocation = nInd.getContentLocation(); - if (rawLocation != null) { - String location = new String(rawLocation); - // TODO do not use the sdk > 19 sms apis for this - String selection = "ct_l = ?"; - String[] selectionArgs = new String[] { location }; - Cursor cursor = SqliteWrapper.query( - context, context.getContentResolver(), - Uri.parse("content://mms"), new String[] { "_id" }, - selection, selectionArgs, null); - if (cursor != null) { - try { - if (cursor.getCount() > 0) { - // We already received the same notification before. - return true; - } - } finally { - cursor.close(); - } - } - } - return false; - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/receiver/QKIntent.java b/QKSMS/src/main/java/com/moez/QKSMS/receiver/QKIntent.java deleted file mode 100644 index dff79393a..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/receiver/QKIntent.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.moez.QKSMS.receiver; - -public class QKIntent { - public static final String ACTION_ANALYTICS_REPORT = "com.moez.QKSMS.action.analytics_report"; -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/receiver/RemoteMessagingReceiver.java b/QKSMS/src/main/java/com/moez/QKSMS/receiver/RemoteMessagingReceiver.java deleted file mode 100644 index 4fc6d3b02..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/receiver/RemoteMessagingReceiver.java +++ /dev/null @@ -1,142 +0,0 @@ -package com.moez.QKSMS.receiver; - -import android.app.Notification; -import android.app.PendingIntent; -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import android.content.SharedPreferences; -import android.graphics.Bitmap; -import android.os.Build; -import android.os.Bundle; -import android.preference.PreferenceManager; -import android.support.v4.app.NotificationCompat; -import android.support.v4.app.RemoteInput; -import android.view.Gravity; -import com.moez.QKSMS.R; -import com.moez.QKSMS.data.ContactHelper; -import com.moez.QKSMS.mmssms.Message; -import com.moez.QKSMS.mmssms.Transaction; -import com.moez.QKSMS.service.MarkReadService; -import com.moez.QKSMS.transaction.NotificationManager; -import com.moez.QKSMS.transaction.SmsHelper; -import com.moez.QKSMS.ui.ThemeManager; -import com.moez.QKSMS.ui.settings.SettingsFragment; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashSet; -import java.util.Set; - -import static android.support.v4.app.NotificationCompat.BigTextStyle; -import static android.support.v4.app.NotificationCompat.WearableExtender; - -public class RemoteMessagingReceiver extends BroadcastReceiver { - - public static final String ACTION_REPLY = "com.moez.QKSMS.receiver.WearableIntentReceiver.REPLY"; - - public static final String EXTRA_ADDRESS = "address"; - public static final String EXTRA_THREAD_ID = "thread_id"; - public static final String EXTRA_VOICE_REPLY = "voice_reply"; - - @Override - public void onReceive(Context context, Intent intent) { - Bundle remoteInput = RemoteInput.getResultsFromIntent(intent); - Bundle bundle = intent.getExtras(); - if (remoteInput != null && bundle != null) { - if (intent.getAction().equals(ACTION_REPLY)) { - - Message message = new Message( - remoteInput.getCharSequence(EXTRA_VOICE_REPLY).toString(), - new String[]{bundle.getString(EXTRA_ADDRESS)} - ); - - Transaction sendTransaction = new Transaction(context, SmsHelper.getSendSettings(context)); - sendTransaction.sendNewMessage(message, bundle.getLong(EXTRA_THREAD_ID)); - - Intent i = new Intent(context, MarkReadService.class); - i.putExtra(EXTRA_THREAD_ID, bundle.getLong(EXTRA_THREAD_ID)); - context.startService(i); - } - } - } - - public static WearableExtender getConversationExtender(Context context, String name, String address, long threadId) { - WearableExtender wearableExtender = new WearableExtender(); - wearableExtender.setGravity(Gravity.BOTTOM); - wearableExtender.setStartScrollBottom(true); - - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); - - - Bitmap background = ContactHelper.getBitmap(context, ContactHelper.getId(context, address)); - if (background == null) { - background = Bitmap.createBitmap(640, 400, Bitmap.Config.ARGB_8888); - - // We can't use ThemeManager here because it might not be initialized - background.eraseColor(Integer.parseInt(prefs.getString(SettingsFragment.THEME, "" + ThemeManager.DEFAULT_COLOR))); - } - - wearableExtender.setBackground(background); - - - if (Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN) { - BigTextStyle chatPageStyle = new BigTextStyle(); - chatPageStyle - .setBigContentTitle(name) - .setSummaryText(address) - .bigText(SmsHelper.getHistoryForWearable(context, name, threadId)); - - Notification chatPage = new NotificationCompat.Builder(context) - .setStyle(chatPageStyle) - .extend(new NotificationCompat.WearableExtender() - .setStartScrollBottom(true)) - .build(); - - wearableExtender.addPage(chatPage); - } - - wearableExtender.addAction(getReplyAction(context, address, threadId)); - - Intent readIntent = new Intent(NotificationManager.ACTION_MARK_READ); - readIntent.putExtra(EXTRA_THREAD_ID, threadId); - PendingIntent readPI = PendingIntent.getBroadcast(context, 2, readIntent, PendingIntent.FLAG_UPDATE_CURRENT); - - NotificationCompat.Action readAction = new NotificationCompat.Action.Builder( - R.drawable.ic_accept, - context.getString(R.string.mark_read), readPI) - .build(); - - wearableExtender.addAction(readAction); - - - return wearableExtender; - } - - public static NotificationCompat.Action getReplyAction(Context context, String address, long threadId) { - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); - - Intent replyIntent = new Intent(ACTION_REPLY).setClass(context, RemoteMessagingReceiver.class); - replyIntent.putExtra(EXTRA_ADDRESS, address); - replyIntent.putExtra(EXTRA_THREAD_ID, threadId); - - Set<String> defaultResponses = new HashSet<>(Arrays.asList(context.getResources().getStringArray(R.array.qk_responses))); - Set<String> responseSet = prefs.getStringSet(SettingsFragment.QK_RESPONSES, defaultResponses); - ArrayList<String> responses = new ArrayList<>(); - responses.addAll(responseSet); - Collections.sort(responses); - - PendingIntent replyPI = PendingIntent.getBroadcast(context, 0, replyIntent, PendingIntent.FLAG_UPDATE_CURRENT); - RemoteInput remoteInput = new RemoteInput.Builder(EXTRA_VOICE_REPLY) - .setLabel(context.getString(R.string.reply)) - .setChoices(responses.toArray(new String[responses.size()])) - .build(); - - return new NotificationCompat.Action.Builder( - R.drawable.ic_reply, - context.getString(R.string.reply), replyPI) - .addRemoteInput(remoteInput) - .build(); - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/receiver/SmsReceiver.java b/QKSMS/src/main/java/com/moez/QKSMS/receiver/SmsReceiver.java deleted file mode 100644 index 46bce15dc..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/receiver/SmsReceiver.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.moez.QKSMS.receiver; - -public class SmsReceiver extends MessagingReceiver { -} - diff --git a/QKSMS/src/main/java/com/moez/QKSMS/receiver/SmsReceiverLegacy.java b/QKSMS/src/main/java/com/moez/QKSMS/receiver/SmsReceiverLegacy.java deleted file mode 100644 index 4231ac539..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/receiver/SmsReceiverLegacy.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.moez.QKSMS.receiver; - -public class SmsReceiverLegacy extends MessagingReceiver { -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/receiver/UnreadBadgeService.java b/QKSMS/src/main/java/com/moez/QKSMS/receiver/UnreadBadgeService.java deleted file mode 100644 index 1b8844d8b..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/receiver/UnreadBadgeService.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.moez.QKSMS.receiver; - -import android.app.IntentService; -import android.content.Context; -import android.content.Intent; -import com.moez.QKSMS.transaction.SmsHelper; -import com.moez.QKSMS.ui.widget.WidgetProvider; -import me.leolin.shortcutbadger.ShortcutBadger; - -public class UnreadBadgeService extends IntentService { - - public static final String UNREAD_COUNT_UPDATED = "com.moez.QKSMS.intent.action.UNREAD_COUNT_UPDATED"; - - public UnreadBadgeService() { - super("UnreadBadgeService"); - } - - @Override - protected void onHandleIntent(Intent intent) { - if (UNREAD_COUNT_UPDATED.equals(intent.getAction())) { - ShortcutBadger.with(getApplicationContext()).count(SmsHelper.getUnreadMessageCount(this)); - WidgetProvider.notifyDatasetChanged(this); - } - } - - public static void update(Context context) { - Intent intent = new Intent(context, UnreadBadgeService.class); - intent.setAction(UNREAD_COUNT_UPDATED); - context.startService(intent); - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/service/CopyUnreadMessageTextService.java b/QKSMS/src/main/java/com/moez/QKSMS/service/CopyUnreadMessageTextService.java deleted file mode 100644 index 80e69e03e..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/service/CopyUnreadMessageTextService.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.moez.QKSMS.service; - -import android.app.IntentService; -import android.content.ClipData; -import android.content.ClipboardManager; -import android.content.Intent; -import android.net.Uri; -import android.os.Handler; -import android.os.Looper; -import android.widget.Toast; - -import com.moez.QKSMS.R; -import com.moez.QKSMS.transaction.SmsHelper; -import com.moez.QKSMS.ui.view.RunnableToast; - -public class CopyUnreadMessageTextService extends IntentService { - - public static String EXTRA_THREAD_URI = "threadUri"; - - private Handler mHandler; - - public CopyUnreadMessageTextService() { - super("CopyUnreadMessageTextService"); - } - - @Override - public void onCreate() { - super.onCreate(); - mHandler = new Handler(Looper.getMainLooper()); - } - - @Override - protected void onHandleIntent(Intent intent) { - Uri threadUri = intent.getParcelableExtra(EXTRA_THREAD_URI); - - String messages = SmsHelper.getUnreadMessageText(this, threadUri); - - ((ClipboardManager) getSystemService(CLIPBOARD_SERVICE)).setPrimaryClip(ClipData.newPlainText(messages, messages)); - mHandler.post(new RunnableToast(this, R.string.toast_copy_text, Toast.LENGTH_SHORT)); - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/service/DeleteOldMessagesService.java b/QKSMS/src/main/java/com/moez/QKSMS/service/DeleteOldMessagesService.java deleted file mode 100644 index f6441b83d..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/service/DeleteOldMessagesService.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.moez.QKSMS.service; - -import android.app.AlarmManager; -import android.app.IntentService; -import android.app.PendingIntent; -import android.content.Context; -import android.content.Intent; -import android.util.Log; -import com.moez.QKSMS.common.QKPreferences; -import com.moez.QKSMS.enums.QKPreference; -import com.moez.QKSMS.transaction.SmsHelper; - -import java.util.Calendar; - -public class DeleteOldMessagesService extends IntentService { - private static final String TAG = "DeleteOldMessages"; - - public DeleteOldMessagesService() { - super(TAG); - } - - @Override - protected void onHandleIntent(Intent intent) { - Calendar last = Calendar.getInstance(); - last.setTimeInMillis(QKPreferences.getLong(QKPreference.LAST_AUTO_DELETE_CHECK)); - - Calendar current = Calendar.getInstance(); - - // Continue if the auto delete setting is enabled, and we haven't done a purge today - if (QKPreferences.getBoolean(QKPreference.AUTO_DELETE) && (last.getTimeInMillis() == 0 || - current.get(Calendar.DAY_OF_YEAR) != last.get(Calendar.DAY_OF_YEAR) || - current.get(Calendar.YEAR) != last.get(Calendar.YEAR))) { - Log.i(TAG, "Ready to delete old messages"); - QKPreferences.setLong(QKPreference.LAST_AUTO_DELETE_CHECK, System.currentTimeMillis()); - - deleteOldUnreadMessages(this); - deleteOldReadMessages(this); - } else { - Log.i(TAG, "Not going to delete old messages"); - } - } - - private void deleteOldUnreadMessages(Context context) { - Calendar calendar = Calendar.getInstance(); - calendar.add(Calendar.DAY_OF_YEAR, -Integer.parseInt(QKPreferences.getString(QKPreference.AUTO_DELETE_UNREAD))); - calendar.set(Calendar.HOUR_OF_DAY, calendar.getActualMaximum(Calendar.HOUR_OF_DAY)); - calendar.set(Calendar.MINUTE, calendar.getActualMaximum(Calendar.MINUTE)); - calendar.set(Calendar.SECOND, calendar.getActualMaximum(Calendar.SECOND)); - int count = deleteOldMessages(context, SmsHelper.UNREAD_SELECTION, calendar.getTimeInMillis()); - Log.i(TAG, "Deleted unread messages: " + count); - } - - private void deleteOldReadMessages(Context context) { - Calendar calendar = Calendar.getInstance(); - calendar.add(Calendar.DAY_OF_YEAR, -Integer.parseInt(QKPreferences.getString(QKPreference.AUTO_DELETE_READ))); - calendar.set(Calendar.HOUR_OF_DAY, calendar.getActualMaximum(Calendar.HOUR_OF_DAY)); - calendar.set(Calendar.MINUTE, calendar.getActualMaximum(Calendar.MINUTE)); - calendar.set(Calendar.SECOND, calendar.getActualMaximum(Calendar.SECOND)); - int count = deleteOldMessages(context, SmsHelper.READ_SELECTION + "=" + SmsHelper.READ, calendar.getTimeInMillis()); - Log.i(TAG, "Deleted read messages: " + count); - } - - private int deleteOldMessages(Context context, String selection, long before) { - selection += " AND " + SmsHelper.COLUMN_DATE + "<=?"; - - try { - return context.getContentResolver().delete(SmsHelper.SMS_CONTENT_PROVIDER, selection, new String[]{String.valueOf(before)}); - } catch (Exception e) { - e.printStackTrace(); - } - - return 0; - } - - public static void setupAutoDeleteAlarm(Context context) { - Calendar calendar = Calendar.getInstance(); - calendar.setTimeInMillis(System.currentTimeMillis()); - calendar.set(Calendar.HOUR_OF_DAY, 3); // We want this service to run when the phone is not likely being used - - Intent intent = new Intent(context, DeleteOldMessagesService.class); - PendingIntent pIntent = PendingIntent.getService(context, 9237, intent, PendingIntent.FLAG_UPDATE_CURRENT); - - AlarmManager alarm = (AlarmManager) context.getSystemService(ALARM_SERVICE); - alarm.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pIntent); - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/service/DeleteUnreadMessageService.java b/QKSMS/src/main/java/com/moez/QKSMS/service/DeleteUnreadMessageService.java deleted file mode 100644 index 05dfb8609..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/service/DeleteUnreadMessageService.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.moez.QKSMS.service; - -import android.app.IntentService; -import android.content.Intent; -import android.net.Uri; - -import com.moez.QKSMS.data.Message; -import com.moez.QKSMS.transaction.NotificationManager; -import com.moez.QKSMS.transaction.SmsHelper; - -import java.util.ArrayList; - -// We have this in a service beacause depending on the number of messages and the device, it can be -// slow. We don't want to leave the QK Reply window open while it's marking as read, so we let a -// service execute the code and we can shut down the activity. Otherwise it'll look like the app it -// just lagging. -public class DeleteUnreadMessageService extends IntentService { - - public static String EXTRA_THREAD_URI = "threadUri"; - - public DeleteUnreadMessageService() { - super("DeleteUnreadMessageService"); - } - - @Override - protected void onHandleIntent(Intent intent) { - Uri threadUri = intent.getParcelableExtra(EXTRA_THREAD_URI); - - // The messages are marked as read before deleting due to an issue with the android content - // provider. When the message is deleted, it doesn't notify the conversations table. So if - // there is an unread message, and it's deleted, then the conversation will remain unread. - // Then even when you try to mark it as read and it iterates over unread messages to mark - // them read, it won't be able to find any because they were deleted, leaving the - // conversation "stuck" as unread. The only way to un-stick it is to receive a new message - // in the conversation and mark that as read. Marking them read before deleting them solves - // this problem. - ArrayList<Message> messages = SmsHelper.getUnreadMessagesLegacy(this, threadUri); - for (Message message : messages) { - message.markRead(); - message.delete(); - } - NotificationManager.update(this); - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/service/HeadlessSmsSendService.java b/QKSMS/src/main/java/com/moez/QKSMS/service/HeadlessSmsSendService.java deleted file mode 100644 index 213ce11d7..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/service/HeadlessSmsSendService.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.moez.QKSMS.service; - -import android.app.IntentService; -import android.content.Intent; -import android.net.Uri; -import android.os.Bundle; -import android.telephony.TelephonyManager; -import android.text.TextUtils; -import com.moez.QKSMS.mmssms.Message; -import com.moez.QKSMS.mmssms.Transaction; -import com.moez.QKSMS.transaction.NotificationManager; -import com.moez.QKSMS.transaction.SmsHelper; - -import static com.moez.QKSMS.data.Conversation.getRecipients; - -public class HeadlessSmsSendService extends IntentService { - private static final String TAG = "HeadlessSmsSendService"; - - public HeadlessSmsSendService() { - super(TAG); - } - - @Override - protected void onHandleIntent(Intent intent) { - String action = intent.getAction(); - if (!TelephonyManager.ACTION_RESPOND_VIA_MESSAGE.equals(action)) { - return; - } - - Bundle extras = intent.getExtras(); - if (extras != null) { - String body = extras.getString(Intent.EXTRA_TEXT); - Uri intentUri = intent.getData(); - String recipients = getRecipients(intentUri); - - if (!TextUtils.isEmpty(recipients) && !TextUtils.isEmpty(body)) { - String[] destinations = TextUtils.split(recipients, ";"); - - Transaction sendTransaction = new Transaction(this, SmsHelper.getSendSettings(this)); - - Message message = new Message(body, destinations); - message.setType(Message.TYPE_SMSMMS); - - sendTransaction.sendNewMessage(message, Transaction.NO_THREAD_ID); - NotificationManager.update(this); - } - } - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/service/MarkReadService.java b/QKSMS/src/main/java/com/moez/QKSMS/service/MarkReadService.java deleted file mode 100644 index 83257f96c..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/service/MarkReadService.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.moez.QKSMS.service; - -import android.app.IntentService; -import android.content.Intent; -import android.os.Bundle; - -import com.moez.QKSMS.data.ConversationLegacy; - -public class MarkReadService extends IntentService { - - public MarkReadService() { - super("MarkReadService"); - } - - @Override - protected void onHandleIntent(Intent intent) { - Bundle extras = intent.getExtras(); - long threadId = extras.getLong("thread_id"); - - ConversationLegacy conversation = new ConversationLegacy(this, threadId); - conversation.markRead(); - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/service/MarkSeenService.java b/QKSMS/src/main/java/com/moez/QKSMS/service/MarkSeenService.java deleted file mode 100644 index ed035c3c4..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/service/MarkSeenService.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.moez.QKSMS.service; - -import android.app.IntentService; -import android.content.Intent; -import com.moez.QKSMS.transaction.NotificationManager; -import com.moez.QKSMS.transaction.SmsHelper; - -public class MarkSeenService extends IntentService { - private final String TAG = "MarkSeenService"; - - public MarkSeenService() { - super("MarkSeenService"); - } - - @Override - protected void onHandleIntent(Intent intent) { - SmsHelper.markSmsSeen(this); - SmsHelper.markMmsSeen(this); - NotificationManager.update(this); - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/service/NotificationService.java b/QKSMS/src/main/java/com/moez/QKSMS/service/NotificationService.java deleted file mode 100644 index 1782d1346..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/service/NotificationService.java +++ /dev/null @@ -1,88 +0,0 @@ -package com.moez.QKSMS.service; - -import android.app.Service; -import android.content.Context; -import android.content.Intent; -import android.content.SharedPreferences; -import android.database.Cursor; -import android.graphics.Bitmap; -import android.net.Uri; -import android.os.Build; -import android.os.IBinder; -import android.preference.PreferenceManager; -import com.moez.QKSMS.common.ConversationPrefsHelper; -import com.moez.QKSMS.common.LifecycleHandler; -import com.moez.QKSMS.data.ContactHelper; -import com.moez.QKSMS.data.Message; -import com.moez.QKSMS.transaction.SmsHelper; -import com.moez.QKSMS.ui.popup.QKReplyActivity; -import com.moez.QKSMS.ui.settings.SettingsFragment; - -public class NotificationService extends Service { - private final String TAG = "NotificationService"; - - public static final String EXTRA_POPUP = "popup"; - public static final String EXTRA_URI = "uri"; - private Context context = this; - private Intent popupIntent; - private SharedPreferences prefs; - private ConversationPrefsHelper conversationPrefs; - - @Override - public int onStartCommand(Intent intent, int flags, int startId) { - - prefs = PreferenceManager.getDefaultSharedPreferences(context); - - Uri uri = Uri.parse(intent.getStringExtra(EXTRA_URI)); - - // Try to get the message's ID, in case the given Uri is bad. - long messageId = -1; - Cursor cursor = context.getContentResolver().query(uri, new String[]{SmsHelper.COLUMN_ID}, - null, null, null); - if (cursor.moveToFirst()) { - messageId = cursor.getLong(cursor.getColumnIndexOrThrow(SmsHelper.COLUMN_ID)); - } - cursor.close(); - - // Make sure we found a message before showing QuickReply and using PushBullet. - if (messageId != -1) { - - Message message = new Message(context, messageId); - - conversationPrefs = new ConversationPrefsHelper(context, message.getThreadId()); - - if (conversationPrefs.getNotificationsEnabled()) { - // Only show QuickReply if we're outside of the app, and they have popups and QuickReply enabled. - if (!LifecycleHandler.isApplicationVisible() && - intent.getBooleanExtra(EXTRA_POPUP, false) && prefs.getBoolean(SettingsFragment.QUICKREPLY, Build.VERSION.SDK_INT < 24)) { - - popupIntent = new Intent(context, QKReplyActivity.class); - popupIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - popupIntent.putExtra(QKReplyActivity.EXTRA_THREAD_ID, message.getThreadId()); - startActivity(popupIntent); - } - - // Get the photo for the PushBullet notification. - Bitmap photoBitmap = message.getPhotoBitmap(); - if (photoBitmap == null) { - photoBitmap = ContactHelper.blankContact(context, message.getName()); - } - - PushbulletService.mirrorMessage(context, "" + message.getThreadId(), - message.getName(), message.getBody(), photoBitmap, null, 6639); - } else { - // If the conversation is muted, mark this message as "seen". Note that this is - // different from marking it as "read". - message.markSeen(); - } - } - - stopSelf(); - return super.onStartCommand(intent, flags, startId); - } - - @Override - public IBinder onBind(Intent intent) { - return null; - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/service/PushbulletService.java b/QKSMS/src/main/java/com/moez/QKSMS/service/PushbulletService.java deleted file mode 100644 index de623ba98..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/service/PushbulletService.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.moez.QKSMS.service; - -import com.moez.QKSMS.mmssms.Message; -import com.moez.QKSMS.mmssms.Transaction; -import com.moez.QKSMS.data.ConversationLegacy; -import com.moez.QKSMS.transaction.NotificationManager; -import com.moez.QKSMS.transaction.SmsHelper; -import com.moez.QKSMS.ui.popup.QKReplyActivity; -import com.pushbullet.android.extension.MessagingExtension; - -public class PushbulletService extends MessagingExtension { - private final String TAG = "PushbulletService"; - - @Override - protected void onMessageReceived(String conversationIden, String body) { - long threadId = Long.parseLong(conversationIden); - ConversationLegacy conversation = new ConversationLegacy(getApplicationContext(), threadId); - - Transaction sendTransaction = new Transaction(getApplicationContext(), SmsHelper.getSendSettings(getApplicationContext())); - Message message = new com.moez.QKSMS.mmssms.Message(body, conversation.getAddress()); - message.setType(com.moez.QKSMS.mmssms.Message.TYPE_SMSMMS); - sendTransaction.sendNewMessage(message, conversation.getThreadId()); - - QKReplyActivity.dismiss(conversation.getThreadId()); - - NotificationManager.update(getApplicationContext()); - } - - @Override - protected void onConversationDismissed(String conversationIden) { - long threadId = Long.parseLong(conversationIden); - ConversationLegacy conversation = new ConversationLegacy(getApplicationContext(), threadId); - conversation.markRead(); - } - -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/service/ShouldIAnswerService.java b/QKSMS/src/main/java/com/moez/QKSMS/service/ShouldIAnswerService.java deleted file mode 100644 index 0b471de80..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/service/ShouldIAnswerService.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.moez.QKSMS.service; - -import android.annotation.SuppressLint; -import android.app.Service; -import android.content.Context; -import android.content.Intent; -import android.content.SharedPreferences; -import android.os.Bundle; -import android.os.Handler; -import android.os.IBinder; -import android.os.Message; -import android.os.Messenger; -import android.os.RemoteException; -import android.preference.PreferenceManager; -import android.support.annotation.Nullable; -import com.moez.QKSMS.ui.settings.SettingsFragment; - -public class ShouldIAnswerService extends Service { - - private Messenger mMessenger = new Messenger(new BlockingEnabledHandler(this)); - - @Nullable - @Override - public IBinder onBind(Intent intent) { - return mMessenger.getBinder(); - } - - private class BlockingEnabledHandler extends Handler { - private Context mContext; - - private BlockingEnabledHandler(Context context) { - mContext = context; - } - - @SuppressLint("CommitPrefEdits") - @Override - public void handleMessage(Message msg) { - super.handleMessage(msg); - - Messenger messenger = msg.replyTo; - if (messenger != null && (msg.what == 918 || msg.what == 919)) { - Bundle data = new Bundle(); - - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(mContext); - if (msg.what == 919) { - boolean enabled=msg.getData().getBoolean("enabled"); - prefs.edit().putBoolean(SettingsFragment.SHOULD_I_ANSWER, enabled).commit(); - } - - data.putBoolean("blocking_enabled", prefs.getBoolean(SettingsFragment.SHOULD_I_ANSWER, false)); - - Message message = new Message(); - message.what = msg.what; - message.setData(data); - - try { - messenger.send(message); - } catch (RemoteException e) { - e.printStackTrace(); - } - } - } - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/theme/IconAdapter.java b/QKSMS/src/main/java/com/moez/QKSMS/theme/IconAdapter.java deleted file mode 100644 index 19b0fdbd4..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/theme/IconAdapter.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.moez.QKSMS.theme; - -import android.content.Context; -import android.support.v7.internal.widget.AdapterViewCompat; -import android.support.v7.widget.RecyclerView; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import com.moez.QKSMS.R; - -public class IconAdapter extends RecyclerView.Adapter<IconViewHolder> { - - private Context mContext; - private AdapterViewCompat.OnItemClickListener mOnItemClickListener; - private int[] mIconIds = new int[]{ - R.mipmap.ic_launcher, R.mipmap.ic_launcher_dark, R.mipmap.ic_launcher_red, R.mipmap.ic_launcher_pink, - R.mipmap.ic_launcher_purple, R.mipmap.ic_launcher_deep_purple, R.mipmap.ic_launcher_indigo, - R.mipmap.ic_launcher_blue, R.mipmap.ic_launcher_light_blue, R.mipmap.ic_launcher_cyan, - R.mipmap.ic_launcher_teal, R.mipmap.ic_launcher_green, R.mipmap.ic_launcher_light_green, - R.mipmap.ic_launcher_lime, R.mipmap.ic_launcher_yellow, R.mipmap.ic_launcher_amber, - R.mipmap.ic_launcher_orange, R.mipmap.ic_launcher_deep_orange, R.mipmap.ic_launcher_brown, - R.mipmap.ic_launcher_grey, R.mipmap.ic_launcher_blue_grey - }; - - public IconAdapter(Context context, AdapterViewCompat.OnItemClickListener onItemClickListener) { - mContext = context; - mOnItemClickListener = onItemClickListener; - } - - @Override - public IconViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - View view = LayoutInflater.from(mContext).inflate(R.layout.list_item_icon, parent, false); - return new IconViewHolder(this, view); - } - - @Override - public void onBindViewHolder(IconViewHolder holder, int position) { - holder.bind(position); - holder.itemView.setOnClickListener(v -> mOnItemClickListener.onItemClick(null, holder.itemView, position, 0)); - } - - public Integer getItem(int position) { - return mIconIds[position]; - } - - @Override - public int getItemCount() { - return mIconIds.length; - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/theme/IconViewHolder.java b/QKSMS/src/main/java/com/moez/QKSMS/theme/IconViewHolder.java deleted file mode 100644 index a17d4762a..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/theme/IconViewHolder.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.moez.QKSMS.theme; - -import android.support.v7.widget.RecyclerView; -import android.view.View; -import android.widget.ImageView; -import butterknife.Bind; -import butterknife.ButterKnife; -import com.moez.QKSMS.R; - -public class IconViewHolder extends RecyclerView.ViewHolder { - - @Bind(R.id.icon) protected ImageView mIcon; - - protected IconAdapter mIconAdapter; - - public IconViewHolder(IconAdapter iconAdapter, View view) { - super(view); - mIconAdapter = iconAdapter; - ButterKnife.bind(this, view); - } - - public void bind(int position) { - int iconRes = mIconAdapter.getItem(position); - mIcon.setImageResource(iconRes); - } - -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/transaction/EndlessJabber.java b/QKSMS/src/main/java/com/moez/QKSMS/transaction/EndlessJabber.java deleted file mode 100644 index a60380eba..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/transaction/EndlessJabber.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.moez.QKSMS.transaction; - -import android.content.Context; -import android.util.Log; - -import com.moez.QKSMS.mmssms.Message; -import com.moez.QKSMS.mmssms.Transaction; -import com.mariussoft.endlessjabber.sdk.IEndlessJabberImplementation; -import com.mariussoft.endlessjabber.sdk.MMSPart; -import com.moez.QKSMS.data.ConversationLegacy; - -public class EndlessJabber implements IEndlessJabberImplementation { - private final String TAG = "EndlessJabber"; - - public EndlessJabber() { - - } - - @Override - public void UpdateReadMessages(Context context, long time, int threadId) { - Log.d(TAG, "UpdateReadMessages"); - new ConversationLegacy(context, threadId).markRead(); - } - - @Override - public void DeleteThread(Context context, int threadId) { - Log.d(TAG, "DeleteThread"); - new ConversationLegacy(context, threadId).delete(); - } - - @Override - public void SendMMS(Context context, String[] recipients, MMSPart[] parts, String subject, boolean save, boolean send) { - Log.d(TAG, "SendMMS"); - Transaction sendTransaction = new Transaction(context, SmsHelper.getSendSettings(context)); - - Message message = new Message(); - message.setType(com.moez.QKSMS.mmssms.Message.TYPE_SMSMMS); - message.setAddresses(recipients); - message.setSubject(subject); - message.setSave(save); - - sendTransaction.sendNewMessage(message, 0); - } - - @Override - public void SendSMS(Context context, String[] recipients, String body, boolean send) { - Log.d(TAG, "SendSMS"); - Transaction sendTransaction = new Transaction(context, SmsHelper.getSendSettings(context)); - - Message message = new Message(); - message.setType(com.moez.QKSMS.mmssms.Message.TYPE_SMSMMS); - message.setAddresses(recipients); - message.setText(body); - - sendTransaction.sendNewMessage(message, 0); - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/transaction/NotificationManager.java b/QKSMS/src/main/java/com/moez/QKSMS/transaction/NotificationManager.java deleted file mode 100644 index 7dfc10586..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/transaction/NotificationManager.java +++ /dev/null @@ -1,760 +0,0 @@ -package com.moez.QKSMS.transaction; - -import android.app.PendingIntent; -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; -import android.content.SharedPreferences; -import android.content.res.Resources; -import android.database.Cursor; -import android.graphics.Bitmap; -import android.graphics.drawable.BitmapDrawable; -import android.graphics.drawable.Drawable; -import android.net.Uri; -import android.os.Build; -import android.os.Handler; -import android.os.HandlerThread; -import android.os.Looper; -import android.os.PowerManager; -import android.preference.PreferenceManager; -import android.provider.Telephony; -import android.support.v4.app.NotificationCompat; -import android.text.Html; -import android.util.Log; -import com.android.mms.transaction.TransactionService; -import com.android.mms.transaction.TransactionState; -import com.google.android.mms.pdu_alt.PduHeaders; -import com.moez.QKSMS.R; -import com.moez.QKSMS.common.ConversationPrefsHelper; -import com.moez.QKSMS.common.utils.ImageUtils; -import com.moez.QKSMS.data.Contact; -import com.moez.QKSMS.data.ContactHelper; -import com.moez.QKSMS.data.Message; -import com.moez.QKSMS.model.ImageModel; -import com.moez.QKSMS.model.SlideshowModel; -import com.moez.QKSMS.receiver.RemoteMessagingReceiver; -import com.moez.QKSMS.ui.MainActivity; -import com.moez.QKSMS.ui.ThemeManager; -import com.moez.QKSMS.ui.dialog.DefaultSmsHelper; -import com.moez.QKSMS.ui.messagelist.MessageItem; -import com.moez.QKSMS.ui.messagelist.MessageListActivity; -import com.moez.QKSMS.ui.popup.QKComposeActivity; -import com.moez.QKSMS.ui.popup.QKReplyActivity; -import com.moez.QKSMS.ui.settings.SettingsFragment; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Set; - -public class NotificationManager { - private static final String TAG = "NotificationManager"; - - private static final int NOTIFICATION_ID_QUICKCOMPOSE = 4516; - private static final int NOTIFICATION_ID_FAILED = 4295; - - public static final String ACTION_MARK_READ = "com.moez.QKSMS.MARK_READ"; - public static final String ACTION_MARK_SEEN = "com.moez.QKSMS.MARK_SEEN"; - - private static final String DEFAULT_RINGTONE = "content://settings/system/notification_sound"; - - private static final String PREV_NOTIFICATIONS = "key_prev_notifications"; - - private static final long[] VIBRATION = {0, 200, 200, 200}; - private static final long[] VIBRATION_SILENT = {0, 0}; - - private static HandlerThread sThread; - private static Looper sLooper; - private static Handler sHandler; - - private static SharedPreferences sPrefs; - private static Resources sRes; - - static { - // Start a new thread for showing notifications on with minimum priority - sThread = new HandlerThread("NotificationManager"); - sThread.start(); - sThread.setPriority(HandlerThread.MIN_PRIORITY); - - sLooper = sThread.getLooper(); - sHandler = new Handler(sLooper); - } - - public static void init(final Context context) { - - // Initialize the static shared prefs and resources. - sPrefs = PreferenceManager.getDefaultSharedPreferences(context); - sRes = context.getResources(); - - // Listen for MMS events. - IntentFilter filter = new IntentFilter(TransactionService.TRANSACTION_COMPLETED_ACTION); - context.registerReceiver(sBroadcastReceiver, filter); - } - - private static BroadcastReceiver sBroadcastReceiver = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - // TODO this should happen on a background thread because it requires a DB query - int result = intent.getIntExtra(TransactionService.STATE, TransactionState.FAILED); - Uri uri = intent.getParcelableExtra(TransactionService.STATE_URI); - - if (uri != null) { - // Get the message type - int msgType = -1; - Cursor c = null; - try { - c = SqliteWrapper.query(context, context.getContentResolver(), uri, - new String[]{Telephony.Mms.MESSAGE_TYPE}, null, null, null - ); - if (c.moveToFirst()) { - msgType = c.getInt(c.getColumnIndex(Telephony.Mms.MESSAGE_TYPE)); - } - } finally { - if (c != null) c.close(); - } - - // For successful retrieve messages, show a notification! - if (result == TransactionState.SUCCESS && msgType == PduHeaders.MESSAGE_TYPE_RETRIEVE_CONF) { - create(context); - } else { - update(context); - } - } - } - }; - - /** - * Creates a new notification, called when a new message is received. This notification will have sound and - * vibration - */ - public static void create(final Context context) { - if (sPrefs.getBoolean(SettingsFragment.NOTIFICATIONS, true)) { - sHandler.post(new Runnable() { - @Override - public void run() { - HashMap<Long, ArrayList<MessageItem>> conversations = SmsHelper.getUnreadUnseenConversations(context); - - // Let's find the list of current notifications. If we're showing multiple notifications, now we know - // which ones don't need to be touched - Set<Long> oldThreads = new HashSet<>(); - for (String s : sPrefs.getStringSet(PREV_NOTIFICATIONS, new HashSet<String>())) { - long l = Long.parseLong(s); - if (!oldThreads.contains(l)) { - oldThreads.add(l); - } - } - - dismissOld(context, conversations); - - // If there are no messages, don't try to create a notification - if (conversations.size() == 0) { - return; - } - - ArrayList<MessageItem> lastConversation = conversations.get(conversations.keySet().toArray()[0]); - MessageItem lastMessage = lastConversation.get(0); - - // If this message is in the foreground, mark it as read - Message message = new Message(context, lastMessage.mMsgId); - if (MessageListActivity.isInForeground && message.getThreadId() == MessageListActivity.getThreadId()) { - message.markRead(); - return; - } - - long threadId = (long) conversations.keySet().toArray()[0]; - ConversationPrefsHelper conversationPrefs = new ConversationPrefsHelper(context, threadId); - - if (!conversationPrefs.getNotificationsEnabled()) { - return; - } - - // Otherwise, reset the state and show the notification. - NotificationCompat.Builder builder = - new NotificationCompat.Builder(context) - .setSmallIcon(R.drawable.ic_notification) - .setPriority(getNotificationPriority(context)) - .setSound(conversationPrefs.getNotificationSoundUri()) - .setVibrate(VIBRATION_SILENT) - .setAutoCancel(true); - - if (conversationPrefs.getVibrateEnabled()) { - builder.setVibrate(VIBRATION); - } - - if (conversationPrefs.getNotificationLedEnabled()) { - builder.setLights(getLedColor(conversationPrefs), 1000, 1000); - } - - Integer privateNotifications = conversationPrefs.getPrivateNotificationsSetting(); - - if (conversationPrefs.getTickerEnabled()) { - switch (privateNotifications) { - case 0: - builder.setTicker(String.format("%s: %s", lastMessage.mContact, lastMessage.mBody)); - break; - case 1: - builder.setTicker(String.format("%s: %s", lastMessage.mContact, sRes.getString(R.string.new_message))); - break; - case 2: - builder.setTicker(String.format("%s: %s", "QKSMS", sRes.getString(R.string.new_message))); - break; - } - } - - if (conversationPrefs.getWakePhoneEnabled()) { - PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); - PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "FlashActivity"); - wl.acquire(); - wl.release(); - } - - if (conversations.size() == 1 && lastConversation.size() == 1) { - singleMessage(context, lastConversation, threadId, builder, conversationPrefs, privateNotifications); - } else if (conversations.size() == 1) { - singleSender(context, lastConversation, threadId, builder, conversationPrefs, privateNotifications); - } else { - multipleSenders(context, conversations, oldThreads, builder); - } - } - }); - } - } - - /** - * Updates the notifications silently. This is called when a conversation is marked read or something like that, - * where we need to update the notifications without alerting the user - */ - public static void update(final Context context) { - sHandler.post(new Runnable() { - @Override - public void run() { - HashMap<Long, ArrayList<MessageItem>> conversations = SmsHelper.getUnreadUnseenConversations(context); - - // Let's find the list of current notifications. If we're showing multiple notifications, now we know - // which ones don't need to be touched - Set<Long> oldThreads = new HashSet<>(); - for (String s : sPrefs.getStringSet(PREV_NOTIFICATIONS, new HashSet<String>())) { - long l = Long.parseLong(s); - if (!oldThreads.contains(l)) { - oldThreads.add(l); - } - } - - dismissOld(context, conversations); - - // If there are no messages, don't try to create a notification - // If this app is not default message app, don't try to create a notification either - if (conversations.size() == 0 || !new DefaultSmsHelper(context, 0).isDefault()) { - return; - } - - ArrayList<MessageItem> lastConversation = conversations.get(conversations.keySet().toArray()[0]); - MessageItem lastMessage = lastConversation.get(0); - - // If the message is visible (i.e. it is currently showing in the Main Activity), - // don't show a notification; just mark it as read and return. - Message message = new Message(context, lastMessage.mMsgId); - if (MessageListActivity.isInForeground && message.getThreadId() == MessageListActivity.getThreadId()) { - message.markRead(); - return; - } - - long threadId = (long) conversations.keySet().toArray()[0]; - ConversationPrefsHelper conversationPrefs = new ConversationPrefsHelper(context, threadId); - - NotificationCompat.Builder builder = - new NotificationCompat.Builder(context) - .setSmallIcon(R.drawable.ic_notification) - // SMS messages are high priority - .setPriority(getNotificationPriority(context)) - // Silent here because this is just an update, not a new - // notification - .setSound(null) - .setVibrate(VIBRATION_SILENT) - .setAutoCancel(true); - - if (conversationPrefs.getNotificationLedEnabled()) { - builder.setLights(getLedColor(conversationPrefs), 1000, 1000); - } - - Integer privateNotifications = conversationPrefs.getPrivateNotificationsSetting(); - - if (conversations.size() == 1 && lastConversation.size() == 1) { - singleMessage(context, lastConversation, threadId, builder, conversationPrefs, privateNotifications); - } else if (conversations.size() == 1) { - singleSender(context, lastConversation, threadId, builder, conversationPrefs, privateNotifications); - } else { - multipleSenders(context, conversations, oldThreads, builder); - } - } - }); - } - - /** - * Creates a notification to tell the user about failed messages. This is currently pretty shitty and needs to be - * improved, by adding functionality such as the ability to delete all of the failed messages - */ - public static void notifyFailed(final Context context) { - sHandler.post(new Runnable() { - public void run() { - Cursor failedCursor = context.getContentResolver().query( - SmsHelper.SMS_CONTENT_PROVIDER, - new String[]{SmsHelper.COLUMN_THREAD_ID}, - SmsHelper.FAILED_SELECTION, - null, null - ); - - // Dismiss the notification if the failed cursor doesn't have any items in it. - if (failedCursor == null || !failedCursor.moveToFirst() || failedCursor.getCount() <= 0) { - dismiss(context, NOTIFICATION_ID_FAILED); - return; - } - - String title; - PendingIntent PI; - if (failedCursor.getCount() == 1) { - title = sRes.getString(R.string.failed_message); - Intent intent = new Intent(context, MainActivity.class); - intent.putExtra(MessageListActivity.ARG_THREAD_ID, failedCursor.getLong(0)); - PI = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); - } else { - title = failedCursor.getCount() + " " + sRes.getString(R.string.failed_messages); - Intent intent = new Intent(context, MainActivity.class); - PI = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); - } - - - NotificationCompat.InboxStyle inboxStyle = new NotificationCompat.InboxStyle(); - - for (Message message : SmsHelper.getFailedMessages(context)) { - switch (Integer.parseInt(sPrefs.getString(SettingsFragment.PRIVATE_NOTIFICATION, "0"))) { - case 0: - inboxStyle.addLine(Html.fromHtml("<strong>" + message.getName() + "</strong> " + message.getBody())); - break; - case 1: - inboxStyle.addLine(Html.fromHtml("<strong>" + message.getName() + "</strong> " + sRes.getString(R.string.new_message))); - break; - case 2: - inboxStyle.addLine(Html.fromHtml("<strong>" + "QKSMS" + "</strong> " + sRes.getString(R.string.new_message))); - break; - } - } - - NotificationCompat.Builder builder = new NotificationCompat.Builder(context) - .setSmallIcon(R.drawable.ic_notification_failed) - .setPriority(NotificationCompat.PRIORITY_HIGH) - .setSound(Uri.parse(sPrefs.getString(SettingsFragment.NOTIFICATION_TONE, DEFAULT_RINGTONE))) - .setVibrate(VIBRATION_SILENT) - .setAutoCancel(true) - .setContentTitle(title) - .setStyle(inboxStyle) - .setContentText(sRes.getString(R.string.failed_messages_summary)) - .setContentIntent(PI) - .setNumber(failedCursor.getCount()) - .setColor(ThemeManager.getThemeColor()); - - if (sPrefs.getBoolean(SettingsFragment.NOTIFICATION_VIBRATE, false)) { - builder.setVibrate(VIBRATION); - } - - if (sPrefs.getBoolean(SettingsFragment.NOTIFICATION_LED, true)) { - builder.setLights(getLedColor(new ConversationPrefsHelper(context, 0)), 1000, 1000); - } - - if (sPrefs.getBoolean(SettingsFragment.NOTIFICATION_TICKER, false)) { - builder.setTicker(title); - } - - NotificationManager.notify(context, NOTIFICATION_ID_FAILED, builder.build()); - } - }); - } - - - /** - * Notifies the user of the given notification. - */ - public static void notify(Context context, int id, android.app.Notification notification) { - ((android.app.NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE)) - .notify(id, notification); - } - - /** - * Cancels the notification for the given ID. - */ - public static void dismiss(Context context, int id) { - // Cancel the notification for this ID. - ((android.app.NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE)) - .cancel(id); - } - - /** - * Dismisses all old notifications. The purpose of this is to clear notifications that don't need to show up, - * without making the remaining ones dissapear and pop up again like how NotificationMangager.cancelAll and then - * rebuilding them would do - * <p> - * This should stay private, because it assumes that the preferences have already been initialized - */ - private static void dismissOld(Context context, HashMap<Long, ArrayList<MessageItem>> newMessages) { - // Let's find the list of current notifications - Set<Long> oldThreads = new HashSet<>(); - for (String s : sPrefs.getStringSet(PREV_NOTIFICATIONS, new HashSet<String>())) { - long l = Long.parseLong(s); - if (!oldThreads.contains(l)) { - oldThreads.add(l); - } - } - - // Now we need a comparable list of thread ids for the new messages - Set<Long> newThreads = newMessages.keySet(); - - Log.d(TAG, "Old threads: " + Arrays.toString(oldThreads.toArray())); - Log.d(TAG, "New threads: " + Arrays.toString(newThreads.toArray())); - - // For all of the notifications that exist and are not to be still shown, let's dismiss them - for (long threadId : oldThreads) { - if (!newThreads.contains(threadId)) { - dismiss(context, (int) threadId); - } - } - - // Now let's convert the new list into a set of strings so we can save them to prefs - Set<String> newThreadStrings = new HashSet<>(); - for (long threadId : newThreads) { - newThreadStrings.add(Long.toString(threadId)); - } - - sPrefs.edit().putStringSet(PREV_NOTIFICATIONS, newThreadStrings).apply(); - } - - /** - * Displays a notification for a single message - */ - private static void singleMessage(final Context context, final ArrayList<MessageItem> messages, final long threadId, - final NotificationCompat.Builder builder, final ConversationPrefsHelper conversationPrefs, - final Integer privateNotifications) { - - MessageItem message = messages.get(0); - - if (message.isMms()) { - Log.d(TAG, "Message is MMS"); - if (message.mSlideshow != null) { - Log.d(TAG, "Woah! Slideshow not null"); - buildSingleMessageNotification(context, messages, threadId, builder, conversationPrefs, privateNotifications); - } else { - Log.d(TAG, "Listening for PDU"); - message.setOnPduLoaded(new MessageItem.PduLoadedCallback() { - @Override - public void onPduLoaded(MessageItem messageItem) { - Log.d(TAG, "PDU Loaded"); - buildSingleMessageNotification(context, messages, threadId, builder, conversationPrefs, privateNotifications); - } - }); - } - } else { - buildSingleMessageNotification(context, messages, threadId, builder, conversationPrefs, privateNotifications); - } - } - - - /** - * Builds the actual notification for the single message. This code can be called at different points in execution - * depending on whether or not the MMS data has been downloaded - */ - private static void buildSingleMessageNotification(final Context context, ArrayList<MessageItem> messages, long threadId, - final NotificationCompat.Builder builder, ConversationPrefsHelper conversationPrefs, - final Integer privateNotifications) { - - MessageItem message = messages.get(0); - - Intent threadIntent = new Intent(context, MainActivity.class); - threadIntent.putExtra(MessageListActivity.ARG_THREAD_ID, threadId); - final PendingIntent threadPI = PendingIntent.getActivity(context, buildRequestCode(threadId, 1), threadIntent, PendingIntent.FLAG_UPDATE_CURRENT); - - Intent readIntent = new Intent(ACTION_MARK_READ); - readIntent.putExtra("thread_id", threadId); - final PendingIntent readPI = PendingIntent.getBroadcast(context, buildRequestCode(threadId, 2), readIntent, PendingIntent.FLAG_UPDATE_CURRENT); - - Intent seenIntent = new Intent(ACTION_MARK_SEEN); - final PendingIntent seenPI = PendingIntent.getBroadcast(context, buildRequestCode(threadId, 4), seenIntent, PendingIntent.FLAG_UPDATE_CURRENT); - - int unreadMessageCount = SmsHelper.getUnreadMessageCount(context); - String body; - String title; - NotificationCompat.Style nstyle = null; - switch (privateNotifications) { - case 0: //Hide nothing - body = message.mBody; - title = message.mContact; - nstyle = new NotificationCompat.BigTextStyle().bigText(message.mBody); - break; - case 1: //Hide message - body = sRes.getString(R.string.new_message); - title = message.mContact; - break; - case 2: //Hide sender & message - body = sRes.getString(R.string.new_message); - title = "QKSMS"; - break; - default: - body = message.mBody; - title = message.mContact; - nstyle = null; - } - - builder.setContentTitle(title) - .setContentText(body) - .setLargeIcon(getLargeIcon(context, Contact.get(message.mAddress, false), privateNotifications)) - .setContentIntent(threadPI) - .setNumber(unreadMessageCount) - .setStyle(nstyle) - .setColor(ThemeManager.getColor()) - .addAction(R.drawable.ic_accept, sRes.getString(R.string.read), readPI) - .extend(RemoteMessagingReceiver.getConversationExtender(context, message.mContact, message.mAddress, threadId)) - .setDeleteIntent(seenPI); - - if (Build.VERSION.SDK_INT < 24) { - Intent replyIntent = new Intent(context, QKReplyActivity.class); - replyIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - replyIntent.putExtra(QKReplyActivity.EXTRA_THREAD_ID, threadId); - replyIntent.putExtra(QKReplyActivity.EXTRA_SHOW_KEYBOARD, true); - PendingIntent replyPI = PendingIntent.getActivity(context, buildRequestCode(threadId, 0), replyIntent, PendingIntent.FLAG_UPDATE_CURRENT); - builder.addAction(R.drawable.ic_reply, sRes.getString(R.string.reply), replyPI); - } else { - builder.addAction(RemoteMessagingReceiver.getReplyAction(context, message.mAddress, threadId)); - } - - if (conversationPrefs.getDimissedReadEnabled()) { - builder.setDeleteIntent(readPI); - } - - if (conversationPrefs.getCallButtonEnabled()) { - Intent callIntent = new Intent(Intent.ACTION_CALL); - callIntent.setData(Uri.parse("tel:" + message.mAddress)); - PendingIntent callPI = PendingIntent.getActivity(context, buildRequestCode(threadId, 3), callIntent, PendingIntent.FLAG_UPDATE_CURRENT); - builder.addAction(R.drawable.ic_call, sRes.getString(R.string.call), callPI); - } - - if (message.isMms()) { - Log.d(TAG, "Message is MMS"); - - SlideshowModel model = message.mSlideshow; - - if (model != null && model.isSimple() && model.get(0).getImage() != null) { - Log.d(TAG, "MMS type: image"); - ImageModel imageModel = model.get(0).getImage(); - Bitmap image = imageModel.getBitmap(imageModel.getWidth(), imageModel.getHeight()); - NotificationCompat.BigPictureStyle style = new NotificationCompat.BigPictureStyle() - .setBigContentTitle(message.mContact) - .setSummaryText(message.mBody) - .bigLargeIcon(getLargeIcon(context, Contact.get(message.mAddress, false), privateNotifications)) - .bigPicture(image); - if (privateNotifications == 0) builder.setStyle(style); - else builder.setStyle(null); - - } else { - Log.d(TAG, "MMS Type: not an image lol"); - if (privateNotifications == 0) - builder.setStyle(new NotificationCompat.BigTextStyle().bigText(message.mBody)); - else builder.setStyle(null); - } - - } - - NotificationManager.notify(context, (int) threadId, builder.build()); - } - - /** - * Creates a notification that contains several messages that are all part of the same conversation - */ - private static void singleSender(final Context context, ArrayList<MessageItem> messages, long threadId, - final NotificationCompat.Builder builder, ConversationPrefsHelper conversationPrefs, - final Integer privateNotifications) { - - MessageItem message = messages.get(0); - - Intent threadIntent = new Intent(context, MainActivity.class); - threadIntent.putExtra(MessageListActivity.ARG_THREAD_ID, threadId); - PendingIntent threadPI = PendingIntent.getActivity(context, buildRequestCode(threadId, 1), threadIntent, PendingIntent.FLAG_UPDATE_CURRENT); - - Intent readIntent = new Intent(ACTION_MARK_READ); - readIntent.putExtra("thread_id", threadId); - PendingIntent readPI = PendingIntent.getBroadcast(context, buildRequestCode(threadId, 2), readIntent, PendingIntent.FLAG_UPDATE_CURRENT); - - Intent seenIntent = new Intent(ACTION_MARK_SEEN); - PendingIntent seenPI = PendingIntent.getBroadcast(context, buildRequestCode(threadId, 4), seenIntent, PendingIntent.FLAG_UPDATE_CURRENT); - - NotificationCompat.InboxStyle inboxStyle = new NotificationCompat.InboxStyle(); - for (MessageItem message1 : messages) { - inboxStyle.addLine(message1.mBody); - } - - String notificationTitle = message.mContact; - - if (!(privateNotifications == 0)) inboxStyle = null; - if (privateNotifications == 2) notificationTitle = "QKSMS"; - - int unreadMessageCount = SmsHelper.getUnreadMessageCount(context); - builder.setContentTitle(notificationTitle) - .setContentText(SmsHelper.getUnseenSMSCount(context, threadId) + " " + sRes.getString(R.string.new_messages)) - .setLargeIcon(getLargeIcon(context, Contact.get(message.mAddress, false), privateNotifications)) - .setContentIntent(threadPI) - .setNumber(unreadMessageCount) - .setStyle(inboxStyle) - .setColor(ThemeManager.getColor()) - .addAction(R.drawable.ic_accept, sRes.getString(R.string.read), readPI) - .extend(RemoteMessagingReceiver.getConversationExtender(context, message.mContact, message.mAddress, threadId)) - .setDeleteIntent(seenPI); - - if (Build.VERSION.SDK_INT < 24) { - Intent replyIntent = new Intent(context, QKReplyActivity.class); - replyIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - replyIntent.putExtra(QKReplyActivity.EXTRA_THREAD_ID, threadId); - replyIntent.putExtra(QKReplyActivity.EXTRA_SHOW_KEYBOARD, true); - PendingIntent replyPI = PendingIntent.getActivity(context, buildRequestCode(threadId, 0), replyIntent, PendingIntent.FLAG_UPDATE_CURRENT); - builder.addAction(R.drawable.ic_reply, sRes.getString(R.string.reply), replyPI); - } else { - builder.addAction(RemoteMessagingReceiver.getReplyAction(context, message.mAddress, threadId)); - } - - if (conversationPrefs.getCallButtonEnabled()) { - Intent callIntent = new Intent(Intent.ACTION_CALL); - callIntent.setData(Uri.parse("tel:" + message.mAddress)); - PendingIntent callPI = PendingIntent.getActivity(context, buildRequestCode(threadId, 3), callIntent, PendingIntent.FLAG_UPDATE_CURRENT); - builder.addAction(R.drawable.ic_call, sRes.getString(R.string.call), callPI); - } - - notify(context, (int) threadId, builder.build()); - } - - /** - * Creates a unique action ID for notification actions (Open, Mark read, Call, etc) - */ - private static int buildRequestCode(long threadId, int action) { - action++; // Fixes issue on some 4.3 phones | http://stackoverflow.com/questions/19031861/pendingintent-not-opening-activity-in-android-4-3 - return (int) (action * 100000 + threadId); - } - - /** - * Create notifications for multiple conversations - */ - private static void multipleSenders(Context context, HashMap<Long, ArrayList<MessageItem>> conversations, Set<Long> oldThreads, NotificationCompat.Builder builder) { - Set<Long> threadIds = conversations.keySet(); - for (long threadId : threadIds) { - if (!oldThreads.contains(threadId)) { - ConversationPrefsHelper conversationPrefs = new ConversationPrefsHelper(context, threadId); - Integer privateNotification = conversationPrefs.getPrivateNotificationsSetting(); - if (conversations.get(threadId).size() == 1) { - singleMessage(context, conversations.get(threadId), threadId, copyBuilder(builder), conversationPrefs, privateNotification); - } else { - singleSender(context, conversations.get(threadId), threadId, copyBuilder(builder), conversationPrefs, privateNotification); - } - } - } - } - - /** - * Creates a clone of the NotificationCompat.Builder to be used when we're displaying multiple notifications, - * and need multiple instances of the builder - */ - private static NotificationCompat.Builder copyBuilder(NotificationCompat.Builder builder) { - return new NotificationCompat.Builder(builder.mContext) - .setSmallIcon(builder.mNotification.icon) - .setPriority(builder.mNotification.priority) - .setSound(builder.mNotification.sound) - .setVibrate(builder.mNotification.vibrate) - .setLights(builder.mNotification.ledARGB, builder.mNotification.ledOnMS, builder.mNotification.ledOffMS) - .setTicker(builder.mNotification.tickerText) - .setAutoCancel(true); - } - - /** - * Set up the QK Compose notification - * - * @param override If true, then show the QK Compose notification regardless of the user's preference - * @param overrideCancel If true, dismiss the notification no matter what - */ - public static void initQuickCompose(Context context, boolean override, boolean overrideCancel) { - - if (sPrefs == null) { - init(context); - } - - if (sPrefs.getBoolean(SettingsFragment.QUICKCOMPOSE, false) || override) { - Intent composeIntent = new Intent(context, QKComposeActivity.class); - PendingIntent composePI = PendingIntent.getActivity(context, 9, composeIntent, PendingIntent.FLAG_UPDATE_CURRENT); - - NotificationCompat.Builder builder = new NotificationCompat.Builder(context) - .setContentTitle(sRes.getString(R.string.quickcompose)) - .setContentText(sRes.getString(R.string.quickcompose_detail)) - .setOngoing(true) - .setContentIntent(composePI) - .setSmallIcon(R.drawable.ic_compose) - .setPriority(NotificationCompat.PRIORITY_MIN) - .setColor(ThemeManager.getColor()); - - NotificationManager.notify(context, NOTIFICATION_ID_QUICKCOMPOSE, builder.build()); - } else { - dismiss(context, NOTIFICATION_ID_QUICKCOMPOSE); - } - - if (overrideCancel) { - dismiss(context, NOTIFICATION_ID_QUICKCOMPOSE); - } - } - - private static int getLedColor(ConversationPrefsHelper conversationPrefs) { - int color = Integer.parseInt(conversationPrefs.getNotificationLedColor()); - - if (color == sRes.getColor(R.color.blue_light) || color == sRes.getColor(R.color.blue_dark)) - return sRes.getColor(R.color.blue_dark); - if (color == sRes.getColor(R.color.purple_light) || color == sRes.getColor(R.color.purple_dark)) - return sRes.getColor(R.color.purple_dark); - if (color == sRes.getColor(R.color.green_light) || color == sRes.getColor(R.color.green_dark)) - return sRes.getColor(R.color.green_dark); - if (color == sRes.getColor(R.color.yellow_light) || color == sRes.getColor(R.color.yellow_dark)) - return sRes.getColor(R.color.yellow_dark); - if (color == sRes.getColor(R.color.red_light) || color == sRes.getColor(R.color.red_dark)) - return sRes.getColor(R.color.red_dark); - - return sRes.getColor(R.color.white_pure); - } - - /** - * Retreives the avatar to be used for the notification's large icon. If the user is running Lollipop, then let's - * crop their avatar to a circle - */ - private static Bitmap getLargeIcon(Context context, Contact contact, Integer privateNotification) { - Drawable avatarDrawable = contact.getAvatar(context, new BitmapDrawable(sRes, ContactHelper.blankContact(context, contact.getName()))); - int idealIconWidth = sRes.getDimensionPixelSize(android.R.dimen.notification_large_icon_width); - int idealIconHeight = sRes.getDimensionPixelSize(android.R.dimen.notification_large_icon_height); - - Bitmap bitmap = Bitmap.createScaledBitmap(((BitmapDrawable) avatarDrawable).getBitmap(), idealIconWidth, idealIconHeight, true); - - if (privateNotification == 2) { - return null; - } else { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - return ImageUtils.getCircleBitmap(bitmap, idealIconWidth); - } else { - return bitmap; - } - } - } - - /** - * Returns the notification priority we should be using based on whether or not the Heads-up notification should - * show - */ - private static int getNotificationPriority(Context context) { - boolean qkreplyEnabled = PreferenceManager.getDefaultSharedPreferences(context) - .getBoolean(SettingsFragment.QUICKREPLY, Build.VERSION.SDK_INT < 24); - if (qkreplyEnabled) { - return NotificationCompat.PRIORITY_DEFAULT; - } else { - return NotificationCompat.PRIORITY_HIGH; - } - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/transaction/SmsHelper.java b/QKSMS/src/main/java/com/moez/QKSMS/transaction/SmsHelper.java deleted file mode 100644 index d721fd4d1..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/transaction/SmsHelper.java +++ /dev/null @@ -1,887 +0,0 @@ -package com.moez.QKSMS.transaction; - -import android.content.ContentResolver; -import android.content.ContentValues; -import android.content.Context; -import android.content.SharedPreferences; -import android.database.Cursor; -import android.net.Uri; -import android.preference.PreferenceManager; -import android.provider.Telephony; -import android.provider.Telephony.Sms; -import android.telephony.SmsManager; -import android.text.TextUtils; -import android.util.Log; -import android.util.Patterns; -import com.google.android.mms.MmsException; -import com.google.android.mms.pdu_alt.CharacterSets; -import com.google.android.mms.pdu_alt.EncodedStringValue; -import com.google.android.mms.pdu_alt.MultimediaMessagePdu; -import com.google.android.mms.pdu_alt.PduPersister; -import com.moez.QKSMS.MmsConfig; -import com.moez.QKSMS.R; -import com.moez.QKSMS.data.Conversation; -import com.moez.QKSMS.data.Message; -import com.moez.QKSMS.mmssms.Settings; -import com.moez.QKSMS.model.SlideModel; -import com.moez.QKSMS.model.SlideshowModel; -import com.moez.QKSMS.ui.messagelist.MessageColumns; -import com.moez.QKSMS.ui.messagelist.MessageItem; -import com.moez.QKSMS.ui.settings.SettingsFragment; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -public class SmsHelper { - - public static final Uri SMS_CONTENT_PROVIDER = Uri.parse("content://sms/"); - public static final Uri MMS_CONTENT_PROVIDER = Uri.parse("content://mms/"); - public static final Uri MMS_SMS_CONTENT_PROVIDER = Uri.parse("content://mms-sms/conversations/"); - public static final Uri SENT_MESSAGE_CONTENT_PROVIDER = Uri.parse("content://sms/sent"); - public static final Uri DRAFTS_CONTENT_PROVIDER = Uri.parse("content://sms/draft"); - public static final Uri PENDING_MESSAGE_CONTENT_PROVIDER = Uri.parse("content://sms/outbox"); - public static final Uri RECEIVED_MESSAGE_CONTENT_PROVIDER = Uri.parse("content://sms/inbox"); - public static final Uri CONVERSATIONS_CONTENT_PROVIDER = Uri.parse("content://mms-sms/conversations?simple=true"); - public static final Uri ADDRESSES_CONTENT_PROVIDER = Uri.parse("content://mms-sms/canonical-addresses"); - - public static final String MAX_MMS_ATTACHMENT_SIZE_UNLIMITED = "unlimited"; - public static final String MAX_MMS_ATTACHMENT_SIZE_300KB = "300kb"; - public static final String MAX_MMS_ATTACHMENT_SIZE_600KB = "600kb"; - public static final String MAX_MMS_ATTACHMENT_SIZE_1MB = "1mb"; - - public static final String sortDateDesc = "date DESC"; - public static final String sortDateAsc = "date ASC"; - - public static final byte UNREAD = 0; - public static final byte READ = 1; - - // Attachment types - public static final int TEXT = 0; - public static final int IMAGE = 1; - public static final int VIDEO = 2; - public static final int AUDIO = 3; - public static final int SLIDESHOW = 4; - - // Columns for SMS content providers - public static final String COLUMN_ID = "_id"; - public static final String COLUMN_THREAD_ID = "thread_id"; - public static final String COLUMN_ADDRESS = "address"; - public static final String COLUMN_RECIPIENT = "recipient_ids"; - public static final String COLUMN_PERSON = "person"; - public static final String COLUMN_SNIPPET = "snippet"; - public static final String COLUMN_DATE = "date"; - public static final String COLUMN_DATE_NORMALIZED = "normalized_date"; - public static final String COLUMN_DATE_SENT = "date_sent"; - public static final String COLUMN_STATUS = "status"; - public static final String COLUMN_ERROR = "error"; - public static final String COLUMN_READ = "read"; - public static final String COLUMN_TYPE = "type"; - public static final String COLUMN_MMS = "ct_t"; - public static final String COLUMN_TEXT = "text"; - public static final String COLUMN_SUB = "sub"; - public static final String COLUMN_MSG_BOX = "msg_box"; - public static final String COLUMN_SUBJECT = "subject"; - public static final String COLUMN_BODY = "body"; - public static final String COLUMN_SEEN = "seen"; - - public static final String READ_SELECTION = COLUMN_READ + " = " + READ; - public static final String UNREAD_SELECTION = COLUMN_READ + " = " + UNREAD; - public static final String UNSEEN_SELECTION = COLUMN_SEEN + " = " + UNREAD; - public static final String FAILED_SELECTION = COLUMN_TYPE + " = " + Message.FAILED; - - public static final int ADDRESSES_ADDRESS = 1; - - private static final String TAG = "SMSHelper"; - private static SmsManager sms; - - private static Settings sendSettings; - - public SmsHelper() { - - } - - /** - * The quality parameter which is used to compress JPEG images. - */ - public static final int IMAGE_COMPRESSION_QUALITY = 95; - /** - * The minimum quality parameter which is used to compress JPEG images. - */ - public static final int MINIMUM_IMAGE_COMPRESSION_QUALITY = 50; - - /** - * Message type: all messages. - */ - public static final int MESSAGE_TYPE_ALL = 0; - - /** - * Message type: inbox. - */ - public static final int MESSAGE_TYPE_INBOX = 1; - - /** - * Message type: sent messages. - */ - public static final int MESSAGE_TYPE_SENT = 2; - - /** - * Message type: drafts. - */ - public static final int MESSAGE_TYPE_DRAFT = 3; - - /** - * Message type: outbox. - */ - public static final int MESSAGE_TYPE_OUTBOX = 4; - - /** - * Message type: failed outgoing message. - */ - public static final int MESSAGE_TYPE_FAILED = 5; - - /** - * Message type: queued to send later. - */ - public static final int MESSAGE_TYPE_QUEUED = 6; - - /** - * MMS address parsing data structures - */ - // allowable phone number separators - private static final char[] NUMERIC_CHARS_SUGAR = { - '-', '.', ',', '(', ')', ' ', '/', '\\', '*', '#', '+' - }; - - private static String[] sNoSubjectStrings; - - public static void markSmsSeen(Context context) { - Cursor cursor = context.getContentResolver().query(RECEIVED_MESSAGE_CONTENT_PROVIDER, - new String[]{SmsHelper.COLUMN_ID}, SmsHelper.UNSEEN_SELECTION + " AND " + SmsHelper.UNREAD_SELECTION, null, null); - - if (cursor == null) { - Log.i(TAG, "No unseen messages"); - return; - } - - MessageColumns.ColumnsMap map = new MessageColumns.ColumnsMap(cursor); - - if (cursor.moveToFirst()) { - ContentValues cv = new ContentValues(); - cv.put("seen", true); - - do { - context.getContentResolver().update(Uri.parse("content://sms/" + cursor.getLong(map.mColumnMsgId)), cv, null, null); - } while (cursor.moveToNext()); - } - - cursor.close(); - } - - public static void markMmsSeen(Context context) { - Cursor cursor = context.getContentResolver().query(MMS_CONTENT_PROVIDER, - new String[]{SmsHelper.COLUMN_ID}, SmsHelper.UNSEEN_SELECTION + " AND " + SmsHelper.UNREAD_SELECTION, null, null); - - if (cursor == null) { - Log.i(TAG, "No unseen messages"); - return; - } - - MessageColumns.ColumnsMap map = new MessageColumns.ColumnsMap(cursor); - - if (cursor.moveToFirst()) { - ContentValues cv = new ContentValues(); - cv.put("seen", true); - - do { - context.getContentResolver().update(Uri.parse("content://mms/" + cursor.getLong(map.mColumnMsgId)), cv, null, null); - } while (cursor.moveToNext()); - } - - cursor.close(); - } - - public static Settings getSendSettings(Context context) { - if (sendSettings == null) { - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); - - sendSettings = new Settings(); - sendSettings.setMmsc(prefs.getString(SettingsFragment.MMSC_URL, "")); - sendSettings.setProxy(prefs.getString(SettingsFragment.MMS_PROXY, "")); - sendSettings.setPort(prefs.getString(SettingsFragment.MMS_PORT, "")); - sendSettings.setAgent(prefs.getString("mms_agent", "")); - sendSettings.setUserProfileUrl(prefs.getString("mms_user_agent_profile_url", "")); - sendSettings.setUaProfTagName(prefs.getString("mms_user_agent_tag_name", "")); - sendSettings.setGroup(prefs.getBoolean(SettingsFragment.COMPOSE_GROUP, true)); - setMaxAttachmentSizeSetting(context, prefs.getString(SettingsFragment.MAX_MMS_ATTACHMENT_SIZE, "300kb")); - sendSettings.setDeliveryReports(prefs.getBoolean(SettingsFragment.DELIVERY_REPORTS, false)); - sendSettings.setSplit(prefs.getBoolean(SettingsFragment.SPLIT_SMS, false)); - sendSettings.setSplitCounter(prefs.getBoolean(SettingsFragment.SPLIT_COUNTER, true)); - sendSettings.setStripUnicode(prefs.getBoolean(SettingsFragment.STRIP_UNICODE, false)); - sendSettings.setSignature(prefs.getString("pref_key_signature", "")); - sendSettings.setSendLongAsMms(prefs.getBoolean(SettingsFragment.LONG_AS_MMS, false)); - sendSettings.setSendLongAsMmsAfter(Integer.parseInt(prefs.getString(SettingsFragment.LONG_AS_MMS_AFTER, "3"))); - sendSettings.setAccount(null); - sendSettings.setRnrSe(null); - } - return sendSettings; - } - - /** - * Sets the max MMS attachment size in the MMS settings field. - * - * @param context - * @param maxAttachmentSize The String value in the ListPreference for max attachment sizes - */ - public static void setMaxAttachmentSizeSetting(Context context, String maxAttachmentSize) { - - // Initialize sendSettings if it hasn't already been initialized - sendSettings = getSendSettings(context); - - if (MAX_MMS_ATTACHMENT_SIZE_300KB.equals(maxAttachmentSize)) { - sendSettings.setMaxAttachmentSize(Settings.MAX_ATTACHMENT_SIZE_300KB); - } else if (MAX_MMS_ATTACHMENT_SIZE_600KB.equals(maxAttachmentSize)) { - sendSettings.setMaxAttachmentSize(Settings.MAX_ATTACHMENT_SIZE_600KB); - } else if (MAX_MMS_ATTACHMENT_SIZE_1MB.equals(maxAttachmentSize)) { - sendSettings.setMaxAttachmentSize(Settings.MAX_ATTACHMENT_SIZE_1MB); - } else if (MAX_MMS_ATTACHMENT_SIZE_UNLIMITED.equals(maxAttachmentSize)) { - sendSettings.setMaxAttachmentSize(Settings.MAX_ATTACHMENT_SIZE_UNLIMITED); - } - } - - /** - * Add incoming SMS to inbox - * - * @param context - * @param address Address of sender - * @param body Body of incoming SMS message - * @param time Time that incoming SMS message was sent at - */ - public static Uri addMessageToInbox(Context context, String address, String body, long time) { - - ContentResolver contentResolver = context.getContentResolver(); - ContentValues cv = new ContentValues(); - - cv.put("address", address); - cv.put("body", body); - cv.put("date_sent", time); - - return contentResolver.insert(RECEIVED_MESSAGE_CONTENT_PROVIDER, cv); - } - - /** - * Returns true iff the folder (message type) identifies an - * outgoing message. - * - * @hide - */ - public static boolean isOutgoingFolder(int messageType) { - return (messageType == MESSAGE_TYPE_FAILED) - || (messageType == MESSAGE_TYPE_OUTBOX) - || (messageType == MESSAGE_TYPE_SENT) - || (messageType == MESSAGE_TYPE_QUEUED); - } - - public static int getUnseenSMSCount(Context context, long threadId) { - Cursor cursor = null; - int count = 0; - String selection = UNSEEN_SELECTION + " AND " + UNREAD_SELECTION + (threadId == 0 ? "" : " AND " + COLUMN_THREAD_ID + " = " + threadId); - - try { - cursor = context.getContentResolver().query(RECEIVED_MESSAGE_CONTENT_PROVIDER, new String[]{COLUMN_ID}, selection, null, null); - cursor.moveToFirst(); - count = cursor.getCount(); - } catch (Exception e) { - e.printStackTrace(); - } finally { - if (cursor != null) { - cursor.close(); - } - } - - return count; - } - - /** - * Returns a string containing the last 10 messages for a given conversation - * This is used to be displayed on the notification page on a wearable, which - * only accepts a single String to be displayed - */ - public static String getHistoryForWearable(Context context, String name, long threadId) { - final String me = context.getString(R.string.me); - Cursor cursor = null; - StringBuilder builder = new StringBuilder(); - MessageColumns.ColumnsMap map = new MessageColumns.ColumnsMap(); - - - try { - cursor = context.getContentResolver().query( - Uri.withAppendedPath(Message.MMS_SMS_CONTENT_PROVIDER, "" + threadId), - MessageColumns.PROJECTION, null, null, "normalized_date DESC LIMIT 10"); - - cursor.moveToLast(); - do { - if (cursor.getString(map.mColumnMsgType).equals("sms")) { - int boxId = cursor.getInt(map.mColumnSmsType); - boolean in = boxId == Telephony.TextBasedSmsColumns.MESSAGE_TYPE_INBOX || - boxId == Telephony.TextBasedSmsColumns.MESSAGE_TYPE_ALL; - - builder.append(in ? name : me) - .append("\n") - .append(cursor.getString(map.mColumnSmsBody)) - .append("\n\n"); - } - } while (cursor.moveToPrevious()); - } catch (Exception e) { - e.printStackTrace(); - } finally { - if (cursor != null) { - cursor.close(); - } - } - - return builder.toString(); - } - - /** - * List of messages grouped by thread id, used for showing notifications - */ - public static HashMap<Long, ArrayList<MessageItem>> getUnreadUnseenConversations(Context context) { - HashMap<Long, ArrayList<MessageItem>> result = new HashMap<>(); - - String selection = SmsHelper.UNSEEN_SELECTION + " AND " + SmsHelper.UNREAD_SELECTION; - - // Create a cursor for the conversation list - Cursor conversationCursor = context.getContentResolver().query( - SmsHelper.CONVERSATIONS_CONTENT_PROVIDER, Conversation.ALL_THREADS_PROJECTION, - SmsHelper.UNREAD_SELECTION, null, SmsHelper.sortDateAsc); - - if (conversationCursor != null && conversationCursor.moveToFirst()) { - do { - ArrayList<MessageItem> messages = new ArrayList<>(); - long threadId = conversationCursor.getLong(Conversation.ID); - Uri threadUri = Uri.withAppendedPath(Message.MMS_SMS_CONTENT_PROVIDER, Long.toString(threadId)); - Cursor messageCursor = context.getContentResolver().query(threadUri, MessageColumns.PROJECTION, selection, null, SmsHelper.sortDateAsc); - - if (messageCursor != null && messageCursor.moveToFirst()) { - do { - MessageColumns.ColumnsMap columnsMap = new MessageColumns.ColumnsMap(messageCursor); - MessageItem message = null; - try { - message = new MessageItem(context, messageCursor.getString(columnsMap.mColumnMsgType), messageCursor, columnsMap, null, true); - } catch (MmsException e) { - e.printStackTrace(); - } - messages.add(message); - } while (messageCursor.moveToNext()); - messageCursor.close(); - result.put(threadId, messages); - } - - } while (conversationCursor.moveToNext()); - conversationCursor.close(); - } - - return result; - } - - /** - * @return A list of unread messages to be deleted by QKReply - */ - public static ArrayList<Message> getUnreadMessagesLegacy(Context context, Uri threadUri) { - ArrayList<Message> result = new ArrayList<>(); - - if (threadUri != null) { - Cursor messageCursor = context.getContentResolver().query(threadUri, MessageColumns.PROJECTION, UNREAD_SELECTION, null, SmsHelper.sortDateAsc); - MessageColumns.ColumnsMap columnsMap = new MessageColumns.ColumnsMap(messageCursor); - - if (messageCursor.moveToFirst()) { - do { - try { - Message message = new Message(context, messageCursor.getLong(columnsMap.mColumnMsgId)); - result.add(message); - } catch (Exception e) { - e.printStackTrace(); - } - } while (messageCursor.moveToNext()); - } - - messageCursor.close(); - } - - return result; - } - - public static String getUnreadMessageText(Context context, Uri threadUri) { - StringBuilder builder = new StringBuilder(); - - ArrayList<Message> messages = SmsHelper.getUnreadMessagesLegacy(context, threadUri); - for (int i = 0; i < messages.size(); i++) { - Message message = messages.get(i); - builder.append(message.getBody()); - if (i < messages.size() - 1) { - builder.append("\n\n"); - } - } - - return builder.toString(); - } - - public static long getThreadId(Context context, String address) { - Cursor cursor = null; - long threadId = 0; - - try { - cursor = context.getContentResolver().query(SENT_MESSAGE_CONTENT_PROVIDER, new String[]{COLUMN_THREAD_ID}, COLUMN_ADDRESS + "=" + address, null, sortDateDesc); - cursor.moveToFirst(); - threadId = cursor.getLong(cursor.getColumnIndexOrThrow(COLUMN_THREAD_ID)); - } catch (Exception e) { - e.printStackTrace(); - } finally { - if (cursor != null) { - cursor.close(); - } - } - - return threadId; - } - - public static int getUnreadMessageCount(Context context) { - int result = 0; - - // Create a cursor for the conversation list - Cursor conversationCursor = context.getContentResolver().query( - SmsHelper.CONVERSATIONS_CONTENT_PROVIDER, Conversation.ALL_THREADS_PROJECTION, - SmsHelper.UNREAD_SELECTION, null, SmsHelper.sortDateAsc); - - if (conversationCursor.moveToFirst()) { - do { - Uri threadUri = Uri.withAppendedPath(Message.MMS_SMS_CONTENT_PROVIDER, conversationCursor.getString(Conversation.ID)); - Cursor messageCursor = context.getContentResolver().query(threadUri, MessageColumns.PROJECTION, SmsHelper.UNREAD_SELECTION, null, SmsHelper.sortDateDesc); - if (messageCursor != null) { - result += messageCursor.getCount(); - messageCursor.close(); - } - } while (conversationCursor.moveToNext()); - } - - conversationCursor.close(); - - return result; - } - - public static List<Message> getFailedMessages(Context context) { - Cursor cursor = null; - List<Message> messages = new ArrayList<>(); - - try { - cursor = context.getContentResolver().query(SMS_CONTENT_PROVIDER, new String[]{COLUMN_ID}, FAILED_SELECTION, null, sortDateDesc); - cursor.moveToFirst(); - for (int i = 0; i < cursor.getCount(); i++) { - messages.add(new Message(context, cursor.getLong(cursor.getColumnIndexOrThrow(COLUMN_ID)))); - cursor.moveToNext(); - } - } catch (Exception e) { - e.printStackTrace(); - } finally { - if (cursor != null) { - cursor.close(); - } - } - - return messages; - } - - public static List<Message> deleteFailedMessages(Context context, long threadId) { - Log.d(TAG, "Deleting failed messages"); - Cursor cursor = null; - List<Message> messages = new ArrayList<>(); - - try { - cursor = context.getContentResolver().query(SMS_CONTENT_PROVIDER, new String[]{COLUMN_ID}, FAILED_SELECTION, null, sortDateDesc); - cursor.moveToFirst(); - for (int i = 0; i < cursor.getCount(); i++) { - messages.add(new Message(context, cursor.getLong(cursor.getColumnIndexOrThrow(COLUMN_ID)))); - cursor.moveToNext(); - } - } catch (Exception e) { - e.printStackTrace(); - } finally { - if (cursor != null) { - cursor.close(); - } - } - - for (Message m : messages) { - if (m.getThreadId() == threadId) { - Log.d(TAG, "Deleting failed message to " + m.getName() + "\n Body: " + m.getBody()); - m.delete(); - } - } - return messages; - } - - /** - * Add an SMS to the given URI. - * - * @param resolver the content resolver to use - * @param uri the URI to add the message to - * @param address the address of the sender - * @param body the body of the message - * @param subject the pseudo-subject of the message - * @param date the timestamp for the message - * @param read true if the message has been read, false if not - * @param deliveryReport true if a delivery report was requested, false if not - * @return the URI for the new message - * @hide - */ - public static Uri addMessageToUri(ContentResolver resolver, - Uri uri, String address, String body, String subject, - Long date, boolean read, boolean deliveryReport) { - return addMessageToUri(resolver, uri, address, body, subject, - date, read, deliveryReport, -1L); - } - - /** - * Add an SMS to the given URI with the specified thread ID. - * - * @param resolver the content resolver to use - * @param uri the URI to add the message to - * @param address the address of the sender - * @param body the body of the message - * @param subject the pseudo-subject of the message - * @param date the timestamp for the message - * @param read true if the message has been read, false if not - * @param deliveryReport true if a delivery report was requested, false if not - * @param threadId the thread_id of the message - * @return the URI for the new message - * @hide - */ - public static Uri addMessageToUri(ContentResolver resolver, - Uri uri, String address, String body, String subject, - Long date, boolean read, boolean deliveryReport, long threadId) { - ContentValues values = new ContentValues(7); - - values.put(Sms.ADDRESS, address); - if (date != null) { - values.put(Sms.DATE, date); - } - values.put(Sms.READ, read ? Integer.valueOf(1) : Integer.valueOf(0)); - values.put(Sms.SUBJECT, subject); - values.put(Sms.BODY, body); - if (deliveryReport) { - values.put(Sms.STATUS, Sms.STATUS_PENDING); - } - if (threadId != -1L) { - values.put(Sms.THREAD_ID, threadId); - } - return resolver.insert(uri, values); - } - - public static String extractEncStrFromCursor(Cursor cursor, - int columnRawBytes, int columnCharset) { - String rawBytes = cursor.getString(columnRawBytes); - int charset = cursor.getInt(columnCharset); - - if (TextUtils.isEmpty(rawBytes)) { - return ""; - } else if (charset == CharacterSets.ANY_CHARSET) { - return rawBytes; - } else { - return new EncodedStringValue(charset, PduPersister.getBytes(rawBytes)).getString(); - } - } - - /** - * cleanseMmsSubject will take a subject that's says, "<Subject: no subject>", and return - * a null string. Otherwise it will return the original subject string. - * - * @param context a regular context so the function can grab string resources - * @param subject the raw subject - * @return - */ - public static String cleanseMmsSubject(Context context, String subject) { - if (TextUtils.isEmpty(subject)) { - return subject; - } - if (sNoSubjectStrings == null) { - sNoSubjectStrings = context.getResources().getStringArray(R.array.empty_subject_strings); - } - - final int len = sNoSubjectStrings.length; - for (int i = 0; i < len; i++) { - if (subject.equalsIgnoreCase(sNoSubjectStrings[i])) { - return null; - } - } - return subject; - } - - /** - * Is the specified address an email address? - * - * @param address the input address to test - * @return true if address is an email address; false otherwise. - * @hide - */ - public static boolean isEmailAddress(String address) { - if (TextUtils.isEmpty(address)) { - return false; - } - - String s = extractAddrSpec(address); - Matcher match = Patterns.EMAIL_ADDRESS.matcher(s); - return match.matches(); - } - - /** - * Regex pattern for names and email addresses. - * <ul> - * <li><em>mailbox</em> = {@code name-addr}</li> - * <li><em>name-addr</em> = {@code [display-name] angle-addr}</li> - * <li><em>angle-addr</em> = {@code [CFWS] "<" addr-spec ">" [CFWS]}</li> - * </ul> - * - * @hide - */ - public static final Pattern NAME_ADDR_EMAIL_PATTERN = - Pattern.compile("\\s*(\"[^\"]*\"|[^<>\"]+)\\s*<([^<>]+)>\\s*"); - - /** - * Helper method to extract email address from address string. - * - * @hide - */ - public static String extractAddrSpec(String address) { - Matcher match = NAME_ADDR_EMAIL_PATTERN.matcher(address); - - if (match.matches()) { - return match.group(2); - } - return address; - } - - private static HashMap numericSugarMap = new HashMap(NUMERIC_CHARS_SUGAR.length); - - /** - * Given a phone number, return the string without syntactic sugar, meaning parens, - * spaces, slashes, dots, dashes, etc. If the input string contains non-numeric - * non-punctuation characters, return null. - */ - private static String parsePhoneNumberForMms(String address) { - StringBuilder builder = new StringBuilder(); - int len = address.length(); - - for (int i = 0; i < len; i++) { - char c = address.charAt(i); - - // accept the first '+' in the address - if (c == '+' && builder.length() == 0) { - builder.append(c); - continue; - } - - if (Character.isDigit(c)) { - builder.append(c); - continue; - } - - if (numericSugarMap.get(c) == null) { - return null; - } - } - return builder.toString(); - } - - /** - * parse the input address to be a valid MMS address. - * - if the address is an email address, leave it as is. - * - if the address can be parsed into a valid MMS phone number, return the parsed number. - * - if the address is a compliant alias address, leave it as is. - */ - public static String parseMmsAddress(String address) { - // if it's a valid Email address, use that. - if (isEmailAddress(address)) { - return address; - } - - // if we are able to parse the address to a MMS compliant phone number, take that. - String retVal = parsePhoneNumberForMms(address); - if (retVal != null && retVal.length() != 0) { - return retVal; - } - - // if it's an alias compliant address, use that. - if (isAlias(address)) { - return address; - } - - // it's not a valid MMS address, return null - return null; - } - - // An alias (or commonly called "nickname") is: - // Nickname must begin with a letter. - // Only letters a-z, numbers 0-9, or . are allowed in Nickname field. - public static boolean isAlias(String string) { - if (!MmsConfig.isAliasEnabled()) { - return false; - } - - int len = string == null ? 0 : string.length(); - - if (len < MmsConfig.getAliasMinChars() || len > MmsConfig.getAliasMaxChars()) { - return false; - } - - if (!Character.isLetter(string.charAt(0))) { // Nickname begins with a letter - return false; - } - for (int i = 1; i < len; i++) { - char c = string.charAt(i); - if (!(Character.isLetterOrDigit(c) || c == '.')) { - return false; - } - } - - return true; - } - - public static int getAttachmentType(SlideshowModel model, MultimediaMessagePdu mmp) { - if (model == null || mmp == null) { - return MessageItem.ATTACHMENT_TYPE_NOT_LOADED; - } - - int numberOfSlides = model.size(); - if (numberOfSlides > 1) { - return SLIDESHOW; - } else if (numberOfSlides == 1) { - // Only one slide in the slide-show. - SlideModel slide = model.get(0); - if (slide.hasVideo()) { - return VIDEO; - } - - if (slide.hasAudio() && slide.hasImage()) { - return SLIDESHOW; - } - - if (slide.hasAudio()) { - return AUDIO; - } - - if (slide.hasImage()) { - return IMAGE; - } - - if (slide.hasText()) { - return TEXT; - } - - // Handle the multimedia message only has subject - String subject = mmp.getSubject() != null ? mmp.getSubject().getString() : null; - if (!TextUtils.isEmpty(subject)) { - return TEXT; - } - } - - return MessageItem.ATTACHMENT_TYPE_NOT_LOADED; - } - - /** - * Returns the position of the message in the cursor. - * - * @param cursor - * @param messageType - * @param messageId - * @param map - * @return - */ - public static int getPositionForMessageId(Cursor cursor, String messageType, long messageId, MessageColumns.ColumnsMap map) { - - // Modified binary search on the cursor to find the position of the message in the cursor. - // It's modified because, although the SMS and MMS are generally ordered in terms of their - // ID, they have different IDs. So, we might have a list of IDs like: - // - // [ 4444, 4447, 4449, 4448, 312, 315, 4451 ] - // - // where the 44xx IDs are for SMS messages, and the 31x IDs are for MMS messages. The - // solution is to do a linear scan if we reach a point in the list where the ID doesn't - // match what we're looking for. - - // Lower and upper bounds for doing the search - int min = 0; - int max = cursor.getCount() - 1; - - while (min <= max) { - int mid = min / 2 + max / 2 + (min & max & 1); - - cursor.moveToPosition(mid); - long candidateId = cursor.getLong(map.mColumnMsgId); - String candidateType = cursor.getString(map.mColumnMsgType); - - if (messageType.equals(candidateType)) { - if (messageId < candidateId) { - max = mid - 1; - } else if (messageId > candidateId) { - min = mid + 1; - } else { - return mid; - } - - } else { - // This message is the wrong type, so we have to do a linear search until we find a - // message that is the right type so we can orient ourselves. - - // First, look forward. Stop when we move past max, or reach the end of the cursor. - boolean success = false; - while (cursor.getPosition() <= max && cursor.moveToNext()) { - candidateType = cursor.getString(map.mColumnMsgType); - if (candidateType.equals(messageType)) { - success = true; - break; - } - } - - if (!success) { - // We didn't find any messages of the right type by looking forward, so try - // looking backwards. - cursor.moveToPosition(mid); - while (cursor.getPosition() >= min && cursor.moveToPrevious()) { - candidateType = cursor.getString(map.mColumnMsgType); - if (candidateType.equals(messageType)) { - success = true; - break; - } - } - } - - if (!success) { - // There is no message with that ID of the correct type! - return -1; - } - - // In this case, we've found a message of the correct type! Now to do the binary - // search stuff. - candidateId = cursor.getLong(map.mColumnMsgId); - int pos = cursor.getPosition(); - if (messageId < candidateId) { - // The new upper bound is the minimum of where we started and where we ended - // up, subtract one. - max = (mid < pos ? mid : pos) - 1; - } else if (messageId > candidateId) { - // Same as above but in reverse. - min = (mid > pos ? mid : pos) + 1; - } else { - return pos; - } - } - } - - // This is the case where we've minimized our bounds until they're the same, and we haven't - // found anything yet---this means that the item doesn't exist, so return -1. - return -1; - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/transaction/SqliteWrapper.java b/QKSMS/src/main/java/com/moez/QKSMS/transaction/SqliteWrapper.java deleted file mode 100644 index 23f05f3e9..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/transaction/SqliteWrapper.java +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Copyright (C) 2008 Esmertec AG. - * Copyright (C) 2008 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.moez.QKSMS.transaction; - -import android.content.ContentResolver; -import android.content.ContentValues; -import android.content.Context; -import android.database.Cursor; -import android.database.sqlite.SQLiteException; -import android.net.Uri; -import android.util.Log; -import android.widget.Toast; - -import com.moez.QKSMS.R; - -public final class SqliteWrapper { - private static final String TAG = "SqliteWrapper"; - private static final String SQLITE_EXCEPTION_DETAIL_MESSAGE - = "unable to open database file"; - - private SqliteWrapper() { - // Forbidden being instantiated. - } - - // FIXME: need to optimize this method. - private static boolean isLowMemory(SQLiteException e) { - return e.getMessage().equals(SQLITE_EXCEPTION_DETAIL_MESSAGE); - } - - public static void checkSQLiteException(Context context, SQLiteException e) { - if (isLowMemory(e)) { - Toast.makeText(context, R.string.toast_low_memory, Toast.LENGTH_SHORT).show(); - } else { - throw e; - } - } - - public static Cursor query(Context context, ContentResolver resolver, Uri uri, - String[] projection, String selection, String[] selectionArgs, String sortOrder) { - try { - return resolver.query(uri, projection, selection, selectionArgs, sortOrder); - } catch (SQLiteException e) { - Log.e(TAG, "Catch a SQLiteException when query: ", e); - checkSQLiteException(context, e); - return null; - } - } - - public static boolean requery(Context context, Cursor cursor) { - try { - return cursor.requery(); - } catch (SQLiteException e) { - Log.e(TAG, "Catch a SQLiteException when requery: ", e); - checkSQLiteException(context, e); - return false; - } - } - public static int update(Context context, ContentResolver resolver, Uri uri, - ContentValues values, String where, String[] selectionArgs) { - try { - return resolver.update(uri, values, where, selectionArgs); - } catch (SQLiteException e) { - Log.e(TAG, "Catch a SQLiteException when update: ", e); - checkSQLiteException(context, e); - return -1; - } - } - - public static int delete(Context context, ContentResolver resolver, Uri uri, - String where, String[] selectionArgs) { - try { - return resolver.delete(uri, where, selectionArgs); - } catch (SQLiteException e) { - Log.e(TAG, "Catch a SQLiteException when delete: ", e); - checkSQLiteException(context, e); - return -1; - } - } - - public static Uri insert(Context context, ContentResolver resolver, - Uri uri, ContentValues values) { - try { - return resolver.insert(uri, values); - } catch (SQLiteException e) { - Log.e(TAG, "Catch a SQLiteException when insert: ", e); - checkSQLiteException(context, e); - return null; - } - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/ContentFragment.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/ContentFragment.java deleted file mode 100644 index 64ff6b9fa..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/ContentFragment.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.moez.QKSMS.ui; - -import android.content.Context; -import android.view.Menu; -import android.view.MenuInflater; - -/** - * This interface is for fragments that must extend something other than a vanilla Fragment. It - * allows the fragment to get content animation callbacks without the developer having to - * rewrite the base class to extend BaseContentFragment. - */ -public interface ContentFragment { - /** - * Called when the content is being opened with an animation. - */ - void onContentOpening(); - - /** - * Called when the content has been opened, i.e. a opening animation has finished or it had - * been opened immediately. - */ - void onContentOpened(); - - /** - * Called when the content is being closed with an animation. - */ - void onContentClosing(); - - /** - * Called when the content has been closed, i.e. a closing animation has finished or it had - * been closed immediately. - */ - void onContentClosed(); - - /** - * Called multiple times as the content is opening or closing. Allows it to receive updates - * of the position. Currently used to animate to the new theme color - * - * @param percentOpen - */ - void onMenuChanging(float percentOpen); - - /** - * Allows the MainActivity to delegate setting of the Toolbar title and menu - */ - void inflateToolbar(Menu menu, MenuInflater inflater, Context context); -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/MainActivity.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/MainActivity.java deleted file mode 100644 index 70668aaf4..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/MainActivity.java +++ /dev/null @@ -1,406 +0,0 @@ -package com.moez.QKSMS.ui; - -import android.app.ActivityManager.TaskDescription; -import android.app.AlertDialog; -import android.app.FragmentManager; -import android.app.FragmentTransaction; -import android.content.Context; -import android.content.DialogInterface; -import android.content.Intent; -import android.content.pm.ComponentInfo; -import android.content.pm.PackageManager; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.os.Build; -import android.os.Bundle; -import android.provider.ContactsContract; -import android.support.v4.content.ContextCompat; -import android.text.TextUtils; -import android.view.KeyEvent; -import android.view.Menu; -import android.view.MenuInflater; -import android.view.MenuItem; -import android.view.View; -import android.widget.CheckBox; -import android.widget.ImageView; -import butterknife.Bind; -import butterknife.ButterKnife; -import com.google.android.mms.pdu_alt.PduHeaders; -import com.moez.QKSMS.R; -import com.moez.QKSMS.common.DonationManager; -import com.moez.QKSMS.common.LiveViewManager; -import com.moez.QKSMS.common.QKRateSnack; -import com.moez.QKSMS.common.google.DraftCache; -import com.moez.QKSMS.common.utils.MessageUtils; -import com.moez.QKSMS.data.Conversation; -import com.moez.QKSMS.enums.QKPreference; -import com.moez.QKSMS.receiver.IconColorReceiver; -import com.moez.QKSMS.service.DeleteOldMessagesService; -import com.moez.QKSMS.transaction.NotificationManager; -import com.moez.QKSMS.transaction.SmsHelper; -import com.moez.QKSMS.ui.base.QKActivity; -import com.moez.QKSMS.ui.conversationlist.ConversationListFragment; -import com.moez.QKSMS.ui.dialog.DefaultSmsHelper; -import com.moez.QKSMS.ui.dialog.QKDialog; -import com.moez.QKSMS.ui.dialog.mms.MMSSetupFragment; -import com.moez.QKSMS.ui.messagelist.MessageListActivity; -import com.moez.QKSMS.ui.search.SearchActivity; -import com.moez.QKSMS.ui.settings.SettingsFragment; -import com.moez.QKSMS.ui.welcome.WelcomeActivity; -import org.ligi.snackengage.SnackEngage; -import org.ligi.snackengage.snacks.BaseSnack; - -import java.util.Collection; - - -public class MainActivity extends QKActivity { - private final String TAG = "MainActivity"; - - public static long sThreadShowing; - - private static final int THREAD_LIST_QUERY_TOKEN = 1701; - private static final int UNREAD_THREADS_QUERY_TOKEN = 1702; - public static final int DELETE_CONVERSATION_TOKEN = 1801; - public static final int HAVE_LOCKED_MESSAGES_TOKEN = 1802; - private static final int DELETE_OBSOLETE_THREADS_TOKEN = 1803; - - public static final String MMS_SETUP_DONT_ASK_AGAIN = "mmsSetupDontAskAgain"; - - @Bind(R.id.root) View mRoot; - - private ConversationListFragment mConversationList; - - /** - * True if the mms setup fragment has been dismissed and we shouldn't show it anymore. - */ - private final String KEY_MMS_SETUP_FRAGMENT_DISMISSED = "mmsSetupFragmentShown"; - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - launchWelcomeActivity(); - onNewIntent(getIntent()); - - setContentView(R.layout.activity_fragment); - setTitle(R.string.title_conversation_list); - ButterKnife.bind(this); - - FragmentManager fm = getFragmentManager(); - mConversationList = (ConversationListFragment) fm.findFragmentByTag(ConversationListFragment.TAG); - if (mConversationList == null) { - mConversationList = new ConversationListFragment(); - } - FragmentTransaction menuTransaction = fm.beginTransaction(); - menuTransaction.replace(R.id.content_frame, mConversationList, ConversationListFragment.TAG); - menuTransaction.commit(); - - showDialogIfNeeded(savedInstanceState); - - LiveViewManager.registerView(QKPreference.BACKGROUND, this, key -> { - // Update the background color. This code is important during the welcome screen setup, when the activity - // in the ThemeManager isn't the MainActivity - mRoot.setBackgroundColor(ThemeManager.getBackgroundColor()); - }); - - //Adds a small/non intrusive snackbar that asks the user to rate the app - SnackEngage.from(this).withSnack(new QKRateSnack().withDuration(BaseSnack.DURATION_LONG)) - .build().engageWhenAppropriate(); - - DeleteOldMessagesService.setupAutoDeleteAlarm(this); - } - - /** - * Shows at most one dialog using the intent extras and the restored state of the activity. - * - * @param savedInstanceState restored state - */ - private void showDialogIfNeeded(Bundle savedInstanceState) { - // Check if the intent has the ICON_COLOR_CHANGED action; if so, show a new dialog. - if (getIntent().getBooleanExtra(IconColorReceiver.EXTRA_ICON_COLOR_CHANGED, false)) { - // Clear the flag in the intent so that the dialog doesn't show up anymore - getIntent().putExtra(IconColorReceiver.EXTRA_ICON_COLOR_CHANGED, false); - - // Display a dialog showcasing the new icon! - ImageView imageView = new ImageView(this); - PackageManager manager = getPackageManager(); - try { - ComponentInfo info = manager.getActivityInfo(getComponentName(), 0); - imageView.setImageDrawable(ContextCompat.getDrawable(getBaseContext(), info.getIconResource())); - } catch (PackageManager.NameNotFoundException ignored) { - } - - new QKDialog() - .setContext(this) - .setTitle(getString(R.string.icon_ready)) - .setMessage(R.string.icon_ready_message) - .setCustomView(imageView) - .setPositiveButton(R.string.okay, null) - .show(); - - // Only show the MMS setup fragment if it hasn't already been dismissed - } else if (!wasMmsSetupFragmentDismissed(savedInstanceState)) { - beginMmsSetup(); - } - } - - private boolean wasMmsSetupFragmentDismissed(Bundle savedInstanceState) { - // It hasn't been dismissed if the saved instance state isn't initialized, or is initialized - // but doesn't have the flag. - return savedInstanceState != null - && savedInstanceState.getBoolean(KEY_MMS_SETUP_FRAGMENT_DISMISSED, false); - } - - private void launchWelcomeActivity() { - if (mPrefs.getBoolean(SettingsFragment.WELCOME_SEEN, false)) { - // User has already seen the welcome screen - return; - } - - Intent welcomeIntent = new Intent(this, WelcomeActivity.class); - startActivityForResult(welcomeIntent, WelcomeActivity.WELCOME_REQUEST_CODE); - } - - @Override - public boolean onPrepareOptionsMenu(Menu menu) { - MenuInflater inflater = getMenuInflater(); - menu.clear(); - - showBackButton(false); - mConversationList.inflateToolbar(menu, inflater, this); - - return super.onPrepareOptionsMenu(menu); - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case android.R.id.home: - onKeyUp(KeyEvent.KEYCODE_BACK, null); - return true; - case R.id.menu_search: - startActivity(SearchActivity.class); - return true; - } - - return super.onOptionsItemSelected(item); - } - - @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - if (requestCode == WelcomeActivity.WELCOME_REQUEST_CODE) { - new DefaultSmsHelper(this, R.string.not_default_first).showIfNotDefault(null); - } - } - - public static Intent createAddContactIntent(String address) { - // address must be a single recipient - Intent intent = new Intent(Intent.ACTION_INSERT_OR_EDIT); - intent.setType(ContactsContract.Contacts.CONTENT_ITEM_TYPE); - if (SmsHelper.isEmailAddress(address)) { - intent.putExtra(ContactsContract.Intents.Insert.EMAIL, address); - } else { - intent.putExtra(ContactsContract.Intents.Insert.PHONE, address); - intent.putExtra(ContactsContract.Intents.Insert.PHONE_TYPE, - ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE); - } - intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); - - return intent; - } - - @Override - public void onDestroy() { - super.onDestroy(); - DonationManager.getInstance(this).destroy(); - } - - @Override - public boolean onKeyUp(int keyCode, KeyEvent event) { - if (keyCode == KeyEvent.KEYCODE_BACK) { - if (mConversationList.isShowingBlocked()) { - mConversationList.setShowingBlocked(false); - } else { - finish(); - } - } - - return false; - } - - @Override - protected void onPause() { - super.onPause(); - sThreadShowing = 0; - } - - @Override - protected void onStart() { - super.onStart(); - // Only mark screen if the screen is on. onStart() is still called if the app is in the - // foreground and the screen is off - // TODO this solution doesn't work if the activity is in the foreground but the lockscreen is on - if (isScreenOn()) { - SmsHelper.markSmsSeen(this); - SmsHelper.markMmsSeen(this); - NotificationManager.update(this); - } - } - - @Override - protected void onResume() { - super.onResume(); - - sThreadShowing = 0; - - NotificationManager.initQuickCompose(this, false, false); - } - - /** - * MainActivity has a "singleTask" launch mode, which means that if it is currently running - * and another intent is launched to open it, instead of creating a new MainActivity it - * just opens the current MainActivity. We use this so that when you click on notifications, - * only one main activity is ever used. - * <p> - * onNewIntent() is called every time the homescreen shortcut is tapped, even if the app - * is already running in the background. It's also called when the app is launched via other - * intents - * <p> - * Docs: - * http://developer.android.com/guide/components/tasks-and-back-stack.html#TaskLaunchModes - */ - @Override - public void onNewIntent(Intent intent) { - // onNewIntent doesn't change the result of getIntent() by default, so here we set it since - // that makes the most sense. - setIntent(intent); - - boolean shouldOpenConversation = intent.hasExtra(MessageListActivity.ARG_THREAD_ID); - - // The activity can also be launched by clicking on the message button from the contacts app - // Check for {sms,mms}{,to}: schemes, in which case we know to open a conversation - if (intent.getData() != null) { - String scheme = intent.getData().getScheme(); - shouldOpenConversation = shouldOpenConversation || scheme.startsWith("sms") || scheme.startsWith("mms"); - } - - if (shouldOpenConversation) { - intent.setClass(this, MessageListActivity.class); - startActivity(intent); - } - } - - private void beginMmsSetup() { - if (!mPrefs.getBoolean(MMS_SETUP_DONT_ASK_AGAIN, false) && - TextUtils.isEmpty(mPrefs.getString(SettingsFragment.MMSC_URL, "")) && - TextUtils.isEmpty(mPrefs.getString(SettingsFragment.MMS_PROXY, "")) && - TextUtils.isEmpty(mPrefs.getString(SettingsFragment.MMS_PORT, ""))) { - - // Launch the MMS setup fragment here. This is a series of dialogs that will guide the - // user through the MMS setup process. - FragmentManager manager = getFragmentManager(); - if (manager.findFragmentByTag(MMSSetupFragment.TAG) == null) { - MMSSetupFragment f = new MMSSetupFragment(); - Bundle args = new Bundle(); - args.putBoolean(MMSSetupFragment.ARG_ASK_FIRST, true); - args.putString(MMSSetupFragment.ARG_DONT_ASK_AGAIN_PREF, MMS_SETUP_DONT_ASK_AGAIN); - f.setArguments(args); - - getFragmentManager() - .beginTransaction() - .add(f, MMSSetupFragment.TAG) - .commit(); - } - } - } - - @Override - protected void onSaveInstanceState(Bundle outState) { - super.onSaveInstanceState(outState); - FragmentManager m = getFragmentManager(); - - // Save whether or not the mms setup fragment was dismissed - if (m.findFragmentByTag(MMSSetupFragment.TAG) == null) { - outState.putBoolean(KEY_MMS_SETUP_FRAGMENT_DISMISSED, true); - } - } - - /** - * Build and show the proper delete thread dialog. The UI is slightly different - * depending on whether there are locked messages in the thread(s) and whether we're - * deleting single/multiple threads or all threads. - * - * @param listener gets called when the delete button is pressed - * @param threadIds the thread IDs to be deleted (pass null for all threads) - * @param hasLockedMessages whether the thread(s) contain locked messages - * @param context used to load the various UI elements - */ - public static void confirmDeleteThreadDialog(final DeleteThreadListener listener, Collection<Long> threadIds, - boolean hasLockedMessages, Context context) { - View contents = View.inflate(context, R.layout.dialog_delete_thread, null); - android.widget.TextView msg = (android.widget.TextView) contents.findViewById(R.id.message); - - if (threadIds == null) { - msg.setText(R.string.confirm_delete_all_conversations); - } else { - // Show the number of threads getting deleted in the confirmation dialog. - int cnt = threadIds.size(); - msg.setText(context.getResources().getQuantityString( - R.plurals.confirm_delete_conversation, cnt, cnt)); - } - - final CheckBox checkbox = (CheckBox) contents.findViewById(R.id.delete_locked); - if (!hasLockedMessages) { - checkbox.setVisibility(View.GONE); - } else { - listener.setDeleteLockedMessage(checkbox.isChecked()); - checkbox.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - listener.setDeleteLockedMessage(checkbox.isChecked()); - } - }); - } - - AlertDialog.Builder builder = new AlertDialog.Builder(context); - builder.setTitle(R.string.confirm_dialog_title) - .setIconAttribute(android.R.attr.alertDialogIcon) - .setCancelable(true) - .setPositiveButton(R.string.delete, listener) - .setNegativeButton(R.string.cancel, null) - .setView(contents) - .show(); - } - - public static class DeleteThreadListener implements DialogInterface.OnClickListener { - private final Collection<Long> mThreadIds; - private final Conversation.ConversationQueryHandler mHandler; - private final Context mContext; - private boolean mDeleteLockedMessages; - - public DeleteThreadListener(Collection<Long> threadIds, Conversation.ConversationQueryHandler handler, Context context) { - mThreadIds = threadIds; - mHandler = handler; - mContext = context; - } - - public void setDeleteLockedMessage(boolean deleteLockedMessages) { - mDeleteLockedMessages = deleteLockedMessages; - } - - @Override - public void onClick(DialogInterface dialog, final int whichButton) { - MessageUtils.handleReadReport(mContext, mThreadIds, - PduHeaders.READ_STATUS__DELETED_WITHOUT_BEING_READ, () -> { - int token = DELETE_CONVERSATION_TOKEN; - if (mThreadIds == null) { - Conversation.startDeleteAll(mHandler, token, mDeleteLockedMessages); - DraftCache.getInstance().refresh(); - } else { - Conversation.startDelete(mHandler, token, mDeleteLockedMessages, mThreadIds); - } - } - ); - dialog.dismiss(); - } - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/SwipeBackLayout.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/SwipeBackLayout.java deleted file mode 100644 index 6a4c6b594..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/SwipeBackLayout.java +++ /dev/null @@ -1,512 +0,0 @@ -package com.moez.QKSMS.ui; - -import android.app.Activity; -import android.content.Context; -import android.content.res.TypedArray; -import android.graphics.Canvas; -import android.graphics.Rect; -import android.graphics.drawable.Drawable; -import android.support.v4.view.ViewCompat; -import android.support.v4.widget.ViewDragHelper; -import android.util.AttributeSet; -import android.view.MotionEvent; -import android.view.View; -import android.view.ViewGroup; -import android.widget.FrameLayout; -import com.moez.QKSMS.R; - -import java.util.ArrayList; -import java.util.List; - -/** - * Modified version of https://github.com/ikew0ng/SwipeBackLayout - */ -public class SwipeBackLayout extends FrameLayout { - private final String TAG = "SwipeBackLayout"; - - public interface ScrollChangedListener { - void onScrollChanged(float scrollPercent); - } - - private static final int MIN_FLING_VELOCITY = 400; // dips per second - private static final int DEFAULT_SCRIM_COLOR = 0x99000000; - private static final int FULL_ALPHA = 255; - private static final float DEFAULT_SCROLL_THRESHOLD = 0.3f; - private static final int OVERSCROLL_DISTANCE = 10; - - public static final int EDGE_LEFT = ViewDragHelper.EDGE_LEFT; - public static final int EDGE_BOTTOM = ViewDragHelper.EDGE_BOTTOM; - public static final int EDGE_ALL = EDGE_LEFT | EDGE_BOTTOM; - - public static final int STATE_IDLE = ViewDragHelper.STATE_IDLE; - public static final int STATE_DRAGGING = ViewDragHelper.STATE_DRAGGING; - public static final int STATE_SETTLING = ViewDragHelper.STATE_SETTLING; - - - private static final int[] EDGE_FLAGS = { - EDGE_LEFT, EDGE_BOTTOM, EDGE_ALL - }; - - private int mEdgeFlag; - - /** - * Threshold of scroll, we will close the activity, when scrollPercent over - * this value; - */ - private float mScrollThreshold = DEFAULT_SCROLL_THRESHOLD; - - private Activity mActivity; - - private boolean mEnable = true; - - private View mContentView; - - private ViewDragHelper mDragHelper; - - private float mScrollPercent; - - private int mContentLeft; - private int mContentTop; - - /** - * The set of listeners to be sent events through. - */ - private List<SwipeListener> mListeners; - private ScrollChangedListener mScrollChangedListener; - - private Drawable mShadowLeft; - private Drawable mShadowBottom; - - private float mScrimOpacity; - private int mScrimColor = DEFAULT_SCRIM_COLOR; - - private boolean mInLayout; - private Rect mTmpRect = new Rect(); - - /** - * Edge being dragged - */ - private int mTrackingEdge = EDGE_LEFT; - - public SwipeBackLayout(Context context) { - this(context, null); - } - - public SwipeBackLayout(Context context, AttributeSet attrs) { - this(context, attrs, 0); - } - - public SwipeBackLayout(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs); - mDragHelper = ViewDragHelper.create(this, 0.2f, new ViewDragCallback()); - - int shadowLeft = R.drawable.shadow_left; - int shadowBottom = R.drawable.shadow_bottom; - setShadow(shadowLeft, EDGE_LEFT); - setShadow(shadowBottom, EDGE_BOTTOM); - final float density = getResources().getDisplayMetrics().density; - final float minVel = MIN_FLING_VELOCITY * density; - mDragHelper.setMinVelocity(minVel); - } - - /** - * Set up contentView which will be moved by user gesture - * - * @param view - */ - private void setContentView(View view) { - mContentView = view; - } - - public void setEnableGesture(boolean enable) { - mEnable = enable; - } - - /** - * Enable edge tracking for the selected edges of the parent view. The - * callback's - * {@link android.support.v4.widget.ViewDragHelper.Callback#onEdgeTouched(int, int)} - * and - * {@link android.support.v4.widget.ViewDragHelper.Callback#onEdgeDragStarted(int, int)} - * methods will only be invoked for edges for which edge tracking has been - * enabled. - * - * @param edgeFlags Combination of edge flags describing the edges to watch - * @see #EDGE_LEFT - * @see #EDGE_BOTTOM - */ - public void setEdgeTrackingEnabled(int edgeFlags) { - mEdgeFlag = edgeFlags; - mDragHelper.setEdgeTrackingEnabled(mEdgeFlag); - } - - /** - * Set a color to use for the scrim that obscures primary content while a - * drawer is open. - * - * @param color Color to use in 0xAARRGGBB format. - */ - public void setScrimColor(int color) { - mScrimColor = color; - invalidate(); - } - - /** - * Register a callback to be invoked when a swipe event is sent to this - * view. - * - * @param listener the swipe listener to attach to this view - * @deprecated use {@link #addSwipeListener} instead - */ - @Deprecated - public void setSwipeListener(SwipeListener listener) { - addSwipeListener(listener); - } - - /** - * Add a callback to be invoked when a swipe event is sent to this view. - * - * @param listener the swipe listener to attach to this view - */ - public void addSwipeListener(SwipeListener listener) { - if (mListeners == null) { - mListeners = new ArrayList<SwipeListener>(); - } - mListeners.add(listener); - } - - /** - * Removes a listener from the set of listeners - * - * @param listener - */ - public void removeSwipeListener(SwipeListener listener) { - if (mListeners == null) { - return; - } - mListeners.remove(listener); - } - - public void setScrollChangedListener(ScrollChangedListener listener) { - mScrollChangedListener = listener; - } - - public interface SwipeListener { - /** - * Invoke when state change - * - * @param state flag to describe scroll state - * @param scrollPercent scroll percent of this view - * @see #STATE_IDLE - * @see #STATE_DRAGGING - * @see #STATE_SETTLING - */ - void onScrollStateChange(int state, float scrollPercent); - - /** - * Invoke when edge touched - * - * @param edgeFlag edge flag describing the edge being touched - * @see #EDGE_LEFT - * @see #EDGE_BOTTOM - */ - void onEdgeTouch(int edgeFlag); - - /** - * Invoke when scroll percent over the threshold for the first time - */ - void onScrollOverThreshold(); - } - - /** - * Set scroll threshold, we will close the activity, when scrollPercent over - * this value - * - * @param threshold - */ - public void setScrollThresHold(float threshold) { - if (threshold >= 1.0f || threshold <= 0) { - throw new IllegalArgumentException("Threshold value should be between 0 and 1.0"); - } - mScrollThreshold = threshold; - } - - /** - * Set a drawable used for edge shadow. - * - * @param shadow Drawable to use - * @param edgeFlags Combination of edge flags describing the edge to set - * @see #EDGE_LEFT - * @see #EDGE_BOTTOM - */ - public void setShadow(Drawable shadow, int edgeFlag) { - if ((edgeFlag & EDGE_LEFT) != 0) { - mShadowLeft = shadow; - } else if ((edgeFlag & EDGE_BOTTOM) != 0) { - mShadowBottom = shadow; - } - invalidate(); - } - - /** - * Set a drawable used for edge shadow. - * - * @param resId Resource of drawable to use - * @param edgeFlags Combination of edge flags describing the edge to set - * @see #EDGE_LEFT - * @see #EDGE_BOTTOM - */ - public void setShadow(int resId, int edgeFlag) { - setShadow(getResources().getDrawable(resId), edgeFlag); - } - - /** - * Scroll out contentView and finish the activity - */ - public void scrollToFinishActivity() { - final int childWidth = mContentView.getWidth(); - final int childHeight = mContentView.getHeight(); - - int left = 0, top = 0; - if ((mEdgeFlag & EDGE_LEFT) != 0) { - left = childWidth + mShadowLeft.getIntrinsicWidth() + OVERSCROLL_DISTANCE; - mTrackingEdge = EDGE_LEFT; - } else if ((mEdgeFlag & EDGE_BOTTOM) != 0) { - top = -childHeight - mShadowBottom.getIntrinsicHeight() - OVERSCROLL_DISTANCE; - mTrackingEdge = EDGE_BOTTOM; - } - - mDragHelper.smoothSlideViewTo(mContentView, left, top); - invalidate(); - } - - @Override - public boolean onInterceptTouchEvent(MotionEvent event) { - if (!mEnable) { - return false; - } - try { - return mDragHelper.shouldInterceptTouchEvent(event); - } catch (ArrayIndexOutOfBoundsException e) { - // FIXME: handle exception - // issues #9 - return false; - } - } - - @Override - public boolean onTouchEvent(MotionEvent event) { - if (!mEnable) { - return false; - } - mDragHelper.processTouchEvent(event); - return true; - } - - @Override - protected void onLayout(boolean changed, int left, int top, int right, int bottom) { - mInLayout = true; - if (mContentView != null) - mContentView.layout(mContentLeft, mContentTop, - mContentLeft + mContentView.getMeasuredWidth(), - mContentTop + mContentView.getMeasuredHeight()); - mInLayout = false; - } - - @Override - public void requestLayout() { - if (!mInLayout) { - super.requestLayout(); - } - } - - @Override - protected boolean drawChild(Canvas canvas, View child, long drawingTime) { - final boolean drawContent = child == mContentView; - - boolean ret = super.drawChild(canvas, child, drawingTime); - if (mScrimOpacity > 0 && drawContent && mDragHelper.getViewDragState() != ViewDragHelper.STATE_IDLE) { - drawShadow(canvas, child); - drawScrim(canvas, child); - } - return ret; - } - - private void drawScrim(Canvas canvas, View child) { - final int baseAlpha = (mScrimColor & 0xff000000) >>> 24; - final int alpha = (int) (baseAlpha * mScrimOpacity); - final int color = alpha << 24 | (mScrimColor & 0xffffff); - - if ((mTrackingEdge & EDGE_LEFT) != 0) { - canvas.clipRect(0, 0, child.getLeft(), getHeight()); - } else if ((mTrackingEdge & EDGE_BOTTOM) != 0) { - canvas.clipRect(child.getLeft(), child.getBottom(), getRight(), getHeight()); - } - canvas.drawColor(color); - } - - private void drawShadow(Canvas canvas, View child) { - final Rect childRect = mTmpRect; - child.getHitRect(childRect); - - if ((mEdgeFlag & EDGE_LEFT) != 0) { - mShadowLeft.setBounds(childRect.left - mShadowLeft.getIntrinsicWidth(), childRect.top, - childRect.left, childRect.bottom); - mShadowLeft.setAlpha((int) (mScrimOpacity * FULL_ALPHA)); - mShadowLeft.draw(canvas); - } - - if ((mEdgeFlag & EDGE_BOTTOM) != 0) { - mShadowBottom.setBounds(childRect.left, childRect.bottom, childRect.right, - childRect.bottom + mShadowBottom.getIntrinsicHeight()); - mShadowBottom.setAlpha((int) (mScrimOpacity * FULL_ALPHA)); - mShadowBottom.draw(canvas); - } - } - - public void attachToActivity(Activity activity) { - mActivity = activity; - TypedArray a = activity.getTheme().obtainStyledAttributes(new int[]{ - android.R.attr.windowBackground - }); - int background = a.getResourceId(0, 0); - a.recycle(); - - ViewGroup decor = (ViewGroup) activity.getWindow().getDecorView(); - ViewGroup decorChild = (ViewGroup) decor.getChildAt(0); - decorChild.setBackgroundResource(background); - decor.removeView(decorChild); - addView(decorChild); - setContentView(decorChild); - decor.addView(this); - } - - @Override - public void computeScroll() { - mScrimOpacity = mScrollPercent < 0.8f ? 0.4f : (1f - mScrollPercent) * 2f; - if (mDragHelper.continueSettling(true)) { - ViewCompat.postInvalidateOnAnimation(this); - } - } - - private class ViewDragCallback extends ViewDragHelper.Callback { - private boolean mIsScrollOverValid; - - @Override - public void onEdgeDragStarted(int edgeFlags, int pointerId) { - super.onEdgeDragStarted(edgeFlags, pointerId); - } - - @Override - public boolean tryCaptureView(View view, int i) { - mTrackingEdge = EDGE_LEFT; - if (mListeners != null && !mListeners.isEmpty()) { - for (SwipeListener listener : mListeners) { - listener.onEdgeTouch(mTrackingEdge); - } - } - mIsScrollOverValid = true; - boolean directionCheck = false; - if (mEdgeFlag == EDGE_LEFT) { - directionCheck = !mDragHelper.checkTouchSlop(ViewDragHelper.DIRECTION_VERTICAL, i); - } else if (mEdgeFlag == EDGE_BOTTOM) { - directionCheck = !mDragHelper.checkTouchSlop(ViewDragHelper.DIRECTION_HORIZONTAL, i); - } else if (mEdgeFlag == EDGE_ALL) { - directionCheck = true; - } - return directionCheck; - } - - @Override - public int getViewHorizontalDragRange(View child) { - return mEdgeFlag & (EDGE_LEFT); - } - - @Override - public int getViewVerticalDragRange(View child) { - return mEdgeFlag & EDGE_BOTTOM; - } - - @Override - public void onViewPositionChanged(View changedView, int left, int top, int dx, int dy) { - super.onViewPositionChanged(changedView, left, top, dx, dy); - if ((mTrackingEdge & EDGE_LEFT) != 0) { - mScrollPercent = Math.abs((float) left / (mContentView.getWidth() + mShadowLeft.getIntrinsicWidth())); - } else if ((mTrackingEdge & EDGE_BOTTOM) != 0) { - mScrollPercent = Math.abs((float) top / (mContentView.getHeight() + mShadowBottom.getIntrinsicHeight())); - } - - if (mScrollChangedListener != null) { - mScrollChangedListener.onScrollChanged(mScrollPercent); - } - - mContentLeft = left; - mContentTop = top; - invalidate(); - if (mScrollPercent < mScrollThreshold && !mIsScrollOverValid) { - mIsScrollOverValid = true; - } - if (mListeners != null && !mListeners.isEmpty() - && mDragHelper.getViewDragState() == STATE_DRAGGING - && mScrollPercent >= mScrollThreshold && mIsScrollOverValid) { - mIsScrollOverValid = false; - for (SwipeListener listener : mListeners) { - listener.onScrollOverThreshold(); - } - } - - if (mScrollPercent >= 1) { - if (!mActivity.isFinishing()) { - mActivity.finish(); - mActivity.overridePendingTransition(0, 0); - } - } - } - - @Override - public void onViewReleased(View releasedChild, float xvel, float yvel) { - final int childWidth = releasedChild.getWidth(); - final int childHeight = releasedChild.getHeight(); - - int left = 0, top = 0; - if ((mTrackingEdge & EDGE_LEFT) != 0) { - left = xvel > 0 || xvel == 0 && mScrollPercent > mScrollThreshold ? childWidth - + mShadowLeft.getIntrinsicWidth() + OVERSCROLL_DISTANCE : 0; - } else if ((mTrackingEdge & EDGE_BOTTOM) != 0) { - top = yvel < 0 || yvel == 0 && mScrollPercent > mScrollThreshold ? -(childHeight - + mShadowBottom.getIntrinsicHeight() + OVERSCROLL_DISTANCE) : 0; - } - - mDragHelper.settleCapturedViewAt(left, top); - invalidate(); - } - - @Override - public int clampViewPositionHorizontal(View child, int left, int dx) { - int ret = 0; - if ((mTrackingEdge & EDGE_LEFT) != 0) { - ret = Math.min(child.getWidth(), Math.max(left, 0)); - } - return ret; - } - - @Override - public int clampViewPositionVertical(View child, int top, int dy) { - int ret = 0; - if ((mTrackingEdge & EDGE_BOTTOM) != 0) { - ret = Math.min(0, Math.max(top, -child.getHeight())); - } - return ret; - } - - @Override - public void onViewDragStateChanged(int state) { - super.onViewDragStateChanged(state); - if (mListeners != null && !mListeners.isEmpty()) { - for (SwipeListener listener : mListeners) { - listener.onScrollStateChange(state, mScrollPercent); - } - } - } - } -} \ No newline at end of file diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/ThemeManager.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/ThemeManager.java deleted file mode 100644 index b97eab08a..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/ThemeManager.java +++ /dev/null @@ -1,786 +0,0 @@ -package com.moez.QKSMS.ui; - -import android.animation.Animator; -import android.animation.AnimatorListenerAdapter; -import android.animation.ArgbEvaluator; -import android.animation.ValueAnimator; -import android.annotation.TargetApi; -import android.content.ComponentName; -import android.content.Context; -import android.content.Intent; -import android.content.SharedPreferences; -import android.content.pm.PackageManager; -import android.content.res.Resources; -import android.graphics.Color; -import android.graphics.PorterDuff; -import android.graphics.drawable.Drawable; -import android.os.Build; -import android.preference.PreferenceManager; -import android.support.annotation.ColorInt; -import android.support.annotation.DrawableRes; -import android.support.v4.content.ContextCompat; -import android.support.v4.view.ViewPager; -import android.support.v7.widget.GridLayoutManager; -import android.support.v7.widget.RecyclerView; -import android.util.Log; -import android.view.LayoutInflater; -import android.view.View; -import android.view.animation.DecelerateInterpolator; -import android.view.inputmethod.EditorInfo; -import android.widget.ImageView; -import android.widget.LinearLayout; -import android.widget.SeekBar; -import butterknife.Bind; -import butterknife.ButterKnife; -import com.moez.QKSMS.R; -import com.moez.QKSMS.common.AnalyticsManager; -import com.moez.QKSMS.common.CIELChEvaluator; -import com.moez.QKSMS.common.ConversationPrefsHelper; -import com.moez.QKSMS.common.LiveViewManager; -import com.moez.QKSMS.common.utils.ColorUtils; -import com.moez.QKSMS.common.utils.KeyboardUtils; -import com.moez.QKSMS.common.utils.Units; -import com.moez.QKSMS.enums.QKPreference; -import com.moez.QKSMS.receiver.IconColorReceiver; -import com.moez.QKSMS.theme.IconAdapter; -import com.moez.QKSMS.ui.base.QKActivity; -import com.moez.QKSMS.ui.dialog.ColorPickerPagerAdapter; -import com.moez.QKSMS.ui.dialog.QKDialog; -import com.moez.QKSMS.ui.settings.SettingsFragment; -import com.moez.QKSMS.ui.view.QKEditText; -import com.moez.QKSMS.ui.view.QKTextView; -import com.moez.QKSMS.ui.view.colorpicker.ColorPickerPalette; -import com.moez.QKSMS.ui.widget.WidgetProvider; - -public class ThemeManager { - private final static String TAG = "ThemeManager"; - - public static final int DEFAULT_COLOR = 0xff009688; - public static final int TRANSITION_LENGTH = 500; - - public enum Theme { - LIGHT, - DARK, - BLACK; - - public static final String PREF_OFFWHITE = "light"; - public static final String PREF_GREY = "grey"; - public static final String PREF_BLACK = "black"; - - public static Theme fromString(String color) { - switch (color) { - case PREF_OFFWHITE: - return LIGHT; - case PREF_GREY: - return DARK; - case PREF_BLACK: - return BLACK; - default: - Log.w(TAG, "Tried to set theme with invalid string: " + color); - return LIGHT; - } - } - } - - // Colors copied from http://www.google.com/design/spec/style/color.html#color-ui-color-palette - private static final int[][] COLORS = {{ - // Red - 0xfffde0dc, 0xfff9bdbb, 0xfff69988, 0xfff36c60, - 0xffe84e40, 0xffe51c23, 0xffdd191d, 0xffd01716, - 0xffc41411, 0xffb0120a - }, { // Pink - 0xfffce4ec, 0xfff8bbd0, 0xfff48fb1, 0xfff06292, - 0xffec407a, 0xffe91e63, 0xffd81b60, 0xffc2185b, - 0xffad1457, 0xff880e4f - }, { // Purple - 0xfff3e5f5, 0xffe1bee7, 0xffce93d8, 0xffba68c8, - 0xffab47bc, 0xff9c27b0, 0xff8e24aa, 0xff7b1fa2, - 0xff6a1b9a, 0xff4a148c - }, { // Deep Purple - 0xffede7f6, 0xffd1c4e9, 0xffb39ddb, 0xff9575cd, - 0xff7e57c2, 0xff673ab7, 0xff5e35b1, 0xff512da8, - 0xff4527a0, 0xff311b92 - }, { // Indigo - 0xffe8eaf6, 0xffc5cae9, 0xff9fa8da, 0xff7986cb, - 0xff5c6bc0, 0xff3f51b5, 0xff3949ab, 0xff303f9f, - 0xff283593, 0xff1a237e - }, { // Blue - 0xffe7e9fd, 0xffd0d9ff, 0xffafbfff, 0xff91a7ff, - 0xff738ffe, 0xff5677fc, 0xff4e6cef, 0xff455ede, - 0xff3b50ce, 0xff2a36b1 - }, { // Light Blue - 0xffe1f5fe, 0xffb3e5fc, 0xff81d4fa, 0xff4fc3f7, - 0xff29b6f6, 0xff03a9f4, 0xff039be5, 0xff0288d1, - 0xff0277bd, 0xff01579b - }, { // Cyan - 0xffe0f7fa, 0xffb2ebf2, 0xff80deea, 0xff4dd0e1, - 0xff26c6da, 0xff00bcd4, 0xff00acc1, 0xff0097a7, - 0xff00838f, 0xff006064 - }, { // Teal - 0xffe0f2f1, 0xffb2dfdb, 0xff80cbc4, 0xff4db6ac, - 0xff26a69a, 0xff009688, 0xff00897b, 0xff00796b, - 0xff00695c, 0xff004d40 - }, { // Green - 0xffd0f8ce, 0xffa3e9a4, 0xff72d572, 0xff42bd41, - 0xff2baf2b, 0xff259b24, 0xff0a8f08, 0xff0a7e07, - 0xff056f00, 0xff0d5302 - }, { // Light Green - 0xfff1f8e9, 0xffdcedc8, 0xffc5e1a5, 0xffaed581, - 0xff9ccc65, 0xff8bc34a, 0xff7cb342, 0xff689f38, - 0xff558b2f, 0xff33691e - }, { // Lime - 0xfff9fbe7, 0xfff0f4c3, 0xffe6ee9c, 0xffdce775, - 0xffd4e157, 0xffcddc39, 0xffc0ca33, 0xffafb42b, - 0xff9e9d24, 0xff827717 - }, { // Yellow - 0xfffffde7, 0xfffff9c4, 0xfffff59d, 0xfffff176, - 0xffffee58, 0xffffeb3b, 0xfffdd835, 0xfffbc02d, - 0xfff9a825, 0xfff57f17 - }, { // Amber - 0xfffff8e1, 0xffffecb3, 0xffffe082, 0xffffd54f, - 0xffffca28, 0xffffc107, 0xffffb300, 0xffffa000, - 0xffff8f00, 0xffff6f00 - }, { // Orange - 0xfffff3e0, 0xffffe0b2, 0xffffcc80, 0xffffb74d, - 0xffffa726, 0xffff9800, 0xfffb8c00, 0xfff57c00, - 0xffef6c00, 0xffe65100 - }, { // Deep Orange - 0xfffbe9e7, 0xffffccbc, 0xffffab91, 0xffff8a65, - 0xffff7043, 0xffff5722, 0xfff4511e, 0xffe64a19, - 0xffd84315, 0xffbf360c - }, { // Brown - 0xffefebe9, 0xffd7ccc8, 0xffbcaaa4, 0xffa1887f, - 0xff8d6e63, 0xff795548, 0xff6d4c41, 0xff5d4037, - 0xff4e342e, 0xff3e2723 - }, { // Grey - 0xfffafafa, 0xfff5f5f5, 0xffeeeeee, 0xffe0e0e0, - 0xffbdbdbd, 0xff9e9e9e, 0xff757575, 0xff616161, - 0xff424242, 0xff212121, 0xff000000, 0xffffffff - }, { // Blue Grey - 0xffeceff1, 0xffeceff1, 0xffb0bec5, 0xff90a4ae, - 0xff78909c, 0xff607d8b, 0xff546e7a, 0xff455a64, - 0xff37474f, 0xff263238 - }}; - - /** - * These are the colors that go in the initial palette. - */ - public static final int[] PALETTE = { - COLORS[0][5], // Red - COLORS[1][5], // Pink - COLORS[2][5], // Purple - COLORS[3][5], // Deep purple - COLORS[4][5], // Indigo - COLORS[5][5], // Blue - COLORS[6][5], // Light Blue - COLORS[7][5], // Cyan - COLORS[8][5], // Teal - COLORS[9][5], // Green - COLORS[10][5], // Light Green - COLORS[11][5], // Lime - COLORS[12][5], // Yellow - COLORS[13][5], // Amber - COLORS[14][5], // Orange - COLORS[15][5], // Deep Orange - COLORS[16][5], // Brown - COLORS[17][5], // Grey - COLORS[18][5] // Blue Grey - }; - - /** - * This configures whether the text is black (0) or white (1) for each color above. - */ - private static final int[][] TEXT_MODE = {{ - // Red - 0, 0, 1, 1, 1, 1, 1, 1, 1, 1 - }, { // Pink - 0, 0, 1, 1, 1, 1, 1, 1, 1, 1 - }, { // Purple - 0, 0, 1, 1, 1, 1, 1, 1, 1, 1 - }, { // Deep Purple - 0, 0, 1, 1, 1, 1, 1, 1, 1, 1 - }, { // Indigo - 0, 0, 1, 1, 1, 1, 1, 1, 1, 1 - }, { // Blue - 0, 0, 0, 1, 1, 1, 1, 1, 1, 1 - }, { // Light Blue - 0, 0, 0, 1, 1, 1, 1, 1, 1, 1 - }, { // Cyan - 0, 0, 0, 1, 1, 1, 1, 1, 1, 1 - }, { // Teal - 0, 0, 0, 1, 1, 1, 1, 1, 1, 1 - }, { // Green - 0, 0, 1, 1, 1, 1, 1, 1, 1, 1 - }, { // Light Green - 0, 0, 0, 0, 1, 1, 1, 1, 1, 1 - }, { // Lime - 0, 0, 0, 0, 0, 0, 1, 1, 1, 1 - }, { // Yellow - 0, 0, 0, 0, 0, 0, 0, 1, 1, 1 - }, { // Amber - 0, 0, 0, 0, 0, 1, 1, 1, 1, 1 - }, { // Orange - 0, 0, 0, 1, 1, 1, 1, 1, 1, 1 - }, { // Deep Orange - 0, 0, 1, 1, 1, 1, 1, 1, 1, 1 - }, { // Brown - 0, 0, 1, 1, 1, 1, 1, 1, 1, 1 - }, { // Grey - 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0 - }, { // Blue Grey - 0, 0, 0, 1, 1, 1, 1, 1, 1, 1 - }}; - - private static int mColor; - private static int mActiveColor; - private static int mBackgroundColor; - private static Theme mTheme; - - private static int mTextOnColorPrimary; - private static int mTextOnColorSecondary; - private static int mTextOnBackgroundPrimary; - private static int mtextOnBackgroundSecondary; - private static int mSentBubbleRes; - private static int mSentBubbleAltRes; - private static boolean mSentBubbleColored; - private static int mReceivedBubbleRes; - private static int mReceivedBubbleAltRes; - private static boolean mReceivedBubbleColored; - private static int mRippleBackgroundRes; - - private static Resources mResources; - private static SharedPreferences mPrefs; - - private static Context mContext; - - public static void init(Context context) { - mContext = context; - - mPrefs = PreferenceManager.getDefaultSharedPreferences(context); - mResources = context.getResources(); - - mColor = Integer.parseInt(mPrefs.getString(SettingsFragment.THEME, "" + DEFAULT_COLOR)); - mActiveColor = mColor; - - initializeTheme(Theme.fromString(mPrefs.getString(SettingsFragment.BACKGROUND, "offwhite"))); - } - - public static void setTheme(Theme theme) { - final int startColor = mBackgroundColor; - initializeTheme(theme); - final int endColor = mBackgroundColor; - - if (startColor != endColor) { - ValueAnimator backgroundAnimation = ValueAnimator.ofObject(new ArgbEvaluator(), startColor, endColor); - backgroundAnimation.setDuration(TRANSITION_LENGTH); - backgroundAnimation.addUpdateListener(animation -> { - mBackgroundColor = (Integer) animation.getAnimatedValue(); - LiveViewManager.refreshViews(QKPreference.BACKGROUND); - }); - backgroundAnimation.addListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animation) { - mBackgroundColor = endColor; - LiveViewManager.refreshViews(QKPreference.BACKGROUND); - WidgetProvider.notifyThemeChanged(mContext); - } - }); - backgroundAnimation.start(); - } else { - LiveViewManager.refreshViews(QKPreference.BACKGROUND); - WidgetProvider.notifyThemeChanged(mContext); - } - } - - public static void initializeTheme(Theme theme) { - mTheme = theme; - - switch (theme) { - case LIGHT: - mBackgroundColor = mResources.getColor(R.color.grey_light_mega_ultra); - mTextOnBackgroundPrimary = mResources.getColor(R.color.theme_light_text_primary); - mtextOnBackgroundSecondary = mResources.getColor(R.color.theme_light_text_secondary); - mRippleBackgroundRes = R.drawable.ripple; - break; - - case DARK: - mBackgroundColor = mResources.getColor(R.color.grey_material); - mTextOnBackgroundPrimary = mResources.getColor(R.color.theme_dark_text_primary); - mtextOnBackgroundSecondary = mResources.getColor(R.color.theme_dark_text_secondary); - mRippleBackgroundRes = R.drawable.ripple_light; - break; - - case BLACK: - mBackgroundColor = mResources.getColor(R.color.black); - mTextOnBackgroundPrimary = mResources.getColor(R.color.theme_dark_text_primary); - mtextOnBackgroundSecondary = mResources.getColor(R.color.theme_dark_text_secondary); - mRippleBackgroundRes = R.drawable.ripple_light; - break; - } - - mTextOnColorPrimary = mResources.getColor(isColorDarkEnough(mColor) ? - R.color.theme_dark_text_primary : R.color.theme_light_text_primary); - mTextOnColorSecondary = mResources.getColor(isColorDarkEnough(mColor) ? - R.color.theme_dark_text_secondary : R.color.theme_light_text_secondary); - - setSentBubbleColored(mPrefs.getBoolean(SettingsFragment.COLOR_SENT, true)); - setReceivedBubbleColored(mPrefs.getBoolean(SettingsFragment.COLOR_RECEIVED, false)); - setBubbleStyleNew(mPrefs.getBoolean(SettingsFragment.BUBBLES_NEW, true)); - - LiveViewManager.refreshViews(QKPreference.BACKGROUND); - } - - public static void setIcon(final QKActivity context) { - - String[] colors = { - "Default", "Dark", "Red", "Pink", "Purple", "DeepPurple", - "Indigo", "Blue", "LightBlue", "Cyan", "Teal", "Green", - "LightGreen", "Lime", "Yellow", "Amber", "Orange", "DeepOrange", - "Brown", "Grey", "BlueGrey" - }; - - RecyclerView recyclerView = new RecyclerView(context); - recyclerView.setLayoutParams(new LinearLayout.LayoutParams(-1, Units.dpToPx(context, 200))); - recyclerView.setLayoutManager(new GridLayoutManager(context, 4)); - recyclerView.setAdapter(new IconAdapter(context, (parent, view, position, id) -> { - PackageManager packageManager = context.getPackageManager(); - - // Disable all of the color aliases, except for the alias with the current - // color. - String enabledComponent = null; - for (int i = 0; i < colors.length; i++) { - String componentClassName = String.format("com.moez.QKSMS.ui.MainActivity-%s", colors[i]); - - // Save the enabled component so we can kill the app with this one when - // it's all done. - if (i == position) { - enabledComponent = componentClassName; - } else { - packageManager.setComponentEnabledSetting( - new ComponentName(context, componentClassName), - PackageManager.COMPONENT_ENABLED_STATE_DISABLED, - // Don't kill the app while we're in the loop! This will - // prevent the other component enabled settings from - // changing, i.e. they will all be disabled and the app - // won't show up to the user. - PackageManager.DONT_KILL_APP - ); - } - } - - // Broadcast an intent to a receiver that will: - // 1) enable the last component; and - // 2) relaunch QKSMS with the new component name. - Intent intent = new Intent(IconColorReceiver.ACTION_ICON_COLOR_CHANGED); - intent.putExtra(IconColorReceiver.EXTRA_COMPONENT_NAME, enabledComponent); - context.sendBroadcast(intent); - })); - - new QKDialog() - .setContext(context) - .setTitle(R.string.update_icon_title) - .setMessage(R.string.update_icon_message) - .setCustomView(recyclerView) - .setNegativeButton(R.string.cancel, null) - .show(); - } - - @ColorInt - public static int getBackgroundColor() { - return mBackgroundColor; - } - - @ColorInt - public static int getTextOnColorPrimary() { - return mTextOnColorPrimary; - } - - @ColorInt - public static int getTextOnColorSecondary() { - return mTextOnColorSecondary; - } - - @ColorInt - public static int getTextOnBackgroundPrimary() { - return mTextOnBackgroundPrimary; - } - - @ColorInt - public static int getTextOnBackgroundSecondary() { - return mtextOnBackgroundSecondary; - } - - @DrawableRes - public static int getSentBubbleRes() { - return mSentBubbleRes; - } - - @DrawableRes - public static int getSentBubbleAltRes() { - return mSentBubbleAltRes; - } - - @ColorInt - public static int getSentBubbleColor() { - return mSentBubbleColored ? mActiveColor : getNeutralBubbleColor(); - } - - @DrawableRes - public static int getReceivedBubbleRes() { - return mReceivedBubbleRes; - } - - @DrawableRes - public static int getReceivedBubbleAltRes() { - return mReceivedBubbleAltRes; - } - - @ColorInt - public static int getReceivedBubbleColor() { - return mReceivedBubbleColored ? mActiveColor : getNeutralBubbleColor(); - } - - public static void setBubbleStyleNew(boolean styleNew) { - mSentBubbleRes = styleNew ? R.drawable.message_sent_2 : R.drawable.message_sent; - mSentBubbleAltRes = styleNew ? R.drawable.message_sent_alt_2 : R.drawable.message_sent_alt; - mReceivedBubbleRes = styleNew ? R.drawable.message_received_2 : R.drawable.message_received; - mReceivedBubbleAltRes = styleNew ? R.drawable.message_received_alt_2 : R.drawable.message_received_alt; - } - - public static void setSentBubbleColored(boolean colored) { - mSentBubbleColored = colored; - } - - public static void setReceivedBubbleColored(boolean colored) { - mReceivedBubbleColored = colored; - } - - @ColorInt - public static int getNeutralBubbleColor() { - if (mTheme == null) { - return 0xeeeeee; - } - - switch (mTheme) { - case DARK: - return mResources.getColor(R.color.grey_dark); - - case BLACK: - return mResources.getColor(R.color.grey_material); - - default: - return mResources.getColor(R.color.white_pure); - } - } - - public static Drawable getRippleBackground() { - return mResources.getDrawable(mRippleBackgroundRes); - } - - @ColorInt - public static int getColor() { - return mActiveColor; - } - - @ColorInt - public static int getThemeColor() { - return mColor; - } - - public static Theme getTheme() { - return mTheme; - } - - public static boolean isNightMode() { - return mTheme == Theme.DARK || mTheme == Theme.BLACK; - } - - public static void showColorPickerDialog(final QKActivity context) { - showColorPicker(context, v -> setColor(context, getColor())); - } - - public static void showColorPickerDialogForConversation(final QKActivity context, ConversationPrefsHelper prefs) { - showColorPicker(context, v -> { - prefs.putString(QKPreference.THEME.getKey(), "" + getColor()); - LiveViewManager.refreshViews(QKPreference.CONVERSATION_THEME); - }); - } - - private static void showColorPicker(QKActivity context, View.OnClickListener saveListener) { - final QKDialog dialog = new QKDialog(); - - View view = LayoutInflater.from(mContext).inflate(R.layout.dialog_color_picker, null, false); - ColorPickerViewHolder holder = new ColorPickerViewHolder(view); - - holder.mTab1.setBackgroundDrawable(getRippleBackground()); - holder.mTab2.setBackgroundDrawable(getRippleBackground()); - holder.mTab1.setOnClickListener(v -> holder.mPager.setCurrentItem(0)); - holder.mTab2.setOnClickListener(v -> holder.mPager.setCurrentItem(1)); - - ColorPickerPagerAdapter adapter = new ColorPickerPagerAdapter(context); - holder.mPager.setAdapter(adapter); - holder.mPager.setOffscreenPageLimit(1); - holder.mPager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { - @Override - public void onPageSelected(int position) { - super.onPageSelected(position); - holder.mTab1.setTextColor(position == 0 ? getColor() : getTextOnBackgroundPrimary()); - holder.mTab2.setTextColor(position == 1 ? getColor() : getTextOnBackgroundPrimary()); - } - }); - - int swatchColor = getSwatchColor(getColor()); - holder.mPalette.init(19, 4, color -> { - holder.mPalette.init(getSwatch(color).length, 4, color2 -> { - setActiveColor(color2); - saveListener.onClick(null); - dialog.dismiss(); - }); - holder.mPalette.drawPalette(getSwatch(color), getColor()); - }); - holder.mPalette.drawPalette(PALETTE, swatchColor); - - if (swatchColor == getColor()) { // If the current theme was set from the RGB picker, show that page instead - holder.mPager.setCurrentItem(1); - } - - - SeekBar.OnSeekBarChangeListener seekListener = new SeekBar.OnSeekBarChangeListener() { - @Override - public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { - int color = getColor(); - color = Color.rgb(seekBar == holder.mRed ? progress : Color.red(color), - seekBar == holder.mGreen ? progress : Color.green(color), - seekBar == holder.mBlue ? progress : Color.blue(color)); - - if (seekBar == holder.mRed) holder.mRedValue.setText(String.valueOf(progress)); - if (seekBar == holder.mGreen) holder.mGreenValue.setText(String.valueOf(progress)); - if (seekBar == holder.mBlue) holder.mBlueValue.setText(String.valueOf(progress)); - - setActiveColor(color); - String colorString = Integer.toHexString(color); - holder.mHex.setTextChangedListenerEnabled(false); - holder.mHex.setText(colorString.substring(colorString.length() > 6 ? colorString.length() - 6 : 0)); - holder.mHex.setTextChangedListenerEnabled(true); - holder.mError.setVisibility(View.INVISIBLE); - } - - @Override - public void onStartTrackingTouch(SeekBar seekBar) { - } - - @Override - public void onStopTrackingTouch(SeekBar seekBar) { - } - }; - - Drawable thumbRed = ContextCompat.getDrawable(mContext, R.drawable.seek_thumb); - Drawable thumbGreen = ContextCompat.getDrawable(mContext, R.drawable.seek_thumb); - Drawable thumbBlue = ContextCompat.getDrawable(mContext, R.drawable.seek_thumb); - LiveViewManager.registerView(QKPreference.THEME, holder.mPreview, key -> { - holder.mPreview.setBackgroundColor(getColor()); - holder.mRed.getProgressDrawable().setColorFilter(getColor(), PorterDuff.Mode.MULTIPLY); - holder.mGreen.getProgressDrawable().setColorFilter(getColor(), PorterDuff.Mode.MULTIPLY); - holder.mBlue.getProgressDrawable().setColorFilter(getColor(), PorterDuff.Mode.MULTIPLY); - if (holder.mPager.getCurrentItem() == 0) { - holder.mTab1.setTextColor(getColor()); - } else { - holder.mTab2.setTextColor(getColor()); - } - }); - - LiveViewManager.registerView(QKPreference.BACKGROUND, holder.mHex, key -> { - holder.mHex.getBackground().setColorFilter(0x22888888, PorterDuff.Mode.MULTIPLY); - holder.mError.setColorFilter(getTextOnBackgroundSecondary(), PorterDuff.Mode.SRC_ATOP); - }); - - holder.mRed.setThumb(thumbRed); - holder.mRed.setOnSeekBarChangeListener(seekListener); - holder.mGreen.setThumb(thumbGreen); - holder.mGreen.setOnSeekBarChangeListener(seekListener); - holder.mBlue.setThumb(thumbBlue); - holder.mBlue.setOnSeekBarChangeListener(seekListener); - - holder.mRed.setProgress(Color.red(getColor())); - holder.mGreen.setProgress(Color.green(getColor())); - holder.mBlue.setProgress(Color.blue(getColor())); - - String colorString = Integer.toHexString(getColor()); - holder.mHex.setText(colorString.substring(colorString.length() > 6 ? colorString.length() - 6 : 0)); - holder.mHex.setOnEditorActionListener((v, actionId, event) -> { - if (actionId == EditorInfo.IME_ACTION_DONE) { - holder.mHex.clearFocus(); - KeyboardUtils.hide(mContext, holder.mHex); - } - return false; - }); - holder.mHex.setTextChangedListener(s -> { - if (s.length() == 6) { - int color = Color.parseColor("#" + s.toString()); - holder.mError.setVisibility(View.INVISIBLE); - if (color != getColor()) { - holder.mRed.setProgress(Color.red(color)); - holder.mGreen.setProgress(Color.green(color)); - holder.mBlue.setProgress(Color.blue(color)); - } - } else { - holder.mError.setVisibility(View.VISIBLE); - } - }); - - dialog.setContext(context) - .setCustomView(view) - .setNegativeButton(R.string.cancel, v -> setActiveColor(getThemeColor())) - .setPositiveButton(R.string.save, saveListener) - .show(); - } - - @TargetApi(Build.VERSION_CODES.LOLLIPOP) - public static void setStatusBarTintEnabled(QKActivity activity, boolean enabled) { - int colorFrom = enabled ? mResources.getColor(R.color.black) : mColor; - int colorTo = enabled ? mColor : mResources.getColor(R.color.black); - - ValueAnimator colorAnimation = ValueAnimator.ofObject(new ArgbEvaluator(), colorFrom, colorTo); - colorAnimation.setDuration(TRANSITION_LENGTH); - colorAnimation.addUpdateListener(animation -> { - activity.getWindow().setStatusBarColor(ColorUtils.darken((Integer) animation.getAnimatedValue())); - }); - colorAnimation.start(); - } - - @TargetApi(Build.VERSION_CODES.LOLLIPOP) - public static void setNavigationBarTintEnabled(QKActivity activity, boolean enabled) { - int colorFrom = enabled ? mResources.getColor(R.color.black) : mColor; - int colorTo = enabled ? mColor : mResources.getColor(R.color.black); - - ValueAnimator colorAnimation = ValueAnimator.ofObject(new ArgbEvaluator(), colorFrom, colorTo); - colorAnimation.setDuration(TRANSITION_LENGTH); - colorAnimation.addUpdateListener(animation -> { - activity.getWindow().setNavigationBarColor(ColorUtils.darken((Integer) animation.getAnimatedValue())); - }); - colorAnimation.start(); - } - - public static String getColorString(int color) { - return String.format("#%08x", color).toUpperCase(); - } - - public static void setColor(QKActivity activity, int color) { - - AnalyticsManager.getInstance().sendEvent( - AnalyticsManager.CATEGORY_PREFERENCE_CHANGE, - SettingsFragment.CATEGORY_THEME, - getColorString(color) - ); - - int colorFrom = mActiveColor; - mColor = color; - mActiveColor = color; - - mPrefs.edit().putString(SettingsFragment.THEME, "" + color).apply(); - - setSentBubbleColored(mPrefs.getBoolean(SettingsFragment.COLOR_SENT, true)); - setReceivedBubbleColored(mPrefs.getBoolean(SettingsFragment.COLOR_RECEIVED, false)); - mTextOnColorPrimary = mResources.getColor(isColorDarkEnough(mColor) ? - R.color.theme_dark_text_primary : R.color.theme_light_text_primary); - mTextOnColorSecondary = mResources.getColor(isColorDarkEnough(mColor) ? - R.color.theme_dark_text_secondary : R.color.theme_light_text_secondary); - - ValueAnimator colorAnimation = ValueAnimator.ofObject(new CIELChEvaluator(colorFrom, color), 0); - colorAnimation.setDuration(TRANSITION_LENGTH); - colorAnimation.setInterpolator(new DecelerateInterpolator()); - colorAnimation.addUpdateListener(animation -> { - setActiveColor((Integer) animation.getAnimatedValue()); - }); - colorAnimation.addListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animation) { - super.onAnimationEnd(animation); - WidgetProvider.notifyThemeChanged(mContext); - } - }); - colorAnimation.start(); - - - if (activity.findViewById(R.id.toolbar_title) != null) { - //final Toolbar toolbar = (Toolbar) mActivity.findViewById(R.id.title); - final QKTextView title = (QKTextView) activity.findViewById(R.id.toolbar_title); - - if (title.getCurrentTextColor() != mTextOnColorPrimary) { - ValueAnimator titleColorAnimation = ValueAnimator.ofObject(new ArgbEvaluator(), title.getCurrentTextColor(), mTextOnColorPrimary); - titleColorAnimation.setDuration(TRANSITION_LENGTH); - titleColorAnimation.setInterpolator(new DecelerateInterpolator()); - titleColorAnimation.addUpdateListener(animation -> { - int color1 = (Integer) animation.getAnimatedValue(); - title.setTextColor(color1); - activity.colorMenuIcons(activity.getMenu(), color1); - }); - titleColorAnimation.start(); - } - } - } - - public static void setActiveColor(int color) { - if (mActiveColor != color) { - mActiveColor = color; - LiveViewManager.refreshViews(QKPreference.THEME); - } - } - - private static boolean isColorDarkEnough(int color) { - for (int i = 0; i < COLORS.length; i++) { - for (int j = 0; j < COLORS[i].length; j++) { - if (color == COLORS[i][j]) { - return TEXT_MODE[i][j] == 1; - } - } - } - - return true; - } - - public static int getSwatchColor(int color) { - for (int i = 0; i < COLORS.length; i++) { - for (int j = 0; j < COLORS[i].length; j++) { - if (color == COLORS[i][j]) { - return PALETTE[i]; - } - } - } - - return color; - } - - private static int[] getSwatch(int color) { - for (int[] swatch : COLORS) { - for (int swatchColor : swatch) { - if (color == swatchColor) { - return swatch; - } - } - } - - return PALETTE; - } - - static class ColorPickerViewHolder { - @Bind(R.id.tab_1) QKTextView mTab1; - @Bind(R.id.tab_2) QKTextView mTab2; - @Bind(R.id.pager) ViewPager mPager; - @Bind(R.id.palette) ColorPickerPalette mPalette; - @Bind(R.id.preview) View mPreview; - @Bind(R.id.red) SeekBar mRed; - @Bind(R.id.red_value) QKTextView mRedValue; - @Bind(R.id.green) SeekBar mGreen; - @Bind(R.id.green_value) QKTextView mGreenValue; - @Bind(R.id.blue) SeekBar mBlue; - @Bind(R.id.blue_value) QKTextView mBlueValue; - @Bind(R.id.hex) QKEditText mHex; - @Bind(R.id.error) ImageView mError; - - public ColorPickerViewHolder(View view) { - ButterKnife.bind(this, view); - } - - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/base/ClickyViewHolder.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/base/ClickyViewHolder.java deleted file mode 100644 index d539191e0..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/base/ClickyViewHolder.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.moez.QKSMS.ui.base; - -import android.support.v7.widget.RecyclerView; -import android.view.View; - -public abstract class ClickyViewHolder<DataType> extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener { - - public RecyclerCursorAdapter.ItemClickListener<DataType> mClickListener; - public DataType mData; - public QKActivity mContext; - - public ClickyViewHolder(QKActivity context, View itemView) { - super(itemView); - mContext = context; - } - - @Override - public void onClick(View v) { - if (mClickListener != null) { - mClickListener.onItemClick(mData, v); - } - } - - @Override - public boolean onLongClick(View v) { - if (mClickListener != null) { - mClickListener.onItemLongClick(mData, v); - } - - return true; - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/base/QKActivity.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/base/QKActivity.java deleted file mode 100644 index 743dd99e2..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/base/QKActivity.java +++ /dev/null @@ -1,311 +0,0 @@ -package com.moez.QKSMS.ui.base; - -import android.app.ActivityManager; -import android.app.ProgressDialog; -import android.content.Intent; -import android.content.SharedPreferences; -import android.content.res.Resources; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.graphics.PorterDuff; -import android.graphics.drawable.Drawable; -import android.os.Build; -import android.os.Bundle; -import android.os.PowerManager; -import android.preference.PreferenceManager; -import android.support.annotation.StringRes; -import android.support.v7.app.AppCompatActivity; -import android.support.v7.widget.Toolbar; -import android.util.Log; -import android.view.Menu; -import android.view.MenuItem; -import android.view.View; -import android.view.ViewGroup; -import android.view.ViewTreeObserver; -import android.widget.ImageView; -import android.widget.Toast; -import com.android.volley.RequestQueue; -import com.moez.QKSMS.QKSMSApp; -import com.moez.QKSMS.R; -import com.moez.QKSMS.common.DialogHelper; -import com.moez.QKSMS.common.DonationManager; -import com.moez.QKSMS.common.LiveViewManager; -import com.moez.QKSMS.common.QKPreferences; -import com.moez.QKSMS.common.utils.ColorUtils; -import com.moez.QKSMS.enums.QKPreference; -import com.moez.QKSMS.ui.ThemeManager; -import com.moez.QKSMS.ui.settings.SettingsActivity; -import com.moez.QKSMS.ui.view.QKTextView; - -import java.util.ArrayList; - -public abstract class QKActivity extends AppCompatActivity { - private final String TAG = "QKActivity"; - - private Toolbar mToolbar; - private QKTextView mTitle; - private ImageView mOverflowButton; - private Menu mMenu; - private ProgressDialog mProgressDialog; - private Bitmap mRecentsIcon; - - protected Resources mRes; - protected SharedPreferences mPrefs; - - private static boolean mStatusTintEnabled = true; - private static boolean mNavigationTintEnabled = false; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - mRes = getResources(); - getPrefs(); // set the preferences if they haven't been set. this method takes care of that logic for us - - mProgressDialog = new ProgressDialog(this); - mProgressDialog.setIndeterminate(true); - mProgressDialog.setCancelable(false); - - LiveViewManager.registerView(QKPreference.TINTED_STATUS, this, key -> { - mStatusTintEnabled = QKPreferences.getBoolean(QKPreference.TINTED_STATUS) && - Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP; - }); - - LiveViewManager.registerView(QKPreference.TINTED_NAV, this, key -> { - mNavigationTintEnabled = QKPreferences.getBoolean(QKPreference.TINTED_NAV) && - Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP; - }); - - if (Build.VERSION.SDK_INT >= 21) { - mRecentsIcon = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher); - LiveViewManager.registerView(QKPreference.THEME, this, key -> { - ActivityManager.TaskDescription taskDesc = new ActivityManager.TaskDescription(getString(R.string.app_name), mRecentsIcon, ThemeManager.getColor()); - setTaskDescription(taskDesc); - }); - } - } - - /** - * Reloads the toolbar and it's view references. - * <p> - * This is called every time the content view of the activity is set, since the - * toolbar is now a part of the activity layout. - * <p> - * TODO: If someone ever wants to manage the Toolbar dynamically instead of keeping it in their - * TODO layout file, we can add an alternate way of setting the toolbar programmatically. - */ - private void reloadToolbar() { - mToolbar = (Toolbar) findViewById(R.id.toolbar); - - if (mToolbar == null) { - throw new RuntimeException("Toolbar not found in BaseActivity layout."); - } else { - mToolbar.setPopupTheme(R.style.PopupTheme); - mTitle = (QKTextView) mToolbar.findViewById(R.id.toolbar_title); - setSupportActionBar(mToolbar); - } - - LiveViewManager.registerView(QKPreference.THEME, this, key -> { - mToolbar.setBackgroundColor(ThemeManager.getColor()); - - if (mStatusTintEnabled) { - getWindow().setStatusBarColor(ColorUtils.darken(ThemeManager.getColor())); - } - if (mNavigationTintEnabled) { - getWindow().setNavigationBarColor(ColorUtils.darken(ThemeManager.getColor())); - } - }); - - LiveViewManager.registerView(QKPreference.BACKGROUND, this, key -> { - setTheme(getThemeRes()); - switch (ThemeManager.getTheme()) { - case LIGHT: - mToolbar.setPopupTheme(R.style.PopupThemeLight); - break; - - case DARK: - case BLACK: - mToolbar.setPopupTheme(R.style.PopupTheme); - break; - } - ((QKTextView) findViewById(R.id.toolbar_title)).setTextColor(ThemeManager.getTextOnColorPrimary()); - }); - } - - protected void showBackButton(boolean show) { - getSupportActionBar().setDisplayHomeAsUpEnabled(show); - } - - public void showProgressDialog() { - mProgressDialog.show(); - } - - public void hideProgressDialog() { - mProgressDialog.hide(); - } - - public SharedPreferences getPrefs() { - if (mPrefs == null) { - mPrefs = PreferenceManager.getDefaultSharedPreferences(this); - } - return mPrefs; - } - - public void colorMenuIcons(Menu menu, int color) { - - // Toolbar navigation icon - Drawable navigationIcon = mToolbar.getNavigationIcon(); - if (navigationIcon != null) { - navigationIcon.setColorFilter(color, PorterDuff.Mode.SRC_ATOP); - mToolbar.setNavigationIcon(navigationIcon); - } - - // Overflow icon - colorOverflowButtonWhenReady(color); - - // Other icons - for (int i = 0; i < menu.size(); i++) { - MenuItem menuItem = menu.getItem(i); - Drawable newIcon = menuItem.getIcon(); - if (newIcon != null) { - newIcon.setColorFilter(color, PorterDuff.Mode.SRC_ATOP); - menuItem.setIcon(newIcon); - } - } - } - - private void colorOverflowButtonWhenReady(final int color) { - if (mOverflowButton != null) { - // We already have the overflow button, so just color it. - Drawable icon = mOverflowButton.getDrawable(); - icon.setColorFilter(color, PorterDuff.Mode.SRC_ATOP); - // Have to clear the image drawable first or else it won't take effect - mOverflowButton.setImageDrawable(null); - mOverflowButton.setImageDrawable(icon); - - } else { - // Otherwise, find the overflow button by searching for the content description. - final String overflowDesc = getString(R.string.abc_action_menu_overflow_description); - final ViewGroup decor = (ViewGroup) getWindow().getDecorView(); - decor.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { - @Override - public boolean onPreDraw() { - decor.getViewTreeObserver().removeOnPreDrawListener(this); - - final ArrayList<View> views = new ArrayList<>(); - decor.findViewsWithText(views, overflowDesc, - View.FIND_VIEWS_WITH_CONTENT_DESCRIPTION); - - if (views.isEmpty()) { - Log.w(TAG, "no views"); - } else { - if (views.get(0) instanceof ImageView) { - mOverflowButton = (ImageView) views.get(0); - colorOverflowButtonWhenReady(color); - } else { - Log.w(TAG, "overflow button isn't an imageview"); - } - } - return false; - } - }); - } - } - - public Menu getMenu() { - return mMenu; - } - - @Override - public boolean onPrepareOptionsMenu(Menu menu) { - // Save a reference to the menu so that we can quickly access menu icons later. - mMenu = menu; - colorMenuIcons(mMenu, ThemeManager.getTextOnColorPrimary()); - return true; - } - - @Override - public void setContentView(int layoutResID) { - super.setContentView(layoutResID); - reloadToolbar(); - } - - @Override - public void setContentView(View view) { - super.setContentView(view); - reloadToolbar(); - } - - @Override - public void setContentView(View view, ViewGroup.LayoutParams params) { - super.setContentView(view, params); - reloadToolbar(); - } - - /** - * Sets the title of the activity, displayed on the toolbar - * <p> - * Make sure this is only called AFTER setContentView, or else the Toolbar - * is likely not initialized yet and this method will do nothing - * - * @param title title of activity - */ - @Override - public void setTitle(CharSequence title) { - super.setTitle(title); - - if (mTitle != null) { - mTitle.setText(title); - } - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case R.id.menu_settings: - startActivity(SettingsActivity.class); - return true; - case R.id.menu_changelog: - DialogHelper.showChangelog(this); - return true; - case R.id.menu_donate: - DonationManager.getInstance(this).showDonateDialog(); - return true; - } - - return super.onOptionsItemSelected(item); - } - - public void startActivity(Class<?> cls) { - Intent intent = new Intent(this, cls); - startActivity(intent); - } - - public boolean isScreenOn() { - PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE); - if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT) { - return powerManager.isInteractive(); - } else { - return powerManager.isScreenOn(); - } - } - - protected int getThemeRes() { - switch (ThemeManager.getTheme()) { - case DARK: - return R.style.AppThemeDark; - - case BLACK: - return R.style.AppThemeDarkAmoled; - } - - return R.style.AppThemeLight; - } - - public void makeToast(@StringRes int message) { - Toast.makeText(this, message, Toast.LENGTH_LONG).show(); - } - - public RequestQueue getRequestQueue() { - return ((QKSMSApp) getApplication()).getRequestQueue(); - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/base/QKFragment.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/base/QKFragment.java deleted file mode 100644 index fce00323b..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/base/QKFragment.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.moez.QKSMS.ui.base; - -import android.app.Activity; -import android.app.Fragment; -import android.os.Bundle; -import android.view.View; -import com.moez.QKSMS.QKSMSApp; -import com.moez.QKSMS.common.LiveViewManager; -import com.moez.QKSMS.enums.QKPreference; -import com.moez.QKSMS.ui.ThemeManager; -import com.squareup.leakcanary.RefWatcher; -import icepick.Icepick; - -public class QKFragment extends Fragment { - - protected QKActivity mContext; - - @Override - public void onAttach(Activity activity) { - super.onAttach(activity); - mContext = (QKActivity) activity; - } - - @Override - public void onViewCreated(View view, Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); - - LiveViewManager.registerView(QKPreference.BACKGROUND, this, key -> { - if (getView() != null) { - getView().setBackgroundColor(ThemeManager.getBackgroundColor()); - } - }); - } - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - Icepick.restoreInstanceState(this, savedInstanceState); - } - - @Override - public void onSaveInstanceState(Bundle outState) { - super.onSaveInstanceState(outState); - Icepick.saveInstanceState(this, outState); - } - - @Override - public void onDestroy() { - super.onDestroy(); - RefWatcher refWatcher = QKSMSApp.getRefWatcher(getActivity()); - refWatcher.watch(this); - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/base/QKPopupActivity.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/base/QKPopupActivity.java deleted file mode 100644 index 52c704400..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/base/QKPopupActivity.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.moez.QKSMS.ui.base; - -import android.content.SharedPreferences; -import android.content.res.Resources; -import android.os.Bundle; -import android.preference.PreferenceManager; -import android.support.v7.widget.AppCompatTextView; -import android.view.View; -import android.view.Window; -import android.view.WindowManager; -import com.moez.QKSMS.R; -import com.moez.QKSMS.ui.ThemeManager; -import com.moez.QKSMS.ui.settings.SettingsFragment; -import com.moez.QKSMS.ui.view.QKLinearLayout; - -public abstract class QKPopupActivity extends QKActivity { - - protected SharedPreferences mPrefs; - protected Resources mRes; - - @Override - protected void onCreate(Bundle savedInstanceState) { - supportRequestWindowFeature(Window.FEATURE_NO_TITLE); - super.onCreate(savedInstanceState); - - mPrefs = PreferenceManager.getDefaultSharedPreferences(this); - mRes = getResources(); - - setFinishOnTouchOutside(mPrefs.getBoolean(SettingsFragment.QUICKREPLY_TAP_DISMISS, true)); - getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND); - setContentView(getLayoutResource()); - - ((QKLinearLayout) findViewById(R.id.popup)).setBackgroundTint(ThemeManager.getBackgroundColor()); - - View title = findViewById(R.id.title); - if (title != null && title instanceof AppCompatTextView) { - title.setVisibility(View.GONE); - } - } - - @Override - protected int getThemeRes() { - switch (ThemeManager.getTheme()) { - case DARK: - return R.style.AppThemeDarkDialog; - - case BLACK: - return R.style.AppThemeDarkAmoledDialog; - } - - return R.style.AppThemeLightDialog; - } - - protected abstract int getLayoutResource(); -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/base/QKSwipeBackActivity.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/base/QKSwipeBackActivity.java deleted file mode 100644 index 4f814965f..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/base/QKSwipeBackActivity.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.moez.QKSMS.ui.base; - -import android.graphics.Color; -import android.graphics.drawable.ColorDrawable; -import android.os.Bundle; -import android.view.LayoutInflater; -import android.view.MenuItem; -import com.moez.QKSMS.R; -import com.moez.QKSMS.ui.SwipeBackLayout; - -public abstract class QKSwipeBackActivity extends QKActivity { - - protected SwipeBackLayout mSwipeBackLayout; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_fragment); - - getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); - getWindow().getDecorView().setBackgroundDrawable(null); - mSwipeBackLayout = (SwipeBackLayout) LayoutInflater.from(this).inflate(R.layout.view_swipeback, null); - - mSwipeBackLayout.setEdgeTrackingEnabled(SwipeBackLayout.EDGE_LEFT); - mSwipeBackLayout.setEnableGesture(true); - - showBackButton(true); - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case android.R.id.home: - onBackPressed(); - return true; - } - - return super.onOptionsItemSelected(item); - } - - @Override - protected void onPostCreate(Bundle savedInstanceState) { - super.onPostCreate(savedInstanceState); - mSwipeBackLayout.attachToActivity(this); - } - - @Override - public void onBackPressed() { - mSwipeBackLayout.scrollToFinishActivity(); - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/base/RecyclerCursorAdapter.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/base/RecyclerCursorAdapter.java deleted file mode 100644 index 5e5828e97..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/base/RecyclerCursorAdapter.java +++ /dev/null @@ -1,142 +0,0 @@ -package com.moez.QKSMS.ui.base; - -import android.database.Cursor; -import android.support.v7.widget.RecyclerView; -import android.view.View; -import com.moez.QKSMS.common.utils.CursorUtils; - -import java.util.HashMap; - -public abstract class RecyclerCursorAdapter<VH extends RecyclerView.ViewHolder, DataType> - extends RecyclerView.Adapter<VH> { - - public interface ItemClickListener<DataType> { - void onItemClick(DataType object, View view); - - void onItemLongClick(DataType object, View view); - } - - public interface MultiSelectListener { - void onMultiSelectStateChanged(boolean enabled); - - void onItemAdded(long id); - - void onItemRemoved(long id); - } - - protected QKActivity mContext; - protected Cursor mCursor; - - public RecyclerCursorAdapter(QKActivity context) { - mContext = context; - } - - protected HashMap<Long, DataType> mSelectedItems = new HashMap<>(); - - protected ItemClickListener<DataType> mItemClickListener; - protected RecyclerCursorAdapter.MultiSelectListener mMultiSelectListener; - - public void setItemClickListener(ItemClickListener<DataType> conversationClickListener) { - mItemClickListener = conversationClickListener; - } - - public void setMultiSelectListener(RecyclerCursorAdapter.MultiSelectListener multiSelectListener) { - mMultiSelectListener = multiSelectListener; - } - - public void changeCursor(Cursor cursor) { - Cursor old = swapCursor(cursor); - if (old != null) { - old.close(); - } - } - - private Cursor swapCursor(Cursor cursor) { - if (mCursor == cursor) { - return null; - } - - Cursor oldCursor = mCursor; - mCursor = cursor; - if (cursor != null) { - notifyDataSetChanged(); - } - return oldCursor; - } - - public Cursor getCursor() { - return mCursor; - } - - public int getCount() { - return mCursor == null ? 0 : mCursor.getCount(); - } - - protected abstract DataType getItem(int position); - - public boolean isInMultiSelectMode() { - return mSelectedItems.size() > 0; - } - - public HashMap<Long, DataType> getSelectedItems() { - return mSelectedItems; - } - - public void disableMultiSelectMode(boolean requestCallback) { - if (isInMultiSelectMode()) { - mSelectedItems.clear(); - notifyDataSetChanged(); - - if (requestCallback && mMultiSelectListener != null) { - mMultiSelectListener.onMultiSelectStateChanged(false); - } - } - } - - public boolean isSelected(long threadId) { - return mSelectedItems.containsKey(threadId); - } - - public void setSelected(long threadId, DataType object) { - if (!mSelectedItems.containsKey(threadId)) { - mSelectedItems.put(threadId, object); - notifyDataSetChanged(); - - if (mMultiSelectListener != null) { - mMultiSelectListener.onItemAdded(threadId); - - if (mSelectedItems.size() == 1) { - mMultiSelectListener.onMultiSelectStateChanged(true); - } - } - } - } - - public void setUnselected(long threadId) { - if (mSelectedItems.containsKey(threadId)) { - mSelectedItems.remove(threadId); - notifyDataSetChanged(); - - if (mMultiSelectListener != null) { - mMultiSelectListener.onItemRemoved(threadId); - - if (mSelectedItems.size() == 0) { - mMultiSelectListener.onMultiSelectStateChanged(false); - } - } - } - } - - public void toggleSelection(long threadId, DataType object) { - if (isSelected(threadId)) { - setUnselected(threadId); - } else { - setSelected(threadId, object); - } - } - - @Override - public int getItemCount() { - return CursorUtils.isValid(mCursor) ? mCursor.getCount() : 0; - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/compose/ComposeActivity.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/compose/ComposeActivity.java deleted file mode 100644 index c5517eb8a..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/compose/ComposeActivity.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.moez.QKSMS.ui.compose; - -import android.app.FragmentManager; -import android.os.Bundle; -import android.view.Menu; -import android.view.MenuInflater; -import android.view.ViewGroup; - -import com.moez.QKSMS.R; -import com.moez.QKSMS.mmssms.Utils; -import com.moez.QKSMS.ui.base.QKSwipeBackActivity; -import com.moez.QKSMS.ui.dialog.DefaultSmsHelper; -import com.moez.QKSMS.ui.dialog.QKDialog; - -public class ComposeActivity extends QKSwipeBackActivity { - - private ComposeFragment mComposeFragment; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setTitle(R.string.title_compose); - - FragmentManager fm = getFragmentManager(); - mComposeFragment = (ComposeFragment) fm.findFragmentByTag(ComposeFragment.TAG); - if (mComposeFragment == null) { - mComposeFragment = new ComposeFragment(); - } - - fm.beginTransaction() - .replace(R.id.content_frame, mComposeFragment, ComposeFragment.TAG) - .commit(); - } - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - new MenuInflater(this).inflate(R.menu.compose, menu); - return super.onCreateOptionsMenu(menu); - } - - @Override - public void onBackPressed() { - // Check if we're not the default SMS app - if (!Utils.isDefaultSmsApp(this)) { - // Ask to become the default SMS app - new DefaultSmsHelper(this, R.string.not_default_send) - .showIfNotDefault((ViewGroup)getWindow().getDecorView().getRootView()); - } else if (mComposeFragment != null && !mComposeFragment.isReplyTextEmpty() - && mComposeFragment.getRecipientAddresses().length == 0) { - // If there is Draft message and no recipients are set - new QKDialog() - .setContext(this) - .setMessage(R.string.discard_message_reason) - .setPositiveButton(R.string.yes, v -> { - super.onBackPressed(); - }) - .setNegativeButton(R.string.cancel, null) - .show(); - } else { - super.onBackPressed(); - } - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/compose/ComposeFragment.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/compose/ComposeFragment.java deleted file mode 100644 index 517201144..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/compose/ComposeFragment.java +++ /dev/null @@ -1,115 +0,0 @@ -package com.moez.QKSMS.ui.compose; - -import android.content.Intent; -import android.os.Bundle; -import android.os.Handler; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.AdapterView; -import com.android.ex.chips.recipientchip.DrawableRecipientChip; -import com.moez.QKSMS.R; -import com.moez.QKSMS.common.utils.KeyboardUtils; -import com.moez.QKSMS.common.utils.PhoneNumberUtils; -import com.moez.QKSMS.interfaces.ActivityLauncher; -import com.moez.QKSMS.interfaces.RecipientProvider; -import com.moez.QKSMS.mmssms.Utils; -import com.moez.QKSMS.ui.base.QKFragment; -import com.moez.QKSMS.ui.messagelist.MessageListActivity; -import com.moez.QKSMS.ui.view.AutoCompleteContactView; -import com.moez.QKSMS.ui.view.ComposeView; -import com.moez.QKSMS.ui.view.StarredContactsView; - -public class ComposeFragment extends QKFragment implements ActivityLauncher, RecipientProvider, - ComposeView.OnSendListener, AdapterView.OnItemClickListener { - - public static final String TAG = "ComposeFragment"; - - private AutoCompleteContactView mRecipients; - private ComposeView mComposeView; - private StarredContactsView mStarredContactsView; - - public ComposeFragment() { - } - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - - View view = inflater.inflate(R.layout.fragment_compose, container, false); - - mRecipients = (AutoCompleteContactView) view.findViewById(R.id.compose_recipients); - mRecipients.setOnItemClickListener(this); - - mComposeView = (ComposeView) view.findViewById(R.id.compose_view); - mComposeView.onOpenConversation(null, null); - mComposeView.setActivityLauncher(this); - mComposeView.setRecipientProvider(this); - mComposeView.setOnSendListener(this); - mComposeView.setLabel("Compose"); - - mStarredContactsView = (StarredContactsView) view.findViewById(R.id.starred_contacts); - mStarredContactsView.setComposeScreenViews(mRecipients, mComposeView); - - new Handler().postDelayed(() -> KeyboardUtils.showAndFocus(mContext, mRecipients), 100); - - return view; - } - - @Override - public void onSend(String[] recipients, String body) { - long threadId = Utils.getOrCreateThreadId(mContext, recipients[0]); - if (threadId != 0) { - mContext.finish(); - MessageListActivity.launch(mContext, threadId, -1, null, true); - } else { - mContext.onBackPressed(); - } - } - - @Override - public void onDestroy() { - super.onDestroy(); - if (mComposeView != null) { - mComposeView.saveDraft(); - } - } - - /** - * @return the addresses of all the contacts in the AutoCompleteContactsView. - */ - @Override - public String[] getRecipientAddresses() { - DrawableRecipientChip[] chips = mRecipients.getRecipients(); - String[] addresses = new String[chips.length]; - - for (int i = 0; i < chips.length; i++) { - addresses[i] = PhoneNumberUtils.stripSeparators(chips[i].getEntry().getDestination()); - } - - return addresses; - } - - /** - * Photo Selection result - */ - @Override - public void onActivityResult(int requestCode, int resultCode, final Intent data) { - if (!mComposeView.onActivityResult(requestCode, resultCode, data)) { - // Wasn't handled by ComposeView - } - } - - @Override - public void onItemClick(AdapterView<?> parent, View view, int position, long id) { - mRecipients.onItemClick(parent, view, position, id); - mStarredContactsView.collapse(); - mComposeView.requestReplyTextFocus(); - } - - public boolean isReplyTextEmpty() { - if (mComposeView != null) { - return mComposeView.isReplyTextEmpty(); - } - return true; - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/conversationlist/ConversationListAdapter.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/conversationlist/ConversationListAdapter.java deleted file mode 100644 index 9f5897a1b..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/conversationlist/ConversationListAdapter.java +++ /dev/null @@ -1,128 +0,0 @@ -package com.moez.QKSMS.ui.conversationlist; - -import android.content.SharedPreferences; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import com.moez.QKSMS.R; -import com.moez.QKSMS.common.ConversationPrefsHelper; -import com.moez.QKSMS.common.FontManager; -import com.moez.QKSMS.common.LiveViewManager; -import com.moez.QKSMS.common.QKPreferences; -import com.moez.QKSMS.common.emoji.EmojiRegistry; -import com.moez.QKSMS.common.utils.DateFormatter; -import com.moez.QKSMS.data.Contact; -import com.moez.QKSMS.data.Conversation; -import com.moez.QKSMS.enums.QKPreference; -import com.moez.QKSMS.ui.ThemeManager; -import com.moez.QKSMS.ui.base.QKActivity; -import com.moez.QKSMS.ui.base.RecyclerCursorAdapter; -import com.moez.QKSMS.ui.settings.SettingsFragment; - -public class ConversationListAdapter extends RecyclerCursorAdapter<ConversationListViewHolder, Conversation> { - - - private final SharedPreferences mPrefs; - - public ConversationListAdapter(QKActivity context) { - super(context); - mPrefs = mContext.getPrefs(); - } - - protected Conversation getItem(int position) { - mCursor.moveToPosition(position); - return Conversation.from(mContext, mCursor); - } - - @Override - public ConversationListViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - LayoutInflater inflater = LayoutInflater.from(mContext); - View view = inflater.inflate(R.layout.list_item_conversation, null); - - ConversationListViewHolder holder = new ConversationListViewHolder(mContext, view); - holder.mutedView.setImageResource(R.drawable.ic_notifications_muted); - holder.unreadView.setImageResource(R.drawable.ic_unread_indicator); - holder.errorIndicator.setImageResource(R.drawable.ic_error); - - LiveViewManager.registerView(QKPreference.THEME, this, key -> { - holder.mutedView.setColorFilter(ThemeManager.getColor()); - holder.unreadView.setColorFilter(ThemeManager.getColor()); - holder.errorIndicator.setColorFilter(ThemeManager.getColor()); - }); - - LiveViewManager.registerView(QKPreference.BACKGROUND, this, key -> { - holder.root.setBackgroundDrawable(ThemeManager.getRippleBackground()); - }); - - return holder; - } - - @Override - public void onBindViewHolder(ConversationListViewHolder holder, int position) { - final Conversation conversation = getItem(position); - - holder.mData = conversation; - holder.mContext = mContext; - holder.mClickListener = mItemClickListener; - holder.root.setOnClickListener(holder); - holder.root.setOnLongClickListener(holder); - - holder.mutedView.setVisibility(new ConversationPrefsHelper(mContext, conversation.getThreadId()) - .getNotificationsEnabled() ? View.GONE : View.VISIBLE); - - holder.errorIndicator.setVisibility(conversation.hasError() ? View.VISIBLE : View.GONE); - - final boolean hasUnreadMessages = conversation.hasUnreadMessages(); - if (hasUnreadMessages) { - holder.unreadView.setVisibility(View.VISIBLE); - holder.snippetView.setTextColor(ThemeManager.getTextOnBackgroundPrimary()); - holder.dateView.setTextColor(ThemeManager.getColor()); - holder.fromView.setType(FontManager.TEXT_TYPE_PRIMARY_BOLD); - holder.snippetView.setMaxLines(5); - } else { - holder.unreadView.setVisibility(View.GONE); - holder.snippetView.setTextColor(ThemeManager.getTextOnBackgroundSecondary()); - holder.dateView.setTextColor(ThemeManager.getTextOnBackgroundSecondary()); - holder.fromView.setType(FontManager.TEXT_TYPE_PRIMARY); - holder.snippetView.setMaxLines(1); - } - - LiveViewManager.registerView(QKPreference.THEME, this, key -> { - holder.dateView.setTextColor(hasUnreadMessages ? ThemeManager.getColor() : ThemeManager.getTextOnBackgroundSecondary()); - }); - - if (isInMultiSelectMode()) { - holder.mSelected.setVisibility(View.VISIBLE); - if (isSelected(conversation.getThreadId())) { - holder.mSelected.setImageResource(R.drawable.ic_selected); - holder.mSelected.setColorFilter(ThemeManager.getColor()); - holder.mSelected.setAlpha(1f); - } else { - holder.mSelected.setImageResource(R.drawable.ic_unselected); - holder.mSelected.setColorFilter(ThemeManager.getTextOnBackgroundSecondary()); - holder.mSelected.setAlpha(0.5f); - } - } else { - holder.mSelected.setVisibility(View.GONE); - } - - LiveViewManager.registerView(QKPreference.HIDE_AVATAR_CONVERSATIONS, this, key -> { - holder.mAvatarView.setVisibility(QKPreferences.getBoolean(QKPreference.HIDE_AVATAR_CONVERSATIONS) ? View.GONE : View.VISIBLE); - }); - - // Date - holder.dateView.setText(DateFormatter.getConversationTimestamp(mContext, conversation.getDate())); - - // Subject - String emojiSnippet = conversation.getSnippet(); - if (mPrefs.getBoolean(SettingsFragment.AUTO_EMOJI, false)) { - emojiSnippet = EmojiRegistry.parseEmojis(emojiSnippet); - } - holder.snippetView.setText(emojiSnippet); - - Contact.addListener(holder); - - // Update the avatar and name - holder.onUpdate(conversation.getRecipients().size() == 1 ? conversation.getRecipients().get(0) : null); - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/conversationlist/ConversationListFragment.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/conversationlist/ConversationListFragment.java deleted file mode 100644 index 99ebd8ee9..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/conversationlist/ConversationListFragment.java +++ /dev/null @@ -1,350 +0,0 @@ -package com.moez.QKSMS.ui.conversationlist; - -import android.app.LoaderManager; -import android.content.Context; -import android.content.CursorLoader; -import android.content.Loader; -import android.content.SharedPreferences; -import android.database.Cursor; -import android.graphics.PorterDuff; -import android.os.Bundle; -import android.preference.PreferenceManager; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; -import android.view.LayoutInflater; -import android.view.Menu; -import android.view.MenuInflater; -import android.view.MenuItem; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ImageView; -import butterknife.Bind; -import butterknife.ButterKnife; -import com.melnykov.fab.FloatingActionButton; -import com.moez.QKSMS.QKSMSApp; -import com.moez.QKSMS.R; -import com.moez.QKSMS.common.BlockedConversationHelper; -import com.moez.QKSMS.common.DialogHelper; -import com.moez.QKSMS.common.LiveViewManager; -import com.moez.QKSMS.common.utils.ColorUtils; -import com.moez.QKSMS.data.Contact; -import com.moez.QKSMS.data.Conversation; -import com.moez.QKSMS.data.ConversationLegacy; -import com.moez.QKSMS.enums.QKPreference; -import com.moez.QKSMS.transaction.SmsHelper; -import com.moez.QKSMS.ui.MainActivity; -import com.moez.QKSMS.ui.ThemeManager; -import com.moez.QKSMS.ui.base.QKFragment; -import com.moez.QKSMS.ui.base.RecyclerCursorAdapter; -import com.moez.QKSMS.ui.compose.ComposeActivity; -import com.moez.QKSMS.ui.dialog.conversationdetails.ConversationDetailsDialog; -import com.moez.QKSMS.ui.messagelist.MessageListActivity; -import com.moez.QKSMS.ui.settings.SettingsFragment; - -import java.util.Observable; -import java.util.Observer; - - -public class ConversationListFragment extends QKFragment implements LoaderManager.LoaderCallbacks<Cursor>, - RecyclerCursorAdapter.ItemClickListener<Conversation>, RecyclerCursorAdapter.MultiSelectListener, Observer { - - public static final String TAG = "ConversationListFragment"; - - @Bind(R.id.empty_state) View mEmptyState; - @Bind(R.id.empty_state_icon) ImageView mEmptyStateIcon; - @Bind(R.id.conversations_list) RecyclerView mRecyclerView; - @Bind(R.id.fab) FloatingActionButton mFab; - - private ConversationListAdapter mAdapter; - private LinearLayoutManager mLayoutManager; - private ConversationDetailsDialog mConversationDetailsDialog; - private SharedPreferences mPrefs; - private MenuItem mBlockedItem; - private boolean mShowBlocked = false; - - private boolean mViewHasLoaded = false; - - // This does not hold the current position of the list, rather the position the list is pending being set to - private int mPosition; - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - mPrefs = PreferenceManager.getDefaultSharedPreferences(mContext); - setHasOptionsMenu(true); - - mAdapter = new ConversationListAdapter(mContext); - mAdapter.setItemClickListener(this); - mAdapter.setMultiSelectListener(this); - mLayoutManager = new LinearLayoutManager(mContext); - mConversationDetailsDialog = new ConversationDetailsDialog(mContext, getFragmentManager()); - - LiveViewManager.registerView(QKPreference.THEME, this, key -> { - if (!mViewHasLoaded) { - return; - } - - mFab.setColorNormal(ThemeManager.getColor()); - mFab.setColorPressed(ColorUtils.lighten(ThemeManager.getColor())); - mFab.getDrawable().setColorFilter(ThemeManager.getTextOnColorPrimary(), PorterDuff.Mode.SRC_ATOP); - - mEmptyStateIcon.setColorFilter(ThemeManager.getTextOnBackgroundPrimary()); - }); - } - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.fragment_conversations, null); - ButterKnife.bind(this, view); - - mEmptyStateIcon.setColorFilter(ThemeManager.getTextOnBackgroundPrimary()); - - mRecyclerView.setHasFixedSize(true); - mRecyclerView.setLayoutManager(mLayoutManager); - mRecyclerView.setAdapter(mAdapter); - - mFab.setColorNormal(ThemeManager.getColor()); - mFab.setColorPressed(ColorUtils.lighten(ThemeManager.getColor())); - mFab.attachToRecyclerView(mRecyclerView); - mFab.setColorFilter(ThemeManager.getTextOnColorPrimary()); - mFab.setOnClickListener(v -> { - if (mAdapter.isInMultiSelectMode()) { - mAdapter.disableMultiSelectMode(true); - } else { - mContext.startActivity(ComposeActivity.class); - } - }); - - mViewHasLoaded = true; - - initLoaderManager(); - BlockedConversationHelper.FutureBlockedConversationObservable.getInstance().addObserver(this); - - return view; - } - - /** - * Returns the weighting for unread vs. read conversations that are selected, to decide - * which options we should show in the multi selction toolbar - */ - private int getUnreadWeight() { - int unreadWeight = 0; - for (Conversation conversation : mAdapter.getSelectedItems().values()) { - unreadWeight += conversation.hasUnreadMessages() ? 1 : -1; - } - return unreadWeight; - } - - /** - * Returns the weighting for blocked vs. unblocked conversations that are selected - */ - private int getBlockedWeight() { - int blockedWeight = 0; - for (Conversation conversation : mAdapter.getSelectedItems().values()) { - blockedWeight += BlockedConversationHelper.isConversationBlocked(mPrefs, conversation.getThreadId()) ? 1 : -1; - } - return blockedWeight; - } - - /** - * Returns whether or not any of the selected conversations have errors - */ - private boolean doSomeHaveErrors() { - for (Conversation conversation : mAdapter.getSelectedItems().values()) { - if (conversation.hasError()) { - return true; - } - } - return false; - } - - public void inflateToolbar(Menu menu, MenuInflater inflater, Context context) { - if (mAdapter.isInMultiSelectMode()) { - inflater.inflate(R.menu.conversations_selection, menu); - mContext.setTitle(getString(R.string.title_conversations_selected, mAdapter.getSelectedItems().size())); - - menu.findItem(R.id.menu_block).setVisible(mPrefs.getBoolean(SettingsFragment.BLOCKED_ENABLED, false)); - - menu.findItem(R.id.menu_mark_read).setIcon(getUnreadWeight() >= 0 ? R.drawable.ic_mark_read : R.drawable.ic_mark_unread); - menu.findItem(R.id.menu_mark_read).setTitle(getUnreadWeight() >= 0 ? R.string.menu_mark_read : R.string.menu_mark_unread); - menu.findItem(R.id.menu_block).setTitle(getBlockedWeight() > 0 ? R.string.menu_unblock_conversations : R.string.menu_block_conversations); - menu.findItem(R.id.menu_delete_failed).setVisible(doSomeHaveErrors()); - } else { - inflater.inflate(R.menu.conversations, menu); - mContext.setTitle(mShowBlocked ? R.string.title_blocked : R.string.title_conversation_list); - - mBlockedItem = menu.findItem(R.id.menu_blocked); - BlockedConversationHelper.bindBlockedMenuItem(mContext, mPrefs, mBlockedItem, mShowBlocked); - } - - super.onCreateOptionsMenu(menu, inflater); - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case R.id.menu_blocked: - setShowingBlocked(!mShowBlocked); - return true; - - case R.id.menu_delete: - DialogHelper.showDeleteConversationsDialog((MainActivity) mContext, mAdapter.getSelectedItems().keySet()); - mAdapter.disableMultiSelectMode(true); - return true; - - case R.id.menu_mark_read: - for (long threadId : mAdapter.getSelectedItems().keySet()) { - if (getUnreadWeight() >= 0) { - new ConversationLegacy(mContext, threadId).markRead(); - } else { - new ConversationLegacy(mContext, threadId).markUnread(); - } - } - mAdapter.disableMultiSelectMode(true); - return true; - - case R.id.menu_block: - for (long threadId : mAdapter.getSelectedItems().keySet()) { - if (getBlockedWeight() > 0) { - BlockedConversationHelper.unblockConversation(mPrefs, threadId); - } else { - BlockedConversationHelper.blockConversation(mPrefs, threadId); - } - } - mAdapter.disableMultiSelectMode(true); - initLoaderManager(); - return true; - - case R.id.menu_delete_failed: - DialogHelper.showDeleteFailedMessagesDialog((MainActivity) mContext, mAdapter.getSelectedItems().keySet()); - mAdapter.disableMultiSelectMode(true); - return true; - - case R.id.menu_done: - mAdapter.disableMultiSelectMode(true); - return true; - } - - return super.onOptionsItemSelected(item); - } - - public boolean isShowingBlocked() { - return mShowBlocked; - } - - public void setShowingBlocked(boolean showBlocked) { - mShowBlocked = showBlocked; - mContext.setTitle(mShowBlocked ? R.string.title_blocked : R.string.title_conversation_list); - BlockedConversationHelper.bindBlockedMenuItem(mContext, mPrefs, mBlockedItem, mShowBlocked); - initLoaderManager(); - } - - @Override - public void onItemClick(Conversation conversation, View view) { - if (mAdapter.isInMultiSelectMode()) { - mAdapter.toggleSelection(conversation.getThreadId(), conversation); - } else { - MessageListActivity.launch(mContext, conversation.getThreadId(), -1, null, true); - } - } - - @Override - public void onItemLongClick(final Conversation conversation, View view) { - mAdapter.toggleSelection(conversation.getThreadId(), conversation); - } - - public void setPosition(int position) { - mPosition = position; - if (mLayoutManager != null && mAdapter != null) { - mLayoutManager.scrollToPosition(Math.min(mPosition, mAdapter.getCount() - 1)); - } - } - - public int getPosition() { - return mLayoutManager.findFirstVisibleItemPosition(); - } - - private void initLoaderManager() { - getLoaderManager().restartLoader(QKSMSApp.LOADER_CONVERSATIONS, null, this); - } - - @Override - public void onDestroy() { - super.onDestroy(); - BlockedConversationHelper.FutureBlockedConversationObservable.getInstance().deleteObserver(this); - - if (null == mRecyclerView) { - return; - } - try { - for (int i = 0; i < mRecyclerView.getChildCount(); i++) { - View child = mRecyclerView.getChildAt(i); - RecyclerView.ViewHolder holder = mRecyclerView.getChildViewHolder(child); - if (holder instanceof ConversationListViewHolder) { - Contact.removeListener((ConversationListViewHolder) holder); - } - } - } catch (Exception ignored) { - // - } - } - - @Override - public Loader<Cursor> onCreateLoader(int id, Bundle args) { - if (id == QKSMSApp.LOADER_CONVERSATIONS) { - return new CursorLoader(mContext, SmsHelper.CONVERSATIONS_CONTENT_PROVIDER, Conversation.ALL_THREADS_PROJECTION, - BlockedConversationHelper.getCursorSelection(mPrefs, mShowBlocked), - BlockedConversationHelper.getBlockedConversationArray(mPrefs), "date DESC"); - } else { - return null; - } - } - - @Override - public void onLoadFinished(Loader<Cursor> loader, Cursor data) { - if (loader.getId() == QKSMSApp.LOADER_CONVERSATIONS) { - if (mAdapter != null) { - // Swap the new cursor in. (The framework will take care of closing the, old cursor once we return.) - mAdapter.changeCursor(data); - if (mPosition != 0) { - mRecyclerView.scrollToPosition(Math.min(mPosition, data.getCount() - 1)); - mPosition = 0; - } - } - - mEmptyState.setVisibility(data != null && data.getCount() > 0 ? View.GONE : View.VISIBLE); - } - } - - @Override - public void onLoaderReset(Loader<Cursor> loader) { - if (mAdapter != null && loader.getId() == QKSMSApp.LOADER_CONVERSATIONS) { - mAdapter.changeCursor(null); - } - } - - @Override - public void onMultiSelectStateChanged(boolean enabled) { - mContext.invalidateOptionsMenu(); - mFab.setImageResource(enabled ? R.drawable.ic_accept : R.drawable.ic_add); - } - - @Override - public void onItemAdded(long id) { - mContext.invalidateOptionsMenu(); - } - - @Override - public void onItemRemoved(long id) { - mContext.invalidateOptionsMenu(); - } - - /** - * This should be called when there's a future blocked conversation, and it's received - */ - @Override - public void update(Observable observable, Object data) { - initLoaderManager(); - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/conversationlist/ConversationListViewHolder.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/conversationlist/ConversationListViewHolder.java deleted file mode 100644 index f065c4e91..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/conversationlist/ConversationListViewHolder.java +++ /dev/null @@ -1,114 +0,0 @@ -package com.moez.QKSMS.ui.conversationlist; - -import android.content.SharedPreferences; -import android.graphics.drawable.Drawable; -import android.text.Spannable; -import android.text.SpannableStringBuilder; -import android.text.style.ForegroundColorSpan; -import android.view.View; -import android.widget.ImageView; -import com.moez.QKSMS.R; -import com.moez.QKSMS.data.Contact; -import com.moez.QKSMS.data.Conversation; -import com.moez.QKSMS.data.ConversationLegacy; -import com.moez.QKSMS.ui.ThemeManager; -import com.moez.QKSMS.ui.base.ClickyViewHolder; -import com.moez.QKSMS.ui.base.QKActivity; -import com.moez.QKSMS.ui.settings.SettingsFragment; -import com.moez.QKSMS.ui.view.AvatarView; -import com.moez.QKSMS.ui.view.QKTextView; - -public class ConversationListViewHolder extends ClickyViewHolder<Conversation> implements Contact.UpdateListener { - - private final SharedPreferences mPrefs; - - protected View root; - protected QKTextView snippetView; - protected QKTextView fromView; - protected QKTextView dateView; - protected ImageView mutedView; - protected ImageView unreadView; - protected ImageView errorIndicator; - protected AvatarView mAvatarView; - protected ImageView mSelected; - - public ConversationListViewHolder(QKActivity context, View view) { - super(context, view); - mPrefs = mContext.getPrefs(); - - root = view; - fromView = (QKTextView) view.findViewById(R.id.conversation_list_name); - snippetView = (QKTextView) view.findViewById(R.id.conversation_list_snippet); - dateView = (QKTextView) view.findViewById(R.id.conversation_list_date); - mutedView = (ImageView) view.findViewById(R.id.conversation_list_muted); - unreadView = (ImageView) view.findViewById(R.id.conversation_list_unread); - errorIndicator = (ImageView) view.findViewById(R.id.conversation_list_error); - mAvatarView = (AvatarView) view.findViewById(R.id.conversation_list_avatar); - mSelected = (ImageView) view.findViewById(R.id.selected); - } - - @Override - public void onUpdate(final Contact updated) { - boolean shouldUpdate = true; - final Drawable drawable; - final String name; - - if (mData.getRecipients().size() == 1) { - Contact contact = mData.getRecipients().get(0); - if (contact.getNumber().equals(updated.getNumber())) { - drawable = contact.getAvatar(mContext, null); - name = contact.getName(); - - if (contact.existsInDatabase()) { - mAvatarView.assignContactUri(contact.getUri()); - } else { - mAvatarView.assignContactFromPhone(contact.getNumber(), true); - } - } else { - // onUpdate was called because *some* contact was loaded, but it wasn't the contact for this - // conversation, and thus we shouldn't update the UI because we won't be able to set the correct data - drawable = null; - name = ""; - shouldUpdate = false; - } - } else if (mData.getRecipients().size() > 1) { - drawable = null; - name = "" + mData.getRecipients().size(); - mAvatarView.assignContactUri(null); - } else { - drawable = null; - name = "#"; - mAvatarView.assignContactUri(null); - } - - final ConversationLegacy conversationLegacy = new ConversationLegacy(mContext, mData.getThreadId()); - - if (shouldUpdate) { - mContext.runOnUiThread(() -> { - mAvatarView.setImageDrawable(drawable); - mAvatarView.setContactName(name); - fromView.setText(formatMessage(mData, conversationLegacy)); - }); - } - } - - private CharSequence formatMessage(Conversation conversation, ConversationLegacy conversationLegacy) { - String from = conversation.getRecipients().formatNames(", "); - - SpannableStringBuilder buf = new SpannableStringBuilder(from); - - if (conversation.getMessageCount() > 1 && mPrefs.getBoolean(SettingsFragment.MESSAGE_COUNT, false)) { - int before = buf.length(); - buf.append(mContext.getResources().getString(R.string.message_count_format, conversation.getMessageCount())); - buf.setSpan(new ForegroundColorSpan(mContext.getResources().getColor(R.color.grey_light)), before, buf.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE); - } - if (conversationLegacy.hasDraft()) { - buf.append(mContext.getResources().getString(R.string.draft_separator)); - int before = buf.length(); - buf.append(mContext.getResources().getString(R.string.has_draft)); - buf.setSpan(new ForegroundColorSpan(ThemeManager.getColor()), before, buf.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE); - } - - return buf; - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/delivery/DeliveryReportHelper.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/delivery/DeliveryReportHelper.java deleted file mode 100644 index d2e105963..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/delivery/DeliveryReportHelper.java +++ /dev/null @@ -1,330 +0,0 @@ -/* - * Copyright (C) 2008 Esmertec AG. - * Copyright (C) 2008 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.moez.QKSMS.ui.delivery; - -import android.content.Context; -import android.database.Cursor; -import android.database.sqlite.SqliteWrapper; -import android.net.Uri; -import android.provider.Telephony.Mms; -import android.provider.Telephony.Sms; -import android.telephony.PhoneNumberUtils; -import android.text.TextUtils; -import android.util.Log; -import com.google.android.mms.pdu_alt.PduHeaders; -import com.moez.QKSMS.R; -import com.moez.QKSMS.common.utils.MessageUtils; -import com.moez.QKSMS.transaction.SmsHelper; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; - -/** - * This is the UI for displaying a delivery report: - * - * This activity can handle the following parameters from the intent - * by which it is launched: - * - * thread_id long The id of the conversation from which to get the recipients - * for the report. - * message_id long The id of the message about which a report should be displayed. - * message_type String The type of message (Sms or Mms). This is used in - * conjunction with the message id to retrive the particular message that - * the report will be about. - */ -public class DeliveryReportHelper { - private static final String LOG_TAG = "DeliveryReportActivity"; - - static final String[] MMS_REPORT_REQUEST_PROJECTION = new String[] { - Mms.Addr.ADDRESS, //0 - Mms.DELIVERY_REPORT, //1 - Mms.READ_REPORT //2 - }; - - static final String[] MMS_REPORT_STATUS_PROJECTION = new String[] { - Mms.Addr.ADDRESS, //0 - "delivery_status", //1 - "read_status" //2 - }; - - static final String[] SMS_REPORT_STATUS_PROJECTION = new String[] { - Sms.ADDRESS, //0 - Sms.STATUS, //1 - Sms.DATE_SENT, //2 - Sms.TYPE //3 - }; - - // These indices must sync up with the projections above. - static final int COLUMN_RECIPIENT = 0; - static final int COLUMN_DELIVERY_REPORT = 1; - static final int COLUMN_READ_REPORT = 2; - static final int COLUMN_DELIVERY_STATUS = 1; - static final int COLUMN_READ_STATUS = 2; - static final int COLUMN_DATE_SENT = 2; - static final int COLUMN_MESSAGE_TYPE = 3; - - private Context mContext; - private long mMessageId; - private String mMessageType; - - public DeliveryReportHelper(Context context, long messageId, String messageType) { - mContext = context; - mMessageId = messageId; - mMessageType = messageType; - } - - public List<DeliveryReportItem> getListItems() { - List<DeliveryReportItem> items = getReportItems(); - if (items == null) { - items = new ArrayList<>(1); - items.add(new DeliveryReportItem("", mContext.getString(R.string.status_none), null)); - Log.w(LOG_TAG, "cursor == null"); - } - return items; - } - - private List<DeliveryReportItem> getReportItems() { - if (mMessageType.equals("sms")) { - return getSmsReportItems(); - } else { - return getMmsReportItems(); - } - } - - private List<DeliveryReportItem> getSmsReportItems() { - String selection = "_id = " + mMessageId; - Cursor c = SqliteWrapper.query(mContext, mContext.getContentResolver(), Sms.CONTENT_URI, - SMS_REPORT_STATUS_PROJECTION, selection, null, null); - if (c == null) { - return null; - } - - try { - if (c.getCount() <= 0) { - return null; - } - - List<DeliveryReportItem> items = new ArrayList<>(); - while (c.moveToNext()) { - // For sent messages with delivery reports, we stick the delivery time in the - // date_sent column (see MessageStatusReceiver). - String deliveryDateString = null; - long deliveryDate = c.getLong(COLUMN_DATE_SENT); - int messageType = c.getInt(COLUMN_MESSAGE_TYPE); - if (messageType == Sms.MESSAGE_TYPE_SENT && deliveryDate > 0) { - deliveryDateString = mContext.getString(R.string.delivered_label) + - MessageUtils.formatTimeStampString(mContext, deliveryDate, true); - } - - items.add(new DeliveryReportItem( - mContext.getString(R.string.recipient_label) + c.getString(COLUMN_RECIPIENT), - mContext.getString(R.string.status_label) + - getSmsStatusText(c.getInt(COLUMN_DELIVERY_STATUS)), - deliveryDateString)); - } - return items; - } finally { - c.close(); - } - } - - private String getMmsReportStatusText( - MmsReportRequest request, - Map<String, MmsReportStatus> reportStatus) { - if (reportStatus == null) { - // haven't received any reports. - return mContext.getString(R.string.status_pending); - } - - String recipient = request.getRecipient(); - recipient = (SmsHelper.isEmailAddress(recipient))? - SmsHelper.extractAddrSpec(recipient): PhoneNumberUtils.stripSeparators(recipient); - MmsReportStatus status = queryStatusByRecipient(reportStatus, recipient); - if (status == null) { - // haven't received any reports. - return mContext.getString(R.string.status_pending); - } - - if (request.isReadReportRequested()) { - if (status.readStatus != 0) { - switch (status.readStatus) { - case PduHeaders.READ_STATUS_READ: - return mContext.getString(R.string.status_read); - case PduHeaders.READ_STATUS__DELETED_WITHOUT_BEING_READ: - return mContext.getString(R.string.status_unread); - } - } - } - - switch (status.deliveryStatus) { - case 0: // No delivery report received so far. - return mContext.getString(R.string.status_pending); - case PduHeaders.STATUS_FORWARDED: - case PduHeaders.STATUS_RETRIEVED: - return mContext.getString(R.string.status_received); - case PduHeaders.STATUS_REJECTED: - return mContext.getString(R.string.status_rejected); - default: - return mContext.getString(R.string.status_failed); - } - } - - private static MmsReportStatus queryStatusByRecipient( - Map<String, MmsReportStatus> status, String recipient) { - Set<String> recipientSet = status.keySet(); - for (String r : recipientSet) { - if (SmsHelper.isEmailAddress(recipient)) { - if (TextUtils.equals(r, recipient)) { - return status.get(r); - } - } else if (PhoneNumberUtils.compare(r, recipient)) { - return status.get(r); - } - } - return null; - } - - private List<DeliveryReportItem> getMmsReportItems() { - List<MmsReportRequest> reportReqs = getMmsReportRequests(); - if (null == reportReqs) { - return null; - } - - if (reportReqs.isEmpty()) { - return null; - } - - Map<String, MmsReportStatus> reportStatus = getMmsReportStatus(); - List<DeliveryReportItem> items = new ArrayList<>(); - for (MmsReportRequest reportReq : reportReqs) { - String statusText = mContext.getString(R.string.status_label) + getMmsReportStatusText(reportReq, reportStatus); - items.add(new DeliveryReportItem(mContext.getString(R.string.recipient_label) + reportReq.getRecipient(), statusText, null)); - } - return items; - } - - private Map<String, MmsReportStatus> getMmsReportStatus() { - Uri uri = Uri.withAppendedPath(Mms.REPORT_STATUS_URI, - String.valueOf(mMessageId)); - Cursor c = SqliteWrapper.query(mContext, mContext.getContentResolver(), uri, - MMS_REPORT_STATUS_PROJECTION, null, null, null); - - if (c == null) { - return null; - } - - try { - Map<String, MmsReportStatus> statusMap = new HashMap<>(); - - while (c.moveToNext()) { - String recipient = c.getString(COLUMN_RECIPIENT); - recipient = (SmsHelper.isEmailAddress(recipient))? - SmsHelper.extractAddrSpec(recipient): - PhoneNumberUtils.stripSeparators(recipient); - MmsReportStatus status = new MmsReportStatus( - c.getInt(COLUMN_DELIVERY_STATUS), - c.getInt(COLUMN_READ_STATUS)); - statusMap.put(recipient, status); - } - return statusMap; - } finally { - c.close(); - } - } - - private List<MmsReportRequest> getMmsReportRequests() { - Uri uri = Uri.withAppendedPath(Mms.REPORT_REQUEST_URI, - String.valueOf(mMessageId)); - Cursor c = SqliteWrapper.query(mContext, mContext.getContentResolver(), uri, - MMS_REPORT_REQUEST_PROJECTION, null, null, null); - - if (c == null) { - return null; - } - - try { - if (c.getCount() <= 0) { - return null; - } - - List<MmsReportRequest> reqList = new ArrayList<>(); - while (c.moveToNext()) { - reqList.add(new MmsReportRequest( - c.getString(COLUMN_RECIPIENT), - c.getInt(COLUMN_DELIVERY_REPORT), - c.getInt(COLUMN_READ_REPORT))); - } - return reqList; - } finally { - c.close(); - } - } - - private String getSmsStatusText(int status) { - if (status == Sms.STATUS_NONE) { - // No delivery report requested - return mContext.getString(R.string.status_none); - } else if (status >= Sms.STATUS_FAILED) { - // Failure - return mContext.getString(R.string.status_failed); - } else if (status >= Sms.STATUS_PENDING) { - // Pending - return mContext.getString(R.string.status_pending); - } else { - // Success - return mContext.getString(R.string.status_received); - } - } - - private static final class MmsReportStatus { - final int deliveryStatus; - final int readStatus; - - public MmsReportStatus(int drStatus, int rrStatus) { - deliveryStatus = drStatus; - readStatus = rrStatus; - } - } - - private static final class MmsReportRequest { - private final String mRecipient; - private final boolean mIsDeliveryReportRequsted; - private final boolean mIsReadReportRequested; - - public MmsReportRequest(String recipient, int drValue, int rrValue) { - mRecipient = recipient; - mIsDeliveryReportRequsted = drValue == PduHeaders.VALUE_YES; - mIsReadReportRequested = rrValue == PduHeaders.VALUE_YES; - } - - public String getRecipient() { - return mRecipient; - } - - public boolean isDeliveryReportRequested() { - return mIsDeliveryReportRequsted; - } - - public boolean isReadReportRequested() { - return mIsReadReportRequested; - } - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/delivery/DeliveryReportItem.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/delivery/DeliveryReportItem.java deleted file mode 100644 index 621b6026a..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/delivery/DeliveryReportItem.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (C) 2008 Esmertec AG. - * Copyright (C) 2008 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.moez.QKSMS.ui.delivery; - -/** - * This object holds information used by the DeliveryReportAdapter to create - * DeliveryReportListItems. - */ -public class DeliveryReportItem { - public String recipient; - public String status; - public String deliveryDate; - - public DeliveryReportItem(String recipient, String status, String deliveryDate) { - this.recipient = recipient; - this.status = status; - this.deliveryDate = deliveryDate; - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/dialog/AsyncDialog.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/dialog/AsyncDialog.java deleted file mode 100644 index 89e164a0c..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/dialog/AsyncDialog.java +++ /dev/null @@ -1,162 +0,0 @@ -/* - * Copyright (C) 2012 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.moez.QKSMS.ui.dialog; - -import android.app.Activity; -import android.app.ProgressDialog; -import android.os.AsyncTask; -import android.os.Handler; - - -/** - * This AsyncDialog class is used to execute a runnable in a background thread and once that - * finishes, execute a runnable on the UI thread. If the background runnable task takes longer - * than half a second, a progress modal dialog is displayed. - * - */ -public class AsyncDialog { - private ProgressDialog mProgressDialog; - private final Activity mActivity; - private final Handler mHandler; - - public AsyncDialog(Activity activity) { - mActivity = activity; - mHandler = new Handler(); - } - - /** - * Asynchronously executes a task while blocking the UI with a progress spinner. - * - * Must be invoked by the UI thread. No exceptions! - * - * @param backgroundTask the work to be done in the background wrapped in a Runnable - * @param postExecuteTask an optional runnable to run on the UI thread when the background - * runnable is finished - * @param dialogStringId the id of the string to be shown in the dialog - */ - public void runAsync(final Runnable backgroundTask, - final Runnable postExecuteTask, final int dialogStringId) { - new ModalDialogAsyncTask(dialogStringId, postExecuteTask) - .execute(new Runnable[] {backgroundTask}); - } - - // Shows the activity's progress spinner. Should be canceled if exiting the activity. - private Runnable mShowProgressDialogRunnable = new Runnable() { - @Override - public void run() { - if (mProgressDialog != null) { - mProgressDialog.show(); - } - } - }; - - public void clearPendingProgressDialog() { - // remove any callback to display a progress spinner - mHandler.removeCallbacks(mShowProgressDialogRunnable); - // clear the dialog so any pending dialog.dismiss() call can be avoided - mProgressDialog = null; - } - - /** - * Asynchronously performs tasks specified by Runnables. - * Displays a progress spinner while the tasks are running. The progress spinner - * will only show if tasks have not finished after a certain amount of time. - * - * This AsyncTask must be instantiated and invoked on the UI thread. - * - * TODO: Need to implement a way for the background thread to pass a result to - * the onPostExecute thread. AsyncTask already provides this functionality. - */ - private class ModalDialogAsyncTask extends AsyncTask<Runnable, Void, Void> { - final Runnable mPostExecuteTask; - - /** - * Creates the Task with the specified string id to be shown in the dialog - */ - public ModalDialogAsyncTask(int dialogStringId, - final Runnable postExecuteTask) { - mPostExecuteTask = postExecuteTask; - // lazy initialization of progress dialog for loading attachments - if (mProgressDialog == null) { - mProgressDialog = createProgressDialog(); - } - mProgressDialog.setMessage(mActivity.getText(dialogStringId)); - } - - /** - * Initializes the progress dialog with its intended settings. - */ - private ProgressDialog createProgressDialog() { - ProgressDialog dialog = new ProgressDialog(mActivity); - dialog.setIndeterminate(true); - dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); - dialog.setCanceledOnTouchOutside(false); - dialog.setCancelable(false); - return dialog; - } - - /** - * Activates a progress spinner on the UI. This assumes the UI has invoked this Task. - */ - @Override - protected void onPreExecute() { - // activate spinner after half a second - mHandler.postDelayed(mShowProgressDialogRunnable, 500); - } - - /** - * Perform the specified Runnable tasks on a background thread - */ - @Override - protected Void doInBackground(Runnable... params) { - if (params != null) { - try { - for (int i = 0; i < params.length; i++) { - params[i].run(); - } - - // Test code. Uncomment this block to test the progress dialog popping up. -// try { -// Thread.sleep(2000); -// } catch (Exception e) { -// } - } finally { - // Cancel pending display of the progress bar if the background task has - // finished before the progress bar has popped up. - mHandler.removeCallbacks(mShowProgressDialogRunnable); - } - } - return null; - } - - /** - * Deactivates the progress spinner on the UI. This assumes the UI has invoked this Task. - */ - @Override - protected void onPostExecute(Void result) { - if (mActivity.isFinishing()) { - return; - } - if (mProgressDialog != null && mProgressDialog.isShowing()) { - mProgressDialog.dismiss(); - } - if (mPostExecuteTask != null) { - mPostExecuteTask.run(); - } - } - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/dialog/BlockedNumberDialog.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/dialog/BlockedNumberDialog.java deleted file mode 100644 index e3bdb4bc0..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/dialog/BlockedNumberDialog.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.moez.QKSMS.ui.dialog; - -import android.content.SharedPreferences; -import android.preference.PreferenceManager; -import android.view.View; -import android.widget.AdapterView; -import android.widget.TextView; -import com.moez.QKSMS.R; -import com.moez.QKSMS.common.BlockedConversationHelper; -import com.moez.QKSMS.ui.base.QKActivity; -import com.moez.QKSMS.ui.view.QKEditText; - -import java.util.Set; - -public class BlockedNumberDialog { - - public static void showDialog(final QKActivity context) { - final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); - Set<String> addresses = BlockedConversationHelper.getFutureBlockedConversations(prefs); - - new QKDialog() - .setContext(context) - .setTitle(R.string.pref_block_future) - .setItems(addresses.toArray(new String[addresses.size()]), new AdapterView.OnItemClickListener() { - @Override - public void onItemClick(AdapterView<?> parent, final View view, int position, long id) { - new QKDialog() - .setContext(context) - .setTitle(R.string.title_unblock_address) - .setMessage(((TextView) view).getText().toString()) - .setPositiveButton(R.string.yes, new View.OnClickListener() { - @Override - public void onClick(View v) { - BlockedConversationHelper.unblockFutureConversation(prefs, ((TextView) view).getText().toString()); - } - }) - .setNegativeButton(R.string.cancel, null) - .show(); - } - }) - .setPositiveButton(R.string.add, new View.OnClickListener() { - @Override - public void onClick(View v) { - final QKEditText editText = new QKEditText(context); - new QKDialog() - .setContext(context) - .setTitle(R.string.title_block_address) - .setCustomView(editText) - .setPositiveButton(R.string.add, new View.OnClickListener() { - @Override - public void onClick(View v) { - if (editText.getText().length() > 0) { - BlockedConversationHelper.blockFutureConversation(prefs, editText.getText().toString()); - } - } - }) - .setNegativeButton(R.string.cancel, null) - .show(); - } - }) - .setNegativeButton(R.string.cancel, null) - .show(); - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/dialog/BubblePreferenceDialog.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/dialog/BubblePreferenceDialog.java deleted file mode 100644 index 5399f5624..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/dialog/BubblePreferenceDialog.java +++ /dev/null @@ -1,107 +0,0 @@ -package com.moez.QKSMS.ui.dialog; - -import android.app.Dialog; -import android.content.SharedPreferences; -import android.graphics.PorterDuff; -import android.os.Bundle; -import android.preference.Preference; -import android.preference.PreferenceManager; -import android.util.Log; -import android.view.View; -import android.widget.LinearLayout; -import com.moez.QKSMS.R; -import com.moez.QKSMS.ui.ThemeManager; -import com.moez.QKSMS.ui.settings.SettingsFragment; -import com.moez.QKSMS.ui.view.QKSwitchPreference; -import com.moez.QKSMS.ui.view.QKTextView; - -public class BubblePreferenceDialog extends QKDialog { - private static final String TAG = "BubblePreferenceDialog"; - - @Override - public Dialog onCreateDialog(Bundle savedInstanceState) { - - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(mContext); - mResources = mContext.getResources(); - - View view = mContext.getLayoutInflater().inflate(R.layout.dialog_bubbles, null); - - final QKTextView in1 = (QKTextView) view.findViewById(R.id.in_1); - in1.setBackgroundResource(ThemeManager.getReceivedBubbleRes()); - in1.getBackground().setColorFilter(ThemeManager.getReceivedBubbleColor(), PorterDuff.Mode.SRC_ATOP); - in1.setOnColorBackground(ThemeManager.getReceivedBubbleColor() == ThemeManager.getColor()); - - final QKTextView in2 = (QKTextView) view.findViewById(R.id.in_2); - in2.setBackgroundResource(ThemeManager.getReceivedBubbleAltRes()); - in2.getBackground().setColorFilter(ThemeManager.getReceivedBubbleColor(), PorterDuff.Mode.SRC_ATOP); - in2.setOnColorBackground(ThemeManager.getReceivedBubbleColor() == ThemeManager.getColor()); - - final QKTextView out1 = (QKTextView) view.findViewById(R.id.out_1); - out1.setBackgroundResource(ThemeManager.getSentBubbleRes()); - out1.getBackground().setColorFilter(ThemeManager.getSentBubbleColor(), PorterDuff.Mode.SRC_ATOP); - out1.setOnColorBackground(ThemeManager.getSentBubbleColor() == ThemeManager.getColor()); - - final QKTextView out2 = (QKTextView) view.findViewById(R.id.out_2); - out2.setBackgroundResource(ThemeManager.getSentBubbleAltRes()); - out2.getBackground().setColorFilter(ThemeManager.getSentBubbleColor(), PorterDuff.Mode.SRC_ATOP); - out2.setOnColorBackground(ThemeManager.getSentBubbleColor() == ThemeManager.getColor()); - - Preference.OnPreferenceClickListener onPreferenceClickListener = new Preference.OnPreferenceClickListener() { - @Override - public boolean onPreferenceClick(Preference preference) { - Log.d(TAG, preference.getKey()); - switch (preference.getKey()) { - case SettingsFragment.BUBBLES_NEW: - ThemeManager.setBubbleStyleNew(((QKSwitchPreference) preference).isChecked()); - in1.setBackgroundResource(ThemeManager.getReceivedBubbleRes()); - in1.getBackground().setColorFilter(ThemeManager.getReceivedBubbleColor(), PorterDuff.Mode.SRC_ATOP); - in1.setOnColorBackground(ThemeManager.getReceivedBubbleColor() == ThemeManager.getColor()); - - in2.setBackgroundResource(ThemeManager.getReceivedBubbleAltRes()); - in2.getBackground().setColorFilter(ThemeManager.getReceivedBubbleColor(), PorterDuff.Mode.SRC_ATOP); - in2.setOnColorBackground(ThemeManager.getReceivedBubbleColor() == ThemeManager.getColor()); - - out1.setBackgroundResource(ThemeManager.getSentBubbleRes()); - out1.getBackground().setColorFilter(ThemeManager.getSentBubbleColor(), PorterDuff.Mode.SRC_ATOP); - out1.setOnColorBackground(ThemeManager.getSentBubbleColor() == ThemeManager.getColor()); - - out2.setBackgroundResource(ThemeManager.getSentBubbleAltRes()); - out2.getBackground().setColorFilter(ThemeManager.getSentBubbleColor(), PorterDuff.Mode.SRC_ATOP); - out2.setOnColorBackground(ThemeManager.getSentBubbleColor() == ThemeManager.getColor()); - return true; - - case SettingsFragment.COLOR_RECEIVED: - ThemeManager.setReceivedBubbleColored(((QKSwitchPreference) preference).isChecked()); - in1.getBackground().setColorFilter(ThemeManager.getReceivedBubbleColor(), PorterDuff.Mode.SRC_ATOP); - in1.setOnColorBackground(ThemeManager.getReceivedBubbleColor() == ThemeManager.getColor()); - in2.getBackground().setColorFilter(ThemeManager.getReceivedBubbleColor(), PorterDuff.Mode.SRC_ATOP); - in2.setOnColorBackground(ThemeManager.getReceivedBubbleColor() == ThemeManager.getColor()); - return true; - - case SettingsFragment.COLOR_SENT: - ThemeManager.setSentBubbleColored(((QKSwitchPreference) preference).isChecked()); - out1.getBackground().setColorFilter(ThemeManager.getSentBubbleColor(), PorterDuff.Mode.SRC_ATOP); - out1.setOnColorBackground(ThemeManager.getSentBubbleColor() == ThemeManager.getColor()); - out2.getBackground().setColorFilter(ThemeManager.getSentBubbleColor(), PorterDuff.Mode.SRC_ATOP); - out2.setOnColorBackground(ThemeManager.getSentBubbleColor() == ThemeManager.getColor()); - return true; - } - return false; - } - }; - - LinearLayout prefsLayout = (LinearLayout) view.findViewById(R.id.prefs); - prefsLayout.addView(new QKSwitchPreference(mContext, onPreferenceClickListener, SettingsFragment.BUBBLES_NEW, - prefs, true, R.string.pref_bubble_style_new, 0).getView()); - prefsLayout.addView(new QKSwitchPreference(mContext, onPreferenceClickListener, SettingsFragment.COLOR_RECEIVED, - prefs, false, R.string.pref_color_received, 0).getView()); - prefsLayout.addView(new QKSwitchPreference(mContext, onPreferenceClickListener, SettingsFragment.COLOR_SENT, - prefs, true, R.string.pref_color_sent, 0).getView()); - - setTitle(R.string.pref_bubbles); - setCustomView(view); - setPositiveButton(R.string.okay, null); - - return super.onCreateDialog(savedInstanceState); - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/dialog/ColorPickerPagerAdapter.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/dialog/ColorPickerPagerAdapter.java deleted file mode 100644 index 0eacfa771..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/dialog/ColorPickerPagerAdapter.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.moez.QKSMS.ui.dialog; - -import android.support.v4.view.PagerAdapter; -import android.view.View; -import android.view.ViewGroup; -import com.moez.QKSMS.R; -import com.moez.QKSMS.ui.base.QKActivity; - -public class ColorPickerPagerAdapter extends PagerAdapter { - - private QKActivity mContext; - - public ColorPickerPagerAdapter(QKActivity context) { - mContext = context; - } - - public Object instantiateItem(ViewGroup collection, int position) { - int resId = 0; - switch (position) { - case 0: - resId = R.id.palette; - break; - - case 1: - resId = R.id.rgb; - break; - } - - return collection.findViewById(resId); - } - - @Override - public CharSequence getPageTitle(int position) { - int resId = 0; - switch (position) { - case 0: - resId = R.string.title_palette; - break; - - case 1: - resId = R.string.title_rgb; - break; - } - - return mContext.getString(resId); - } - - @Override - public int getCount() { - return 2; - } - - @Override - public boolean isViewFromObject(View arg0, Object arg1) { - return arg0 == ((View) arg1); - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/dialog/ConversationSettingsDialog.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/dialog/ConversationSettingsDialog.java deleted file mode 100644 index 2e0a5216a..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/dialog/ConversationSettingsDialog.java +++ /dev/null @@ -1,142 +0,0 @@ -package com.moez.QKSMS.ui.dialog; - -import android.app.Dialog; -import android.content.Intent; -import android.content.res.Resources; -import android.media.RingtoneManager; -import android.net.Uri; -import android.os.Bundle; -import android.preference.Preference; -import android.text.TextUtils; -import android.view.ViewGroup; -import android.widget.LinearLayout; - -import com.moez.QKSMS.R; -import com.moez.QKSMS.common.ConversationPrefsHelper; -import com.moez.QKSMS.common.utils.Units; -import com.moez.QKSMS.ui.ThemeManager; -import com.moez.QKSMS.ui.messagelist.MessageListActivity; -import com.moez.QKSMS.ui.settings.SettingsFragment; -import com.moez.QKSMS.ui.view.QKPreference; -import com.moez.QKSMS.ui.view.QKRingtonePreference; -import com.moez.QKSMS.ui.view.QKSwitchPreference; -import com.moez.QKSMS.ui.view.QKTextView; -import com.moez.QKSMS.ui.view.colorpicker.ColorPickerDialog; - -public class ConversationSettingsDialog extends QKDialog implements Preference.OnPreferenceClickListener { - private final String TAG = "ConversationSettingsDialog"; - - public static final int RINGTONE_REQUEST_CODE = 716; - public static final String ARG_THREAD_ID = "thread_id"; - private static final String ARG_NAME = "name"; - - private Resources mRes; - private ConversationPrefsHelper mConversationPrefs; - - private int[] mLedColors; - - private long mThreadId; - private ViewGroup.LayoutParams mLayoutParams = new LinearLayout.LayoutParams( - ViewGroup.LayoutParams.MATCH_PARENT, - ViewGroup.LayoutParams.WRAP_CONTENT); - - public static ConversationSettingsDialog newInstance(long threadId, String name) { - ConversationSettingsDialog dialog = new ConversationSettingsDialog(); - - Bundle bundle = new Bundle(); - bundle.putLong(ARG_THREAD_ID, threadId); - bundle.putString(ARG_NAME, name); - - dialog.setArguments(bundle); - - return dialog; - } - - @Override - public Dialog onCreateDialog(Bundle savedInstanceState) { - - setTitle(getArguments().getString(ARG_NAME)); - mThreadId = getArguments().getLong(ARG_THREAD_ID); - - mRes = getActivity().getResources(); - mConversationPrefs = new ConversationPrefsHelper(getActivity(), mThreadId); - - mLedColors = new int[]{ - mRes.getColor(R.color.blue_light), mRes.getColor(R.color.purple_light), - mRes.getColor(R.color.green_light), mRes.getColor(R.color.yellow_light), - mRes.getColor(R.color.red_light), mRes.getColor(R.color.white_pure) - }; - - int padding = Units.dpToPx(getActivity(), 16); - QKTextView premiumWarning = new QKTextView(getActivity()); - premiumWarning.setLayoutParams(mLayoutParams); - premiumWarning.setPadding(padding, padding, padding, padding); - - LinearLayout list = new LinearLayout(getActivity()); - list.setOrientation(LinearLayout.VERTICAL); - - list.addView(new QKPreference(getActivity(), this, SettingsFragment.THEME, - R.string.pref_theme, R.string.pref_theme_summary_alt).getView()); - - list.addView(new QKSwitchPreference(getActivity(), this, SettingsFragment.NOTIFICATION_LED, - mConversationPrefs.getConversationPrefs(), mConversationPrefs.getNotificationLedEnabled(), R.string.pref_led, 0).getView()); - - list.addView(new QKPreference(getActivity(), this, SettingsFragment.NOTIFICATION_LED_COLOR, - R.string.pref_theme_led, 0).getView()); - - list.addView(new QKSwitchPreference(getActivity(), this, SettingsFragment.WAKE, - mConversationPrefs.getConversationPrefs(), mConversationPrefs.getWakePhoneEnabled(), R.string.pref_wake, R.string.pref_wake_summary).getView()); - - list.addView(new QKSwitchPreference(getActivity(), this, SettingsFragment.NOTIFICATION_TICKER, - mConversationPrefs.getConversationPrefs(), mConversationPrefs.getTickerEnabled(), R.string.pref_ticker, R.string.pref_ticker_summary).getView()); - - list.addView(new QKSwitchPreference(getActivity(), this, SettingsFragment.NOTIFICATION_VIBRATE, - mConversationPrefs.getConversationPrefs(), mConversationPrefs.getVibrateEnabled(), R.string.pref_vibration, R.string.pref_vibration_summary).getView()); - - list.addView(new QKRingtonePreference(getActivity(), this, SettingsFragment.NOTIFICATION_TONE, - R.string.pref_ringtone, R.string.pref_ringtone_summary).getView()); - - list.addView(new QKSwitchPreference(getActivity(), this, SettingsFragment.NOTIFICATION_CALL_BUTTON, - mConversationPrefs.getConversationPrefs(), mConversationPrefs.getCallButtonEnabled(), R.string.pref_notification_call, R.string.pref_notification_call_summary).getView()); - - setCustomView(list); - - return super.onCreateDialog(savedInstanceState); - } - - public boolean onPreferenceClick(Preference preference) { - switch (preference.getKey()) { - case SettingsFragment.THEME: - ThemeManager.showColorPickerDialogForConversation(mContext, mConversationPrefs); - break; - - case SettingsFragment.NOTIFICATION_LED_COLOR: - ColorPickerDialog ledColorPickerDialog = new ColorPickerDialog(); - ledColorPickerDialog.initialize(R.string.pref_theme_led, mLedColors, Integer.parseInt(mConversationPrefs.getNotificationLedColor()), 3, 2); - ledColorPickerDialog.setOnColorSelectedListener(color -> mConversationPrefs.putString(SettingsFragment.NOTIFICATION_LED_COLOR, "" + color)); - ledColorPickerDialog.show(getActivity().getFragmentManager(), "colorpicker"); - break; - - case SettingsFragment.NOTIFICATION_TONE: - Intent intent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER); - intent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, getRingtoneUri()); - intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_DEFAULT, true); - intent.putExtra(RingtoneManager.EXTRA_RINGTONE_DEFAULT_URI, RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)); - intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_SILENT, true); - intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, RingtoneManager.TYPE_NOTIFICATION); - intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TITLE, getString(R.string.pref_ringtone)); - intent.putExtra(ARG_THREAD_ID, mThreadId); - ((MessageListActivity) getActivity()).getResultForThreadId(mThreadId); - getActivity().startActivityForResult(intent, RINGTONE_REQUEST_CODE); - break; - } - - return true; - } - - private Uri getRingtoneUri() { - final String uriString = mConversationPrefs.getString(SettingsFragment.NOTIFICATION_TONE, "content://settings/system/notification_sound"); - return !TextUtils.isEmpty(uriString) ? Uri.parse(uriString) : null; - } - -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/dialog/DefaultSmsHelper.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/dialog/DefaultSmsHelper.java deleted file mode 100644 index ba8f45d56..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/dialog/DefaultSmsHelper.java +++ /dev/null @@ -1,91 +0,0 @@ -package com.moez.QKSMS.ui.dialog; - -import android.content.Context; -import android.content.Intent; -import android.os.Build; -import android.provider.Telephony; -import android.view.ViewGroup; - -import com.moez.QKSMS.R; -import com.moez.QKSMS.ui.ThemeManager; -import com.nispok.snackbar.Snackbar; -import com.nispok.snackbar.SnackbarManager; -import com.nispok.snackbar.enums.SnackbarType; -import com.nispok.snackbar.listeners.ActionClickListener; - -import java.lang.reflect.Field; - - -public class DefaultSmsHelper implements ActionClickListener { - - private Context mContext; - private int mMessage; - private static long sLastShown; - private boolean mIsDefault = true; - - // Listener is currently useless because we can't listen for response from the system dialog - public DefaultSmsHelper(Context context, int messageRes) { - mContext = context; - mMessage = messageRes != 0 ? messageRes : R.string.default_info; - - if (Build.VERSION.SDK_INT >= 19) { - String defaultSmsPackage = Telephony.Sms.getDefaultSmsPackage(mContext); - mIsDefault = defaultSmsPackage != null && defaultSmsPackage.equals(mContext.getPackageName()); - } else { - mIsDefault = true; - } - } - - public void showIfNotDefault(ViewGroup viewGroup) { - if (!mIsDefault) { - long deltaTime = (System.nanoTime() / 1000000) - sLastShown; - long duration = deltaTime > 60 * 1000 ? 8000 : 3000; - - Snackbar snackBar = Snackbar.with(mContext) - .type(getSnackBarType()) - .text(mMessage) - .duration(duration) - .actionColor(ThemeManager.getColor()) - .actionLabel(R.string.upgrade_now) - .actionListener(this); - - if (viewGroup == null) { - SnackbarManager.show(snackBar); - } else { - SnackbarManager.show(snackBar, viewGroup); - } - - sLastShown = System.nanoTime() / 1000000; - } - } - - @Override - public void onActionClicked(Snackbar snackbar) { - Intent intent = new Intent(Telephony.Sms.Intents.ACTION_CHANGE_DEFAULT); - intent.putExtra(Telephony.Sms.Intents.EXTRA_PACKAGE_NAME, mContext.getPackageName()); - mContext.startActivity(intent); - } - - private SnackbarType getSnackBarType() { - SnackbarType snackbarType = SnackbarType.MULTI_LINE; - - try { - Field maxLines = SnackbarType.class.getDeclaredField("maxLines"); - maxLines.setAccessible(true); - maxLines.setInt(snackbarType, 3); - - Field maxHeight = SnackbarType.class.getDeclaredField("maxHeight"); - maxHeight.setAccessible(true); - maxHeight.setInt(snackbarType, 112); - - } catch (Exception e) { - e.printStackTrace(); - } - - return snackbarType; - } - - public boolean isDefault() { - return mIsDefault; - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/dialog/QKDialog.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/dialog/QKDialog.java deleted file mode 100644 index 0f35ff1fd..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/dialog/QKDialog.java +++ /dev/null @@ -1,478 +0,0 @@ -package com.moez.QKSMS.ui.dialog; - -import android.app.Dialog; -import android.app.DialogFragment; -import android.app.FragmentManager; -import android.content.Context; -import android.content.res.Resources; -import android.graphics.Color; -import android.graphics.drawable.ColorDrawable; -import android.os.Bundle; -import android.support.annotation.StringRes; -import android.support.v7.widget.RecyclerView; -import android.util.DisplayMetrics; -import android.util.Log; -import android.view.LayoutInflater; -import android.view.View; -import android.view.View.OnClickListener; -import android.view.ViewGroup; -import android.view.Window; -import android.view.WindowManager; -import android.widget.AdapterView; -import android.widget.AdapterView.OnItemClickListener; -import android.widget.ArrayAdapter; -import android.widget.LinearLayout; -import android.widget.ListView; -import android.widget.ScrollView; -import com.moez.QKSMS.R; -import com.moez.QKSMS.common.LiveViewManager; -import com.moez.QKSMS.common.utils.Units; -import com.moez.QKSMS.enums.QKPreference; -import com.moez.QKSMS.ui.ThemeManager; -import com.moez.QKSMS.ui.base.QKActivity; -import com.moez.QKSMS.ui.view.QKTextView; - -import java.util.ArrayList; - -public class QKDialog extends DialogFragment { - private final String TAG = "QKDialog"; - - protected QKActivity mContext; - protected Resources mResources; - - private boolean mTitleEnabled; - private String mTitleText; - private QKTextView mTitleView; - - private LinearLayout mContentPanel; - - private boolean mMessageEnabled; - private String mMessageText; - private QKTextView mMessageView; - - private LinearLayout mCustomPanel; - - private boolean mCustomViewEnabled; - private View mCustomView; - - private LinearLayout mButtonBar; - private int mButtonBarOrientation = LinearLayout.HORIZONTAL; - - private boolean mPositiveButtonEnabled; - private String mPositiveButtonText; - private OnClickListener mPositiveButtonClickListener; - private QKTextView mPositiveButtonView; - - private boolean mNeutralButtonEnabled; - private String mNeutralButtonText; - private OnClickListener mNeutralButtonClickListener; - private QKTextView mNeutralButtonView; - - private boolean mNegativeButtonEnabled; - private String mNegativeButtonText; - private OnClickListener mNegativeButtonClickListener; - private QKTextView mNegativeButtonView; - - private ArrayList<String> mMenuItems = new ArrayList<>(); - private ArrayList<Long> mMenuItemIds = new ArrayList<>(); - - public QKDialog() { - } - - @Override - public Dialog onCreateDialog(Bundle savedInstanceState) { - - Dialog dialog = new Dialog(mContext); - - Window window = dialog.getWindow(); - window.requestFeature(Window.FEATURE_NO_TITLE); - window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); - window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); - - LayoutInflater inflater = getActivity().getLayoutInflater(); - View view = inflater.inflate(R.layout.dialog_material, null); - - if (mTitleEnabled || mMessageEnabled) { - mContentPanel = (LinearLayout) view.findViewById(R.id.contentPanel); - mContentPanel.setVisibility(View.VISIBLE); - } - - if (mTitleEnabled) { - mTitleView = (QKTextView) view.findViewById(R.id.alertTitle); - mTitleView.setVisibility(View.VISIBLE); - mTitleView.setText(mTitleText); - Log.d(TAG, "title enabled"); - } - - if (mMessageEnabled) { - mMessageView = (QKTextView) view.findViewById(R.id.message); - mMessageView.setVisibility(View.VISIBLE); - mMessageView.setText(mMessageText); - } - - if (mCustomViewEnabled) { - mCustomPanel = (LinearLayout) view.findViewById(R.id.customPanel); - mCustomPanel.setVisibility(View.VISIBLE); - - if (mCustomView instanceof ListView || mCustomView instanceof RecyclerView) { - mCustomPanel.addView(mCustomView); - } else { - ScrollView scrollView = new ScrollView(mContext); - scrollView.addView(mCustomView); - mCustomPanel.addView(scrollView); - } - } - - if (mPositiveButtonEnabled || mNegativeButtonEnabled) { - mButtonBar = (LinearLayout) view.findViewById(R.id.buttonPanel); - mButtonBar.setVisibility(View.VISIBLE); - mButtonBar.setOrientation(mButtonBarOrientation); - } - - if (mPositiveButtonEnabled) { - mPositiveButtonView = (QKTextView) view.findViewById(R.id.buttonPositive); - mPositiveButtonView.setVisibility(View.VISIBLE); - mPositiveButtonView.setText(mPositiveButtonText); - mPositiveButtonView.setOnClickListener(mPositiveButtonClickListener); - LiveViewManager.registerView(QKPreference.THEME, mPositiveButtonView, key -> { - mPositiveButtonView.setTextColor(ThemeManager.getColor()); - }); - } - - if (mNeutralButtonEnabled) { - mNeutralButtonView = (QKTextView) view.findViewById(R.id.buttonNeutral); - mNeutralButtonView.setVisibility(View.VISIBLE); - mNeutralButtonView.setText(mNeutralButtonText); - mNeutralButtonView.setOnClickListener(mNeutralButtonClickListener); - } - - if (mNegativeButtonEnabled) { - mNegativeButtonView = (QKTextView) view.findViewById(R.id.buttonNegative); - mNegativeButtonView.setVisibility(View.VISIBLE); - mNegativeButtonView.setText(mNegativeButtonText); - mNegativeButtonView.setOnClickListener(mNegativeButtonClickListener); - } - - dialog.setContentView(view); - - return dialog; - } - - @Override - public void onStart() { - super.onStart(); - - Window window = getDialog().getWindow(); - WindowManager.LayoutParams windowParams = window.getAttributes(); - windowParams.dimAmount = 0.33f; - windowParams.flags |= WindowManager.LayoutParams.FLAG_DIM_BEHIND; - window.setAttributes(windowParams); - - DisplayMetrics metrics = new DisplayMetrics(); - getActivity().getWindowManager().getDefaultDisplay().getMetrics(metrics); - int width = (int) (metrics.widthPixels * 0.9); - - window.setLayout(width, ViewGroup.LayoutParams.WRAP_CONTENT); - } - - public QKDialog setContext(QKActivity context) { - mContext = context; - mResources = context.getResources(); - return this; - } - - public QKDialog setTitle(int resource) { - return setTitle(mResources.getString(resource)); - } - - public QKDialog setTitle(String title) { - mTitleEnabled = true; - mTitleText = title; - return this; - } - - public QKDialog setMessage(int resource) { - return setMessage(mResources.getString(resource)); - } - - public QKDialog setMessage(String message) { - mMessageEnabled = true; - mMessageText = message; - return this; - } - - public QKDialog setCancelOnTouchOutside(boolean cancelable) { - setCancelable(cancelable); - return this; - } - - // TODO fix stack from bottom issue - public QKDialog setButtonBarOrientation(int orientation) { - mButtonBarOrientation = orientation; - return this; - } - - public QKDialog setCustomView(View view) { - mCustomViewEnabled = true; - mCustomView = view; - return this; - } - - public QKDialog addMenuItem(@StringRes int titleId, long id) { - return addMenuItem(mContext.getString(titleId), id); - } - - /** - * Adds a menu style item, allowing for dynamic ids for different items. This is useful when the item order - * is set dynamically, like in the MessageListItem - * - * If you use this method, always make sure to use #buildMenu(OnItemClickListener) to compile the items and add the - * click listener - */ - public QKDialog addMenuItem(String title, long id) { - mMenuItems.add(title); - mMenuItemIds.add(id); - return this; - } - - public QKDialog buildMenu(final OnItemClickListener onItemClickListener) { - ArrayAdapter adapter = new ArrayAdapter<>(mContext, R.layout.list_item_simple, mMenuItems); - ListView listView = new ListView(mContext); - listView.setAdapter(adapter); - listView.setDivider(null); - listView.setPadding(0, Units.dpToPx(mContext, 8), 0, Units.dpToPx(mContext, 8)); - listView.setOnItemClickListener(new OnItemClickListener() { - @Override - public void onItemClick(AdapterView<?> parent, View view, int position, long id) { - // Ignore the given ID and use the one that we set in #addMenuItem() - onItemClickListener.onItemClick(parent, view, position, mMenuItemIds.get(position)); - dismiss(); - } - }); - return setCustomView(listView); - } - - public QKDialog setItems(int resource, final OnItemClickListener onClickListener) { - return setItems(mResources.getStringArray(resource), onClickListener); - } - - public QKDialog setItems(String[] items, final OnItemClickListener onClickListener) { - ArrayAdapter adapter = new ArrayAdapter<>(mContext, R.layout.list_item_simple, items); - ListView listView = new ListView(mContext); - listView.setAdapter(adapter); - listView.setDivider(null); - listView.setPadding(0, Units.dpToPx(mContext, 8), 0, Units.dpToPx(mContext, 8)); - listView.setOnItemClickListener(new OnItemClickListener() { - @Override - public void onItemClick(AdapterView<?> parent, View view, int position, long id) { - if (onClickListener != null) { - onClickListener.onItemClick(parent, view, position, id); - dismiss(); - } - } - }); - return setCustomView(listView); - } - - public QKDialog setDoubleLineItems(int titles, int bodies, final OnItemClickListener onClickListener) { - return setDoubleLineItems(mResources.getStringArray(titles), mResources.getStringArray(bodies), onClickListener); - } - - public QKDialog setDoubleLineItems(String[] titles, String[] bodies, final OnItemClickListener onClickListener) { - - int size = Math.min(titles.length, bodies.length); - DoubleLineListItem[] doubleLineListItems = new DoubleLineListItem[size]; - for (int i = 0; i < size; i++) { - doubleLineListItems[i] = new DoubleLineListItem(); - doubleLineListItems[i].title = titles[i]; - doubleLineListItems[i].body = bodies[i]; - } - - ArrayAdapter adapter = new DoubleLineArrayAdapter(mContext, doubleLineListItems); - ListView listView = new ListView(mContext); - listView.setAdapter(adapter); - listView.setDivider(null); - listView.setPadding(0, Units.dpToPx(mContext, 8), 0, Units.dpToPx(mContext, 8)); - listView.setOnItemClickListener(new OnItemClickListener() { - @Override - public void onItemClick(AdapterView<?> parent, View view, int position, long id) { - if (onClickListener != null) { - onClickListener.onItemClick(parent, view, position, id); - dismiss(); - } - } - }); - return setCustomView(listView); - } - - public QKDialog setTripleLineItems(int titles, int subtitles, int bodies, final OnItemClickListener onClickListener) { - return setTripleLineItems(mResources.getStringArray(titles), mResources.getStringArray(subtitles), mResources.getStringArray(bodies), onClickListener); - } - - public QKDialog setTripleLineItems(String[] titles, String[] subtitles, String[] bodies, final OnItemClickListener onClickListener) { - - int size = Math.min(titles.length, Math.min(subtitles.length, bodies.length)); - TripleLineListItem[] tripleLineListItems = new TripleLineListItem[size]; - for (int i = 0; i < size; i++) { - tripleLineListItems[i] = new TripleLineListItem(); - tripleLineListItems[i].title = titles[i]; - tripleLineListItems[i].subtitle = subtitles[i]; - tripleLineListItems[i].body = bodies[i]; - } - - ArrayAdapter adapter = new TripleLineArrayAdapter(mContext, tripleLineListItems); - ListView listView = new ListView(mContext); - listView.setAdapter(adapter); - listView.setDivider(null); - listView.setPadding(0, Units.dpToPx(mContext, 8), 0, Units.dpToPx(mContext, 8)); - listView.setOnItemClickListener(new OnItemClickListener() { - @Override - public void onItemClick(AdapterView<?> parent, View view, int position, long id) { - if (onClickListener != null) { - onClickListener.onItemClick(parent, view, position, id); - dismiss(); - } - } - }); - return setCustomView(listView); - } - - public QKDialog setPositiveButton(int resource, OnClickListener onClickListener) { - return setPositiveButton(mResources.getString(resource), onClickListener); - } - - public QKDialog setPositiveButton(String text, final OnClickListener onClickListener) { - mPositiveButtonEnabled = true; - mPositiveButtonText = text; - mPositiveButtonClickListener = new OnClickListener() { - @Override - public void onClick(View v) { - if (onClickListener != null) { - onClickListener.onClick(v); - } - dismiss(); - } - }; - return this; - } - - public QKDialog setNeutralButton(int resource, OnClickListener onClickListener) { - return setNeutralButton(mResources.getString(resource), onClickListener); - } - - public QKDialog setNeutralButton(String text, final OnClickListener onClickListener) { - mNeutralButtonEnabled = true; - mNeutralButtonText = text; - mNeutralButtonClickListener = new OnClickListener() { - @Override - public void onClick(View v) { - if (onClickListener != null) { - onClickListener.onClick(v); - } - dismiss(); - } - }; - return this; - } - - public QKDialog setNegativeButton(int resource, OnClickListener onClickListener) { - return setNegativeButton(mResources.getString(resource), onClickListener); - } - - public QKDialog setNegativeButton(String text, final OnClickListener onClickListener) { - mNegativeButtonEnabled = true; - mNegativeButtonText = text; - mNegativeButtonClickListener = new OnClickListener() { - @Override - public void onClick(View v) { - if (onClickListener != null) { - onClickListener.onClick(v); - } - dismiss(); - } - }; - return this; - } - - @Override - public void onPause() { - super.onPause(); - dismiss(); - } - - private class DoubleLineListItem { - String title; - String body; - } - - private class DoubleLineArrayAdapter extends ArrayAdapter<DoubleLineListItem> { - - public DoubleLineArrayAdapter(Context context, DoubleLineListItem[] items) { - super(context, R.layout.list_item_dual, items); - } - - @Override - public View getView(int position, View convertView, ViewGroup parent) { - if (convertView == null) { - LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); - convertView = inflater.inflate(R.layout.list_item_dual, parent, false); - } - - ((QKTextView) convertView.findViewById(R.id.list_item_title)) - .setText(getItem(position).title); - - ((QKTextView) convertView.findViewById(R.id.list_item_body)) - .setText(getItem(position).body); - - return convertView; - } - } - - private class TripleLineListItem { - String title; - String subtitle; - String body; - } - - private class TripleLineArrayAdapter extends ArrayAdapter<TripleLineListItem> { - - public TripleLineArrayAdapter(Context context, TripleLineListItem[] items) { - super(context, R.layout.list_item_triple, items); - } - - @Override - public View getView(int position, View convertView, ViewGroup parent) { - if (convertView == null) { - LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); - convertView = inflater.inflate(R.layout.list_item_triple, parent, false); - } - - QKTextView title = (QKTextView) convertView.findViewById(R.id.list_item_title); - title.setTextColor(ThemeManager.getColor()); - title.setText(getItem(position).title); - - QKTextView subtitle = (QKTextView) convertView.findViewById(R.id.list_item_subtitle); - subtitle.setTextColor(ThemeManager.getTextOnBackgroundPrimary()); - subtitle.setText(getItem(position).subtitle); - - ((QKTextView) convertView.findViewById(R.id.list_item_body)) - .setText(getItem(position).body); - - return convertView; - } - } - - public void show() { - try { - super.show(mContext.getFragmentManager(), null); - } catch (IllegalStateException ignored) { - // Sometimes the context is destroyed, but the check for that is API 17+ - } - } - - @Deprecated - @Override - public void show(FragmentManager manager, String tag) { - super.show(manager, tag); - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/dialog/conversationdetails/ConversationDetailsContactListAdapter.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/dialog/conversationdetails/ConversationDetailsContactListAdapter.java deleted file mode 100644 index cf2c3d6f5..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/dialog/conversationdetails/ConversationDetailsContactListAdapter.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.moez.QKSMS.ui.dialog.conversationdetails; - -import android.content.Context; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ArrayAdapter; -import com.moez.QKSMS.R; -import com.moez.QKSMS.data.Contact; -import com.moez.QKSMS.data.ContactList; -import com.moez.QKSMS.ui.view.AvatarView; -import com.moez.QKSMS.ui.view.QKTextView; - -public class ConversationDetailsContactListAdapter extends ArrayAdapter { - - private ContactList mContacts; - - public ConversationDetailsContactListAdapter(Context context, ContactList contacts) { - super(context, R.layout.list_item_recipient); - mContacts = contacts; - } - - @Override - public View getView(int position, View convertView, ViewGroup parent) { - ViewHolder holder; - - if (convertView == null) { - convertView = View.inflate(getContext(), R.layout.list_item_recipient, null); - holder = new ViewHolder(convertView); - convertView.setTag(holder); - } else { - holder = (ViewHolder) convertView.getTag(); - } - - Contact contact = mContacts.get(position); - - holder.name.setText(contact.getName()); - holder.address.setText(contact.getNumber()); - holder.avatar.setImageDrawable(contact.getAvatar(getContext(), null)); - holder.avatar.setContactName(contact.getName()); - if (contact.existsInDatabase()) { - holder.avatar.assignContactUri(contact.getUri()); - } else { - holder.avatar.assignContactFromPhone(contact.getNumber(), true); - } - - return convertView; - } - - @Override - public int getCount() { - return mContacts.size(); - } - - static class ViewHolder { - AvatarView avatar; - QKTextView name; - QKTextView address; - - public ViewHolder(View view) { - avatar = (AvatarView) view.findViewById(R.id.avatar); - name = (QKTextView) view.findViewById(R.id.name); - address = (QKTextView) view.findViewById(R.id.address); - } - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/dialog/conversationdetails/ConversationDetailsDialog.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/dialog/conversationdetails/ConversationDetailsDialog.java deleted file mode 100644 index 172628870..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/dialog/conversationdetails/ConversationDetailsDialog.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.moez.QKSMS.ui.dialog.conversationdetails; - -import android.app.FragmentManager; -import android.view.View; -import android.view.ViewGroup; -import android.widget.AbsListView; -import android.widget.ListView; -import com.moez.QKSMS.R; -import com.moez.QKSMS.common.utils.DateFormatter; -import com.moez.QKSMS.data.Conversation; -import com.moez.QKSMS.interfaces.ConversationDetails; -import com.moez.QKSMS.ui.base.QKActivity; -import com.moez.QKSMS.ui.dialog.QKDialog; -import com.moez.QKSMS.ui.view.QKTextView; - -public class ConversationDetailsDialog implements ConversationDetails { - - private QKActivity mContext; - private FragmentManager mFragmentManager; - - public ConversationDetailsDialog(QKActivity context, FragmentManager fragmentManager) { - mContext = context; - mFragmentManager = fragmentManager; - } - - @Override - public void showDetails(Conversation conversation) { - ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); - AbsListView.LayoutParams listParams = new AbsListView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); - - View view = View.inflate(mContext, R.layout.dialog_conversation_details, null); - view.setLayoutParams(listParams); - ((QKTextView) view.findViewById(R.id.date)).setText(DateFormatter.getDate(mContext, conversation.getDate())); - ((QKTextView) view.findViewById(R.id.message_count)).setText(Integer.toString(conversation.getMessageCount())); - ((QKTextView) view.findViewById(R.id.recipients)).setText(mContext.getString( - R.string.dialog_conversation_details_recipients, Integer.toString(conversation.getRecipients().size()))); - - ListView listView = new ListView(mContext); - listView.setLayoutParams(params); - listView.addHeaderView(view); - listView.setDivider(null); - listView.setDividerHeight(0); - listView.setAdapter(new ConversationDetailsContactListAdapter(mContext, conversation.getRecipients())); - - new QKDialog() - .setContext(mContext) - .setTitle(R.string.dialog_conversation_details_title) - .setCustomView(listView) - .setPositiveButton(R.string.okay, null) - .show(); - } - -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/dialog/mms/MMSDialogFragment.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/dialog/mms/MMSDialogFragment.java deleted file mode 100644 index 97d28454e..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/dialog/mms/MMSDialogFragment.java +++ /dev/null @@ -1,481 +0,0 @@ -package com.moez.QKSMS.ui.dialog.mms; - -import android.app.Dialog; -import android.app.DialogFragment; -import android.app.Fragment; -import android.content.Context; -import android.content.DialogInterface; -import android.content.res.Resources; -import android.graphics.Color; -import android.graphics.drawable.ColorDrawable; -import android.os.Bundle; -import android.util.DisplayMetrics; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.view.Window; -import android.view.WindowManager; -import android.widget.AdapterView; -import android.widget.ArrayAdapter; -import android.widget.LinearLayout; -import android.widget.ListView; -import android.widget.ScrollView; -import com.moez.QKSMS.R; -import com.moez.QKSMS.common.utils.Units; -import com.moez.QKSMS.ui.ThemeManager; -import com.moez.QKSMS.ui.view.QKTextView; - -/** - * @author Moez Bhatti - * @author Shane Creighton-Young - * @since 2015-02-08 - * - * BaseDialogFragment is a backwards-compatible, Material-styled Dialog fragment. - * - * To listen on results from BaseDialogFragment, launch it from a Fragment that implements - * DialogFragmentListener. Then, the "onDialogFragmentResult" methods will get called much like - * "onActivityResult". - */ -public class MMSDialogFragment extends DialogFragment { - private final String TAG = "QKDialogFragment"; - - private Context mContext; - private Resources mResources; - - protected DialogFragmentListener mListener; - - // Result codes for this - public static final int POSITIVE_BUTTON_RESULT = 0; - public static final int NEUTRAL_BUTTON_RESULT = 1; - public static final int NEGATIVE_BUTTON_RESULT = 2; - public static final int LIST_ITEM_CLICK_RESULT = 3; - public static final int DISMISS_RESULT = 4; - - // Views - private boolean mTitleEnabled; - private String mTitleText; - private QKTextView mTitleView; - - private LinearLayout mContentPanel; - - private boolean mMessageEnabled; - private String mMessageText; - private QKTextView mMessageView; - - private LinearLayout mCustomPanel; - - private boolean mCustomViewEnabled; - private View mCustomView; - - private LinearLayout mButtonBar; - private int mButtonBarOrientation = LinearLayout.HORIZONTAL; - - private boolean mPositiveButtonEnabled; - private String mPositiveButtonText; - private QKTextView mPositiveButtonView; - - private boolean mNeutralButtonEnabled; - private String mNeutralButtonText; - private QKTextView mNeutralButtonView; - - private boolean mNegativeButtonEnabled; - private String mNegativeButtonText; - private QKTextView mNegativeButtonView; - - public interface DialogFragmentListener { - // Called when the DialogFragment button is pressed, the DialogFragment is dismissed, etc. - public void onDialogFragmentResult(int resultCode, DialogFragment fragment); - - // Called when a list item within the dialog is pressed. - public void onDialogFragmentListResult(int resultCode, DialogFragment fragment, int index); - } - - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - // Restore the target fragment; this is our listener. - mListener = (DialogFragmentListener)getTargetFragment(); - } - - /** - * Sets the listener of the the DialogFragment. - * - * The generic stuff is just to ensure that the listener is both a Fragment and a - * DialogFragmentListener. - */ - public <T extends Fragment & DialogFragmentListener> - MMSDialogFragment setListener(T l) { - mListener = l; - setTargetFragment(l, 0); - return this; - } - - /** - * Notify the listener of a result. - */ - protected void onResult(int resultCode) { - if (mListener != null) { - mListener.onDialogFragmentResult(resultCode, this); - } - } - - /** - * Notify the listener of a result relating to a list item. - */ - protected void onListResult(int resultCode, int index) { - if (mListener != null) { - mListener.onDialogFragmentListResult(resultCode, this, index); - } - } - - // Make setTargetFragment final so that nobody subclasses BaseDialogFragment and breaks it. - @Override - final public void setTargetFragment(Fragment fragment, int requestCode) { - super.setTargetFragment(fragment, requestCode); - } - - /** - * Builds the dialog using all the View parameters. - */ - @Override - public Dialog onCreateDialog(Bundle savedInstanceState) { - - Dialog dialog = new Dialog(mContext); - - Window window = dialog.getWindow(); - window.requestFeature(Window.FEATURE_NO_TITLE); - window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); - window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); - - LayoutInflater inflater = getActivity().getLayoutInflater(); - View view = inflater.inflate(R.layout.dialog_material, null); - - if (mTitleEnabled || mMessageEnabled) { - mContentPanel = (LinearLayout) view.findViewById(R.id.contentPanel); - mContentPanel.setVisibility(View.VISIBLE); - } - - if (mTitleEnabled) { - mTitleView = (QKTextView) view.findViewById(R.id.alertTitle); - mTitleView.setVisibility(View.VISIBLE); - mTitleView.setText(mTitleText); - } - - if (mMessageEnabled) { - mMessageView = (QKTextView) view.findViewById(R.id.message); - mMessageView.setVisibility(View.VISIBLE); - mMessageView.setText(mMessageText); - } - - if (mCustomViewEnabled) { - mCustomPanel = (LinearLayout) view.findViewById(R.id.customPanel); - mCustomPanel.setVisibility(View.VISIBLE); - - if (mCustomView instanceof ListView) { - mCustomPanel.addView(mCustomView); - } else { - ScrollView scrollView = new ScrollView(mContext); - scrollView.addView(mCustomView); - mCustomPanel.addView(scrollView); - } - } - - if (mPositiveButtonEnabled || mNeutralButtonEnabled || mNegativeButtonEnabled) { - mButtonBar = (LinearLayout) view.findViewById(R.id.buttonPanel); - mButtonBar.setVisibility(View.VISIBLE); - mButtonBar.setOrientation(mButtonBarOrientation); - } - - if (mPositiveButtonEnabled) { - mPositiveButtonView = (QKTextView) view.findViewById(R.id.buttonPositive); - mPositiveButtonView.setVisibility(View.VISIBLE); - mPositiveButtonView.setText(mPositiveButtonText); - mPositiveButtonView.setTextColor(ThemeManager.getColor()); - mPositiveButtonView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - onResult(POSITIVE_BUTTON_RESULT); - } - }); - } - - if (mNeutralButtonEnabled) { - mNeutralButtonView = (QKTextView) view.findViewById(R.id.buttonNeutral); - mNeutralButtonView.setVisibility(View.VISIBLE); - mNeutralButtonView.setText(mNeutralButtonText); - mNeutralButtonView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - onResult(NEUTRAL_BUTTON_RESULT); - } - }); - } - - if (mNegativeButtonEnabled) { - mNegativeButtonView = (QKTextView) view.findViewById(R.id.buttonNegative); - mNegativeButtonView.setVisibility(View.VISIBLE); - mNegativeButtonView.setText(mNegativeButtonText); - mNegativeButtonView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - onResult(NEGATIVE_BUTTON_RESULT); - } - }); - } - - dialog.setContentView(view); - - return dialog; - } - - @Override - public void onStart() { - super.onStart(); - - Window window = getDialog().getWindow(); - WindowManager.LayoutParams windowParams = window.getAttributes(); - windowParams.dimAmount = 0.33f; - windowParams.flags |= WindowManager.LayoutParams.FLAG_DIM_BEHIND; - window.setAttributes(windowParams); - - DisplayMetrics metrics = new DisplayMetrics(); - getActivity().getWindowManager().getDefaultDisplay().getMetrics(metrics); - int width = (int) (metrics.widthPixels * 0.9); - - window.setLayout(width, ViewGroup.LayoutParams.WRAP_CONTENT); - } - - /** - * Called when the dialog is cancelled by the user (i.e. the user clicks outside of it) - */ - @Override - public void onCancel(DialogInterface dialog) { - onResult(DISMISS_RESULT); - } - - public MMSDialogFragment setContext(Context context) { - mContext = context; - mResources = context.getResources(); - return this; - } - - public MMSDialogFragment setTitle(int resource) { - return setTitle(mResources.getString(resource)); - } - - public MMSDialogFragment setTitle(String title) { - mTitleEnabled = true; - mTitleText = title; - return this; - } - - public MMSDialogFragment setMessage(int resource) { - return setMessage(mResources.getString(resource)); - } - - public MMSDialogFragment setMessage(String message) { - mMessageEnabled = true; - mMessageText = message; - return this; - } - - public MMSDialogFragment setCancelOnTouchOutside(boolean cancelable) { - setCancelable(cancelable); - return this; - } - - // TODO fix stack from bottom issue - public MMSDialogFragment setButtonBarOrientation(int orientation) { - mButtonBarOrientation = orientation; - return this; - } - - public MMSDialogFragment setCustomView(View view) { - mCustomViewEnabled = true; - mCustomView = view; - return this; - } - - public MMSDialogFragment setItems(int resource, final int resultCode) { - return setItems(mResources.getStringArray(resource)); - } - - public MMSDialogFragment setItems(String[] items) { - ArrayAdapter adapter = new ArrayAdapter<>(mContext, R.layout.list_item_simple, items); - ListView listView = new ListView(mContext); - listView.setAdapter(adapter); - listView.setDivider(null); - listView.setPadding(0, Units.dpToPx(mContext, 8), 0, Units.dpToPx(mContext, 8)); - listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { - @Override - public void onItemClick(AdapterView<?> parent, View view, int position, long id) { - onListResult(LIST_ITEM_CLICK_RESULT, position); - dismiss(); - } - }); - return setCustomView(listView); - } - - public MMSDialogFragment setDoubleLineItems(int titles, int bodies) { - return setDoubleLineItems( - mResources.getStringArray(titles), mResources.getStringArray(bodies) - ); - } - - public MMSDialogFragment setDoubleLineItems(String[] titles, String[] bodies) { - - int size = Math.min(titles.length, bodies.length); - DoubleLineListItem[] doubleLineListItems = new DoubleLineListItem[size]; - for (int i = 0; i < size; i++) { - doubleLineListItems[i] = new DoubleLineListItem(); - doubleLineListItems[i].title = titles[i]; - doubleLineListItems[i].body = bodies[i]; - } - - ArrayAdapter adapter = new DoubleLineArrayAdapter(mContext, doubleLineListItems); - ListView listView = new ListView(mContext); - listView.setAdapter(adapter); - listView.setDivider(null); - listView.setPadding(0, Units.dpToPx(mContext, 8), 0, Units.dpToPx(mContext, 8)); - listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { - @Override - public void onItemClick(AdapterView<?> parent, View view, int position, long id) { - onListResult(LIST_ITEM_CLICK_RESULT, position); - dismiss(); - } - }); - return setCustomView(listView); - } - - public MMSDialogFragment setTripleLineItems(int titles, int subtitles, int bodies) { - return setTripleLineItems( - mResources.getStringArray(titles), mResources.getStringArray(subtitles), - mResources.getStringArray(bodies) - ); - } - - public MMSDialogFragment setTripleLineItems(String[] titles, String[] subtitles, - String[] bodies) { - - int size = Math.min(titles.length, Math.min(subtitles.length, bodies.length)); - TripleLineListItem[] tripleLineListItems = new TripleLineListItem[size]; - for (int i = 0; i < size; i++) { - tripleLineListItems[i] = new TripleLineListItem(); - tripleLineListItems[i].title = titles[i]; - tripleLineListItems[i].subtitle = subtitles[i]; - tripleLineListItems[i].body = bodies[i]; - } - - ArrayAdapter adapter = new TripleLineArrayAdapter(mContext, tripleLineListItems); - ListView listView = new ListView(mContext); - listView.setAdapter(adapter); - listView.setDivider(null); - listView.setPadding(0, Units.dpToPx(mContext, 8), 0, Units.dpToPx(mContext, 8)); - listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { - @Override - public void onItemClick(AdapterView<?> parent, View view, int position, long id) { - onListResult(LIST_ITEM_CLICK_RESULT, position); - dismiss(); - } - }); - return setCustomView(listView); - } - - public MMSDialogFragment setPositiveButton(int resource) { - return setPositiveButton(mResources.getString(resource)); - } - - public MMSDialogFragment setPositiveButton(String text) { - mPositiveButtonEnabled = true; - mPositiveButtonText = text; - return this; - } - - public MMSDialogFragment setNeutralButton(int resource) { - return setNeutralButton(mResources.getString(resource)); - } - - public MMSDialogFragment setNeutralButton(String text) { - mNeutralButtonEnabled = true; - mNeutralButtonText = text; - return this; - } - - public MMSDialogFragment setNegativeButton(int resource) { - return setNegativeButton(mResources.getString(resource)); - } - - public MMSDialogFragment setNegativeButton(String text) { - mNegativeButtonEnabled = true; - mNegativeButtonText = text; - return this; - } - - @Override - public void onPause() { - super.onPause(); - dismiss(); - } - - private class DoubleLineListItem { - String title; - String body; - } - - private class DoubleLineArrayAdapter extends ArrayAdapter<DoubleLineListItem> { - - public DoubleLineArrayAdapter(Context context, DoubleLineListItem[] items) { - super(context, R.layout.list_item_dual, items); - } - - @Override - public View getView(int position, View convertView, ViewGroup parent) { - if (convertView == null) { - LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); - convertView = inflater.inflate(R.layout.list_item_dual, parent, false); - } - - ((QKTextView) convertView.findViewById(R.id.list_item_title)) - .setText(getItem(position).title); - - ((QKTextView) convertView.findViewById(R.id.list_item_body)) - .setText(getItem(position).body); - - return convertView; - } - } - - private class TripleLineListItem { - String title; - String subtitle; - String body; - } - - private class TripleLineArrayAdapter extends ArrayAdapter<TripleLineListItem> { - - public TripleLineArrayAdapter(Context context, TripleLineListItem[] items) { - super(context, R.layout.list_item_triple, items); - } - - @Override - public View getView(int position, View convertView, ViewGroup parent) { - if (convertView == null) { - LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); - convertView = inflater.inflate(R.layout.list_item_triple, parent, false); - } - - QKTextView title = (QKTextView) convertView.findViewById(R.id.list_item_title); - title.setTextColor(ThemeManager.getColor()); - title.setText(getItem(position).title); - - QKTextView subtitle = (QKTextView) convertView.findViewById(R.id.list_item_subtitle); - subtitle.setTextColor(ThemeManager.getTextOnBackgroundPrimary()); - subtitle.setText(getItem(position).subtitle); - - ((QKTextView) convertView.findViewById(R.id.list_item_body)) - .setText(getItem(position).body); - - return convertView; - } - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/dialog/mms/MMSSetupFragment.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/dialog/mms/MMSSetupFragment.java deleted file mode 100644 index 4a73eb254..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/dialog/mms/MMSSetupFragment.java +++ /dev/null @@ -1,402 +0,0 @@ -package com.moez.QKSMS.ui.dialog.mms; - -import android.app.DialogFragment; -import android.content.Context; -import android.content.Intent; -import android.net.Uri; -import android.os.Build; -import android.os.Bundle; -import android.preference.PreferenceManager; -import android.telephony.TelephonyManager; -import android.util.Log; -import com.moez.QKSMS.R; -import com.moez.QKSMS.mmssms.Apn; -import com.moez.QKSMS.mmssms.ApnUtils; -import com.moez.QKSMS.mmssms.Settings; -import com.moez.QKSMS.transaction.SmsHelper; -import com.moez.QKSMS.ui.base.QKFragment; - -import java.util.List; - -import static com.moez.QKSMS.ui.dialog.mms.MMSDialogFragment.DISMISS_RESULT; -import static com.moez.QKSMS.ui.dialog.mms.MMSDialogFragment.DialogFragmentListener; -import static com.moez.QKSMS.ui.dialog.mms.MMSDialogFragment.LIST_ITEM_CLICK_RESULT; -import static com.moez.QKSMS.ui.dialog.mms.MMSDialogFragment.NEGATIVE_BUTTON_RESULT; -import static com.moez.QKSMS.ui.dialog.mms.MMSDialogFragment.NEUTRAL_BUTTON_RESULT; -import static com.moez.QKSMS.ui.dialog.mms.MMSDialogFragment.POSITIVE_BUTTON_RESULT; - -/** - * @author Shane Creighton-Young - * @since 2015-02-08 - */ -public class MMSSetupFragment extends QKFragment implements DialogFragmentListener { - public static final String TAG = "MMSSetupFragment"; - private static final boolean LOCAL_LOGV = true; - - public static final String SET_UP_MMS = "set_up_mms"; - public static final String NO_CONFIGURATIONS_FOUND = "no_configurations_found"; - public static final String ONE_CONFIGURATION_FOUND = "one_configuration_found"; - public static final String MULTIPLE_CONFIGURATIONS_FOUND = "multiple_configurations_found"; - public static final String SUCCESS = "success"; - public static final String NEXT_STEPS = "next_steps"; - public static final String SETTING_UP_MMS_LATER = "setting_up_mms_later"; - - /** - * Key for savedInstanceState to restore the dialogs on rotation. - */ - public static final String STATE_DIALOG_TAG = "dialogTag"; - private String mDialogTag = SET_UP_MMS; - - /** - * If true, the user will see a dialog asking them if they want to automatically configure MMS. - * Defaults to true. - */ - public static final String ARG_ASK_FIRST = "argAskFirst"; - private static final boolean ARG_ASK_FIRST_DEFAULT = true; - - /** - * If non-null, the dialog will not be shown if the pref given is "true". - * - * Additionally, if ARG_ASK_FIRST is true, a DON'T ASK AGAIN button will be shown when asking - * the user if they want to configure MMS. - */ - public static final String ARG_DONT_ASK_AGAIN_PREF = "dontAskAgainPref"; - private static final String ARG_DONT_ASK_AGAIN_PREF_DEFAULT = null; - - /** - * Contains the APNs from the last time the `query` was called. - */ - List<Apn> mAPNs; - - // Arguments - private boolean mArgAskFirst = ARG_ASK_FIRST_DEFAULT; - private String mArgDontAskAgainPref = ARG_DONT_ASK_AGAIN_PREF_DEFAULT; - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - // Get the APNs, which will be used in MMS setup. - mAPNs = ApnUtils.query(mContext); - - // Initialize arguments - initArguments(); - - if (savedInstanceState != null) { - // Restore the fragment (i.e. on rotation) - launchDialog(savedInstanceState.getString(STATE_DIALOG_TAG)); - - } else { - // This is the first time onCreate is being called---set up from arguments - if (mArgAskFirst) { - // Ask them if they want to configure MMS now. - launchDialog(SET_UP_MMS); - } else { - // Show a dialog corresponding to the number of configurations that were found. - showConfigurationDialog(); - } - - } - } - - /** - * Loads the arguments into member variables. The member variables should not be edited other - * than in the method. - */ - private void initArguments() { - Bundle args = getArguments(); - if (args != null) { - mArgAskFirst = args.getBoolean(ARG_ASK_FIRST, ARG_ASK_FIRST_DEFAULT); - mArgDontAskAgainPref = args.getString( - ARG_DONT_ASK_AGAIN_PREF, ARG_DONT_ASK_AGAIN_PREF_DEFAULT - ); - } - } - - @Override - public void onSaveInstanceState(Bundle outState) { - super.onSaveInstanceState(outState); - outState.putString(STATE_DIALOG_TAG, mDialogTag); - } - - @Override - public void onDialogFragmentResult(final int resultCode, DialogFragment fragment) { - final String dialogTag = fragment.getTag(); - if (LOCAL_LOGV) Log.v(TAG, "onDialogFragmentResult result:" + resultCode - + " tag:" + dialogTag); - - // Dismiss the fragment that we got the result from. We will always want to show a new - // dialog here, rather than from the dialog fragment that we started. - fragment.dismiss(); - - // Special case: close the mms setup fragment if the user purposefully dismissed us. - if (resultCode == DISMISS_RESULT) { - close(); - } - - // Otherwise, handle the fragment result. - - if (SET_UP_MMS.equals(dialogTag)) { - if (resultCode == POSITIVE_BUTTON_RESULT) { - // Show the dialog corresponding to the number of configurations that were found. - showConfigurationDialog(); - - } else if (resultCode == NEGATIVE_BUTTON_RESULT) { - if (mArgDontAskAgainPref != null) { - // Save a "don't ask again" pref (this is the DON'T ASK AGAIN button). - mContext.getPrefs() - .edit() - .putBoolean(mArgDontAskAgainPref, true) - .commit(); - } - - // Show instructions for them to set it up later. - launchDialog(SETTING_UP_MMS_LATER); - - } else if (resultCode == NEUTRAL_BUTTON_RESULT) { - // Close the fragment so that the dialog is shown the next time the app is opened. - close(); - } - - } else if (NO_CONFIGURATIONS_FOUND.equals(dialogTag)) { - - if (mArgDontAskAgainPref != null) { - // Don't annoy them with automatic configuration after we've tried and failed. - PreferenceManager.getDefaultSharedPreferences(mContext) - .edit() - .putBoolean(mArgDontAskAgainPref, true) - .commit(); - } - - if (resultCode == POSITIVE_BUTTON_RESULT) { - - // Send an email to the qksms team - contactSupport(mContext); - - } else if (resultCode == NEGATIVE_BUTTON_RESULT) { - // Show "Next steps" dialog telling them how to set up MMS in the future. - launchDialog(NEXT_STEPS); - } - - // Configuration dialog that the single MMS configuration found worked well - } else if (ONE_CONFIGURATION_FOUND.equals(dialogTag)) { - if (resultCode == POSITIVE_BUTTON_RESULT) { - // Success! Save the APN settings and show them instructions for how to change - // settings later. - Apn apn = mAPNs.get(0); - ApnUtils.persistApn(mContext, apn); - - launchDialog(SUCCESS); - - } else if (resultCode == NEGATIVE_BUTTON_RESULT) { - - // Show the "no configurations found" dialog. This will give them the option to - // contact support. - launchDialog(NO_CONFIGURATIONS_FOUND); - } - - // Multiple configurations were found and the user said that none of them looked right. - } else if (MULTIPLE_CONFIGURATIONS_FOUND.equals(dialogTag)) { - if (resultCode == NEGATIVE_BUTTON_RESULT) { - - // Show the "no configurations found" dialog. This will give them the option to - // contact support. - launchDialog(NO_CONFIGURATIONS_FOUND); - } - } - } - - private void showConfigurationDialog() { - if (mAPNs.isEmpty()) { - // Give the user a support channel and further instructions if automatic - // configuration failed. - launchDialog(NO_CONFIGURATIONS_FOUND); - - } else if (mAPNs.size() == 1) { - // Ask the user for confirmation that the single APN found sounds correct. - launchDialog(ONE_CONFIGURATION_FOUND); - - } else { - // We'll show the user all the APN names, as well as an "N/A" option in case - // they all look wrong. - launchDialog(MULTIPLE_CONFIGURATIONS_FOUND); - } - } - - /** - * Sends an email to mms-support@qklabs.com with a bunch of MMS-related debugging information. - * @param context current context - */ - public static void contactSupport(Context context) { - if (context != null) { - Intent intent = new Intent( - Intent.ACTION_SENDTO, - Uri.fromParts("mailto", "mms-support@qklabs.com", null) - ); - intent.putExtra(Intent.EXTRA_EMAIL, "mms-support@qklabs.com"); - intent.putExtra(Intent.EXTRA_SUBJECT, "MMS Support Request"); - intent.putExtra(Intent.EXTRA_TEXT, getSupportEmailBody(context)); - context.startActivity(intent); - } - } - - @Override - public void onDialogFragmentListResult(int resultCode, DialogFragment fragment, int index) { - String dialogTag = fragment.getTag(); - if (LOCAL_LOGV) Log.v(TAG, "onDialogFragmentListResult result:" + resultCode - + " tag:" + dialogTag); - - // Dismiss the fragment that we got the result from. We will always want to show a new - // dialog here, rather than from the dialog fragment that we started. - fragment.dismiss(); - - if (MULTIPLE_CONFIGURATIONS_FOUND.equals(dialogTag)) { - if (resultCode == LIST_ITEM_CLICK_RESULT) { - Apn apn = mAPNs.get(index); - ApnUtils.persistApn(mContext, apn); - - launchDialog(SUCCESS); - } - } - } - - private void close() { - getFragmentManager().beginTransaction().remove(this).commit(); - } - - private void launchDialog(final String dialogTag) { - if (LOCAL_LOGV) Log.v(TAG, "launchDialog: " + dialogTag); - // Save the dialog tag so that we can save it in onSaveInstanceState(). - mDialogTag = dialogTag; - - if (SET_UP_MMS.equals(dialogTag)) { - MMSDialogFragment f = new MMSDialogFragment() - .setContext(mContext) - .setTitle(R.string.set_up_mms_title) - .setMessage(R.string.set_up_mms_description) - .setListener(this) - .setPositiveButton(R.string.okay) - .setNeutralButton(R.string.later); - - // Show a don't ask again button if there is a don't ask again pref string in the - // arguments - if (mArgDontAskAgainPref != null) { - f.setNegativeButton(R.string.dont_ask_again); - } - - // Show the dialog - f.show(getFragmentManager(), SET_UP_MMS); - - } else if (NO_CONFIGURATIONS_FOUND.equals(dialogTag)) { - new MMSDialogFragment() - .setContext(mContext) - .setTitle(R.string.mms_setup_no_configurations_found_title) - .setMessage(R.string.mms_setup_no_configurations_found_body) - .setListener(this) - .setPositiveButton(R.string.okay) - .setNegativeButton(R.string.cancel) - .show(getFragmentManager(), NO_CONFIGURATIONS_FOUND); - - } else if (ONE_CONFIGURATION_FOUND.equals(dialogTag)) { - String carrier = mAPNs.get(0).name; - String message = getString(R.string.mms_setup_one_configuration_found_body, - carrier); - - new MMSDialogFragment() - .setContext(mContext) - .setTitle(R.string.mms_setup_one_configuration_found_title) - .setMessage(message) - .setListener(this) - .setPositiveButton(R.string.yes) - .setNegativeButton(R.string.no) - .show(getFragmentManager(), ONE_CONFIGURATION_FOUND); - - } else if (MULTIPLE_CONFIGURATIONS_FOUND.equals(dialogTag)) { - String[] items = new String[mAPNs.size()]; - for (int i = 0; i < mAPNs.size(); i++) { - items[i] = mAPNs.get(i).name; - } - - new MMSDialogFragment() - .setContext(mContext) - .setTitle(R.string.mms_setup_multiple_configurations_found_title) - .setMessage(R.string.mms_setup_multiple_configurations_found_body) - .setListener(this) - .setNegativeButton(R.string.na) - .setItems(items) - .show(getFragmentManager(), MULTIPLE_CONFIGURATIONS_FOUND); - - } else if (SETTING_UP_MMS_LATER.equals(dialogTag)) { - new MMSDialogFragment() - .setContext(mContext) - .setTitle(R.string.mms_setup_setting_up_later_title) - .setMessage(R.string.mms_setup_setting_up_later_body) - .setListener(this) - .setPositiveButton(R.string.okay) - .show(getFragmentManager(), SETTING_UP_MMS_LATER); - - } else if (NEXT_STEPS.equals(dialogTag)) { - new MMSDialogFragment() - .setContext(mContext) - .setTitle(R.string.mms_setup_next_steps_title) - .setMessage(R.string.mms_setup_next_steps_body) - .setListener(this) - .setPositiveButton(R.string.okay) - .show(getFragmentManager(), NEXT_STEPS); - - } else if (SUCCESS.equals(dialogTag)) { - new MMSDialogFragment() - .setContext(mContext) - .setTitle(R.string.mms_setup_success_title) - .setMessage(R.string.mms_setup_success_body) - .setListener(this) - .setPositiveButton(R.string.okay) - .show(getFragmentManager(), SUCCESS); - - } - } - - private static String getSupportEmailBody(Context context) { - if (context != null) { - TelephonyManager manager = (TelephonyManager) - context.getSystemService(Context.TELEPHONY_SERVICE); - Settings settings = SmsHelper.getSendSettings(context); - - // Build the message body - StringBuilder body = new StringBuilder(); - body.append("Press send, and the QKSMS team will find the correct MMS settings for you!\n\n"); - body.append("------------- DO NOT MODIFY -------------\n"); - body.append("Data activity: ").append(manager.getDataActivity()).append("\n"); - if (Build.VERSION.SDK_INT >= 19) { - body.append("MMS UAProfUrl: ").append(manager.getMmsUAProfUrl()).append("\n"); - body.append("MMS User Agent: ").append(manager.getMmsUserAgent()).append("\n"); - } - body.append("Network operator: ").append(manager.getNetworkOperator()).append("\n"); - body.append("Network name: ").append(manager.getNetworkOperatorName()).append("\n"); - body.append("Radio type: ").append(manager.getPhoneType()).append("\n"); - body.append("Sim operator: ").append(manager.getSimOperator()).append("\n"); - body.append("Sim operator name: ").append(manager.getSimOperatorName()).append("\n"); - body.append("Subscriber ID: ").append(manager.getSubscriberId()).append("\n"); - body.append("\n"); - body.append("Automatically configured APNs:\n"); - - List<Apn> apns = ApnUtils.query(context); - if (apns != null) { - for (Apn apn : apns) { - body.append(apn.toString()).append("\n"); - } - } - body.append("\n"); - body.append("Selected APN settings:\n"); - body.append(String.format("{name:%s, mmsc:%s, proxy:%s, port:%s}", - settings.getUaProfTagName(), - settings.getMmsc(), - settings.getProxy(), - settings.getPort())); - - return body.toString(); - } else { - return null; - } - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/messagelist/MessageColumns.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/messagelist/MessageColumns.java deleted file mode 100644 index 754779f86..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/messagelist/MessageColumns.java +++ /dev/null @@ -1,247 +0,0 @@ -package com.moez.QKSMS.ui.messagelist; - -import android.annotation.SuppressLint; -import android.database.Cursor; -import android.provider.BaseColumns; -import android.provider.Telephony; -import android.util.Log; - -public class MessageColumns { - - public static final int COLUMN_MSG_TYPE = 0; - public static final int COLUMN_ID = 1; - public static final int COLUMN_THREAD_ID = 2; - public static final int COLUMN_SMS_ADDRESS = 3; - public static final int COLUMN_SMS_BODY = 4; - public static final int COLUMN_SMS_DATE = 5; - public static final int COLUMN_SMS_DATE_SENT = 6; - public static final int COLUMN_SMS_READ = 7; - public static final int COLUMN_SMS_TYPE = 8; - public static final int COLUMN_SMS_STATUS = 9; - public static final int COLUMN_SMS_LOCKED = 10; - public static final int COLUMN_SMS_ERROR_CODE = 11; - public static final int COLUMN_MMS_SUBJECT = 12; - public static final int COLUMN_MMS_SUBJECT_CHARSET = 13; - public static final int COLUMN_MMS_DATE = 14; - public static final int COLUMN_MMS_DATE_SENT = 15; - public static final int COLUMN_MMS_READ = 16; - public static final int COLUMN_MMS_MESSAGE_TYPE = 17; - public static final int COLUMN_MMS_MESSAGE_BOX = 18; - public static final int COLUMN_MMS_DELIVERY_REPORT = 19; - public static final int COLUMN_MMS_READ_REPORT = 20; - public static final int COLUMN_MMS_ERROR_TYPE = 21; - public static final int COLUMN_MMS_LOCKED = 22; - public static final int COLUMN_MMS_STATUS = 23; - public static final int COLUMN_MMS_TEXT_ONLY = 24; - - public static final int CACHE_SIZE = 50; - - @SuppressLint("InlinedApi") - public static final String[] PROJECTION = new String[] { - Telephony.MmsSms.TYPE_DISCRIMINATOR_COLUMN, - BaseColumns._ID, - Telephony.Sms.Conversations.THREAD_ID, - // For SMS - Telephony.Sms.ADDRESS, - Telephony.Sms.BODY, - Telephony.Sms.DATE, - Telephony.Sms.DATE_SENT, - Telephony.Sms.READ, - Telephony.Sms.TYPE, - Telephony.Sms.STATUS, - Telephony.Sms.LOCKED, - Telephony.Sms.ERROR_CODE, - // For MMS - Telephony.Mms.SUBJECT, - Telephony.Mms.SUBJECT_CHARSET, - Telephony.Mms.DATE, - Telephony.Mms.DATE_SENT, - Telephony.Mms.READ, - Telephony.Mms.MESSAGE_TYPE, - Telephony.Mms.MESSAGE_BOX, - Telephony.Mms.DELIVERY_REPORT, - Telephony.Mms.READ_REPORT, - Telephony.MmsSms.PendingMessages.ERROR_TYPE, - Telephony.Mms.LOCKED, - Telephony.Mms.STATUS, - Telephony.Mms.TEXT_ONLY - }; - - public static class ColumnsMap { - private final String TAG = "ColumnsMap"; - private final boolean DEBUG = false; - - public int mColumnMsgType; - public int mColumnMsgId; - public int mColumnSmsAddress; - public int mColumnSmsBody; - public int mColumnSmsDate; - public int mColumnSmsDateSent; - public int mColumnSmsRead; - public int mColumnSmsType; - public int mColumnSmsStatus; - public int mColumnSmsLocked; - public int mColumnSmsErrorCode; - public int mColumnMmsSubject; - public int mColumnMmsSubjectCharset; - public int mColumnMmsDate; - public int mColumnMmsDateSent; - public int mColumnMmsRead; - public int mColumnMmsMessageType; - public int mColumnMmsMessageBox; - public int mColumnMmsDeliveryReport; - public int mColumnMmsReadReport; - public int mColumnMmsErrorType; - public int mColumnMmsLocked; - public int mColumnMmsStatus; - public int mColumnMmsTextOnly; - - public ColumnsMap() { - mColumnMsgType = COLUMN_MSG_TYPE; - mColumnMsgId = COLUMN_ID; - mColumnSmsAddress = COLUMN_SMS_ADDRESS; - mColumnSmsBody = COLUMN_SMS_BODY; - mColumnSmsDate = COLUMN_SMS_DATE; - mColumnSmsDateSent = COLUMN_SMS_DATE_SENT; - mColumnSmsType = COLUMN_SMS_TYPE; - mColumnSmsStatus = COLUMN_SMS_STATUS; - mColumnSmsLocked = COLUMN_SMS_LOCKED; - mColumnSmsErrorCode = COLUMN_SMS_ERROR_CODE; - mColumnMmsSubject = COLUMN_MMS_SUBJECT; - mColumnMmsSubjectCharset = COLUMN_MMS_SUBJECT_CHARSET; - mColumnMmsMessageType = COLUMN_MMS_MESSAGE_TYPE; - mColumnMmsMessageBox = COLUMN_MMS_MESSAGE_BOX; - mColumnMmsDeliveryReport = COLUMN_MMS_DELIVERY_REPORT; - mColumnMmsReadReport = COLUMN_MMS_READ_REPORT; - mColumnMmsErrorType = COLUMN_MMS_ERROR_TYPE; - mColumnMmsLocked = COLUMN_MMS_LOCKED; - mColumnMmsStatus = COLUMN_MMS_STATUS; - mColumnMmsTextOnly = COLUMN_MMS_TEXT_ONLY; - } - - @SuppressLint("InlinedApi") - public ColumnsMap(Cursor cursor) { - // Ignore all 'not found' exceptions since the custom columns - // may be just a subset of the default columns. - try { - mColumnMsgType = cursor.getColumnIndexOrThrow(Telephony.MmsSms.TYPE_DISCRIMINATOR_COLUMN); - } catch (IllegalArgumentException e) { - if (DEBUG) Log.w(TAG, e.getMessage()); - } - - try { - mColumnMsgId = cursor.getColumnIndexOrThrow(BaseColumns._ID); - } catch (IllegalArgumentException e) { - if (DEBUG) Log.w(TAG, e.getMessage()); - } - - try { - mColumnSmsAddress = cursor.getColumnIndexOrThrow(Telephony.Sms.ADDRESS); - } catch (IllegalArgumentException e) { - if (DEBUG) Log.w(TAG, e.getMessage()); - } - - try { - mColumnSmsBody = cursor.getColumnIndexOrThrow(Telephony.Sms.BODY); - } catch (IllegalArgumentException e) { - if (DEBUG) Log.w(TAG, e.getMessage()); - } - - try { - mColumnSmsDate = cursor.getColumnIndexOrThrow(Telephony.Sms.DATE); - } catch (IllegalArgumentException e) { - if (DEBUG) Log.w(TAG, e.getMessage()); - } - - try { - mColumnSmsDateSent = cursor.getColumnIndexOrThrow(Telephony.Sms.DATE_SENT); - } catch (IllegalArgumentException e) { - if (DEBUG) Log.w(TAG, e.getMessage()); - } - - try { - mColumnSmsType = cursor.getColumnIndexOrThrow(Telephony.Sms.TYPE); - } catch (IllegalArgumentException e) { - if (DEBUG) Log.w(TAG, e.getMessage()); - } - - try { - mColumnSmsStatus = cursor.getColumnIndexOrThrow(Telephony.Sms.STATUS); - } catch (IllegalArgumentException e) { - if (DEBUG) Log.w(TAG, e.getMessage()); - } - - try { - mColumnSmsLocked = cursor.getColumnIndexOrThrow(Telephony.Sms.LOCKED); - } catch (IllegalArgumentException e) { - if (DEBUG) Log.w(TAG, e.getMessage()); - } - - try { - mColumnSmsErrorCode = cursor.getColumnIndexOrThrow(Telephony.Sms.ERROR_CODE); - } catch (IllegalArgumentException e) { - if (DEBUG) Log.w(TAG, e.getMessage()); - } - - try { - mColumnMmsSubject = cursor.getColumnIndexOrThrow(Telephony.Mms.SUBJECT); - } catch (IllegalArgumentException e) { - if (DEBUG) Log.w(TAG, e.getMessage()); - } - - try { - mColumnMmsSubjectCharset = cursor.getColumnIndexOrThrow(Telephony.Mms.SUBJECT_CHARSET); - } catch (IllegalArgumentException e) { - if (DEBUG) Log.w(TAG, e.getMessage()); - } - - try { - mColumnMmsMessageType = cursor.getColumnIndexOrThrow(Telephony.Mms.MESSAGE_TYPE); - } catch (IllegalArgumentException e) { - if (DEBUG) Log.w(TAG, e.getMessage()); - } - - try { - mColumnMmsMessageBox = cursor.getColumnIndexOrThrow(Telephony.Mms.MESSAGE_BOX); - } catch (IllegalArgumentException e) { - if (DEBUG) Log.w(TAG, e.getMessage()); - } - - try { - mColumnMmsDeliveryReport = cursor.getColumnIndexOrThrow(Telephony.Mms.DELIVERY_REPORT); - } catch (IllegalArgumentException e) { - if (DEBUG) Log.w(TAG, e.getMessage()); - } - - try { - mColumnMmsReadReport = cursor.getColumnIndexOrThrow(Telephony.Mms.READ_REPORT); - } catch (IllegalArgumentException e) { - if (DEBUG) Log.w(TAG, e.getMessage()); - } - - try { - mColumnMmsErrorType = cursor.getColumnIndexOrThrow(Telephony.MmsSms.PendingMessages.ERROR_TYPE); - } catch (IllegalArgumentException e) { - if (DEBUG) Log.w(TAG, e.getMessage()); - } - - try { - mColumnMmsLocked = cursor.getColumnIndexOrThrow(Telephony.Mms.LOCKED); - } catch (IllegalArgumentException e) { - if (DEBUG) Log.w(TAG, e.getMessage()); - } - - try { - mColumnMmsStatus = cursor.getColumnIndexOrThrow(Telephony.Mms.STATUS); - } catch (IllegalArgumentException e) { - if (DEBUG) Log.w(TAG, e.getMessage()); - } - - try { - mColumnMmsTextOnly = cursor.getColumnIndexOrThrow(Telephony.Mms.TEXT_ONLY); - } catch (IllegalArgumentException e) { - if (DEBUG) Log.w(TAG, e.getMessage()); - } - } - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/messagelist/MessageItem.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/messagelist/MessageItem.java deleted file mode 100644 index 53219971b..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/messagelist/MessageItem.java +++ /dev/null @@ -1,442 +0,0 @@ -/* - * Copyright (C) 2008 Esmertec AG. - * Copyright (C) 2008 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.moez.QKSMS.ui.messagelist; - -import android.annotation.SuppressLint; -import android.content.ContentUris; -import android.content.Context; -import android.content.SharedPreferences; -import android.database.Cursor; -import android.net.Uri; -import android.preference.PreferenceManager; -import android.provider.Telephony.Mms; -import android.provider.Telephony.MmsSms; -import android.provider.Telephony.Sms; -import android.text.TextUtils; -import android.util.Log; -import com.android.mms.util.DownloadManager; -import com.google.android.mms.MmsException; -import com.google.android.mms.pdu_alt.EncodedStringValue; -import com.google.android.mms.pdu_alt.MultimediaMessagePdu; -import com.google.android.mms.pdu_alt.NotificationInd; -import com.google.android.mms.pdu_alt.PduHeaders; -import com.google.android.mms.pdu_alt.PduPersister; -import com.google.android.mms.pdu_alt.RetrieveConf; -import com.moez.QKSMS.QKSMSApp; -import com.moez.QKSMS.R; -import com.moez.QKSMS.common.formatter.FormatterFactory; -import com.moez.QKSMS.common.google.ItemLoadedCallback; -import com.moez.QKSMS.common.google.ItemLoadedFuture; -import com.moez.QKSMS.common.google.PduLoaderManager; -import com.moez.QKSMS.common.utils.AddressUtils; -import com.moez.QKSMS.common.utils.DateFormatter; -import com.moez.QKSMS.data.Contact; -import com.moez.QKSMS.enums.QKPreference; -import com.moez.QKSMS.model.SlideModel; -import com.moez.QKSMS.model.SlideshowModel; -import com.moez.QKSMS.model.TextModel; -import com.moez.QKSMS.transaction.SmsHelper; - -import java.util.regex.Pattern; - -/** - * Mostly immutable model for an SMS/MMS message. - * - * <p>The only mutable field is the cached formatted message member, - * the formatting of which is done outside this model in MessageListItem. - */ -public class MessageItem { - private static String TAG = "MessageItem"; - - public enum DeliveryStatus { NONE, INFO, FAILED, PENDING, RECEIVED } - - public static int ATTACHMENT_TYPE_NOT_LOADED = -1; - - final Context mContext; - public final String mType; - public final long mMsgId; - public final int mBoxId; - - public String mDeliveryStatusString; - public DeliveryStatus mDeliveryStatus; - public String mReadReportString; - public boolean mReadReport; - public boolean mLocked; // locked to prevent auto-deletion - - public long mDate; - public String mTimestamp; - public String mAddress; - public String mContact; - public String mBody; // Body of SMS, first text of MMS. - public String mTextContentType; // ContentType of text of MMS. - public Pattern mHighlight; // portion of message to highlight (from search) - - // The only non-immutable field. Not synchronized, as access will - // only be from the main GUI thread. Worst case if accessed from - // another thread is it'll return null and be set again from that - // thread. - public CharSequence mCachedFormattedMessage; - - // The last message is cached above in mCachedFormattedMessage. In the latest design, we - // show "Sending..." in place of the timestamp when a message is being sent. mLastSendingState - // is used to keep track of the last sending state so that if the current sending state is - // different, we can clear the message cache so it will get rebuilt and recached. - public boolean mLastSendingState; - - // Fields for MMS only. - public Uri mMessageUri; - public int mMessageType; - public int mAttachmentType; - public String mSubject; - public SlideshowModel mSlideshow; - public int mMessageSize; - public int mErrorType; - public int mErrorCode; - public int mMmsStatus; - public MessageColumns.ColumnsMap mColumnsMap; - private PduLoadedCallback mPduLoadedCallback; - private ItemLoadedFuture mItemLoadedFuture; - - @SuppressLint("NewApi") - public MessageItem(Context context, String type, final Cursor cursor, - final MessageColumns.ColumnsMap columnsMap, Pattern highlight, - boolean canBlock) throws MmsException { - mContext = context; - mMsgId = cursor.getLong(columnsMap.mColumnMsgId); - mHighlight = highlight; - mType = type; - mColumnsMap = columnsMap; - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(mContext); - - if ("sms".equals(type)) { - mReadReport = false; // No read reports in sms - - long status = cursor.getLong(columnsMap.mColumnSmsStatus); - if (status == Sms.STATUS_NONE) { - // No delivery report requested - mDeliveryStatus = DeliveryStatus.NONE; - } else if (status >= Sms.STATUS_FAILED) { - // Failure - mDeliveryStatus = DeliveryStatus.FAILED; - } else if (status >= Sms.STATUS_PENDING) { - // Pending - mDeliveryStatus = DeliveryStatus.PENDING; - } else { - // Success - mDeliveryStatus = DeliveryStatus.RECEIVED; - } - - mMessageUri = ContentUris.withAppendedId(Sms.CONTENT_URI, mMsgId); - // Set contact and message body - mBoxId = cursor.getInt(columnsMap.mColumnSmsType); - mAddress = cursor.getString(columnsMap.mColumnSmsAddress); - if (SmsHelper.isOutgoingFolder(mBoxId)) { - String meString = context.getString( - R.string.messagelist_sender_self); - - mContact = meString; - } else { - // For incoming messages, the ADDRESS field contains the sender. - mContact = Contact.get(mAddress, canBlock).getName(); - } - mBody = cursor.getString(columnsMap.mColumnSmsBody); - mBody = FormatterFactory.format(mBody); - - // Unless the message is currently in the progress of being sent, it gets a time stamp. - if (!isOutgoingMessage()) { - // Set "received" or "sent" time stamp - boolean sent = prefs.getBoolean(QKPreference.SENT_TIMESTAMPS.getKey(), false) && !isMe(); - mDate = cursor.getLong(sent ? columnsMap.mColumnSmsDateSent : columnsMap.mColumnSmsDate); - mTimestamp = DateFormatter.getMessageTimestamp(context, mDate); - } - - mLocked = cursor.getInt(columnsMap.mColumnSmsLocked) != 0; - mErrorCode = cursor.getInt(columnsMap.mColumnSmsErrorCode); - } else if ("mms".equals(type)) { - mMessageUri = ContentUris.withAppendedId(Mms.CONTENT_URI, mMsgId); - mBoxId = cursor.getInt(columnsMap.mColumnMmsMessageBox); - // If we can block, get the address immediately from the "addr" table. - if (canBlock) { - mAddress = AddressUtils.getFrom(mContext, mMessageUri); - } - mMessageType = cursor.getInt(columnsMap.mColumnMmsMessageType); - mErrorType = cursor.getInt(columnsMap.mColumnMmsErrorType); - String subject = cursor.getString(columnsMap.mColumnMmsSubject); - if (!TextUtils.isEmpty(subject)) { - EncodedStringValue v = new EncodedStringValue( - cursor.getInt(columnsMap.mColumnMmsSubjectCharset), - PduPersister.getBytes(subject)); - mSubject = SmsHelper.cleanseMmsSubject(context, v.getString()); - } - mLocked = cursor.getInt(columnsMap.mColumnMmsLocked) != 0; - mSlideshow = null; - mDeliveryStatusString = cursor.getString(columnsMap.mColumnMmsDeliveryReport); - mReadReportString = cursor.getString(columnsMap.mColumnMmsReadReport); - mBody = null; - mMessageSize = 0; - mTextContentType = null; - // Initialize the time stamp to "" instead of null - mTimestamp = ""; - mMmsStatus = cursor.getInt(columnsMap.mColumnMmsStatus); - mAttachmentType = cursor.getInt(columnsMap.mColumnMmsTextOnly) != 0 ? - SmsHelper.TEXT : ATTACHMENT_TYPE_NOT_LOADED; - - // Start an async load of the pdu. If the pdu is already loaded, the callback - // will get called immediately - boolean loadSlideshow = mMessageType != PduHeaders.MESSAGE_TYPE_NOTIFICATION_IND; - - mItemLoadedFuture = QKSMSApp.getApplication().getPduLoaderManager() - .getPdu(mMessageUri, loadSlideshow, - new PduLoadedMessageItemCallback()); - - } else { - throw new MmsException("Unknown type of the message: " + type); - } - } - - private DeliveryStatus getDeliveryStatus(String deliveryReport) { - DeliveryStatus result; - if (deliveryReport == null || !mAddress.equals(mContext.getString( - R.string.messagelist_sender_self))) { - result = DeliveryStatus.NONE; - } else { - int reportInt; - try { - reportInt = Integer.parseInt(deliveryReport); - if (reportInt == PduHeaders.VALUE_YES) { - result = DeliveryStatus.RECEIVED; - } else { - result = DeliveryStatus.NONE; - } - } catch (NumberFormatException nfe) { - Log.e(TAG, "Value for delivery report was invalid."); - result = DeliveryStatus.NONE; - } - } - return result; - } - - private boolean getReadReport(String readReport) { - boolean result; - if (readReport == null || !mAddress.equals(mContext.getString( - R.string.messagelist_sender_self))) { - result = false; - } else { - int reportInt; - try { - reportInt = Integer.parseInt(readReport); - result = (reportInt == PduHeaders.VALUE_YES); - } catch (NumberFormatException nfe) { - Log.e(TAG, "Value for read report was invalid."); - result = false; - } - } - return result; - } - - private void interpretFrom(EncodedStringValue from, Uri messageUri) { - if (from != null) { - mAddress = from.getString(); - } else { - // In the rare case when getting the "from" address from the pdu fails, - // (e.g. from == null) fall back to a slower, yet more reliable method of - // getting the address from the "addr" table. This is what the Messaging - // notification system uses. - mAddress = AddressUtils.getFrom(mContext, messageUri); - } - mContact = TextUtils.isEmpty(mAddress) ? "" : Contact.get(mAddress, false).getName(); - } - - public boolean isMms() { - return mType.equals("mms"); - } - - public boolean isSms() { - return mType.equals("sms"); - } - - public boolean isDownloaded() { - return (mMessageType != PduHeaders.MESSAGE_TYPE_NOTIFICATION_IND); - } - - public boolean isMe() { - // Logic matches MessageListAdapter.getItemViewType which is used to decide which - // type of MessageListItem to create: a left or right justified item depending on whether - // the message is incoming or outgoing. - boolean isIncomingMms = isMms() - && (mBoxId == Mms.MESSAGE_BOX_INBOX - || mBoxId == Mms.MESSAGE_BOX_ALL); - boolean isIncomingSms = isSms() - && (mBoxId == Sms.MESSAGE_TYPE_INBOX - || mBoxId == Sms.MESSAGE_TYPE_ALL); - return !(isIncomingMms || isIncomingSms); - } - - public boolean isOutgoingMessage() { - boolean isOutgoingMms = isMms() && (mBoxId == Mms.MESSAGE_BOX_OUTBOX); - boolean isOutgoingSms = isSms() - && ((mBoxId == Sms.MESSAGE_TYPE_FAILED) - || (mBoxId == Sms.MESSAGE_TYPE_OUTBOX) - || (mBoxId == Sms.MESSAGE_TYPE_QUEUED)); - return isOutgoingMms || isOutgoingSms; - } - - public boolean isSending() { - return !isFailedMessage() && isOutgoingMessage(); - } - - public boolean isFailedMessage() { - boolean isFailedMms = isMms() - && (mErrorType >= MmsSms.ERR_TYPE_GENERIC_PERMANENT); - boolean isFailedSms = isSms() - && (mBoxId == Sms.MESSAGE_TYPE_FAILED); - return isFailedMms || isFailedSms; - } - - // Note: This is the only mutable field in this class. Think of - // mCachedFormattedMessage as a C++ 'mutable' field on a const - // object, with this being a lazy accessor whose logic to set it - // is outside the class for model/view separation reasons. In any - // case, please keep this class conceptually immutable. - public void setCachedFormattedMessage(CharSequence formattedMessage) { - mCachedFormattedMessage = formattedMessage; - } - - public CharSequence getCachedFormattedMessage() { - boolean isSending = isSending(); - if (isSending != mLastSendingState) { - mLastSendingState = isSending; - mCachedFormattedMessage = null; // clear cache so we'll rebuild the message - // to show "Sending..." or the sent date. - } - return mCachedFormattedMessage; - } - - public int getBoxId() { - return mBoxId; - } - - public long getMessageId() { - return mMsgId; - } - - public int getMmsDownloadStatus() { - return mMmsStatus & ~DownloadManager.DEFERRED_MASK; - } - - @Override - public String toString() { - return "type: " + mType + - " box: " + mBoxId + - " uri: " + mMessageUri + - " address: " + mAddress + - " contact: " + mContact + - " read: " + mReadReport + - " delivery status: " + mDeliveryStatus; - } - - public class PduLoadedMessageItemCallback implements ItemLoadedCallback { - public void onItemLoaded(Object result, Throwable exception) { - if (exception != null) { - Log.e(TAG, "PduLoadedMessageItemCallback PDU couldn't be loaded: ", exception); - return; - } - if (mItemLoadedFuture != null) { - synchronized(mItemLoadedFuture) { - mItemLoadedFuture.setIsDone(true); - } - } - PduLoaderManager.PduLoaded pduLoaded = (PduLoaderManager.PduLoaded)result; - long timestamp = 0L; - if (PduHeaders.MESSAGE_TYPE_NOTIFICATION_IND == mMessageType) { - mDeliveryStatus = DeliveryStatus.NONE; - NotificationInd notifInd = (NotificationInd)pduLoaded.mPdu; - interpretFrom(notifInd.getFrom(), mMessageUri); - // Borrow the mBody to hold the URL of the message. - mBody = new String(notifInd.getContentLocation()); - mMessageSize = (int) notifInd.getMessageSize(); - timestamp = notifInd.getExpiry() * 1000L; - } else { - MultimediaMessagePdu msg = (MultimediaMessagePdu)pduLoaded.mPdu; - mSlideshow = pduLoaded.mSlideshow; - mAttachmentType = SmsHelper.getAttachmentType(mSlideshow, msg); - - if (mMessageType == PduHeaders.MESSAGE_TYPE_RETRIEVE_CONF) { - if (msg == null) { - interpretFrom(null, mMessageUri); - } else { - RetrieveConf retrieveConf = (RetrieveConf) msg; - interpretFrom(retrieveConf.getFrom(), mMessageUri); - timestamp = retrieveConf.getDate() * 1000L; - } - } else { - // Use constant string for outgoing messages - mContact = mAddress = - mContext.getString(R.string.messagelist_sender_self); - timestamp = msg == null ? 0 : msg.getDate() * 1000L; - } - - SlideModel slide = mSlideshow == null ? null : mSlideshow.get(0); - if ((slide != null) && slide.hasText()) { - TextModel tm = slide.getText(); - mBody = tm.getText(); - mTextContentType = tm.getContentType(); - } - - mMessageSize = mSlideshow == null ? 0 : mSlideshow.getTotalMessageSize(); - - mDeliveryStatus = getDeliveryStatus(mDeliveryStatusString); - mReadReport = getReadReport(mReadReportString); - } - if (!isOutgoingMessage()) { - if (PduHeaders.MESSAGE_TYPE_NOTIFICATION_IND == mMessageType) { - mTimestamp = mContext.getString(R.string.expire_on, DateFormatter.getMessageTimestamp(mContext, timestamp)); - } else { - mTimestamp = DateFormatter.getMessageTimestamp(mContext, timestamp); - } - } - if (mPduLoadedCallback != null) { - mPduLoadedCallback.onPduLoaded(MessageItem.this); - } - } - } - - public void setOnPduLoaded(PduLoadedCallback pduLoadedCallback) { - mPduLoadedCallback = pduLoadedCallback; - } - - public void cancelPduLoading() { - if (mItemLoadedFuture != null && !mItemLoadedFuture.isDone()) { - mItemLoadedFuture.cancel(mMessageUri); - mItemLoadedFuture = null; - } - } - - public interface PduLoadedCallback { - /** - * Called when this item's pdu and slideshow are finished loading. - * - * @param messageItem the MessageItem that finished loading. - */ - void onPduLoaded(MessageItem messageItem); - } - - public SlideshowModel getSlideshow() { - return mSlideshow; - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/messagelist/MessageItemCache.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/messagelist/MessageItemCache.java deleted file mode 100644 index 35760e742..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/messagelist/MessageItemCache.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.moez.QKSMS.ui.messagelist; - -import android.content.Context; -import android.database.Cursor; -import android.util.Log; -import android.util.LruCache; -import com.google.android.mms.MmsException; -import com.moez.QKSMS.common.utils.CursorUtils; - -import java.util.regex.Pattern; - -public class MessageItemCache extends LruCache<Long, MessageItem> { - private final String TAG = "MessageItemCache"; - - private Context mContext; - private MessageColumns.ColumnsMap mColumnsMap; - private Pattern mSearchHighlighter; - - public MessageItemCache(Context context, MessageColumns.ColumnsMap columnsMap, Pattern searchHighlighter, int maxSize) { - super(maxSize); - - mContext = context; - mColumnsMap = columnsMap; - mSearchHighlighter = searchHighlighter; - } - - @Override - protected void entryRemoved(boolean evicted, Long key, MessageItem oldValue, - MessageItem newValue) { - oldValue.cancelPduLoading(); - } - - /** - * Generates a unique key for this message item given its type and message ID. - * - * @param type - * @param msgId - */ - public long getKey(String type, long msgId) { - if (type.equals("mms")) { - return -msgId; - } else { - return msgId; - } - } - - - public MessageItem get(String type, long msgId, Cursor c) { - long key = getKey(type, msgId); - MessageItem item = get(key); - - if (item == null && CursorUtils.isValid(c)) { - try { - item = new MessageItem(mContext, type, c, mColumnsMap, mSearchHighlighter, false); - key = getKey(item.mType, item.mMsgId); - put(key, item); - } catch (MmsException e) { - Log.e(TAG, "getCachedMessageItem: ", e); - } - } - return item; - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/messagelist/MessageListActivity.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/messagelist/MessageListActivity.java deleted file mode 100644 index b29b27264..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/messagelist/MessageListActivity.java +++ /dev/null @@ -1,171 +0,0 @@ -package com.moez.QKSMS.ui.messagelist; - -import android.app.FragmentManager; -import android.app.FragmentTransaction; -import android.content.Intent; -import android.media.RingtoneManager; -import android.net.Uri; -import android.os.Bundle; -import android.text.Html; -import android.util.Log; -import android.view.Menu; -import android.view.MenuInflater; - -import com.moez.QKSMS.R; -import com.moez.QKSMS.common.AnalyticsManager; -import com.moez.QKSMS.common.ConversationPrefsHelper; -import com.moez.QKSMS.common.utils.PhoneNumberUtils; -import com.moez.QKSMS.mmssms.Utils; -import com.moez.QKSMS.ui.base.QKActivity; -import com.moez.QKSMS.ui.base.QKSwipeBackActivity; -import com.moez.QKSMS.ui.dialog.ConversationSettingsDialog; -import com.moez.QKSMS.ui.dialog.DefaultSmsHelper; -import com.moez.QKSMS.ui.settings.SettingsFragment; -import com.moez.QKSMS.ui.welcome.WelcomeActivity; - -import java.net.URLDecoder; - -public class MessageListActivity extends QKSwipeBackActivity { - private final String TAG = "MessageListActivity"; - - public static final String ARG_THREAD_ID = "thread_id"; - public static final String ARG_ROW_ID = "rowId"; - public static final String ARG_HIGHLIGHT = "highlight"; - public static final String ARG_SHOW_IMMEDIATE = "showImmediate"; - - private static long mThreadId; - private long mRowId; - private String mHighlight; - private boolean mShowImmediate; - - private long mWaitingForThreadId = -1; - - public static boolean isInForeground; - - public static void launch(QKActivity context, long threadId, long rowId, String pattern, boolean showImmediate) { - Intent intent = new Intent(context, MessageListActivity.class); - intent.putExtra(ARG_THREAD_ID, threadId); - intent.putExtra(ARG_ROW_ID, rowId); - intent.putExtra(ARG_HIGHLIGHT, pattern); - intent.putExtra(ARG_SHOW_IMMEDIATE, showImmediate); - context.startActivity(intent); - } - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - onNewIntent(getIntent()); - } - - @Override - protected void onResume() { - super.onResume(); - isInForeground = true; - } - - @Override - protected void onPause() { - super.onPause(); - isInForeground = false; - } - - @Override - protected void onNewIntent(Intent intent) { - super.onNewIntent(intent); - mThreadId = intent.getLongExtra(ARG_THREAD_ID, -1); - mRowId = intent.getLongExtra(ARG_ROW_ID, -1); - mHighlight = intent.getStringExtra(ARG_HIGHLIGHT); - mShowImmediate = intent.getBooleanExtra(ARG_SHOW_IMMEDIATE, false); - - if (mThreadId == -1 && intent.getData() != null) { - String data = intent.getData().toString(); - String scheme = intent.getData().getScheme(); - - String address = null; - if (scheme.startsWith("smsto") || scheme.startsWith("mmsto")) { - address = data.replace("smsto:", "").replace("mmsto:", ""); - } else if (scheme.startsWith("sms") || (scheme.startsWith("mms"))) { - address = data.replace("sms:", "").replace("mms:", ""); - } - - address = URLDecoder.decode(address); - address = "" + Html.fromHtml(address); - address = PhoneNumberUtils.formatNumber(address); - mThreadId = Utils.getOrCreateThreadId(this, address); - } - - if (mThreadId != -1) { - Log.v(TAG, "Opening thread: " + mThreadId); - FragmentManager fm = getFragmentManager(); - MessageListFragment fragment = (MessageListFragment) fm.findFragmentByTag(MessageListFragment.TAG); - if (fragment == null) { - fragment = MessageListFragment.getInstance(mThreadId, mRowId, mHighlight, mShowImmediate); - } - mSwipeBackLayout.setScrollChangedListener(fragment); - FragmentTransaction menuTransaction = fm.beginTransaction(); - menuTransaction.replace(R.id.content_frame, fragment, MessageListFragment.TAG); - menuTransaction.commit(); - } else { - String msg = "Couldn't open conversation: {action:"; - msg += intent.getAction(); - msg += ", data:"; - msg += intent.getData() == null ? "null" : intent.getData().toString(); - msg += ", scheme:"; - msg += intent.getData() == null ? "null" : intent.getData().getScheme(); - msg += ", extras:{"; - Object[] keys = intent.getExtras().keySet().toArray(); - for (int i = 0; i < keys.length; i++) { - String key = keys[i].toString(); - msg += keys[i].toString(); - msg += ":"; - msg += intent.getExtras().get(key); - if (i < keys.length - 1) { - msg += ", "; - } - } - msg += "}}"; - Log.d(TAG, msg); - AnalyticsManager.getInstance().log(msg); - makeToast(R.string.toast_conversation_error); - finish(); - } - } - - public void getResultForThreadId(long threadId) { - mWaitingForThreadId = threadId; - } - - - - /** - * When In-App billing is done, it'll return information via onActivityResult(). - */ - @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - if (requestCode == ConversationSettingsDialog.RINGTONE_REQUEST_CODE) { - if (data != null) { - if (mWaitingForThreadId > 0) { - ConversationPrefsHelper conversationPrefs = new ConversationPrefsHelper(this, mWaitingForThreadId); - Uri uri = data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI); - conversationPrefs.putString(SettingsFragment.NOTIFICATION_TONE, (uri == null) ? "" : uri.toString()); - - mWaitingForThreadId = -1; - } - } - - } else if (requestCode == WelcomeActivity.WELCOME_REQUEST_CODE) { - new DefaultSmsHelper(this, R.string.not_default_first).showIfNotDefault(null); - } - } - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - MenuInflater inflater = getMenuInflater(); - inflater.inflate(R.menu.message_list, menu); - return super.onCreateOptionsMenu(menu); - } - - public static long getThreadId() { - return mThreadId; - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/messagelist/MessageListAdapter.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/messagelist/MessageListAdapter.java deleted file mode 100644 index 09b6bb133..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/messagelist/MessageListAdapter.java +++ /dev/null @@ -1,622 +0,0 @@ -package com.moez.QKSMS.ui.messagelist; - -import android.content.Intent; -import android.content.SharedPreferences; -import android.content.res.Resources; -import android.database.Cursor; -import android.graphics.PorterDuff; -import android.graphics.Typeface; -import android.net.Uri; -import android.os.Handler; -import android.provider.ContactsContract; -import android.provider.Telephony; -import android.provider.Telephony.TextBasedSmsColumns; -import android.telephony.TelephonyManager; -import android.text.SpannableString; -import android.text.SpannableStringBuilder; -import android.text.TextUtils; -import android.text.style.StyleSpan; -import android.text.style.UnderlineSpan; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.RelativeLayout; -import com.android.mms.transaction.Transaction; -import com.android.mms.transaction.TransactionBundle; -import com.android.mms.transaction.TransactionService; -import com.android.mms.util.DownloadManager; -import com.google.android.mms.ContentType; -import com.google.android.mms.pdu_alt.PduHeaders; -import com.koushikdutta.ion.Ion; -import com.moez.QKSMS.QKSMSApp; -import com.moez.QKSMS.R; -import com.moez.QKSMS.common.LiveViewManager; -import com.moez.QKSMS.common.emoji.EmojiRegistry; -import com.moez.QKSMS.common.utils.CursorUtils; -import com.moez.QKSMS.common.utils.LinkifyUtils; -import com.moez.QKSMS.common.utils.MessageUtils; -import com.moez.QKSMS.data.Contact; -import com.moez.QKSMS.enums.QKPreference; -import com.moez.QKSMS.transaction.SmsHelper; -import com.moez.QKSMS.ui.ThemeManager; -import com.moez.QKSMS.ui.base.QKActivity; -import com.moez.QKSMS.ui.base.RecyclerCursorAdapter; -import com.moez.QKSMS.ui.mms.MmsThumbnailPresenter; -import com.moez.QKSMS.ui.settings.SettingsFragment; -import com.moez.QKSMS.ui.view.AvatarView; -import ezvcard.Ezvcard; -import ezvcard.VCard; - -import java.util.ArrayList; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -public class MessageListAdapter extends RecyclerCursorAdapter<MessageListViewHolder, MessageItem> { - private final String TAG = "MessageListAdapter"; - - public static final int INCOMING_ITEM = 0; - public static final int OUTGOING_ITEM = 1; - - private ArrayList<Long> mSelectedConversations = new ArrayList<>(); - - private static final Pattern urlPattern = Pattern.compile( - "\\b(https?:\\/\\/\\S+(?:png|jpe?g|gif)\\S*)\\b", - Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL); - - private MessageItemCache mMessageItemCache; - private MessageColumns.ColumnsMap mColumnsMap; - - private final Resources mRes; - private final SharedPreferences mPrefs; - - // Configuration options. - private long mThreadId = -1; - private long mRowId = -1; - private Pattern mSearchHighlighter = null; - private boolean mIsGroupConversation = false; - private Handler mMessageListItemHandler = null; // TODO this isn't quite the same as the others - private String mSelection = null; - - public MessageListAdapter(QKActivity context) { - super(context); - mRes = mContext.getResources(); - mPrefs = mContext.getPrefs(); - } - - protected MessageItem getItem(int position) { - mCursor.moveToPosition(position); - - String type = mCursor.getString(mColumnsMap.mColumnMsgType); - long msgId = mCursor.getLong(mColumnsMap.mColumnMsgId); - - return mMessageItemCache.get(type, msgId, mCursor); - } - - public Cursor getCursorForItem(MessageItem item) { - if (CursorUtils.isValid(mCursor) && mCursor.moveToFirst()) { - do { - long id = mCursor.getLong(mColumnsMap.mColumnMsgId); - String type = mCursor.getString(mColumnsMap.mColumnMsgType); - - if (id == item.mMsgId && type != null && type.equals(item.mType)) { - return mCursor; - } - } while (mCursor.moveToNext()); - } - return null; - } - - public MessageColumns.ColumnsMap getColumnsMap() { - return mColumnsMap; - } - - public void setIsGroupConversation(boolean b) { - mIsGroupConversation = b; - } - - @Override - public MessageListViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - LayoutInflater inflater = LayoutInflater.from(mContext); - int resource; - boolean sent; - - if (viewType == INCOMING_ITEM) { - resource = R.layout.list_item_message_in; - sent = false; - } else { - resource = R.layout.list_item_message_out; - sent = true; - } - - View view = inflater.inflate(resource, parent, false); - return setupViewHolder(view, sent); - } - - private MessageListViewHolder setupViewHolder(View view, boolean sent) { - MessageListViewHolder holder = new MessageListViewHolder(mContext, view); - - if (sent) { - // set up colors - holder.mBodyTextView.setOnColorBackground(ThemeManager.getSentBubbleColor() != ThemeManager.getNeutralBubbleColor()); - holder.mDateView.setOnColorBackground(false); - holder.mDeliveredIndicator.setColorFilter(ThemeManager.getTextOnBackgroundSecondary(), PorterDuff.Mode.SRC_ATOP); - holder.mLockedIndicator.setColorFilter(ThemeManager.getTextOnBackgroundSecondary(), PorterDuff.Mode.SRC_ATOP); - - // set up avatar - holder.mAvatarView.setImageDrawable(Contact.getMe(true).getAvatar(mContext, null)); - holder.mAvatarView.setContactName(AvatarView.ME); - holder.mAvatarView.assignContactUri(ContactsContract.Profile.CONTENT_URI); - if (mPrefs.getBoolean(SettingsFragment.HIDE_AVATAR_SENT, true)) { - ((RelativeLayout.LayoutParams) holder.mMessageBlock.getLayoutParams()).setMargins(0, 0, 0, 0); - holder.mAvatarView.setVisibility(View.GONE); - } - } else { - // set up colors - holder.mBodyTextView.setOnColorBackground(ThemeManager.getReceivedBubbleColor() != ThemeManager.getNeutralBubbleColor()); - holder.mDateView.setOnColorBackground(false); - holder.mDeliveredIndicator.setColorFilter(ThemeManager.getTextOnBackgroundSecondary(), PorterDuff.Mode.SRC_ATOP); - holder.mLockedIndicator.setColorFilter(ThemeManager.getTextOnBackgroundSecondary(), PorterDuff.Mode.SRC_ATOP); - - // set up avatar - if (mPrefs.getBoolean(SettingsFragment.HIDE_AVATAR_RECEIVED, false)) { - ((RelativeLayout.LayoutParams) holder.mMessageBlock.getLayoutParams()).setMargins(0, 0, 0, 0); - holder.mAvatarView.setVisibility(View.GONE); - } - } - - LiveViewManager.registerView(QKPreference.BACKGROUND, this, key -> { - holder.mRoot.setBackgroundDrawable(ThemeManager.getRippleBackground()); - holder.mSlideShowButton.setBackgroundDrawable(ThemeManager.getRippleBackground()); - holder.mMmsView.getForeground().setColorFilter(ThemeManager.getBackgroundColor(), PorterDuff.Mode.SRC_ATOP); - }); - - return holder; - } - - @Override - public void onBindViewHolder(MessageListViewHolder holder, int position) { - MessageItem messageItem = getItem(position); - - holder.mData = messageItem; - holder.mContext = mContext; - holder.mClickListener = mItemClickListener; - holder.mRoot.setOnClickListener(holder); - holder.mRoot.setOnLongClickListener(holder); - holder.mPresenter = null; - - // Here we're avoiding reseting the avatar to the empty avatar when we're rebinding - // to the same item. This happens when there's a DB change which causes the message item - // cache in the MessageListAdapter to get cleared. When an mms MessageItem is newly - // created, it has no info in it except the message id. The info is eventually loaded - // and bindCommonMessage is called again (see onPduLoaded below). When we haven't loaded - // the pdu, we don't want to call updateContactView because it - // will set the avatar to the generic avatar then when this method is called again - // from onPduLoaded, it will reset to the real avatar. This test is to avoid that flash. - boolean pduLoaded = messageItem.isSms() || messageItem.mSlideshow != null; - - bindGrouping(holder, messageItem); - bindTimestamp(holder, messageItem); - - if (pduLoaded) { - bindAvatar(holder, messageItem); - } - bindMmsView(holder, messageItem); - bindBody(holder, messageItem); - bindIndicators(holder, messageItem); - bindVcard(holder, messageItem); - - if (messageItem.mMessageType == PduHeaders.MESSAGE_TYPE_NOTIFICATION_IND) { - bindNotifInd(holder, messageItem); - } else { - if (holder.mDownloadButton != null) { - holder.mDownloadButton.setVisibility(View.GONE); - holder.mDownloadingLabel.setVisibility(View.GONE); - } - } - } - - /** - * Binds a MessageItem that hasn't been downloaded yet - */ - private void bindNotifInd(final MessageListViewHolder holder, final MessageItem messageItem) { - holder.showMmsView(false); - - switch (messageItem.getMmsDownloadStatus()) { - case DownloadManager.STATE_PRE_DOWNLOADING: - case DownloadManager.STATE_DOWNLOADING: - showDownloadingAttachment(holder); - break; - case DownloadManager.STATE_UNKNOWN: - case DownloadManager.STATE_UNSTARTED: - DownloadManager downloadManager = DownloadManager.getInstance(); - boolean autoDownload = downloadManager.isAuto(); - boolean dataSuspended = (QKSMSApp.getApplication().getTelephonyManager() - .getDataState() == TelephonyManager.DATA_SUSPENDED); - - // If we're going to automatically start downloading the mms attachment, then - // don't bother showing the download button for an instant before the actual - // download begins. Instead, show downloading as taking place. - if (autoDownload && !dataSuspended) { - showDownloadingAttachment(holder); - break; - } - case DownloadManager.STATE_TRANSIENT_FAILURE: - case DownloadManager.STATE_PERMANENT_FAILURE: - case DownloadManager.STATE_SKIP_RETRYING: - default: - holder.inflateDownloadControls(); - holder.mDownloadingLabel.setVisibility(View.GONE); - holder.mDownloadButton.setVisibility(View.VISIBLE); - holder.mDownloadButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - holder.mDownloadingLabel.setVisibility(View.VISIBLE); - holder.mDownloadButton.setVisibility(View.GONE); - Intent intent = new Intent(mContext, TransactionService.class); - intent.putExtra(TransactionBundle.URI, messageItem.mMessageUri.toString()); - intent.putExtra(TransactionBundle.TRANSACTION_TYPE, Transaction.RETRIEVE_TRANSACTION); - mContext.startService(intent); - - DownloadManager.getInstance().markState(messageItem.mMessageUri, DownloadManager.STATE_PRE_DOWNLOADING); - } - }); - break; - } - - // Hide the indicators. - holder.mLockedIndicator.setVisibility(View.GONE); - holder.mDeliveredIndicator.setVisibility(View.GONE); - holder.mDetailsIndicator.setVisibility(View.GONE); - } - - private void showDownloadingAttachment(MessageListViewHolder holder) { - holder.inflateDownloadControls(); - holder.mDownloadingLabel.setVisibility(View.VISIBLE); - holder.mDownloadButton.setVisibility(View.GONE); - } - - private boolean shouldShowTimestamp(MessageItem messageItem, int position) { - if (position == mCursor.getCount() - 1) { - return true; - } - - MessageItem messageItem2 = getItem(position + 1); - - if (mPrefs.getBoolean(SettingsFragment.FORCE_TIMESTAMPS, false)) { - return true; - } else if (messageItem.mDeliveryStatus != MessageItem.DeliveryStatus.NONE) { - return true; - } else if (messageItem.isFailedMessage()) { - return true; - } else if (messageItem.isSending()) { - return true; - } else if (messagesFromDifferentPeople(messageItem, messageItem2)) { - return true; - } else { - int MAX_DURATION = Integer.parseInt(mPrefs.getString(SettingsFragment.SHOW_NEW_TIMESTAMP_DELAY, "5")) * 60 * 1000; - return (messageItem2.mDate - messageItem.mDate >= MAX_DURATION); - } - } - - private boolean shouldShowAvatar(MessageItem messageItem, int position) { - if (position == 0) { - return true; - } - - MessageItem messageItem2 = getItem(position - 1); - - if (messagesFromDifferentPeople(messageItem, messageItem2)) { - // If the messages are from different people, then we don't care about any of the other checks, - // we need to show the avatar/timestamp. This is used for group chats, which is why we want - // both to be incoming messages - return true; - } else { - int MAX_DURATION = 60 * 60 * 1000; - return (messageItem.getBoxId() != messageItem2.getBoxId() || messageItem.mDate - messageItem2.mDate >= MAX_DURATION); - } - } - - private boolean messagesFromDifferentPeople(MessageItem a, MessageItem b) { - return (a.mAddress != null && b.mAddress != null && - !a.mAddress.equals(b.mAddress) && - !a.isOutgoingMessage( - - ) && !b.isOutgoingMessage()); - } - - private int getBubbleBackgroundResource(boolean showAvatar, boolean isMine) { - if (showAvatar && isMine) return ThemeManager.getSentBubbleRes(); - else if (showAvatar && !isMine) return ThemeManager.getReceivedBubbleRes(); - else if (!showAvatar && isMine) return ThemeManager.getSentBubbleAltRes(); - else if (!showAvatar && !isMine) return ThemeManager.getReceivedBubbleAltRes(); - else return -1; - } - - private void bindGrouping(MessageListViewHolder holder, MessageItem messageItem) { - int position = mCursor.getPosition(); - - boolean showAvatar = shouldShowAvatar(messageItem, position); - boolean showTimestamp = shouldShowTimestamp(messageItem, position); - - holder.mDateView.setVisibility(showTimestamp ? View.VISIBLE : View.GONE); - holder.mSpace.setVisibility(showAvatar ? View.VISIBLE : View.GONE); - holder.mBodyTextView.setBackgroundResource(getBubbleBackgroundResource(showAvatar, messageItem.isMe())); - - holder.setLiveViewCallback(key -> { - if (messageItem.isMe()) { - holder.mBodyTextView.getBackground().setColorFilter(ThemeManager.getSentBubbleColor(), PorterDuff.Mode.SRC_ATOP); - } else { - holder.mBodyTextView.getBackground().setColorFilter(ThemeManager.getReceivedBubbleColor(), PorterDuff.Mode.SRC_ATOP); - } - }); - - if (messageItem.isMe() && !mPrefs.getBoolean(SettingsFragment.HIDE_AVATAR_SENT, true)) { - holder.mAvatarView.setVisibility(showAvatar ? View.VISIBLE : View.GONE); - } else if (!messageItem.isMe() && !mPrefs.getBoolean(SettingsFragment.HIDE_AVATAR_RECEIVED, false)) { - holder.mAvatarView.setVisibility(showAvatar ? View.VISIBLE : View.GONE); - } - } - - private void bindBody(MessageListViewHolder holder, MessageItem messageItem) { - holder.mBodyTextView.setAutoLinkMask(0); - SpannableStringBuilder buf = new SpannableStringBuilder(); - - String body = messageItem.mBody; - - if (messageItem.mMessageType == PduHeaders.MESSAGE_TYPE_NOTIFICATION_IND) { - String msgSizeText = mContext.getString(R.string.message_size_label) - + String.valueOf((messageItem.mMessageSize + 1023) / 1024) - + mContext.getString(R.string.kilobyte); - - body = msgSizeText; - } - - // Cleanse the subject - String subject = MessageUtils.cleanseMmsSubject(mContext, messageItem.mSubject, body); - boolean hasSubject = !TextUtils.isEmpty(subject); - if (hasSubject) { - buf.append(mContext.getResources().getString(R.string.inline_subject, subject)); - } - - if (!TextUtils.isEmpty(body)) { - if (mPrefs.getBoolean(SettingsFragment.AUTO_EMOJI, false)) { - body = EmojiRegistry.parseEmojis(body); - } - - buf.append(body); - } - - if (messageItem.mHighlight != null) { - Matcher m = messageItem.mHighlight.matcher(buf.toString()); - while (m.find()) { - buf.setSpan(new StyleSpan(Typeface.BOLD), m.start(), m.end(), 0); - } - } - - if (!TextUtils.isEmpty(buf)) { - holder.mBodyTextView.setText(buf); - Matcher matcher = urlPattern.matcher(holder.mBodyTextView.getText()); - if (matcher.find()) { //only find the image to the first link - int matchStart = matcher.start(1); - int matchEnd = matcher.end(); - String imageUrl = buf.subSequence(matchStart, matchEnd).toString(); - Ion.with(mContext).load(imageUrl).withBitmap().asBitmap().setCallback((e, result) -> { - try { - holder.setImage("url_img" + holder.getItemId(), result); - holder.mImageView.setOnClickListener(v -> { - Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse(imageUrl)); - mContext.startActivity(i); - }); - } catch (NullPointerException imageException) { - imageException.printStackTrace(); - } - }); - } - LinkifyUtils.addLinks(holder.mBodyTextView); - } - holder.mBodyTextView.setVisibility(TextUtils.isEmpty(buf) ? View.GONE : View.VISIBLE); - holder.mBodyTextView.setOnClickListener(v -> holder.mRoot.callOnClick()); - holder.mBodyTextView.setOnLongClickListener(v -> holder.mRoot.performLongClick()); - } - - private void bindTimestamp(MessageListViewHolder holder, MessageItem messageItem) { - String timestamp; - - - if (messageItem.isSending()) { - timestamp = mContext.getString(R.string.status_sending); - } else if (messageItem.mTimestamp != null && !messageItem.mTimestamp.equals("")) { - timestamp = messageItem.mTimestamp; - } else if (messageItem.isOutgoingMessage() && messageItem.isFailedMessage()) { - timestamp = mContext.getResources().getString(R.string.status_failed); - } else if (messageItem.isMms()) { - timestamp = mContext.getString(R.string.loading); - } else { - timestamp = ""; - } - - if (!mIsGroupConversation || messageItem.isMe() || TextUtils.isEmpty(messageItem.mContact)) { - holder.mDateView.setText(timestamp); - } else { - holder.mDateView.setText(mContext.getString(R.string.message_timestamp_format, timestamp, messageItem.mContact)); - } - - } - - private void bindAvatar(MessageListViewHolder holder, MessageItem messageItem) { - if (!messageItem.isMe()) { - Contact contact = Contact.get(messageItem.mAddress, true); - holder.mAvatarView.setImageDrawable(contact.getAvatar(mContext, null)); - holder.mAvatarView.setContactName(contact.getName()); - if (contact.existsInDatabase()) { - holder.mAvatarView.assignContactUri(contact.getUri()); - } else { - holder.mAvatarView.assignContactFromPhone(contact.getNumber(), true); - } - } - } - - private void bindMmsView(final MessageListViewHolder holder, MessageItem messageItem) { - if (messageItem.isSms()) { - holder.showMmsView(false); - messageItem.setOnPduLoaded(null); - } else { - if (messageItem.mAttachmentType != SmsHelper.TEXT) { - if (holder.mImageView == null) { - holder.setImage(null, null); - } - setImageViewOnClickListener(holder, messageItem); - drawPlaybackButton(holder, messageItem); - } else { - holder.showMmsView(false); - } - - if (messageItem.mSlideshow == null) { - messageItem.setOnPduLoaded(messageItem1 -> { - if (mCursor == null) { - // The pdu has probably loaded after shutting down the fragment. Don't try to bind anything now - return; - } - if (messageItem1 != null && messageItem1.getMessageId() == messageItem1.getMessageId()) { - messageItem1.setCachedFormattedMessage(null); - bindGrouping(holder, messageItem); - bindBody(holder, messageItem); - bindTimestamp(holder, messageItem); - bindAvatar(holder, messageItem); - bindMmsView(holder, messageItem); - bindIndicators(holder, messageItem); - bindVcard(holder, messageItem); - } - }); - } else { - if (holder.mPresenter == null) { - holder.mPresenter = new MmsThumbnailPresenter(mContext, holder, messageItem.mSlideshow); - } else { - holder.mPresenter.setModel(messageItem.mSlideshow); - holder.mPresenter.setView(holder); - } - if (holder.mImageLoadedCallback == null) { - holder.mImageLoadedCallback = new MessageListViewHolder.ImageLoadedCallback(holder); - } else { - holder.mImageLoadedCallback.reset(holder); - } - holder.mPresenter.present(holder.mImageLoadedCallback); - } - } - } - - private void bindIndicators(MessageListViewHolder holder, MessageItem messageItem) { - // Locked icon - if (messageItem.mLocked) { - holder.mLockedIndicator.setVisibility(View.VISIBLE); - } else { - holder.mLockedIndicator.setVisibility(View.GONE); - } - - // Delivery icon - we can show a failed icon for both sms and mms, but for an actual - // delivery, we only show the icon for sms. We don't have the information here in mms to - // know whether the message has been delivered. For mms, msgItem.mDeliveryStatus set - // to MessageItem.DeliveryStatus.RECEIVED simply means the setting requesting a - // delivery report was turned on when the message was sent. Yes, it's confusing! - if ((messageItem.isOutgoingMessage() && messageItem.isFailedMessage()) || - messageItem.mDeliveryStatus == MessageItem.DeliveryStatus.FAILED) { - holder.mDeliveredIndicator.setVisibility(View.VISIBLE); - } else if (messageItem.isSms() && - messageItem.mDeliveryStatus == MessageItem.DeliveryStatus.RECEIVED) { - holder.mDeliveredIndicator.setVisibility(View.VISIBLE); - } else { - holder.mDeliveredIndicator.setVisibility(View.GONE); - } - - // Message details icon - this icon is shown both for sms and mms messages. For mms, - // we show the icon if the read report or delivery report setting was set when the - // message was sent. Showing the icon tells the user there's more information - // by selecting the "View report" menu. - if (messageItem.mDeliveryStatus == MessageItem.DeliveryStatus.INFO || messageItem.mReadReport - || (messageItem.isMms() && messageItem.mDeliveryStatus == MessageItem.DeliveryStatus.RECEIVED)) { - holder.mDetailsIndicator.setVisibility(View.VISIBLE); - } else { - holder.mDetailsIndicator.setVisibility(View.GONE); - } - } - - private void bindVcard(MessageListViewHolder holder, MessageItem messageItem) { - if (!ContentType.TEXT_VCARD.equals(messageItem.mTextContentType)) { - return; - } - - VCard vCard = Ezvcard.parse(messageItem.mBody).first(); - - SpannableString name = new SpannableString(vCard.getFormattedName().getValue()); - name.setSpan(new UnderlineSpan(), 0, name.length(), 0); - holder.mBodyTextView.setText(name); - } - - private void setImageViewOnClickListener(MessageListViewHolder holder, final MessageItem msgItem) { - if (holder.mImageView != null) { - switch (msgItem.mAttachmentType) { - case SmsHelper.IMAGE: - case SmsHelper.VIDEO: - holder.mImageView.setOnClickListener(holder); - holder.mImageView.setOnLongClickListener(holder); - break; - - default: - holder.mImageView.setOnClickListener(null); - break; - } - } - } - - private void drawPlaybackButton(MessageListViewHolder holder, MessageItem msgItem) { - if (holder.mSlideShowButton != null) { - switch (msgItem.mAttachmentType) { - case SmsHelper.SLIDESHOW: - case SmsHelper.AUDIO: - case SmsHelper.VIDEO: - // Show the 'Play' button and bind message info on it. - holder.mSlideShowButton.setTag(msgItem); - // Set call-back for the 'Play' button. - holder.mSlideShowButton.setOnClickListener(holder); - holder.mSlideShowButton.setVisibility(View.VISIBLE); - break; - default: - holder.mSlideShowButton.setVisibility(View.GONE); - break; - } - } - } - - @Override - public void changeCursor(Cursor cursor) { - if (CursorUtils.isValid(cursor)) { - mColumnsMap = new MessageColumns.ColumnsMap(cursor); - mMessageItemCache = new MessageItemCache(mContext, mColumnsMap, mSearchHighlighter, MessageColumns.CACHE_SIZE); - } - - super.changeCursor(cursor); - } - - @Override - public int getItemViewType(int position) { - // This method shouldn't be called if our cursor is null, since the framework should know - // that there aren't any items to look at in that case - MessageItem item = getItem(position); - int boxId = item.getBoxId(); - - if (item.isSms()) { - if (boxId == TextBasedSmsColumns.MESSAGE_TYPE_INBOX || boxId == TextBasedSmsColumns.MESSAGE_TYPE_ALL) { - return INCOMING_ITEM; - } else { - return OUTGOING_ITEM; - } - } else { - if (boxId == Telephony.Mms.MESSAGE_BOX_ALL || boxId == Telephony.Mms.MESSAGE_BOX_INBOX) { - return INCOMING_ITEM; - } else { - return OUTGOING_ITEM; - } - } - } - -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/messagelist/MessageListFragment.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/messagelist/MessageListFragment.java deleted file mode 100644 index 1d71cf4c3..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/messagelist/MessageListFragment.java +++ /dev/null @@ -1,1020 +0,0 @@ -package com.moez.QKSMS.ui.messagelist; - -import android.app.AlertDialog; -import android.app.LoaderManager; -import android.content.ContentResolver; -import android.content.ContentUris; -import android.content.Context; -import android.content.CursorLoader; -import android.content.DialogInterface; -import android.content.Intent; -import android.content.Loader; -import android.database.Cursor; -import android.database.sqlite.SQLiteException; -import android.database.sqlite.SqliteWrapper; -import android.hardware.Sensor; -import android.hardware.SensorEvent; -import android.hardware.SensorEventListener; -import android.hardware.SensorManager; -import android.net.Uri; -import android.os.AsyncTask; -import android.os.Bundle; -import android.os.Vibrator; -import android.provider.Telephony; -import android.support.annotation.IntegerRes; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; -import android.text.SpannableString; -import android.text.TextUtils; -import android.text.style.URLSpan; -import android.text.util.Linkify; -import android.util.Log; -import android.view.LayoutInflater; -import android.view.Menu; -import android.view.MenuInflater; -import android.view.MenuItem; -import android.view.View; -import android.view.ViewGroup; -import android.widget.AdapterView; -import android.widget.Toast; -import com.google.android.mms.ContentType; -import com.moez.QKSMS.LogTag; -import com.moez.QKSMS.MmsConfig; -import com.moez.QKSMS.QKSMSApp; -import com.moez.QKSMS.R; -import com.moez.QKSMS.common.CIELChEvaluator; -import com.moez.QKSMS.common.ConversationPrefsHelper; -import com.moez.QKSMS.common.DialogHelper; -import com.moez.QKSMS.common.LiveViewManager; -import com.moez.QKSMS.common.QKPreferences; -import com.moez.QKSMS.common.utils.KeyboardUtils; -import com.moez.QKSMS.common.utils.MessageUtils; -import com.moez.QKSMS.common.vcard.ContactOperations; -import com.moez.QKSMS.data.Contact; -import com.moez.QKSMS.data.ContactList; -import com.moez.QKSMS.data.Conversation; -import com.moez.QKSMS.data.ConversationLegacy; -import com.moez.QKSMS.data.Message; -import com.moez.QKSMS.enums.QKPreference; -import com.moez.QKSMS.interfaces.ActivityLauncher; -import com.moez.QKSMS.transaction.NotificationManager; -import com.moez.QKSMS.transaction.SmsHelper; -import com.moez.QKSMS.ui.MainActivity; -import com.moez.QKSMS.ui.SwipeBackLayout; -import com.moez.QKSMS.ui.ThemeManager; -import com.moez.QKSMS.ui.base.QKFragment; -import com.moez.QKSMS.ui.base.RecyclerCursorAdapter; -import com.moez.QKSMS.ui.delivery.DeliveryReportHelper; -import com.moez.QKSMS.ui.delivery.DeliveryReportItem; -import com.moez.QKSMS.ui.dialog.AsyncDialog; -import com.moez.QKSMS.ui.dialog.ConversationSettingsDialog; -import com.moez.QKSMS.ui.dialog.QKDialog; -import com.moez.QKSMS.ui.dialog.conversationdetails.ConversationDetailsDialog; -import com.moez.QKSMS.ui.settings.SettingsFragment; -import com.moez.QKSMS.ui.view.ComposeView; -import com.moez.QKSMS.ui.view.MessageListRecyclerView; -import com.moez.QKSMS.ui.view.SmoothLinearLayoutManager; -import com.moez.QKSMS.ui.widget.WidgetProvider; -import ezvcard.Ezvcard; -import ezvcard.VCard; - -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; - -import static android.R.attr.data; - -public class MessageListFragment extends QKFragment implements ActivityLauncher, SensorEventListener, - LoaderManager.LoaderCallbacks<Cursor>, RecyclerCursorAdapter.MultiSelectListener, SwipeBackLayout.ScrollChangedListener, - RecyclerCursorAdapter.ItemClickListener<MessageItem> { - - public static final String TAG = "MessageListFragment"; - - private static final int MESSAGE_LIST_QUERY_TOKEN = 9527; - private static final int MESSAGE_LIST_QUERY_AFTER_DELETE_TOKEN = 9528; - private static final int DELETE_MESSAGE_TOKEN = 9700; - - private static final int MENU_EDIT_MESSAGE = 14; - private static final int MENU_VIEW_SLIDESHOW = 16; - private static final int MENU_VIEW_MESSAGE_DETAILS = 17; - private static final int MENU_DELETE_MESSAGE = 18; - private static final int MENU_SEARCH = 19; - private static final int MENU_DELIVERY_REPORT = 20; - private static final int MENU_FORWARD_MESSAGE = 21; - private static final int MENU_CALL_BACK = 22; - private static final int MENU_SEND_EMAIL = 23; - private static final int MENU_COPY_MESSAGE_TEXT = 24; - private static final int MENU_COPY_TO_SDCARD = 25; - private static final int MENU_ADD_ADDRESS_TO_CONTACTS = 27; - private static final int MENU_LOCK_MESSAGE = 28; - private static final int MENU_UNLOCK_MESSAGE = 29; - private static final int MENU_SAVE_RINGTONE = 30; - private static final int MENU_PREFERENCES = 31; - private static final int MENU_GROUP_PARTICIPANTS = 32; - - private boolean mIsSmsEnabled; - - private Cursor mCursor; - private CIELChEvaluator mCIELChEvaluator; - private MessageListAdapter mAdapter; - private SmoothLinearLayoutManager mLayoutManager; - private MessageListRecyclerView mRecyclerView; - private Conversation mConversation; - private ConversationLegacy mConversationLegacy; - - private Sensor mProxSensor; - private SensorManager mSensorManager; - private AsyncDialog mAsyncDialog; - private ComposeView mComposeView; - private ConversationPrefsHelper mConversationPrefs; - private ConversationDetailsDialog mConversationDetailsDialog; - - private int mSavedScrollPosition = -1; // we save the ListView's scroll position in onPause(), - // so we can remember it after re-entering the activity. - // If the value >= 0, then we jump to that line. If the - // value is maxint, then we jump to the end. - - private BackgroundQueryHandler mBackgroundQueryHandler; - - private long mThreadId; - private long mRowId; - private String mHighlight; - private boolean mShowImmediate; - - protected static MessageListFragment getInstance(long threadId, long rowId, String highlight, boolean showImmediate) { - - Bundle args = new Bundle(); - args.putLong(MessageListActivity.ARG_THREAD_ID, threadId); - args.putLong(MessageListActivity.ARG_ROW_ID, rowId); - args.putString(MessageListActivity.ARG_HIGHLIGHT, highlight); - args.putBoolean(MessageListActivity.ARG_SHOW_IMMEDIATE, showImmediate); - - MessageListFragment fragment = new MessageListFragment(); - fragment.setArguments(args); - - return fragment; - } - - public MessageListFragment() { - - } - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - if (getArguments() != null) { - Bundle args = getArguments(); - mThreadId = args.getLong(MessageListActivity.ARG_THREAD_ID, -1); - mRowId = args.getLong(MessageListActivity.ARG_ROW_ID, -1); - mHighlight = args.getString(MessageListActivity.ARG_HIGHLIGHT, null); - mShowImmediate = args.getBoolean(MessageListActivity.ARG_SHOW_IMMEDIATE, false); - } else if (savedInstanceState != null) { - mThreadId = savedInstanceState.getLong(MessageListActivity.ARG_THREAD_ID, -1); - mRowId = savedInstanceState.getLong(MessageListActivity.ARG_ROW_ID, -1); - mHighlight = savedInstanceState.getString(MessageListActivity.ARG_HIGHLIGHT, null); - mShowImmediate = savedInstanceState.getBoolean(MessageListActivity.ARG_SHOW_IMMEDIATE, false); - } - - mConversationPrefs = new ConversationPrefsHelper(mContext, mThreadId); - mIsSmsEnabled = MmsConfig.isSmsEnabled(mContext); - mConversationDetailsDialog = new ConversationDetailsDialog(mContext, getFragmentManager()); - onOpenConversation(); - setHasOptionsMenu(true); - - LiveViewManager.registerView(QKPreference.CONVERSATION_THEME, this, key -> { - mCIELChEvaluator = new CIELChEvaluator(mConversationPrefs.getColor(), ThemeManager.getThemeColor()); - }); - - - mSensorManager = (SensorManager) mContext.getSystemService(Context.SENSOR_SERVICE); - mProxSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY); - - if (QKPreferences.getBoolean(QKPreference.PROXIMITY_SENSOR)) { - mSensorManager.registerListener(this, mProxSensor, SensorManager.SENSOR_DELAY_NORMAL); - } - - mBackgroundQueryHandler = new BackgroundQueryHandler(mContext.getContentResolver()); - } - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - - View view = inflater.inflate(R.layout.fragment_conversation, container, false); - mRecyclerView = (MessageListRecyclerView) view.findViewById(R.id.conversation); - - mAdapter = new MessageListAdapter(mContext); - mAdapter.setItemClickListener(this); - mAdapter.setMultiSelectListener(this); - mAdapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() { - private long mLastMessageId = -1; - @Override - public void onChanged() { - LinearLayoutManager manager = (LinearLayoutManager) mRecyclerView.getLayoutManager(); - int position; - - if (mRowId != -1 && mCursor != null) { - // Scroll to the position in the conversation for that message. - position = SmsHelper.getPositionForMessageId(mCursor, "sms", mRowId, mAdapter.getColumnsMap()); - - // Be sure to reset the row ID here---we only want to scroll to the message - // the first time the cursor is loaded after the row ID is set. - mRowId = -1; - - } else { - position = mAdapter.getItemCount() - 1; - } - - if(mAdapter.getCount() > 0) { - MessageItem lastMessage = mAdapter.getItem(mAdapter.getCount() - 1); - if (mLastMessageId >= 0 && mLastMessageId != lastMessage.getMessageId()) { - // Scroll to bottom only if a new message was inserted in this conversation - if (position != -1) { - manager.smoothScrollToPosition(mRecyclerView, null, position); - } - } - mLastMessageId = lastMessage.getMessageId(); - } - } - }); - - mRecyclerView.setAdapter(mAdapter); - - mLayoutManager = new SmoothLinearLayoutManager(mContext); - mLayoutManager.setStackFromEnd(true); - mRecyclerView.setLayoutManager(mLayoutManager); - - mComposeView = (ComposeView) view.findViewById(R.id.compose_view); - mComposeView.setActivityLauncher(this); - mComposeView.setLabel("MessageList"); - - mRecyclerView.setComposeView(mComposeView); - - return view; - } - - @Override - public void onResume() { - super.onResume(); - - if (QKPreferences.getBoolean(QKPreference.PROXIMITY_SENSOR)) { - mSensorManager.registerListener(this, mProxSensor, SensorManager.SENSOR_DELAY_NORMAL); - } - - ThemeManager.setActiveColor(mConversationPrefs.getColor()); - } - - @Override - public void onSaveInstanceState(Bundle outState) { - outState.putLong(MessageListActivity.ARG_THREAD_ID, mThreadId); - outState.putLong(MessageListActivity.ARG_ROW_ID, mRowId); - outState.putString(MessageListActivity.ARG_HIGHLIGHT, mHighlight); - outState.putBoolean(MessageListActivity.ARG_SHOW_IMMEDIATE, mShowImmediate); - } - - public long getThreadId() { - return mThreadId; - } - - /** - * To be called when the user opens a conversation. Initializes the Conversation objects, sets - * up the draft, and marks the conversation as read. - * <p> - * Note: This will have no effect if the context has not been initialized yet. - */ - private void onOpenConversation() { - new LoadConversationTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, null); - } - - private void setTitle() { - if (mContext != null && mConversation != null) { - mContext.setTitle(mConversation.getRecipients().formatNames(", ")); - } - } - - @Override - public void onItemClick(final MessageItem messageItem, View view) { - if (mAdapter.isInMultiSelectMode()) { - mAdapter.toggleSelection(messageItem.getMessageId(), messageItem); - } else { - if (view.getId() == R.id.image_view || view.getId() == R.id.play_slideshow_button) { - switch (messageItem.mAttachmentType) { - case SmsHelper.IMAGE: - case SmsHelper.AUDIO: - case SmsHelper.SLIDESHOW: - MessageUtils.viewMmsMessageAttachment(getActivity(), messageItem.mMessageUri, messageItem.mSlideshow, getAsyncDialog()); - break; - case SmsHelper.VIDEO: - new QKDialog() - .setContext(mContext) - .setTitle(R.string.warning) - .setMessage(R.string.stagefright_warning) - .setNegativeButton(R.string.cancel, null) - .setPositiveButton(R.string.yes, new View.OnClickListener() { - @Override - public void onClick(View view) { - MessageUtils.viewMmsMessageAttachment(getActivity(), messageItem.mMessageUri, messageItem.mSlideshow, getAsyncDialog()); - } - }) - .show(); - break; - } - } else if (messageItem != null && messageItem.isOutgoingMessage() && messageItem.isFailedMessage()) { - showMessageResendOptions(messageItem); - } else if (messageItem != null && ContentType.TEXT_VCARD.equals(messageItem.mTextContentType)) { - openVcard(messageItem); - } else { - showMessageDetails(messageItem); - } - } - } - - @Override - public void onItemLongClick(MessageItem messageItem, View view) { - - QKDialog dialog = new QKDialog(); - dialog.setContext(mContext); - dialog.setTitle(R.string.message_options); - - MsgListMenuClickListener l = new MsgListMenuClickListener(messageItem); - - // It is unclear what would make most sense for copying an MMS message - // to the clipboard, so we currently do SMS only. - if (messageItem.isSms()) { - // Message type is sms. Only allow "edit" if the message has a single recipient - if (getRecipients().size() == 1 && (messageItem.mBoxId == Telephony.Sms.MESSAGE_TYPE_OUTBOX || messageItem.mBoxId == Telephony.Sms.MESSAGE_TYPE_FAILED)) { - dialog.addMenuItem(R.string.menu_edit, MENU_EDIT_MESSAGE); - - } - - dialog.addMenuItem(R.string.copy_message_text, MENU_COPY_MESSAGE_TEXT); - } - - addCallAndContactMenuItems(dialog, messageItem); - - // Forward is not available for undownloaded messages. - if (messageItem.isDownloaded() && (messageItem.isSms() || MessageUtils.isForwardable(mContext, messageItem.getMessageId())) && mIsSmsEnabled) { - dialog.addMenuItem(R.string.menu_forward, MENU_FORWARD_MESSAGE); - } - - if (messageItem.isMms()) { - switch (messageItem.mBoxId) { - case Telephony.Mms.MESSAGE_BOX_INBOX: - break; - case Telephony.Mms.MESSAGE_BOX_OUTBOX: - // Since we currently break outgoing messages to multiple - // recipients into one message per recipient, only allow - // editing a message for single-recipient conversations. - if (getRecipients().size() == 1) { - dialog.addMenuItem(R.string.menu_edit, MENU_EDIT_MESSAGE); - } - break; - } - switch (messageItem.mAttachmentType) { - case SmsHelper.TEXT: - break; - case SmsHelper.VIDEO: - case SmsHelper.IMAGE: - if (MessageUtils.haveSomethingToCopyToSDCard(mContext, messageItem.mMsgId)) { - dialog.addMenuItem(R.string.copy_to_sdcard, MENU_COPY_TO_SDCARD); - } - break; - case SmsHelper.SLIDESHOW: - default: - dialog.addMenuItem(R.string.view_slideshow, MENU_VIEW_SLIDESHOW); - if (MessageUtils.haveSomethingToCopyToSDCard(mContext, messageItem.mMsgId)) { - dialog.addMenuItem(R.string.copy_to_sdcard, MENU_COPY_TO_SDCARD); - } - if (MessageUtils.isDrmRingtoneWithRights(mContext, messageItem.mMsgId)) { - dialog.addMenuItem(MessageUtils.getDrmMimeMenuStringRsrc(mContext, messageItem.mMsgId), MENU_SAVE_RINGTONE); - } - break; - } - } - - if (messageItem.mLocked && mIsSmsEnabled) { - dialog.addMenuItem(R.string.menu_unlock, MENU_UNLOCK_MESSAGE); - } else if (mIsSmsEnabled) { - dialog.addMenuItem(R.string.menu_lock, MENU_LOCK_MESSAGE); - } - - dialog.addMenuItem(R.string.view_message_details, MENU_VIEW_MESSAGE_DETAILS); - - if (messageItem.mDeliveryStatus != MessageItem.DeliveryStatus.NONE || messageItem.mReadReport) { - dialog.addMenuItem(R.string.view_delivery_report, MENU_DELIVERY_REPORT); - } - - if (mIsSmsEnabled) { - dialog.addMenuItem(R.string.delete_message, MENU_DELETE_MESSAGE); - } - - dialog.buildMenu(l); - dialog.show(); - } - - private void addCallAndContactMenuItems(QKDialog dialog, MessageItem msgItem) { - if (TextUtils.isEmpty(msgItem.mBody)) { - return; - } - SpannableString msg = new SpannableString(msgItem.mBody); - Linkify.addLinks(msg, Linkify.ALL); - ArrayList<String> uris = MessageUtils.extractUris(msg.getSpans(0, msg.length(), URLSpan.class)); - - // Remove any dupes so they don't get added to the menu multiple times - HashSet<String> collapsedUris = new HashSet<>(); - for (String uri : uris) { - collapsedUris.add(uri.toLowerCase()); - } - for (String uriString : collapsedUris) { - String prefix = null; - int sep = uriString.indexOf(":"); - if (sep >= 0) { - prefix = uriString.substring(0, sep); - uriString = uriString.substring(sep + 1); - } - Uri contactUri = null; - boolean knownPrefix = true; - if ("mailto".equalsIgnoreCase(prefix)) { - contactUri = MessageUtils.getContactUriForEmail(mContext, uriString); - } else if ("tel".equalsIgnoreCase(prefix)) { - contactUri = MessageUtils.getContactUriForPhoneNumber(uriString); - } else { - knownPrefix = false; - } - if (knownPrefix && contactUri == null) { - Intent intent = MainActivity.createAddContactIntent(uriString); - - String addContactString = getString(R.string.menu_add_address_to_contacts, uriString); - dialog.addMenuItem(addContactString, MENU_ADD_ADDRESS_TO_CONTACTS); - } - } - } - - private ContactList getRecipients() { - return mConversation.getRecipients(); - } - - AsyncDialog getAsyncDialog() { - if (mAsyncDialog == null) { - mAsyncDialog = new AsyncDialog(getActivity()); - } - return mAsyncDialog; - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case R.id.menu_call: - makeCall(); - return true; - - case R.id.menu_notifications: - boolean notificationMuted = mConversationPrefs.getNotificationsEnabled(); - mConversationPrefs.putBoolean(SettingsFragment.NOTIFICATIONS, !notificationMuted); - mContext.invalidateOptionsMenu(); - vibrateOnConversationStateChanged(notificationMuted); - return true; - - case R.id.menu_details: - mConversationDetailsDialog.showDetails(mConversation); - return true; - - case R.id.menu_notification_settings: - ConversationSettingsDialog.newInstance(mThreadId, mConversation.getRecipients().formatNames(", ")) - .setContext(mContext) - .show(); - return true; - - case R.id.menu_delete_conversation: - DialogHelper.showDeleteConversationDialog(mContext, mThreadId); - return true; - } - return super.onOptionsItemSelected(item); - } - - private void makeCall() { - Intent openDialerIntent = new Intent(Intent.ACTION_CALL); - openDialerIntent.setData(Uri.parse("tel:" + mConversationLegacy.getAddress())); - startActivity(openDialerIntent); - } - - private void vibrateOnConversationStateChanged(final boolean notificationMuted) { - final int vibrateTime = 70; - Toast.makeText(getActivity(), notificationMuted ? - R.string.notification_mute_off : R.string.notification_mute_on, Toast.LENGTH_SHORT).show(); - Vibrator v = (Vibrator) getActivity().getSystemService(Context.VIBRATOR_SERVICE); - v.vibrate(vibrateTime); - } - - /** - * Photo Selection result - */ - public void onActivityResult(int requestCode, int resultCode, final Intent data) { - if (!mComposeView.onActivityResult(requestCode, resultCode, data)) { - // Wasn't handled by ComposeView - } - } - - /** - * Should only be called for failed messages. Deletes the message, placing the text from the - * message back in the edit box to be updated and then sent. - * <p> - * Assumes that cursor points to the correct MessageItem. - * - * @param msgItem - */ - private void editMessageItem(MessageItem msgItem) { - String body = msgItem.mBody; - - // Delete the message and put the text back into the edit text. - deleteMessageItem(msgItem); - - // Set the text and open the keyboard - KeyboardUtils.show(mContext); - - mComposeView.setText(body); - } - - /** - * Should only be called for failed messages. Deletes the message and resends it. - * - * @param msgItem - */ - public void resendMessageItem(final MessageItem msgItem) { - String body = msgItem.mBody; - deleteMessageItem(msgItem); - - mComposeView.setText(body); - mComposeView.sendSms(); - } - - /** - * Deletes the message from the conversation list and the conversation history. - * - * @param msgItem - */ - public void deleteMessageItem(final MessageItem msgItem) { - new AsyncTask<Void, Void, Void>() { - protected Void doInBackground(Void... none) { - if (msgItem.isMms()) { - MessageUtils.removeThumbnailsFromCache(msgItem.getSlideshow()); - - QKSMSApp.getApplication().getPduLoaderManager().removePdu(msgItem.mMessageUri); - // Delete the message *after* we've removed the thumbnails because we - // need the pdu and slideshow for removeThumbnailsFromCache to work. - } - - // Determine if we're deleting the last item in the cursor. - Boolean deletingLastItem = false; - if (mAdapter != null && mAdapter.getCursor() != null) { - mCursor = mAdapter.getCursor(); - mCursor.moveToLast(); - long msgId = mCursor.getLong(MessageColumns.COLUMN_ID); - deletingLastItem = msgId == msgItem.mMsgId; - } - - mBackgroundQueryHandler.startDelete(DELETE_MESSAGE_TOKEN, deletingLastItem, - msgItem.mMessageUri, msgItem.mLocked ? null : "locked=0", null); - return null; - } - }.execute(); - } - - private void initLoaderManager() { - getLoaderManager().initLoader(QKSMSApp.LOADER_MESSAGES, null, this); - } - - @Override - public void onPause() { - super.onPause(); - mComposeView.saveDraft(); - - if (mSensorManager != null) { - mSensorManager.unregisterListener(this); - } - - if (mConversationLegacy != null) { - mConversationLegacy.markRead(); - } - - if (mConversation != null) { - mConversation.blockMarkAsRead(true); - mConversation.markAsRead(); - mComposeView.saveDraft(); - } - - ThemeManager.setActiveColor(ThemeManager.getThemeColor()); - } - - @Override - public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { - super.onCreateOptionsMenu(menu, inflater); - - menu.findItem(R.id.menu_notifications).setTitle(mConversationPrefs.getNotificationsEnabled() ? - R.string.menu_notifications : R.string.menu_notifications_off); - menu.findItem(R.id.menu_notifications).setIcon(mConversationPrefs.getNotificationsEnabled() ? - R.drawable.ic_notifications : R.drawable.ic_notifications_muted); - } - - @Override - public void onSensorChanged(SensorEvent event) { - if (event.values[0] == 0 && isAdded()) { - makeCall(); - } - } - - @Override - public void onAccuracyChanged(Sensor sensor, int accuracy) { - // Ignored - } - - @Override - public Loader<Cursor> onCreateLoader(int id, Bundle args) { - if (id == QKSMSApp.LOADER_MESSAGES) { - return new CursorLoader(mContext, - Uri.withAppendedPath(Message.MMS_SMS_CONTENT_PROVIDER, String.valueOf(mThreadId)), - MessageColumns.PROJECTION, null, null, "normalized_date ASC"); - } else { - return null; - } - } - - @Override - public void onLoadFinished(Loader<Cursor> loader, Cursor data) { - if (mAdapter != null && loader.getId() == QKSMSApp.LOADER_MESSAGES) { - // Swap the new cursor in. (The framework will take care of closing the, old cursor once we return.) - mAdapter.changeCursor(data); - } - } - - @Override - public void onLoaderReset(Loader<Cursor> loader) { - if (mAdapter != null && loader.getId() == QKSMSApp.LOADER_MESSAGES) { - mAdapter.changeCursor(null); - } - } - - @Override - public void onMultiSelectStateChanged(boolean enabled) { - - } - - @Override - public void onItemAdded(long id) { - - } - - @Override - public void onItemRemoved(long id) { - - } - - @Override - public void onScrollChanged(float scrollPercent) { - if (mConversationPrefs != null) { - ThemeManager.setActiveColor(mCIELChEvaluator.evaluate(scrollPercent)); - } - } - - private class DeleteMessageListener implements DialogInterface.OnClickListener { - private final MessageItem mMessageItem; - - public DeleteMessageListener(MessageItem messageItem) { - mMessageItem = messageItem; - } - - @Override - public void onClick(DialogInterface dialog, int whichButton) { - dialog.dismiss(); - deleteMessageItem(mMessageItem); - } - } - - /** - * Context menu handlers for the message list view. - */ - private final class MsgListMenuClickListener implements AdapterView.OnItemClickListener { - private MessageItem mMsgItem; - - public MsgListMenuClickListener(MessageItem msgItem) { - mMsgItem = msgItem; - } - - @Override - public void onItemClick(AdapterView<?> parent, View view, int position, long id) { - if (mMsgItem == null) { - return; - } - - switch ((int) id) { - case MENU_EDIT_MESSAGE: - editMessageItem(mMsgItem); - break; - - case MENU_COPY_MESSAGE_TEXT: - MessageUtils.copyToClipboard(mContext, mMsgItem.mBody); - break; - - case MENU_FORWARD_MESSAGE: - MessageUtils.forwardMessage(mContext, mMsgItem); - break; - - case MENU_VIEW_SLIDESHOW: - MessageUtils.viewMmsMessageAttachment(getActivity(), ContentUris.withAppendedId(Telephony.Mms.CONTENT_URI, mMsgItem.mMsgId), null, getAsyncDialog()); - break; - - case MENU_VIEW_MESSAGE_DETAILS: - showMessageDetails(mMsgItem); - break; - - case MENU_DELETE_MESSAGE: - DeleteMessageListener l = new DeleteMessageListener(mMsgItem); - confirmDeleteDialog(l, mMsgItem.mLocked); - break; - - case MENU_DELIVERY_REPORT: - showDeliveryReport(mMsgItem.mMsgId, mMsgItem.mType); - break; - - case MENU_COPY_TO_SDCARD: { - int resId = MessageUtils.copyMedia(mContext, mMsgItem.mMsgId) ? R.string.copy_to_sdcard_success : R.string.copy_to_sdcard_fail; - Toast.makeText(mContext, resId, Toast.LENGTH_SHORT).show(); - break; - } - - case MENU_SAVE_RINGTONE: { - int resId = MessageUtils.getDrmMimeSavedStringRsrc(mContext, mMsgItem.mMsgId, MessageUtils.saveRingtone(mContext, mMsgItem.mMsgId)); - Toast.makeText(mContext, resId, Toast.LENGTH_SHORT).show(); - break; - } - - case MENU_ADD_ADDRESS_TO_CONTACTS: - MessageUtils.addToContacts(mContext, mMsgItem); - break; - - case MENU_LOCK_MESSAGE: - MessageUtils.lockMessage(mContext, mMsgItem, true); - break; - - case MENU_UNLOCK_MESSAGE: - MessageUtils.lockMessage(mContext, mMsgItem, false); - break; - } - } - } - - private boolean showMessageResendOptions(final MessageItem msgItem) { - final Cursor cursor = mAdapter.getCursorForItem(msgItem); - if (cursor == null) { - return false; - } - - KeyboardUtils.hide(mContext, mComposeView); - - new QKDialog() - .setContext(mContext) - .setTitle(R.string.failed_message_title) - .setItems(R.array.resend_menu, (parent, view, position, id) -> { - switch (position) { - case 0: // Resend message - resendMessageItem(msgItem); - - break; - case 1: // Edit message - editMessageItem(msgItem); - - break; - case 2: // Delete message - confirmDeleteDialog(new DeleteMessageListener(msgItem), false); - break; - } - }).show(); - return true; - } - - private void openVcard(MessageItem messageItem) { - Log.d(TAG, "Vcard: " + messageItem.mBody); - - VCard vCard = Ezvcard.parse(messageItem.mBody).first(); - - ContactOperations operations = new ContactOperations(mContext); - try { - operations.insertContact(vCard); - } catch (Exception e) { - e.printStackTrace(); - } - } - - private boolean showMessageDetails(MessageItem msgItem) { - Cursor cursor = mAdapter.getCursorForItem(msgItem); - if (cursor == null) { - return false; - } - String messageDetails = MessageUtils.getMessageDetails(mContext, cursor, msgItem.mMessageSize); - new QKDialog() - .setContext(mContext) - .setTitle(R.string.message_details_title) - .setMessage(messageDetails) - .setCancelOnTouchOutside(true) - .show(); - return true; - } - - private void confirmDeleteDialog(DialogInterface.OnClickListener listener, boolean locked) { - AlertDialog.Builder builder = new AlertDialog.Builder(mContext); - builder.setCancelable(true); - builder.setMessage(locked ? R.string.confirm_delete_locked_message : R.string.confirm_delete_message); - builder.setPositiveButton(R.string.delete, listener); - builder.setNegativeButton(R.string.cancel, null); - builder.show(); - } - - private void showDeliveryReport(long messageId, String type) { - DeliveryReportHelper deliveryReportHelper = new DeliveryReportHelper(mContext, messageId, type); - List<DeliveryReportItem> deliveryReportItems = deliveryReportHelper.getListItems(); - - String[] items = new String[deliveryReportItems.size() * 3]; - for (int i = 0; i < deliveryReportItems.size() * 3; i++) { - switch (i % 3) { - case 0: - items[i] = deliveryReportItems.get(i - (i / 3)).recipient; - break; - case 1: - items[i] = deliveryReportItems.get(i - 1 - ((i - 1) / 3)).status; - break; - case 2: - items[i] = deliveryReportItems.get(i - 2 - ((i - 2) / 3)).deliveryDate; - break; - } - } - - new QKDialog() - .setContext(mContext) - .setTitle(R.string.delivery_header_title) - .setItems(items, null) - .setPositiveButton(R.string.okay, null) - .show(); - } - - private void startMsgListQuery(int token) { - /*if (mSendDiscreetMode) { - return; - }*/ - Uri conversationUri = mConversation.getUri(); - - if (conversationUri == null) { - Log.v(TAG, "##### startMsgListQuery: conversationUri is null, bail!"); - return; - } - - long threadId = mConversation.getThreadId(); - if (LogTag.VERBOSE || Log.isLoggable(LogTag.APP, Log.VERBOSE)) { - Log.v(TAG, "startMsgListQuery for " + conversationUri + ", threadId=" + threadId + - " token: " + token + " mConversation: " + mConversation); - } - - // Cancel any pending queries - mBackgroundQueryHandler.cancelOperation(token); - try { - // Kick off the new query - mBackgroundQueryHandler.startQuery( - token, - threadId /* cookie */, - conversationUri, - MessageColumns.PROJECTION, - null, null, null); - } catch (SQLiteException e) { - SqliteWrapper.checkSQLiteException(mContext, e); - } - } - - private final class BackgroundQueryHandler extends Conversation.ConversationQueryHandler { - public BackgroundQueryHandler(ContentResolver contentResolver) { - super(contentResolver, mContext); - } - - @Override - protected void onQueryComplete(int token, Object cookie, Cursor cursor) { - switch (token) { - case MainActivity.HAVE_LOCKED_MESSAGES_TOKEN: - if (mContext.isFinishing()) { - Log.w(TAG, "ComposeMessageActivity is finished, do nothing "); - if (cursor != null) { - cursor.close(); - } - return; - } - @SuppressWarnings("unchecked") - ArrayList<Long> threadIds = (ArrayList<Long>) cookie; - MainActivity.confirmDeleteThreadDialog( - new MainActivity.DeleteThreadListener(threadIds, mBackgroundQueryHandler, mContext), threadIds, - cursor != null && cursor.getCount() > 0, mContext); - if (cursor != null) { - cursor.close(); - } - break; - - case MESSAGE_LIST_QUERY_AFTER_DELETE_TOKEN: - // check consistency between the query result and 'mConversation' - long tid = (Long) cookie; - - if (LogTag.VERBOSE || Log.isLoggable(LogTag.APP, Log.VERBOSE)) { - Log.v(TAG, "##### onQueryComplete (after delete): msg history result for threadId " + tid); - } - if (cursor == null) { - return; - } - if (tid > 0 && cursor.getCount() == 0) { - // We just deleted the last message and the thread will get deleted - // by a trigger in the database. Clear the threadId so next time we - // need the threadId a new thread will get created. - Log.v(TAG, "##### MESSAGE_LIST_QUERY_AFTER_DELETE_TOKEN clearing thread id: " + tid); - Conversation conv = Conversation.get(mContext, tid, false); - if (conv != null) { - conv.clearThreadId(); - conv.setDraftState(false); - } - mContext.onBackPressed(); - } - cursor.close(); - } - } - - @Override - protected void onDeleteComplete(int token, Object cookie, int result) { - super.onDeleteComplete(token, cookie, result); - switch (token) { - case MainActivity.DELETE_CONVERSATION_TOKEN: - mConversation.setMessageCount(0); - // fall through - case DELETE_MESSAGE_TOKEN: - - // Update the notification for new messages since they may be deleted. - NotificationManager.update(mContext); - - // TODO Update the notification for failed messages since they may be deleted. - //updateSendFailedNotification(); - break; - } - // If we're deleting the whole conversation, throw away our current working message and bail. - if (token == MainActivity.DELETE_CONVERSATION_TOKEN) { - ContactList recipients = mConversation.getRecipients(); - - // Remove any recipients referenced by this single thread from the It's possible for two or more - // threads to reference the same contact. That's ok if we remove it. We'll recreate that contact - // when we init all Conversations below. - if (recipients != null) { - for (Contact contact : recipients) { - contact.removeFromCache(); - } - } - - // Make sure the conversation cache reflects the threads in the DB. - Conversation.init(mContext); - - // Go back to the conversation list - mContext.onBackPressed(); - } else if (token == DELETE_MESSAGE_TOKEN) { - // Check to see if we just deleted the last message - startMsgListQuery(MESSAGE_LIST_QUERY_AFTER_DELETE_TOKEN); - } - - WidgetProvider.notifyDatasetChanged(mContext); - } - } - - private class LoadConversationTask extends AsyncTask<Void, Void, Void> { - - public LoadConversationTask() { - Log.d(TAG, "LoadConversationTask"); - } - - @Override - protected Void doInBackground(Void... params) { - Log.d(TAG, "Loading conversation"); - mConversation = Conversation.get(mContext, mThreadId, true); - mConversationLegacy = new ConversationLegacy(mContext, mThreadId); - - mConversationLegacy.markRead(); - mConversation.blockMarkAsRead(true); - mConversation.markAsRead(); - - return null; - } - - @Override - protected void onPostExecute(Void aVoid) { - super.onPostExecute(aVoid); - Log.d(TAG, "Conversation loaded"); - - mComposeView.onOpenConversation(mConversation, mConversationLegacy); - setTitle(); - - mAdapter.setIsGroupConversation(mConversation.getRecipients().size() > 1); - - if (isAdded()) { - initLoaderManager(); - } - } - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/messagelist/MessageListViewHolder.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/messagelist/MessageListViewHolder.java deleted file mode 100644 index 300a9b4fe..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/messagelist/MessageListViewHolder.java +++ /dev/null @@ -1,232 +0,0 @@ -package com.moez.QKSMS.ui.messagelist; - -import android.graphics.Bitmap; -import android.net.Uri; -import android.util.Log; -import android.view.View; -import android.widget.Button; -import android.widget.FrameLayout; -import android.widget.ImageButton; -import android.widget.ImageView; -import android.widget.LinearLayout; -import com.moez.QKSMS.R; -import com.moez.QKSMS.common.LiveViewManager; -import com.moez.QKSMS.common.google.ItemLoadedCallback; -import com.moez.QKSMS.common.google.ThumbnailManager; -import com.moez.QKSMS.enums.QKPreference; -import com.moez.QKSMS.interfaces.SlideViewInterface; -import com.moez.QKSMS.interfaces.LiveView; -import com.moez.QKSMS.ui.base.ClickyViewHolder; -import com.moez.QKSMS.ui.base.QKActivity; -import com.moez.QKSMS.ui.mms.Presenter; -import com.moez.QKSMS.ui.view.AvatarView; -import com.moez.QKSMS.ui.view.QKTextView; - -import java.util.Map; - -public class MessageListViewHolder extends ClickyViewHolder<MessageItem> implements SlideViewInterface { - private final String TAG = "MessageListViewHolder"; - - // Views - protected View mRoot; - protected QKTextView mBodyTextView; - protected QKTextView mDateView; - protected ImageView mLockedIndicator; - protected ImageView mDeliveredIndicator; - protected ImageView mDetailsIndicator; - protected AvatarView mAvatarView; - protected LinearLayout mMessageBlock; - protected View mSpace; - protected FrameLayout mMmsView; - protected ImageView mImageView; - protected ImageButton mSlideShowButton; - protected Button mDownloadButton; - protected QKTextView mDownloadingLabel; - - protected ImageLoadedCallback mImageLoadedCallback; - protected Presenter mPresenter; - - public MessageListViewHolder(QKActivity context, View view) { - super(context, view); - - mRoot = view; - mBodyTextView = (QKTextView) view.findViewById(R.id.text_view); - mDateView = (QKTextView) view.findViewById(R.id.date_view); - mLockedIndicator = (ImageView) view.findViewById(R.id.locked_indicator); - mDeliveredIndicator = (ImageView) view.findViewById(R.id.delivered_indicator); - mDetailsIndicator = (ImageView) view.findViewById(R.id.details_indicator); - mAvatarView = (AvatarView) view.findViewById(R.id.avatar); - mMessageBlock = (LinearLayout) view.findViewById(R.id.message_block); - mSpace = view.findViewById(R.id.space); - mMmsView = (FrameLayout) view.findViewById(R.id.mms_view); - mImageView = (ImageView) view.findViewById(R.id.image_view); - mSlideShowButton = (ImageButton) view.findViewById(R.id.play_slideshow_button); - } - - protected void showMmsView(boolean visible) { - mMmsView.setVisibility(visible ? View.VISIBLE : View.GONE); - mImageView.setVisibility(visible ? View.VISIBLE : View.GONE); - } - - protected void inflateDownloadControls() { - if (mDownloadButton == null) { - mRoot.findViewById(R.id.mms_downloading_view_stub).setVisibility(View.VISIBLE); - mDownloadButton = (Button) mRoot.findViewById(R.id.btn_download_msg); - mDownloadingLabel = (QKTextView) mRoot.findViewById(R.id.label_downloading); - } - } - - protected void setLiveViewCallback(LiveView liveViewCallback) { - LiveViewManager.registerView(QKPreference.THEME, this, liveViewCallback); - } - - @Override - public void setImage(String name, Bitmap bitmap) { - if (bitmap == null) { - showMmsView(false); - } else { - showMmsView(true); - - try { - mImageView.setImageBitmap(bitmap); - mImageView.setVisibility(View.VISIBLE); - } catch (java.lang.OutOfMemoryError e) { - Log.e(TAG, "setImage: out of memory: ", e); - } - } - } - - @Override - public void setImageRegionFit(String fit) { - - } - - @Override - public void setImageVisibility(boolean visible) { - - } - - @Override - public void setVideo(String name, Uri video) { - - } - - @Override - public void setVideoThumbnail(String name, Bitmap bitmap) { - showMmsView(true); - - try { - mImageView.setImageBitmap(bitmap); - mImageView.setVisibility(View.VISIBLE); - } catch (java.lang.OutOfMemoryError e) { - Log.e(TAG, "setVideo: out of memory: ", e); - } - } - - @Override - public void setVideoVisibility(boolean visible) { - - } - - @Override - public void startVideo() { - - } - - @Override - public void stopVideo() { - - } - - @Override - public void pauseVideo() { - - } - - @Override - public void seekVideo(int seekTo) { - - } - - @Override - public void setAudio(Uri audio, String name, Map<String, ?> extras) { - - } - - @Override - public void startAudio() { - - } - - @Override - public void stopAudio() { - - } - - @Override - public void pauseAudio() { - - } - - @Override - public void seekAudio(int seekTo) { - - } - - @Override - public void setText(String name, String text) { - - } - - @Override - public void setTextVisibility(boolean visible) { - - } - - @Override - public int getWidth() { - return 0; - } - - @Override - public int getHeight() { - return 0; - } - - @Override - public void reset() { - - } - - @Override - public void setVisibility(boolean visible) { - - } - - static protected class ImageLoadedCallback implements ItemLoadedCallback<ThumbnailManager.ImageLoaded> { - private long mMessageId; - private final MessageListViewHolder mListItem; - - public ImageLoadedCallback(MessageListViewHolder listItem) { - mListItem = listItem; - mListItem.setImage(null, null); - mMessageId = listItem.mData.getMessageId(); - } - - public void reset(MessageListViewHolder listItem) { - mMessageId = listItem.mData.getMessageId(); - } - - public void onItemLoaded(ThumbnailManager.ImageLoaded imageLoaded, Throwable exception) { - // Make sure we're still pointing to the same message. The list item could have // been recycled. - MessageItem msgItem = mListItem.mData; - if (msgItem != null && msgItem.getMessageId() == mMessageId) { - if (imageLoaded.mIsVideo) { - mListItem.setVideoThumbnail(null, imageLoaded.mBitmap); - } else { - mListItem.setImage(null, imageLoaded.mBitmap); - } - } - } - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/mms/MmsThumbnailPresenter.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/mms/MmsThumbnailPresenter.java deleted file mode 100644 index 9a0c852ae..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/mms/MmsThumbnailPresenter.java +++ /dev/null @@ -1,116 +0,0 @@ -/* - * Copyright (C) 2008 Esmertec AG. - * Copyright (C) 2008 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.moez.QKSMS.ui.mms; - -import android.content.Context; - -import com.moez.QKSMS.interfaces.SlideViewInterface; -import com.moez.QKSMS.interfaces.ViewInterface; -import com.moez.QKSMS.model.AudioModel; -import com.moez.QKSMS.model.ImageModel; -import com.moez.QKSMS.model.Model; -import com.moez.QKSMS.model.SlideModel; -import com.moez.QKSMS.model.SlideshowModel; -import com.moez.QKSMS.model.VideoModel; -import com.moez.QKSMS.common.google.ItemLoadedCallback; -import com.moez.QKSMS.common.google.ItemLoadedFuture; -import com.moez.QKSMS.common.google.ThumbnailManager; - -public class MmsThumbnailPresenter extends Presenter { - private static final String TAG = "MmsThumbnailPresenter"; - private ItemLoadedCallback mOnLoadedCallback; - private ItemLoadedFuture mItemLoadedFuture; - - public MmsThumbnailPresenter(Context context, ViewInterface view, Model model) { - super(context, view, model); - } - - @Override - public void present(ItemLoadedCallback callback) { - mOnLoadedCallback = callback; - SlideModel slide = ((SlideshowModel) mModel).get(0); - if (slide != null) { - presentFirstSlide((SlideViewInterface) mView, slide); - } - } - - private void presentFirstSlide(SlideViewInterface view, SlideModel slide) { - view.reset(); - - if (slide.hasImage()) { - presentImageThumbnail(view, slide.getImage()); - } else if (slide.hasVideo()) { - presentVideoThumbnail(view, slide.getVideo()); - } else if (slide.hasAudio()) { - presentAudioThumbnail(view, slide.getAudio()); - } - } - - private ItemLoadedCallback<ThumbnailManager.ImageLoaded> mImageLoadedCallback = - new ItemLoadedCallback<ThumbnailManager.ImageLoaded>() { - public void onItemLoaded(ThumbnailManager.ImageLoaded imageLoaded, Throwable exception) { - if (exception == null) { - if (mItemLoadedFuture != null) { - synchronized(mItemLoadedFuture) { - mItemLoadedFuture.setIsDone(true); - } - } - if (mOnLoadedCallback != null) { - mOnLoadedCallback.onItemLoaded(imageLoaded, exception); - } else { - // Right now we're only handling image and video loaded callbacks. - SlideModel slide = ((SlideshowModel) mModel).get(0); - if (slide != null) { - if (slide.hasVideo() && imageLoaded.mIsVideo) { - ((SlideViewInterface)mView).setVideoThumbnail(null, - imageLoaded.mBitmap); - } else if (slide.hasImage() && !imageLoaded.mIsVideo) { - ((SlideViewInterface)mView).setImage(null, imageLoaded.mBitmap); - } - } - } - } - } - }; - - private void presentVideoThumbnail(SlideViewInterface view, VideoModel video) { - mItemLoadedFuture = video.loadThumbnailBitmap(mImageLoadedCallback); - } - - private void presentImageThumbnail(SlideViewInterface view, ImageModel image) { - mItemLoadedFuture = image.loadThumbnailBitmap(mImageLoadedCallback); - } - - protected void presentAudioThumbnail(SlideViewInterface view, AudioModel audio) { - view.setAudio(audio.getUri(), audio.getSrc(), audio.getExtras()); - } - - public void onModelChanged(Model model, boolean dataChanged) { - // TODO Auto-generated method stub - } - - public void cancelBackgroundLoading() { - // Currently we only support background loading of thumbnails. If we extend background - // loading to other media types, we should add a cancelLoading API to Model. - SlideModel slide = ((SlideshowModel) mModel).get(0); - if (slide != null && slide.hasImage()) { - slide.getImage().cancelThumbnailLoading(); - } - } - -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/mms/Presenter.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/mms/Presenter.java deleted file mode 100644 index 1e2b1797c..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/mms/Presenter.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (C) 2008 Esmertec AG. - * Copyright (C) 2008 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.moez.QKSMS.ui.mms; - -import android.content.Context; - -import com.moez.QKSMS.interfaces.ViewInterface; -import com.moez.QKSMS.model.IModelChangedObserver; -import com.moez.QKSMS.model.Model; -import com.moez.QKSMS.common.google.ItemLoadedCallback; - -/** - * An abstract message presenter. - */ -public abstract class Presenter implements IModelChangedObserver { - protected final Context mContext; - protected ViewInterface mView; - protected Model mModel; - - public Presenter(Context context, ViewInterface view, Model model) { - mContext = context; - mView = view; - - mModel = model; - mModel.registerModelChangedObserver(this); - } - - public ViewInterface getView() { - return mView; - } - - public void setView(ViewInterface view) { - mView = view; - } - - public Model getModel() { - return mModel; - } - - public void setModel(Model model) { - mModel = model; - } - - public abstract void present(ItemLoadedCallback callback); - - public abstract void cancelBackgroundLoading(); -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/mms/SlideView.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/mms/SlideView.java deleted file mode 100644 index 423572cf5..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/mms/SlideView.java +++ /dev/null @@ -1,553 +0,0 @@ -/* - * Copyright (C) 2008 Esmertec AG. - * Copyright (C) 2008 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.moez.QKSMS.ui.mms; - -import android.content.Context; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.media.MediaPlayer; -import android.net.Uri; -import android.text.method.HideReturnsTransformationMethod; -import android.util.AttributeSet; -import android.util.Log; -import android.view.Gravity; -import android.view.LayoutInflater; -import android.view.View; -import android.widget.AbsoluteLayout; -import android.widget.FrameLayout; -import android.widget.ImageView; -import android.widget.LinearLayout; -import android.widget.MediaController; -import android.widget.ScrollView; -import android.widget.TextView; -import android.widget.VideoView; - -import com.moez.QKSMS.R; -import com.moez.QKSMS.interfaces.AdaptableSlideViewInterface; -import com.moez.QKSMS.ui.mms.layout.LayoutManager; - -import java.io.IOException; -import java.util.Comparator; -import java.util.Map; -import java.util.TreeMap; - -/** - * A basic view to show the contents of a slide. - */ -public class SlideView extends AbsoluteLayout implements - AdaptableSlideViewInterface { - private static final String TAG = "SlideView"; - private static final boolean DEBUG = false; - private static final boolean LOCAL_LOGV = false; - // FIXME: Need getHeight from mAudioInfoView instead of constant AUDIO_INFO_HEIGHT. - private static final int AUDIO_INFO_HEIGHT = 82; - - private Context mContext; - private View mAudioInfoView; - private ImageView mImageView; - private VideoView mVideoView; - private ScrollView mScrollText; - private TextView mTextView; - private OnSizeChangedListener mSizeChangedListener; - private MediaPlayer mAudioPlayer; - private boolean mIsPrepared; - private boolean mStartWhenPrepared; - private int mSeekWhenPrepared; - private boolean mStopWhenPrepared; - private ScrollView mScrollViewPort; - private LinearLayout mViewPort; - // Indicates whether the view is in MMS conformance mode. - private boolean mConformanceMode; - private MediaController mMediaController; - - MediaPlayer.OnPreparedListener mPreparedListener = new MediaPlayer.OnPreparedListener() { - public void onPrepared(MediaPlayer mp) { - mIsPrepared = true; - if (mSeekWhenPrepared > 0) { - mAudioPlayer.seekTo(mSeekWhenPrepared); - mSeekWhenPrepared = 0; - } - if (mStartWhenPrepared) { - mAudioPlayer.start(); - mStartWhenPrepared = false; - displayAudioInfo(); - } - if (mStopWhenPrepared) { - mAudioPlayer.stop(); - mAudioPlayer.release(); - mAudioPlayer = null; - mStopWhenPrepared = false; - hideAudioInfo(); - } - } - }; - - public SlideView(Context context) { - super(context); - mContext = context; - } - - public SlideView(Context context, AttributeSet attrs) { - super(context, attrs); - mContext = context; - } - - public void setImage(String name, Bitmap bitmap) { - if (mImageView == null) { - mImageView = new ImageView(mContext); - mImageView.setPadding(0, 5, 0, 5); - addView(mImageView, new LayoutParams( - LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT, 0, 0)); - if (DEBUG) { - mImageView.setBackgroundColor(0xFFFF0000); - } - } - try { - if (null == bitmap) { - bitmap = BitmapFactory.decodeResource(getResources(), - R.drawable.ic_error); - } - mImageView.setVisibility(View.VISIBLE); - mImageView.setImageBitmap(bitmap); - } catch (OutOfMemoryError e) { - Log.e(TAG, "setImage: out of memory: ", e); - } - } - - public void setImageRegion(int left, int top, int width, int height) { - // Ignore any requirement of layout change once we are in MMS conformance mode. - if (mImageView != null && !mConformanceMode) { - mImageView.setLayoutParams(new LayoutParams(width, height, left, top)); - } - } - - public void setImageRegionFit(String fit) { - // TODO Auto-generated method stub - } - - public void setVideo(String name, Uri video) { - if (mVideoView == null) { - mVideoView = new VideoView(mContext); - addView(mVideoView, new LayoutParams( - LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, 0, 0)); - if (DEBUG) { - mVideoView.setBackgroundColor(0xFFFF0000); - } - } - - if (LOCAL_LOGV) { - Log.v(TAG, "Changing video source to " + video); - } - mVideoView.setVisibility(View.VISIBLE); - mVideoView.setVideoURI(video); - } - - public void setMediaController(MediaController mediaController) { - mMediaController = mediaController; - } - - private void initAudioInfoView(String name) { - if (null == mAudioInfoView) { - LayoutInflater factory = LayoutInflater.from(getContext()); - mAudioInfoView = factory.inflate(R.layout.view_playing_audio, null); - int height = mAudioInfoView.getHeight(); - if (mConformanceMode) { - mViewPort.addView(mAudioInfoView, new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, - AUDIO_INFO_HEIGHT)); - } else { - addView(mAudioInfoView, new LayoutParams( - LayoutParams.MATCH_PARENT, AUDIO_INFO_HEIGHT, - 0, getHeight() - AUDIO_INFO_HEIGHT)); - if (DEBUG) { - mAudioInfoView.setBackgroundColor(0xFFFF0000); - } - } - } - TextView audioName = (TextView) mAudioInfoView.findViewById(R.id.name); - audioName.setText(name); - mAudioInfoView.setVisibility(View.GONE); - } - - private void displayAudioInfo() { - if (null != mAudioInfoView) { - mAudioInfoView.setVisibility(View.VISIBLE); - } - } - - private void hideAudioInfo() { - if (null != mAudioInfoView) { - mAudioInfoView.setVisibility(View.GONE); - } - } - - public void setAudio(Uri audio, String name, Map<String, ?> extras) { - if (audio == null) { - throw new IllegalArgumentException("Audio URI may not be null."); - } - - if (LOCAL_LOGV) { - Log.v(TAG, "Changing audio source to " + audio); - } - - if (mAudioPlayer != null) { - mAudioPlayer.reset(); - mAudioPlayer.release(); - mAudioPlayer = null; - } - - // Reset state variables - mIsPrepared = false; - mStartWhenPrepared = false; - mSeekWhenPrepared = 0; - mStopWhenPrepared = false; - - try { - mAudioPlayer = new MediaPlayer(); - mAudioPlayer.setOnPreparedListener(mPreparedListener); - mAudioPlayer.setDataSource(mContext, audio); - mAudioPlayer.prepareAsync(); - } catch (IOException e) { - Log.e(TAG, "Unexpected IOException.", e); - mAudioPlayer.release(); - mAudioPlayer = null; - } - initAudioInfoView(name); - } - - public void setText(String name, String text) { - if (!mConformanceMode) { - if (null == mScrollText) { - mScrollText = new ScrollView(mContext); - mScrollText.setScrollBarStyle(SCROLLBARS_OUTSIDE_INSET); - addView(mScrollText, new LayoutParams( - LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, 0, 0)); - if (DEBUG) { - mScrollText.setBackgroundColor(0xFF00FF00); - } - } - if (null == mTextView) { - mTextView = new TextView(mContext); - mTextView.setTransformationMethod(HideReturnsTransformationMethod.getInstance()); - mScrollText.addView(mTextView); - } - mScrollText.requestFocus(); - } - mTextView.setVisibility(View.VISIBLE); - mTextView.setText(text); - // Let the text in Mms can be selected. - mTextView.setTextIsSelectable(true); - } - - public void setTextRegion(int left, int top, int width, int height) { - // Ignore any requirement of layout change once we are in MMS conformance mode. - if (mScrollText != null && !mConformanceMode) { - mScrollText.setLayoutParams(new LayoutParams(width, height, left, top)); - } - } - - public void setVideoRegion(int left, int top, int width, int height) { - if (mVideoView != null && !mConformanceMode) { - mVideoView.setLayoutParams(new LayoutParams(width, height, left, top)); - } - } - - public void setImageVisibility(boolean visible) { - if (mImageView != null) { - if (mConformanceMode) { - mImageView.setVisibility(visible ? View.VISIBLE : View.GONE); - } else { - mImageView.setVisibility(visible ? View.VISIBLE : View.INVISIBLE); - } - } - } - - public void setTextVisibility(boolean visible) { - if (mConformanceMode) { - if (mTextView != null) { - mTextView.setVisibility(visible ? View.VISIBLE : View.GONE); - } - } else if (mScrollText != null) { - mScrollText.setVisibility(visible ? View.VISIBLE : View.INVISIBLE); - } - } - - public void setVideoVisibility(boolean visible) { - if (mVideoView != null) { - if (mConformanceMode) { - mVideoView.setVisibility(visible ? View.VISIBLE : View.GONE); - } else { - mVideoView.setVisibility(visible ? View.VISIBLE : View.INVISIBLE); - } - } - } - - public void startAudio() { - if ((mAudioPlayer != null) && mIsPrepared) { - mAudioPlayer.start(); - mStartWhenPrepared = false; - displayAudioInfo(); - } else { - mStartWhenPrepared = true; - } - } - - public void stopAudio() { - if ((mAudioPlayer != null) && mIsPrepared) { - mAudioPlayer.stop(); - mAudioPlayer.release(); - mAudioPlayer = null; - hideAudioInfo(); - } else { - mStopWhenPrepared = true; - } - } - - public void pauseAudio() { - if ((mAudioPlayer != null) && mIsPrepared) { - if (mAudioPlayer.isPlaying()) { - mAudioPlayer.pause(); - } - } - mStartWhenPrepared = false; - } - - public void seekAudio(int seekTo) { - if ((mAudioPlayer != null) && mIsPrepared) { - mAudioPlayer.seekTo(seekTo); - } else { - mSeekWhenPrepared = seekTo; - } - } - - public void startVideo() { - if (mVideoView != null) { - if (LOCAL_LOGV) { - Log.v(TAG, "Starting video playback."); - } - mVideoView.start(); - } - } - - public void stopVideo() { - if ((mVideoView != null)) { - if (LOCAL_LOGV) { - Log.v(TAG, "Stopping video playback."); - } - mVideoView.stopPlayback(); - } - } - - public void pauseVideo() { - if (mVideoView != null) { - if (LOCAL_LOGV) { - Log.v(TAG, "Pausing video playback."); - } - mVideoView.pause(); - } - } - - public void seekVideo(int seekTo) { - if (mVideoView != null) { - if (seekTo > 0) { - if (LOCAL_LOGV) { - Log.v(TAG, "Seeking video playback to " + seekTo); - } - mVideoView.seekTo(seekTo); - } - } - } - - public void reset() { - if (null != mScrollText) { - mScrollText.setVisibility(View.GONE); - } - - if (null != mImageView) { - mImageView.setVisibility(View.GONE); - } - - if (null != mAudioPlayer) { - stopAudio(); - } - - if (null != mVideoView) { - stopVideo(); - mVideoView.setVisibility(View.GONE); - } - - if (null != mTextView) { - mTextView.setVisibility(View.GONE); - } - - if (mScrollViewPort != null) { - mScrollViewPort.scrollTo(0, 0); - mScrollViewPort.setLayoutParams( - new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT, 0, 0)); - } - - } - - public void setVisibility(boolean visible) { - // TODO Auto-generated method stub - } - - @Override - protected void onSizeChanged(int w, int h, int oldw, int oldh) { - super.onSizeChanged(w, h, oldw, oldh); - - if (mSizeChangedListener != null) { - if (LOCAL_LOGV) { - Log.v(TAG, "new size=" + w + "x" + h); - } - mSizeChangedListener.onSizeChanged(w, h - AUDIO_INFO_HEIGHT); - } - } - - public void setOnSizeChangedListener(OnSizeChangedListener l) { - mSizeChangedListener = l; - } - - private class Position { - public Position(int left, int top) { - mTop = top; - mLeft = left; - } - public int mTop; - public int mLeft; - } - - /** - * Makes the SlideView working on MMSConformance Mode. The view will be - * re-layout to the linear view. - * <p> - * This is Chinese requirement about mms conformance. - * The most popular Mms service in China is newspaper which is MMS conformance, - * normally it mixes the image and text and has a number of slides. The - * AbsoluteLayout doesn't have good user experience for this kind of message, - * for example, - * - * 1. AbsoluteLayout exactly follows the smil's layout which is not optimized, - * and actually, no other MMS applications follow the smil's layout, they adjust - * the layout according their screen size. MMS conformance doc also allows the - * implementation to adjust the layout. - * - * 2. The TextView is fixed in the small area of screen, and other part of screen - * is empty once there is no image in the current slide. - * - * 3. The TextView is scrollable in a small area of screen and the font size is - * small which make the user experience bad. - * - * The better UI for the MMS conformance message could be putting the image/video - * and text in a linear layout view and making them scrollable together. - * - * Another reason for only applying the LinearLayout to the MMS conformance message - * is that the AbsoluteLayout has ability to play image and video in a same screen. - * which shouldn't be broken. - */ - public void enableMMSConformanceMode(int textLeft, int textTop, - int imageLeft, int imageTop) { - mConformanceMode = true; - if (mScrollViewPort == null) { - mScrollViewPort = new ScrollView(mContext) { - private int mBottomY; - @Override - protected void onLayout(boolean changed, int left, int top, int right, int bottom) { - super.onLayout(changed, left, top, right, bottom); - if (getChildCount() > 0) { - int childHeight = getChildAt(0).getHeight(); - int height = getHeight(); - mBottomY = height < childHeight ? childHeight - height : 0; - } - } - @Override - protected void onScrollChanged(int l, int t, int oldl, int oldt) { - // Shows MediaController when the view is scrolled to the top/bottom of itself. - if (t == 0 || t >= mBottomY){ - if (mMediaController != null - && !((SlideshowActivity) mContext).isFinishing()) { - mMediaController.show(); - } - } - } - }; - mScrollViewPort.setScrollBarStyle(SCROLLBARS_INSIDE_OVERLAY); - mViewPort = new LinearLayout(mContext); - mViewPort.setOrientation(LinearLayout.VERTICAL); - mViewPort.setGravity(Gravity.CENTER); - mViewPort.setOnClickListener(new OnClickListener() { - public void onClick(View v) { - if (mMediaController != null) { - mMediaController.show(); - } - } - }); - mScrollViewPort.addView(mViewPort, new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, - LayoutParams.WRAP_CONTENT)); - addView(mScrollViewPort); - } - // Layout views to fit the LinearLayout from left to right, then top to - // bottom. - TreeMap<Position, View> viewsByPosition = new TreeMap<>(new Comparator<Position>() { - public int compare(Position p1, Position p2) { - int l1 = p1.mLeft; - int t1 = p1.mTop; - int l2 = p2.mLeft; - int t2 = p2.mTop; - int res = t1 - t2; - if (res == 0) { - res = l1 - l2; - } - if (res == 0) { - // A view will be lost if return 0. - return -1; - } - return res; - } - }); - if (textLeft >=0 && textTop >=0) { - mTextView = new TextView(mContext); - mTextView.setTransformationMethod(HideReturnsTransformationMethod.getInstance()); - mTextView.setTextSize(18); - mTextView.setPadding(5, 5, 5, 5); - viewsByPosition.put(new Position(textLeft, textTop), mTextView); - } - - if (imageLeft >=0 && imageTop >=0) { - mImageView = new ImageView(mContext); - mImageView.setPadding(0, 5, 0, 5); - viewsByPosition.put(new Position(imageLeft, imageTop), mImageView); - // According MMS Conformance Document, the image and video should use the same - // region. So, put the VideoView below the ImageView. - mVideoView = new VideoView(mContext); - viewsByPosition.put(new Position(imageLeft + 1, imageTop), mVideoView); - } - for (View view : viewsByPosition.values()) { - if (view instanceof VideoView) { - mViewPort.addView(view, new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, - LayoutManager.getInstance().getLayoutParameters().getHeight())); - } else { - mViewPort.addView(view, new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, - LayoutParams.WRAP_CONTENT)); - } - view.setVisibility(View.GONE); - } - } - - public void setVideoThumbnail(String name, Bitmap bitmap) { - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/mms/SlideshowActivity.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/mms/SlideshowActivity.java deleted file mode 100644 index ef7f2e4d1..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/mms/SlideshowActivity.java +++ /dev/null @@ -1,410 +0,0 @@ -/* - * Copyright (C) 2008 Esmertec AG. - * Copyright (C) 2008 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.moez.QKSMS.ui.mms; - -import android.content.Intent; -import android.graphics.PixelFormat; -import android.net.Uri; -import android.os.Bundle; -import android.os.Handler; -import android.util.Log; -import android.view.KeyEvent; -import android.view.MotionEvent; -import android.view.View; -import android.view.View.OnClickListener; -import android.view.Window; -import android.widget.MediaController; -import android.widget.MediaController.MediaPlayerControl; -import com.android.mms.dom.AttrImpl; -import com.android.mms.dom.smil.SmilDocumentImpl; -import com.android.mms.dom.smil.SmilPlayer; -import com.android.mms.dom.smil.parser.SmilXmlSerializer; -import com.google.android.mms.MmsException; -import com.moez.QKSMS.R; -import com.moez.QKSMS.model.LayoutModel; -import com.moez.QKSMS.model.RegionModel; -import com.moez.QKSMS.model.SlideshowModel; -import com.moez.QKSMS.model.SmilHelper; -import com.moez.QKSMS.ui.base.QKActivity; -import org.w3c.dom.NamedNodeMap; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; -import org.w3c.dom.events.Event; -import org.w3c.dom.events.EventListener; -import org.w3c.dom.events.EventTarget; -import org.w3c.dom.smil.SMILDocument; -import org.w3c.dom.smil.SMILElement; - -import java.io.ByteArrayOutputStream; - -/** - * Plays the given slideshow in full-screen mode with a common controller. - */ -public class SlideshowActivity extends QKActivity implements EventListener { - private static final String TAG = "SlideshowActivity"; - private static final boolean DEBUG = false; - private static final boolean LOCAL_LOGV = false; - - private MediaController mMediaController; - private SmilPlayer mSmilPlayer; - - private Handler mHandler; - - private SMILDocument mSmilDoc; - - private SlideView mSlideView; - private int mSlideCount; - - /** - * @return whether the Smil has MMS conformance layout. - * Refer to MMS Conformance Document OMA-MMS-CONF-v1_2-20050301-A - */ - private static final boolean isMMSConformance(SMILDocument smilDoc) { - SMILElement head = smilDoc.getHead(); - if (head == null) { - // No 'head' element - return false; - } - NodeList children = head.getChildNodes(); - if (children == null || children.getLength() != 1) { - // The 'head' element should have only one child. - return false; - } - Node layout = children.item(0); - if (layout == null || !"layout".equals(layout.getNodeName())) { - // The child is not layout element - return false; - } - NodeList layoutChildren = layout.getChildNodes(); - if (layoutChildren == null) { - // The 'layout' element has no child. - return false; - } - int num = layoutChildren.getLength(); - if (num <= 0) { - // The 'layout' element has no child. - return false; - } - for (int i = 0; i < num; i++) { - Node layoutChild = layoutChildren.item(i); - if (layoutChild == null) { - // The 'layout' child is null. - return false; - } - String name = layoutChild.getNodeName(); - if ("root-layout".equals(name)) { - continue; - } else if ("region".equals(name)) { - NamedNodeMap map = layoutChild.getAttributes(); - for (int j = 0; j < map.getLength(); j++) { - Node node = map.item(j); - if (node == null) { - return false; - } - String attrName = node.getNodeName(); - // The attr should be one of left, top, height, width, fit and id - if ("left".equals(attrName) || "top".equals(attrName) || - "height".equals(attrName) || "width".equals(attrName) || - "fit".equals(attrName)) { - continue; - } else if ("id".equals(attrName)) { - String value; - if (node instanceof AttrImpl) { - value = ((AttrImpl)node).getValue(); - } else { - return false; - } - if ("Text".equals(value) || "Image".equals(value)) { - continue; - } else { - // The id attr is not 'Text' or 'Image' - return false; - } - } else { - return false; - } - } - } else { - // The 'layout' element has the child other than 'root-layout' or 'region' - return false; - } - } - return true; - } - - @Override - public void onCreate(Bundle icicle) { - // Play slide-show in full-screen mode. - supportRequestWindowFeature(Window.FEATURE_NO_TITLE); - super.onCreate(icicle); - mHandler = new Handler(); - - getWindow().setFormat(PixelFormat.TRANSLUCENT); - setContentView(R.layout.view_slideshow); - - Intent intent = getIntent(); - Uri msg = intent.getData(); - final SlideshowModel model; - - try { - model = SlideshowModel.createFromMessageUri(this, msg); - mSlideCount = model.size(); - } catch (MmsException e) { - Log.e(TAG, "Cannot present the slide show.", e); - finish(); - return; - } - - mSlideView = (SlideView) findViewById(R.id.slide_view); - new SlideshowPresenter(this, mSlideView, model); - - mHandler.post(new Runnable() { - private boolean isRotating() { - return mSmilPlayer.isPausedState() - || mSmilPlayer.isPlayingState() - || mSmilPlayer.isPlayedState(); - } - - public void run() { - mSmilPlayer = SmilPlayer.getPlayer(); - if (mSlideCount > 1) { - // Only show the slideshow controller if we have more than a single slide. - // Otherwise, when we play a sound on a single slide, it appears like - // the slide controller should control the sound (seeking, ff'ing, etc). - initMediaController(); - mSlideView.setMediaController(mMediaController); - } - // Use SmilHelper.getDocument() to ensure rebuilding the - // entire SMIL document. - mSmilDoc = SmilHelper.getDocument(model); - if (isMMSConformance(mSmilDoc)) { - int imageLeft = 0; - int imageTop = 0; - int textLeft = 0; - int textTop = 0; - LayoutModel layout = model.getLayout(); - if (layout != null) { - RegionModel imageRegion = layout.getImageRegion(); - if (imageRegion != null) { - imageLeft = imageRegion.getLeft(); - imageTop = imageRegion.getTop(); - } - RegionModel textRegion = layout.getTextRegion(); - if (textRegion != null) { - textLeft = textRegion.getLeft(); - textTop = textRegion.getTop(); - } - } - mSlideView.enableMMSConformanceMode(textLeft, textTop, imageLeft, imageTop); - } - if (DEBUG) { - ByteArrayOutputStream ostream = new ByteArrayOutputStream(); - SmilXmlSerializer.serialize(mSmilDoc, ostream); - if (LOCAL_LOGV) { - Log.v(TAG, ostream.toString()); - } - } - - // Add event listener. - ((EventTarget) mSmilDoc).addEventListener( - SmilDocumentImpl.SMIL_DOCUMENT_END_EVENT, - SlideshowActivity.this, false); - - mSmilPlayer.init(mSmilDoc); - if (isRotating()) { - mSmilPlayer.reload(); - } else { - mSmilPlayer.play(); - } - } - }); - } - - private void initMediaController() { - mMediaController = new MediaController(SlideshowActivity.this, false); - mMediaController.setMediaPlayer(new SmilPlayerController(mSmilPlayer)); - mMediaController.setAnchorView(findViewById(R.id.slide_view)); - mMediaController.setPrevNextListeners( - new OnClickListener() { - public void onClick(View v) { - mSmilPlayer.next(); - } - }, - new OnClickListener() { - public void onClick(View v) { - mSmilPlayer.prev(); - } - }); - } - - @Override - public boolean onTouchEvent(MotionEvent ev) { - if ((mSmilPlayer != null) && (mMediaController != null)) { - mMediaController.show(); - } - return false; - } - - @Override - protected void onPause() { - super.onPause(); - if (mSmilDoc != null) { - ((EventTarget) mSmilDoc).removeEventListener( - SmilDocumentImpl.SMIL_DOCUMENT_END_EVENT, this, false); - } - if (mSmilPlayer != null) { - mSmilPlayer.pause(); - } - } - - @Override - protected void onStop() { - super.onStop(); - if ((null != mSmilPlayer)) { - if (isFinishing()) { - mSmilPlayer.stop(); - } else { - mSmilPlayer.stopWhenReload(); - } - if (mMediaController != null) { - // TODO Must set the seek bar change listener null, otherwise if we rotate it - // while tapping progress bar continuously, window will leak. - /*View seekBar = mMediaController.findViewById(com.android.internal.R.id.mediacontroller_progress); - if (seekBar instanceof SeekBar) { - ((SeekBar)seekBar).setOnSeekBarChangeListener(null); - }*/ - // Must do this so we don't leak a window. - mMediaController.hide(); - } - } - } - - @Override - protected void onDestroy() { - if (mSlideView != null) { - mSlideView.setMediaController(null); - } - super.onDestroy(); - } - - @Override - public boolean onKeyDown(int keyCode, KeyEvent event) { - switch (keyCode) { - case KeyEvent.KEYCODE_VOLUME_DOWN: - case KeyEvent.KEYCODE_VOLUME_UP: - case KeyEvent.KEYCODE_VOLUME_MUTE: - case KeyEvent.KEYCODE_DPAD_UP: - case KeyEvent.KEYCODE_DPAD_DOWN: - case KeyEvent.KEYCODE_DPAD_LEFT: - case KeyEvent.KEYCODE_DPAD_RIGHT: - break; - case KeyEvent.KEYCODE_BACK: - case KeyEvent.KEYCODE_MENU: - if ((mSmilPlayer != null) && - (mSmilPlayer.isPausedState() - || mSmilPlayer.isPlayingState() - || mSmilPlayer.isPlayedState())) { - mSmilPlayer.stop(); - } - break; - default: - if ((mSmilPlayer != null) && (mMediaController != null)) { - mMediaController.show(); - } - } - return super.onKeyDown(keyCode, event); - } - - private class SmilPlayerController implements MediaPlayerControl { - private final SmilPlayer mPlayer; - /** - * We need to cache the playback state because when the MediaController issues a play or - * pause command, it expects subsequent calls to {@link #isPlaying()} to return the right - * value immediately. However, the SmilPlayer executes play and pause asynchronously, so - * {@link #isPlaying()} will return the wrong value for some time. That's why we keep our - * own version of the state of whether the player is playing. - * - * Initialized to true because we always programatically start the SmilPlayer upon creation - */ - private boolean mCachedIsPlaying = true; - - public SmilPlayerController(SmilPlayer player) { - mPlayer = player; - } - - public int getBufferPercentage() { - // We don't need to buffer data, always return 100%. - return 100; - } - - public int getCurrentPosition() { - return mPlayer.getCurrentPosition(); - } - - public int getDuration() { - return mPlayer.getDuration(); - } - - public boolean isPlaying() { - return mCachedIsPlaying; - } - - public void pause() { - mPlayer.pause(); - mCachedIsPlaying = false; - } - - public void seekTo(int pos) { - // Don't need to support. - } - - public void start() { - mPlayer.start(); - mCachedIsPlaying = true; - } - - public boolean canPause() { - return true; - } - - public boolean canSeekBackward() { - return true; - } - - public boolean canSeekForward() { - return true; - } - - @Override - public int getAudioSessionId() { - return 0; - } - } - - public void handleEvent(Event evt) { - final Event event = evt; - mHandler.post(new Runnable() { - public void run() { - String type = event.getType(); - if(type.equals(SmilDocumentImpl.SMIL_DOCUMENT_END_EVENT)) { - finish(); - } - } - }); - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/mms/SlideshowPresenter.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/mms/SlideshowPresenter.java deleted file mode 100644 index 80fc7a623..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/mms/SlideshowPresenter.java +++ /dev/null @@ -1,313 +0,0 @@ -/* - * Copyright (C) 2008 Esmertec AG. - * Copyright (C) 2008 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.moez.QKSMS.ui.mms; - -import android.content.Context; -import android.os.Handler; -import android.util.Log; - -import com.moez.QKSMS.interfaces.AdaptableSlideViewInterface; -import com.moez.QKSMS.interfaces.SlideViewInterface; -import com.moez.QKSMS.interfaces.ViewInterface; -import com.moez.QKSMS.model.AudioModel; -import com.moez.QKSMS.model.ImageModel; -import com.moez.QKSMS.model.LayoutModel; -import com.moez.QKSMS.model.MediaModel; -import com.moez.QKSMS.model.Model; -import com.moez.QKSMS.model.RegionMediaModel; -import com.moez.QKSMS.model.RegionModel; -import com.moez.QKSMS.model.SlideModel; -import com.moez.QKSMS.model.SlideshowModel; -import com.moez.QKSMS.model.TextModel; -import com.moez.QKSMS.model.VideoModel; -import com.moez.QKSMS.common.google.ItemLoadedCallback; - -/** - * A basic presenter of slides. - */ -public class SlideshowPresenter extends Presenter { - private static final String TAG = "SlideshowPresenter"; - private static final boolean DEBUG = false; - private static final boolean LOCAL_LOGV = false; - - protected int mLocation; - protected final int mSlideNumber; - - protected float mWidthTransformRatio = 1.0f; - protected float mHeightTransformRatio = 1.0f; - - // Since only the original thread that created a view hierarchy can touch - // its views, we have to use Handler to manage the views in the some - // callbacks such as onModelChanged(). - protected final Handler mHandler = new Handler(); - - public SlideshowPresenter(Context context, ViewInterface view, Model model) { - super(context, view, model); - mLocation = 0; - mSlideNumber = ((SlideshowModel) mModel).size(); - - if (view instanceof AdaptableSlideViewInterface) { - ((AdaptableSlideViewInterface) view).setOnSizeChangedListener( - mViewSizeChangedListener); - } - } - - private final AdaptableSlideViewInterface.OnSizeChangedListener mViewSizeChangedListener = - new AdaptableSlideViewInterface.OnSizeChangedListener() { - public void onSizeChanged(int width, int height) { - LayoutModel layout = ((SlideshowModel) mModel).getLayout(); - mWidthTransformRatio = getWidthTransformRatio( - width, layout.getLayoutWidth()); - mHeightTransformRatio = getHeightTransformRatio( - height, layout.getLayoutHeight()); - // The ratio indicates how to reduce the source to match the View, - // so the larger one should be used. - float ratio = mWidthTransformRatio > mHeightTransformRatio ? - mWidthTransformRatio : mHeightTransformRatio; - mWidthTransformRatio = ratio; - mHeightTransformRatio = ratio; - if (LOCAL_LOGV) { - Log.v(TAG, "ratio_w = " + mWidthTransformRatio - + ", ratio_h = " + mHeightTransformRatio); - } - } - }; - - private float getWidthTransformRatio(int width, int layoutWidth) { - if (width > 0) { - return (float) layoutWidth / (float) width; - } - return 1.0f; - } - - private float getHeightTransformRatio(int height, int layoutHeight) { - if (height > 0) { - return (float) layoutHeight / (float) height; - } - return 1.0f; - } - - private int transformWidth(int width) { - return (int) (width / mWidthTransformRatio); - } - - private int transformHeight(int height) { - return (int) (height / mHeightTransformRatio); - } - - @Override - public void present(ItemLoadedCallback callback) { - // This is called to show a full-screen slideshow. Presently, all parts of - // a slideshow (images, sounds, etc.) are loaded and displayed on the UI thread. - presentSlide((SlideViewInterface) mView, ((SlideshowModel) mModel).get(mLocation)); - } - - /** - * @param view - * @param model - */ - protected void presentSlide(SlideViewInterface view, SlideModel model) { - view.reset(); - - for (MediaModel media : model) { - if (media instanceof RegionMediaModel) { - presentRegionMedia(view, (RegionMediaModel) media, true); - } else if (media.isAudio()) { - presentAudio(view, (AudioModel) media, true); - } - } - } - - /** - * @param view - */ - protected void presentRegionMedia(SlideViewInterface view, - RegionMediaModel rMedia, boolean dataChanged) { - RegionModel r = (rMedia).getRegion(); - if (rMedia.isText()) { - presentText(view, (TextModel) rMedia, r, dataChanged); - } else if (rMedia.isImage()) { - presentImage(view, (ImageModel) rMedia, r, dataChanged); - } else if (rMedia.isVideo()) { - presentVideo(view, (VideoModel) rMedia, r, dataChanged); - } - } - - protected void presentAudio(SlideViewInterface view, AudioModel audio, - boolean dataChanged) { - // Set audio only when data changed. - if (dataChanged) { - view.setAudio(audio.getUri(), audio.getSrc(), audio.getExtras()); - } - - MediaModel.MediaAction action = audio.getCurrentAction(); - if (action == MediaModel.MediaAction.START) { - view.startAudio(); - } else if (action == MediaModel.MediaAction.PAUSE) { - view.pauseAudio(); - } else if (action == MediaModel.MediaAction.STOP) { - view.stopAudio(); - } else if (action == MediaModel.MediaAction.SEEK) { - view.seekAudio(audio.getSeekTo()); - } - } - - protected void presentText(SlideViewInterface view, TextModel text, - RegionModel r, boolean dataChanged) { - if (dataChanged) { - view.setText(text.getSrc(), text.getText()); - } - - if (view instanceof AdaptableSlideViewInterface) { - ((AdaptableSlideViewInterface) view).setTextRegion( - transformWidth(r.getLeft()), - transformHeight(r.getTop()), - transformWidth(r.getWidth()), - transformHeight(r.getHeight())); - } - view.setTextVisibility(text.isVisible()); - } - - /** - * @param view - * @param image - * @param r - */ - protected void presentImage(SlideViewInterface view, ImageModel image, - RegionModel r, boolean dataChanged) { - int transformedWidth = transformWidth(r.getWidth()); - int transformedHeight = transformWidth(r.getHeight()); - - if (LOCAL_LOGV) { - Log.v(TAG, "presentImage r.getWidth: " + r.getWidth() - + ", r.getHeight: " + r.getHeight() + - " transformedWidth: " + transformedWidth + - " transformedHeight: " + transformedHeight); - } - - if (dataChanged) { - view.setImage(image.getSrc(), image.getBitmap(transformedWidth, transformedHeight)); - } - - if (view instanceof AdaptableSlideViewInterface) { - ((AdaptableSlideViewInterface) view).setImageRegion( - transformWidth(r.getLeft()), - transformHeight(r.getTop()), - transformedWidth, - transformedHeight); - } - view.setImageRegionFit(r.getFit()); - view.setImageVisibility(image.isVisible()); - } - - /** - * @param view - * @param video - * @param r - */ - protected void presentVideo(SlideViewInterface view, VideoModel video, - RegionModel r, boolean dataChanged) { - if (dataChanged) { - view.setVideo(video.getSrc(), video.getUri()); - } - - if (view instanceof AdaptableSlideViewInterface) { - ((AdaptableSlideViewInterface) view).setVideoRegion( - transformWidth(r.getLeft()), - transformHeight(r.getTop()), - transformWidth(r.getWidth()), - transformHeight(r.getHeight())); - } - view.setVideoVisibility(video.isVisible()); - - MediaModel.MediaAction action = video.getCurrentAction(); - if (action == MediaModel.MediaAction.START) { - view.startVideo(); - } else if (action == MediaModel.MediaAction.PAUSE) { - view.pauseVideo(); - } else if (action == MediaModel.MediaAction.STOP) { - view.stopVideo(); - } else if (action == MediaModel.MediaAction.SEEK) { - view.seekVideo(video.getSeekTo()); - } - } - - public void setLocation(int location) { - mLocation = location; - } - - public int getLocation() { - return mLocation; - } - - public void goBackward() { - if (mLocation > 0) { - mLocation--; - } - } - - public void goForward() { - if (mLocation < (mSlideNumber - 1)) { - mLocation++; - } - } - - public void onModelChanged(final Model model, final boolean dataChanged) { - final SlideViewInterface view = (SlideViewInterface) mView; - - // FIXME: Should be optimized. - if (model instanceof SlideshowModel) { - // TODO: - } else if (model instanceof SlideModel) { - if (((SlideModel) model).isVisible()) { - mHandler.post(new Runnable() { - public void run() { - presentSlide(view, (SlideModel) model); - } - }); - } else { - mHandler.post(new Runnable() { - public void run() { - goForward(); - } - }); - } - } else if (model instanceof MediaModel) { - if (model instanceof RegionMediaModel) { - mHandler.post(new Runnable() { - public void run() { - presentRegionMedia(view, (RegionMediaModel) model, dataChanged); - } - }); - } else if (((MediaModel) model).isAudio()) { - mHandler.post(new Runnable() { - public void run() { - presentAudio(view, (AudioModel) model, dataChanged); - } - }); - } - } else if (model instanceof RegionModel) { - // TODO: - } - } - - @Override - public void cancelBackgroundLoading() { - // For now, the SlideshowPresenter does no background loading so there is nothing to cancel. - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/mms/layout/HVGALayoutParameters.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/mms/layout/HVGALayoutParameters.java deleted file mode 100644 index d12eaa264..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/mms/layout/HVGALayoutParameters.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright (C) 2008 Esmertec AG. - * Copyright (C) 2008 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.moez.QKSMS.ui.mms.layout; - -import android.content.Context; -import android.util.Log; - -public class HVGALayoutParameters implements LayoutParameters { - private static final String TAG = "HVGALayoutParameters"; - private static final boolean DEBUG = false; - private static final boolean LOCAL_LOGV = false; - - private int mType = -1; - - private static int mImageHeightLandscape; - private static int mTextHeightLandscape; - private static int mImageHeightPortrait; - private static int mTextHeightPortrait; - private static int mMaxHeight; - private static int mMaxWidth; - - public HVGALayoutParameters(Context context, int type) { - if ((type != HVGA_LANDSCAPE) && (type != HVGA_PORTRAIT)) { - throw new IllegalArgumentException( - "Bad layout type detected: " + type); - } - - if (LOCAL_LOGV) { - Log.v(TAG, "HVGALayoutParameters.<init>(" + type + ")."); - } - mType = type; - - float scale = context.getResources().getDisplayMetrics().density; - mMaxWidth = (int) (context.getResources().getConfiguration().screenWidthDp * scale + 0.5f); - mMaxHeight = - (int) (context.getResources().getConfiguration().screenHeightDp * scale + 0.5f); - - mImageHeightLandscape = (int) (mMaxHeight * .90f); - mTextHeightLandscape = (int) (mMaxHeight * .10f); - mImageHeightPortrait = (int) (mMaxWidth * .90f); - mTextHeightPortrait = (int) (mMaxWidth * .10f); - - if (LOCAL_LOGV) { - Log.v(TAG, "HVGALayoutParameters mMaxWidth: " + mMaxWidth + - " mMaxHeight: " + mMaxHeight + - " mImageHeightLandscape: " + mImageHeightLandscape + - " mTextHeightLandscape: " + mTextHeightLandscape + - " mImageHeightPortrait: " + mImageHeightPortrait + - " mTextHeightPortrait: " + mTextHeightPortrait); - } - - } - - public int getWidth() { - return mType == HVGA_LANDSCAPE ? mMaxWidth - : mMaxHeight; - } - - public int getHeight() { - return mType == HVGA_LANDSCAPE ? mMaxHeight - : mMaxWidth; - } - - public int getImageHeight() { - return mType == HVGA_LANDSCAPE ? mImageHeightLandscape - : mImageHeightPortrait; - } - - public int getTextHeight() { - return mType == HVGA_LANDSCAPE ? mTextHeightLandscape - : mTextHeightPortrait; - } - - public int getType() { - return mType; - } - - public String getTypeDescription() { - return mType == HVGA_LANDSCAPE ? "HVGA-L" : "HVGA-P"; - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/mms/layout/LayoutManager.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/mms/layout/LayoutManager.java deleted file mode 100644 index 120ce7c47..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/mms/layout/LayoutManager.java +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Copyright (C) 2008 Esmertec AG. - * Copyright (C) 2008 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.moez.QKSMS.ui.mms.layout; - -import android.content.Context; -import android.content.res.Configuration; -import android.util.Log; - -/** - * MMS presentation layout management. - */ -public class LayoutManager { - private static final String TAG = "LayoutManager"; - private static final boolean DEBUG = false; - private static final boolean LOCAL_LOGV = false; - - private final Context mContext; - private LayoutParameters mLayoutParams; - - private static LayoutManager sInstance; - - private LayoutManager(Context context) { - mContext = context; - initLayoutParameters(context.getResources().getConfiguration()); - } - - private void initLayoutParameters(Configuration configuration) { - mLayoutParams = getLayoutParameters( - configuration.orientation == Configuration.ORIENTATION_PORTRAIT - ? LayoutParameters.HVGA_PORTRAIT - : LayoutParameters.HVGA_LANDSCAPE); - - if (LOCAL_LOGV) { - Log.v(TAG, "LayoutParameters: " + mLayoutParams.getTypeDescription() - + ": " + mLayoutParams.getWidth() + "x" + mLayoutParams.getHeight()); - } - } - - private LayoutParameters getLayoutParameters(int displayType) { - switch (displayType) { - case LayoutParameters.HVGA_LANDSCAPE: - return new HVGALayoutParameters(mContext, LayoutParameters.HVGA_LANDSCAPE); - case LayoutParameters.HVGA_PORTRAIT: - return new HVGALayoutParameters(mContext, LayoutParameters.HVGA_PORTRAIT); - } - - throw new IllegalArgumentException( - "Unsupported display type: " + displayType); - } - - public static void init(Context context) { - if (LOCAL_LOGV) { - Log.v(TAG, "DefaultLayoutManager.init()"); - } - - if (sInstance != null) { - Log.w(TAG, "Already initialized."); - } - sInstance = new LayoutManager(context); - } - - public static LayoutManager getInstance() { - if (sInstance == null) { - throw new IllegalStateException("Uninitialized."); - } - return sInstance; - } - - public void onConfigurationChanged(Configuration newConfig) { - if (LOCAL_LOGV) { - Log.v(TAG, "-> LayoutManager.onConfigurationChanged()."); - } - initLayoutParameters(newConfig); - } - - public int getLayoutType() { - return mLayoutParams.getType(); - } - - public int getLayoutWidth() { - return mLayoutParams.getWidth(); - } - - public int getLayoutHeight() { - return mLayoutParams.getHeight(); - } - - public LayoutParameters getLayoutParameters() { - return mLayoutParams; - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/mms/layout/LayoutParameters.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/mms/layout/LayoutParameters.java deleted file mode 100644 index 659e865c9..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/mms/layout/LayoutParameters.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (C) 2008 Esmertec AG. - * Copyright (C) 2008 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.moez.QKSMS.ui.mms.layout; - -public interface LayoutParameters { - /* Layouts type definition */ - public static final int UNKNOWN = -1; - public static final int HVGA_LANDSCAPE = 10; - public static final int HVGA_PORTRAIT = 11; - - /* Parameters for known layouts */ - public static final int HVGA_LANDSCAPE_WIDTH = 480; - public static final int HVGA_LANDSCAPE_HEIGHT = 320; - public static final int HVGA_PORTRAIT_WIDTH = 320; - public static final int HVGA_PORTRAIT_HEIGHT = 480; - - /** - * Get the width of current layout. - */ - int getWidth(); - /** - * Get the height of current layout. - */ - int getHeight(); - /** - * Get the width of the image region of current layout. - */ - int getImageHeight(); - /** - * Get the height of the text region of current layout. - */ - int getTextHeight(); - /** - * Get the type of current layout. - */ - int getType(); - /** - * Get the type description of current layout. - */ - String getTypeDescription(); -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/popup/QKComposeActivity.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/popup/QKComposeActivity.java deleted file mode 100644 index 12ea9d540..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/popup/QKComposeActivity.java +++ /dev/null @@ -1,104 +0,0 @@ -package com.moez.QKSMS.ui.popup; - -import android.content.Context; -import android.content.Intent; -import android.os.Bundle; -import android.telephony.PhoneNumberUtils; -import android.view.View; -import android.widget.AdapterView; -import com.android.ex.chips.recipientchip.DrawableRecipientChip; -import com.moez.QKSMS.R; -import com.moez.QKSMS.common.utils.KeyboardUtils; -import com.moez.QKSMS.interfaces.ActivityLauncher; -import com.moez.QKSMS.interfaces.RecipientProvider; -import com.moez.QKSMS.ui.base.QKPopupActivity; -import com.moez.QKSMS.ui.view.AutoCompleteContactView; -import com.moez.QKSMS.ui.view.ComposeView; -import com.moez.QKSMS.ui.view.StarredContactsView; - -public class QKComposeActivity extends QKPopupActivity implements ComposeView.OnSendListener, RecipientProvider, - ActivityLauncher, AdapterView.OnItemClickListener { - - private final String TAG = "QKComposeActivity"; - - private Context mContext = this; - private AutoCompleteContactView mRecipients; - private StarredContactsView mStarredContactsView; - private ComposeView mCompose; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - setTitle(R.string.title_compose); - - mRecipients = (AutoCompleteContactView) findViewById(R.id.compose_recipients); - mRecipients.setOnItemClickListener(this); - - // Get the compose view, and set it up with all the listeners. - findViewById(R.id.compose_view_stub).setVisibility(View.VISIBLE); - mCompose = (ComposeView) findViewById(R.id.compose_view); - mCompose.setActivityLauncher(this); - mCompose.setOnSendListener(this); - mCompose.setRecipientProvider(this); - mCompose.setLabel("QKCompose"); - - mStarredContactsView = (StarredContactsView) findViewById(R.id.starred_contacts); - mStarredContactsView.setComposeScreenViews(mRecipients, mCompose); - - // Apply different attachments based on the type. - mCompose.loadMessageFromIntent(getIntent()); - } - - @Override - protected int getLayoutResource() { - return R.layout.activity_qkcompose; - } - - @Override - protected void onPause() { - super.onPause(); - KeyboardUtils.hide(mContext, mCompose); - } - - @Override - public void finish() { - // Override pending transitions so that we don't see black for a second when QuickReply closes - super.finish(); - overridePendingTransition(0, 0); - } - - @Override - public String[] getRecipientAddresses() { - DrawableRecipientChip[] chips = mRecipients.getRecipients(); - String[] addresses = new String[chips.length]; - - for (int i = 0; i < chips.length; i++) { - addresses[i] = PhoneNumberUtils.stripSeparators(chips[i].getEntry().getDestination()); - } - - return addresses; - } - - @Override - public void onSend(String[] recipients, String body) { - // When the SMS is sent, close this activity. - finish(); - } - - @Override - public void onActivityResult(int requestCode, int resultCode, Intent data) { - super.onActivityResult(requestCode, resultCode, data); - - if (!mCompose.onActivityResult(requestCode, resultCode, data)) { - // Handle other results here, since the ComposeView didn't handle them. - } - } - - @Override - public void onItemClick(AdapterView<?> parent, View view, int position, long id) { - mRecipients.onItemClick(parent, view, position, id); - mStarredContactsView.collapse(); - mCompose.requestReplyTextFocus(); - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/popup/QKReplyActivity.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/popup/QKReplyActivity.java deleted file mode 100644 index 24666ec8f..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/popup/QKReplyActivity.java +++ /dev/null @@ -1,306 +0,0 @@ -package com.moez.QKSMS.ui.popup; - -import android.app.LoaderManager; -import android.content.CursorLoader; -import android.content.DialogInterface; -import android.content.Intent; -import android.content.Loader; -import android.database.Cursor; -import android.net.Uri; -import android.os.AsyncTask; -import android.os.Bundle; -import android.view.Menu; -import android.view.MenuInflater; -import android.view.MenuItem; -import android.widget.ListView; - -import com.moez.QKSMS.R; -import com.moez.QKSMS.common.ConversationPrefsHelper; -import com.moez.QKSMS.common.utils.KeyboardUtils; -import com.moez.QKSMS.data.Conversation; -import com.moez.QKSMS.data.ConversationLegacy; -import com.moez.QKSMS.data.Message; -import com.moez.QKSMS.interfaces.ActivityLauncher; -import com.moez.QKSMS.service.CopyUnreadMessageTextService; -import com.moez.QKSMS.service.DeleteUnreadMessageService; -import com.moez.QKSMS.transaction.SmsHelper; -import com.moez.QKSMS.ui.MainActivity; -import com.moez.QKSMS.ui.ThemeManager; -import com.moez.QKSMS.ui.base.QKPopupActivity; -import com.moez.QKSMS.ui.messagelist.MessageColumns; -import com.moez.QKSMS.ui.messagelist.MessageListActivity; -import com.moez.QKSMS.ui.view.ComposeView; - -public class QKReplyActivity extends QKPopupActivity implements DialogInterface.OnDismissListener, - LoaderManager.LoaderCallbacks<Cursor>, ActivityLauncher, ComposeView.OnSendListener { - - @SuppressWarnings("unused") - private String TAG = "QKReplyActivity"; - - // Intent extras for configuring a QuickReplyActivity intent - public static final String EXTRA_THREAD_ID = "thread_id"; - public static final String EXTRA_SHOW_KEYBOARD = "open_keyboard"; - - private static long sThreadId; - - private Conversation mConversation; - private ConversationLegacy mConversationLegacy; - private ConversationPrefsHelper mConversationPrefsHelper; - - private Cursor mCursor; - private boolean mShowUnreadOnly = true; - - private ListView mListView; - private QKReplyAdapter mAdapter; - private ComposeView mComposeView; - - /** - * True if we're starting an activity. This will let us know whether or not we should finish() - * in onPause(). - */ - private boolean mIsStartingActivity = false; - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - Bundle extras = getIntent().getExtras(); - - sThreadId = extras.getLong(EXTRA_THREAD_ID); - mConversation = Conversation.get(this, sThreadId, false); - mConversationLegacy = new ConversationLegacy(this, sThreadId); - mConversationPrefsHelper = new ConversationPrefsHelper(this, sThreadId); - - // Set up the compose view. - mComposeView = (ComposeView) findViewById(R.id.compose_view); - mComposeView.setActivityLauncher(this); - mComposeView.setOnSendListener(this); - mComposeView.setLabel("QKReply"); - - mAdapter = new QKReplyAdapter(this); - - mListView = (ListView) findViewById(R.id.popup_messages); - mListView.setAdapter(mAdapter); - - // Set the conversation data objects. These are used to save drafts, send sms messages, etc. - mComposeView.onOpenConversation(mConversation, mConversationLegacy); - - // If the user has the "show keyboard" for popups option enabled, show the keyboard here by - // requesting the focus on the reply text. - if (extras.getBoolean(EXTRA_SHOW_KEYBOARD, false)) { - mComposeView.requestReplyTextFocus(); - } - - new AsyncTask<Void, Void, Void>() { - - @Override - protected Void doInBackground(Void... params) { - mConversationLegacy.getName(true); - - return null; - } - - @Override - protected void onPostExecute(Void aVoid) { - super.onPostExecute(aVoid); - - setTitle(mConversationLegacy.getName(true)); - - initLoaderManager(); - } - }.execute((Void[]) null); - } - - @Override - protected int getLayoutResource() { - return R.layout.activity_qkreply; - } - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - MenuInflater inflater = getMenuInflater(); - inflater.inflate(R.menu.qkreply, menu); - return super.onCreateOptionsMenu(menu); - } - - private void switchView() { - mShowUnreadOnly = !mShowUnreadOnly; - getLoaderManager().restartLoader(0, null, this); - } - - private void initLoaderManager() { - getLoaderManager().initLoader(0, null, this); - } - - @Override - protected void onPause() { - super.onPause(); - ThemeManager.setActiveColor(ThemeManager.getThemeColor()); - - KeyboardUtils.hide(this, mComposeView); - - mComposeView.saveDraft(); - - // When the home button is pressed, this ensures that the QK Reply is shut down - // Don't shut it down if it pauses and the screen is off though - if (!mIsStartingActivity && !isChangingConfigurations() && isScreenOn()) { - finish(); - } - } - - @Override - public void onActivityResult(int requestCode, int resultCode, Intent data) { - super.onActivityResult(requestCode, resultCode, data); - - boolean handledByComposeView = mComposeView.onActivityResult(requestCode, resultCode, data); - if (!handledByComposeView) { - // ... - } - } - - @Override - protected void onResume() { - super.onResume(); - sThreadId = mConversationLegacy.getThreadId(); - mIsStartingActivity = false; - ThemeManager.setActiveColor(mConversationPrefsHelper.getColor()); - } - - @Override - public void finish() { - // Override pending transitions so that we don't see black for a second when QuickReply - // closes - super.finish(); - overridePendingTransition(0, 0); - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - - case R.id.menu_fold: - switchView(); - if (mShowUnreadOnly) { - item.setIcon(R.drawable.ic_unfold); - item.setTitle(R.string.menu_show_all); - } else { - item.setIcon(R.drawable.ic_fold); - item.setTitle(R.string.menu_show_unread); - } - return true; - - case R.id.menu_open_thread: - Intent threadIntent = new Intent(this, MainActivity.class); - threadIntent.putExtra(MessageListActivity.ARG_THREAD_ID, mConversationLegacy.getThreadId()); - startActivity(threadIntent); - finish(); - return true; - - case R.id.menu_call: - Intent callIntent = new Intent(Intent.ACTION_CALL); - callIntent.setData(Uri.parse("tel:" + mConversationLegacy.getAddress())); - startActivity(callIntent); - return true; - - case R.id.menu_mark_read: - mConversationLegacy.markRead(); - finish(); - return true; - - case R.id.menu_delete: - Intent intent = new Intent(this, DeleteUnreadMessageService.class); - intent.putExtra(DeleteUnreadMessageService.EXTRA_THREAD_URI, mConversation.getUri()); - startService(intent); - finish(); - return true; - - case R.id.menu_copy: - Intent copyIntent = new Intent(this, CopyUnreadMessageTextService.class); - copyIntent.putExtra(DeleteUnreadMessageService.EXTRA_THREAD_URI, mConversation.getUri()); - startService(copyIntent); - return true; - - case R.id.menu_forward: - Intent forwardIntent = new Intent(this, QKComposeActivity.class); - forwardIntent.putExtra("sms_body", SmsHelper.getUnreadMessageText(this, mConversation.getUri())); - startActivity(forwardIntent); - finish(); - return true; - } - - return super.onOptionsItemSelected(item); - } - - @Override - public void onDismiss(DialogInterface dialog) { - finish(); - } - - public Loader<Cursor> onCreateLoader(int id, Bundle args) { - String selection = mShowUnreadOnly ? SmsHelper.UNREAD_SELECTION : null; - return new CursorLoader(this, - Uri.withAppendedPath(Message.MMS_SMS_CONTENT_PROVIDER, "" + mConversationLegacy.getThreadId()), - MessageColumns.PROJECTION, selection, null, "normalized_date ASC"); - } - - public void onLoadFinished(Loader<Cursor> loader, Cursor data) { - if (mAdapter != null) { - mAdapter.changeCursor(data); - } - mCursor = data; - } - - public void onLoaderReset(Loader<Cursor> loader) { - if (mAdapter != null) { - mAdapter.changeCursor(null); - } - mCursor = null; - } - - /** - * Other areas of the app can tell the QK Reply window to close itself if necessary - * <p/> - * 1. MainActivity. When it's resumed, we don't want any QK Reply windows to open, which may have - * happened while the screen was off. - * <p/> - * 2. PushbulletService. If a message is replied to via PB, close the window - * <p/> - * 3. MarkReadReceiver. A QK Reply window may have opened while the screen was off, so if it's marked - * as read from the lock screen via notification, the QK Reply window should be dismissed - */ - public static void dismiss(long threadId) { - if (sThreadId == threadId) { - sThreadId = 0; - System.exit(0); - } - } - - @Override - public void onSend(String[] addresses, String body) { - // When we send an SMS, mark the conversation as read, and close the quick reply activity. - if (mConversation != null) { - mConversation.markAsRead(); - } - if (mConversationLegacy != null) { - mConversationLegacy.markRead(); - } - - finish(); - } - - /** - * Launches an activity with the given request code. - * <p/> - * Note: The `ActivityLauncher` interface exposes this method for views (such as ComposeView) - * to use. - */ - @Override - public void startActivityForResult(Intent intent, int requestCode) { - super.startActivityForResult(intent, requestCode); - mIsStartingActivity = true; - - // 0 for the exit anim so that the dialog appears to not fade out while you're choosing an - // attachment. - overridePendingTransition(R.anim.abc_fade_in, 0); - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/popup/QKReplyAdapter.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/popup/QKReplyAdapter.java deleted file mode 100644 index f8b8db273..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/popup/QKReplyAdapter.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.moez.QKSMS.ui.popup; - -import android.database.Cursor; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ArrayAdapter; - -import com.moez.QKSMS.ui.base.QKActivity; -import com.moez.QKSMS.ui.messagelist.MessageListAdapter; -import com.moez.QKSMS.ui.messagelist.MessageListViewHolder; - -/** - * ArrayAdapter wrapper of MessageListAdapter to allow regular ListView usage in QKReplyActivity - * RecyclerView in variable-height windows causes a lot of issues - */ -public class QKReplyAdapter extends ArrayAdapter { - - private MessageListAdapter mMessageListAdapter; - - public QKReplyAdapter(QKActivity context) { - super(context, 0); - mMessageListAdapter = new MessageListAdapter(context); - } - - @Override - public View getView(int position, View convertView, ViewGroup parent) { - MessageListViewHolder holder; - - if (convertView == null) { - holder = mMessageListAdapter.onCreateViewHolder(parent, getItemViewType(position)); - convertView = holder.itemView; - convertView.setTag(holder); - } else { - holder = (MessageListViewHolder) convertView.getTag(); - } - - mMessageListAdapter.bindViewHolder(holder, position); - return holder.itemView; - } - - @Override - public int getCount() { - return mMessageListAdapter != null ? mMessageListAdapter.getCount() : 0; - } - - @Override - public int getItemViewType(int position) { - return mMessageListAdapter.getItemViewType(position); - } - - @Override - public int getViewTypeCount() { - return 2; - } - - public void changeCursor(Cursor cursor) { - mMessageListAdapter.changeCursor(cursor); - notifyDataSetChanged(); - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/search/SearchActivity.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/search/SearchActivity.java deleted file mode 100644 index 69d59dcf3..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/search/SearchActivity.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.moez.QKSMS.ui.search; - -import android.app.FragmentManager; -import android.os.Bundle; -import android.view.Menu; -import android.view.MenuInflater; -import com.moez.QKSMS.R; -import com.moez.QKSMS.ui.base.QKSwipeBackActivity; - -public class SearchActivity extends QKSwipeBackActivity { - - private SearchFragment mSearchFragment; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setTitle(R.string.title_search); - - FragmentManager fm = getFragmentManager(); - mSearchFragment = (SearchFragment) fm.findFragmentByTag(SearchFragment.TAG); - if (mSearchFragment == null) { - mSearchFragment = new SearchFragment(); - } - - fm.beginTransaction() - .replace(R.id.content_frame, mSearchFragment, SearchFragment.TAG) - .commit(); - } - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - new MenuInflater(this).inflate(R.menu.search, menu); - return super.onCreateOptionsMenu(menu); - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/search/SearchAdapter.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/search/SearchAdapter.java deleted file mode 100644 index bf4680cd1..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/search/SearchAdapter.java +++ /dev/null @@ -1,94 +0,0 @@ -package com.moez.QKSMS.ui.search; - -import android.graphics.Typeface; -import android.graphics.drawable.Drawable; -import android.text.Spannable; -import android.text.SpannableStringBuilder; -import android.text.style.StyleSpan; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import com.moez.QKSMS.R; -import com.moez.QKSMS.common.LiveViewManager; -import com.moez.QKSMS.common.utils.DateFormatter; -import com.moez.QKSMS.enums.QKPreference; -import com.moez.QKSMS.ui.ThemeManager; -import com.moez.QKSMS.ui.base.QKActivity; -import com.moez.QKSMS.ui.base.RecyclerCursorAdapter; - -import java.util.ArrayList; - -public class SearchAdapter extends RecyclerCursorAdapter<SearchViewHolder, SearchData> { - - private String mQuery; - - public SearchAdapter(QKActivity context) { - super(context); - } - - public void setQuery(String query) { - mQuery = query; - } - - @Override - protected SearchData getItem(int position) { - mCursor.moveToPosition(position); - return new SearchData(mCursor); - } - - @Override - public SearchViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - LayoutInflater inflater = LayoutInflater.from(mContext); - View view = inflater.inflate(R.layout.list_item_search, parent, false); - - LiveViewManager.registerView(QKPreference.BACKGROUND, this, key -> { - view.setBackgroundDrawable(ThemeManager.getRippleBackground()); - }); - - return new SearchViewHolder(mContext, view); - } - - @Override - public void onBindViewHolder(SearchViewHolder holder, int position) { - SearchData data = getItem(position); - - holder.mData = data; - holder.mClickListener = mItemClickListener; - holder.root.setOnClickListener(holder); - holder.root.setOnLongClickListener(holder); - - if (data.contact != null) { - Drawable avatarDrawable = data.contact.getAvatar(mContext, null); - holder.avatar.setImageDrawable(avatarDrawable); - holder.avatar.setContactName(data.contact.getName()); - holder.name.setText(data.contact.getName()); - } else { - holder.avatar.setImageDrawable(null); - holder.avatar.setContactName(null); - holder.name.setText(null); - } - - holder.date.setText(DateFormatter.getConversationTimestamp(mContext, data.date)); - - if (mQuery != null) { - - // We need to make the search string bold within the full message - // Get all of the start positions of the query within the messages - ArrayList<Integer> indices = new ArrayList<>(); - int index = data.body.toLowerCase().indexOf(mQuery.toLowerCase()); - while (index >= 0) { - indices.add(index); - index = data.body.toLowerCase().indexOf(mQuery.toLowerCase(), index + 1); - } - - // Make all instances of the search query bold - SpannableStringBuilder sb = new SpannableStringBuilder(data.body); - for (int i : indices) { - StyleSpan span = new StyleSpan(Typeface.BOLD); - sb.setSpan(span, i, i + mQuery.length(), Spannable.SPAN_EXCLUSIVE_INCLUSIVE); - } - - holder.snippet.setText(sb); - } - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/search/SearchData.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/search/SearchData.java deleted file mode 100644 index 59d9d1f61..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/search/SearchData.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.moez.QKSMS.ui.search; - -import android.database.Cursor; -import com.moez.QKSMS.data.Contact; - -public class SearchData { - - protected long threadId; - protected Contact contact; - protected String body; - protected long date; - protected long rowId; - - public SearchData(Cursor cursor) { - final int threadIdPos = cursor.getColumnIndex("thread_id"); - final int addressPos = cursor.getColumnIndex("address"); - final int bodyPos = cursor.getColumnIndex("body"); - final int datePos = cursor.getColumnIndex("date"); - final int rowidPos = cursor.getColumnIndex("_id"); - - threadId = cursor.getLong(threadIdPos); - - String address = cursor.getString(addressPos); - contact = address != null ? Contact.get(address, false) : null; - - body = cursor.getString(bodyPos); - - date = cursor.getLong(datePos); - - rowId = cursor.getLong(rowidPos); - } - -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/search/SearchFragment.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/search/SearchFragment.java deleted file mode 100644 index f61c25714..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/search/SearchFragment.java +++ /dev/null @@ -1,137 +0,0 @@ -package com.moez.QKSMS.ui.search; - -import android.content.AsyncQueryHandler; -import android.content.SharedPreferences; -import android.content.res.Resources; -import android.database.Cursor; -import android.net.Uri; -import android.os.Bundle; -import android.os.Handler; -import android.provider.Telephony; -import android.support.v7.widget.LinearLayoutManager; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.view.inputmethod.EditorInfo; -import com.moez.QKSMS.R; -import com.moez.QKSMS.common.utils.KeyboardUtils; -import com.moez.QKSMS.data.Contact; -import com.moez.QKSMS.ui.base.QKFragment; -import com.moez.QKSMS.ui.base.RecyclerCursorAdapter; -import com.moez.QKSMS.ui.messagelist.MessageListActivity; -import com.moez.QKSMS.ui.view.MessageListRecyclerView; -import com.moez.QKSMS.ui.view.QKEditText; -import com.moez.QKSMS.ui.view.QKTextView; - -import java.util.HashMap; -import java.util.regex.Pattern; - -public class SearchFragment extends QKFragment implements RecyclerCursorAdapter.ItemClickListener<SearchData> { - public static final String TAG = "SearchFragment"; - - private AsyncQueryHandler mQueryHandler; - - // Track which TextView's show which Contact objects so that we can update - // appropriately when the Contact gets fully loaded. - private HashMap<Contact, QKTextView> mContactMap = new HashMap<>(); - - private SharedPreferences mPrefs; - private Resources mRes; - private Cursor mCursor; - private QKEditText mQuery; - private String mSearchString; - private LinearLayoutManager mLayoutManager; - private MessageListRecyclerView mRecyclerView; - private SearchAdapter mAdapter; - private Pattern mPattern; - - public SearchFragment() { - - } - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - mPrefs = mContext.getPrefs(); - mRes = mContext.getResources(); - - // When the query completes cons up a new adapter and set our list adapter to that. - mQueryHandler = new AsyncQueryHandler(mContext.getContentResolver()) { - protected void onQueryComplete(int token, Object cookie, Cursor c) { - - mAdapter.changeCursor(c); - mAdapter.setQuery(mSearchString); - } - }; - } - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.fragment_search, container, false); - - mQuery = (QKEditText) view.findViewById(R.id.search_query); - mQuery.setTextChangedListener(s -> { - mSearchString = s.toString(); - query(); - }); - mQuery.setOnEditorActionListener((v, actionId, event) -> { - if (actionId == EditorInfo.IME_ACTION_SEARCH) { - mSearchString = mQuery.getText().toString(); - query(); - - // Hide the keyboard when the user makes a query - mQuery.clearFocus(); - KeyboardUtils.hide(mContext, mQuery); - return true; - } - return false; - }); - - mLayoutManager = new LinearLayoutManager(mContext); - mAdapter = new SearchAdapter(mContext); - mAdapter.setItemClickListener(this); - - - mRecyclerView = (MessageListRecyclerView) view.findViewById(R.id.search_list); - mRecyclerView.setLayoutManager(mLayoutManager); - mRecyclerView.setAdapter(mAdapter); - - new Handler().postDelayed(() -> KeyboardUtils.showAndFocus(mContext, mQuery), 50); - return view; - } - - private void query() { - Contact.addListener(mContactListener); - - // don't pass a projection since the search uri ignores it - Uri uri = Telephony.MmsSms.SEARCH_URI.buildUpon().appendQueryParameter("pattern", mSearchString).build(); - - // kick off a query for the threads which match the search string - mQueryHandler.startQuery(0, null, uri, null, null, null, null); - } - - - Contact.UpdateListener mContactListener = updated -> { - QKTextView tv = mContactMap.get(updated); - if (tv != null) { - tv.setText(updated.getNameAndNumber()); - } - }; - - @Override - public void onStop() { - super.onStop(); - Contact.removeListener(mContactListener); - } - - @Override - public void onItemClick(SearchData data, View view) { - MessageListActivity.launch(mContext, data.threadId, data.rowId, mSearchString, true); - mContext.finish(); - } - - @Override - public void onItemLongClick(SearchData data, View view) { - - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/search/SearchViewHolder.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/search/SearchViewHolder.java deleted file mode 100644 index b079ab94b..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/search/SearchViewHolder.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.moez.QKSMS.ui.search; - -import android.view.View; -import com.moez.QKSMS.R; -import com.moez.QKSMS.ui.base.ClickyViewHolder; -import com.moez.QKSMS.ui.base.QKActivity; -import com.moez.QKSMS.ui.view.AvatarView; -import com.moez.QKSMS.ui.view.QKTextView; - -public class SearchViewHolder extends ClickyViewHolder<SearchData> { - - protected View root; - protected AvatarView avatar; - protected QKTextView name; - protected QKTextView date; - protected QKTextView snippet; - - public SearchViewHolder(QKActivity context, View view) { - super(context, view); - - root = view; - avatar = (AvatarView) view.findViewById(R.id.search_avatar); - name = (QKTextView) view.findViewById(R.id.search_name); - date = (QKTextView) view.findViewById(R.id.search_date); - snippet = (QKTextView) view.findViewById(R.id.search_snippet); - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/settings/QKResponseAdapter.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/settings/QKResponseAdapter.java deleted file mode 100644 index 3b976274e..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/settings/QKResponseAdapter.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.moez.QKSMS.ui.settings; - -import android.content.Context; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ArrayAdapter; - -import com.moez.QKSMS.R; -import com.moez.QKSMS.ui.view.QKEditText; -import com.moez.QKSMS.ui.view.QKTextView; - -import java.util.ArrayList; -import java.util.List; - -public class QKResponseAdapter extends ArrayAdapter<String> { - private List<String> mResponses = new ArrayList<>(); - - public QKResponseAdapter(Context context, int resource, List<String> objects) { - super(context, resource, objects); - mResponses.addAll(objects); - } - - @Override - public View getView(int position, View convertView, ViewGroup parent) { - final ViewHolder vh; - - if (convertView == null) { - convertView = LayoutInflater.from(getContext()).inflate(R.layout.list_item_qk_response, null); - - vh = new ViewHolder(); - vh.mResponseIndex = (QKTextView) convertView.findViewById(R.id.response_index); - vh.mResponse = (QKEditText) convertView.findViewById(R.id.response); - convertView.setTag(vh); - } else { - vh = (ViewHolder) convertView.getTag(); - } - - vh.position = position; - vh.mResponseIndex.setText(Integer.toString(position + 1)); - vh.mResponse.setText(mResponses.get(position)); - vh.mResponse.setTextChangedListener(new QKEditText.TextChangedListener() { - @Override - public void onTextChanged(CharSequence s) { - mResponses.remove(vh.position); - mResponses.add(vh.position, s.toString()); - } - }); - - return convertView; - } - - public List<String> getResponses() { - return mResponses; - } - - @Override - public int getCount() { - return mResponses.size(); - } -} - -class ViewHolder { - int position; - QKTextView mResponseIndex; - QKEditText mResponse; -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/settings/SettingsActivity.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/settings/SettingsActivity.java deleted file mode 100644 index d16c34535..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/settings/SettingsActivity.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.moez.QKSMS.ui.settings; - -import android.app.FragmentManager; -import android.os.Bundle; -import com.moez.QKSMS.R; -import com.moez.QKSMS.ui.base.QKSwipeBackActivity; - -public class SettingsActivity extends QKSwipeBackActivity { - - private SettingsFragment mSettingsFragment; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - FragmentManager fm = getFragmentManager(); - mSettingsFragment = (SettingsFragment) fm.findFragmentByTag(SettingsFragment.TAG); - if (mSettingsFragment == null) { - mSettingsFragment = SettingsFragment.newInstance(R.xml.settings_main); - fm.beginTransaction() - .replace(R.id.content_frame, mSettingsFragment, SettingsFragment.TAG) - .commit(); - } else { - fm.beginTransaction() - .show(mSettingsFragment) - .commit(); - } - } - - @Override - public void onBackPressed() { - if (getFragmentManager().getBackStackEntryCount() > 0) { - getFragmentManager().popBackStack(); - } else { - super.onBackPressed(); - } - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/settings/SettingsFragment.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/settings/SettingsFragment.java deleted file mode 100644 index a8bb54345..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/settings/SettingsFragment.java +++ /dev/null @@ -1,755 +0,0 @@ -package com.moez.QKSMS.ui.settings; - -import android.app.AlarmManager; -import android.app.Fragment; -import android.app.PendingIntent; -import android.content.Context; -import android.content.Intent; -import android.content.SharedPreferences; -import android.content.pm.PackageInfo; -import android.content.pm.PackageManager; -import android.content.res.Resources; -import android.net.Uri; -import android.os.Build; -import android.os.Bundle; -import android.os.Handler; -import android.preference.CheckBoxPreference; -import android.preference.EditTextPreference; -import android.preference.ListPreference; -import android.preference.Preference; -import android.preference.PreferenceCategory; -import android.preference.PreferenceFragment; -import android.preference.PreferenceManager; -import android.preference.PreferenceScreen; -import android.util.Log; -import android.view.Menu; -import android.view.MenuInflater; -import android.view.View; -import android.widget.AdapterView; -import android.widget.ListView; -import android.widget.Toast; -import com.mariussoft.endlessjabber.sdk.EndlessJabberInterface; -import com.moez.QKSMS.R; -import com.moez.QKSMS.common.AnalyticsManager; -import com.moez.QKSMS.common.DialogHelper; -import com.moez.QKSMS.common.DonationManager; -import com.moez.QKSMS.common.ListviewHelper; -import com.moez.QKSMS.common.LiveViewManager; -import com.moez.QKSMS.common.QKPreferences; -import com.moez.QKSMS.common.utils.DateFormatter; -import com.moez.QKSMS.common.utils.KeyboardUtils; -import com.moez.QKSMS.common.utils.PackageUtils; -import com.moez.QKSMS.enums.QKPreference; -import com.moez.QKSMS.receiver.NightModeAutoReceiver; -import com.moez.QKSMS.service.DeleteOldMessagesService; -import com.moez.QKSMS.transaction.EndlessJabber; -import com.moez.QKSMS.transaction.NotificationManager; -import com.moez.QKSMS.transaction.SmsHelper; -import com.moez.QKSMS.ui.ThemeManager; -import com.moez.QKSMS.ui.base.QKActivity; -import com.moez.QKSMS.ui.dialog.BlockedNumberDialog; -import com.moez.QKSMS.ui.dialog.BubblePreferenceDialog; -import com.moez.QKSMS.ui.dialog.QKDialog; -import com.moez.QKSMS.ui.dialog.mms.MMSSetupFragment; -import com.moez.QKSMS.ui.view.QKTextView; -import com.moez.QKSMS.ui.view.colorpicker.ColorPickerDialog; -import com.moez.QKSMS.ui.view.colorpicker.ColorPickerSwatch; - -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Calendar; -import java.util.Collections; -import java.util.HashSet; -import java.util.Set; -import java.util.Stack; - -public class SettingsFragment extends PreferenceFragment implements Preference.OnPreferenceChangeListener, - Preference.OnPreferenceClickListener { - public static final String TAG = "SettingsFragment"; - - public static final String CATEGORY_APPEARANCE = "pref_key_category_appearance"; - public static final String CATEGORY_THEME = "pref_category_theme"; - public static final String CATEGORY_GENERAL = "pref_key_category_general"; - public static final String CATEGORY_NOTIFICATIONS = "pref_key_category_notifications"; - public static final String CATEGORY_MMS = "pref_key_category_mms"; - public static final String CATEGORY_QUICKREPLY = "pref_key_category_quickreply"; - public static final String CATEGORY_QUICKCOMPOSE = "pref_key_category_quickcompose"; - public static final String CATEGORY_ABOUT = "pref_key_category_about"; - - // Sub-categories - public static final String CATEGORY_APPEARANCE_SYSTEM_BARS = "pref_key_category_appearance_system_bars"; - - public static final String THEME = "pref_key_theme"; - public static final String ICON = "pref_key_icon"; - public static final String STATUS_TINT = "pref_key_status_tint"; - public static final String NAVIGATION_TINT = "pref_key_navigation_tint"; - public static final String BACKGROUND = "pref_key_background"; - public static final String BUBBLES = "pref_key_bubbles"; - public static final String BUBBLES_NEW = "pref_key_new_bubbles"; - public static final String COLOR_SENT = "pref_key_colour_sent"; - public static final String COLOR_RECEIVED = "pref_key_colour_received"; - public static final String HIDE_AVATAR_CONVERSATIONS = "pref_key_hide_avatar_conversations"; - public static final String HIDE_AVATAR_SENT = "pref_key_hide_avatar_sent"; - public static final String HIDE_AVATAR_RECEIVED = "pref_key_hide_avatar_received"; - public static final String AUTO_EMOJI = "pref_key_auto_emoji"; - public static final String MARKDOWN_ENABLED = "pref_key_markdown_enabled"; - public static final String ENTER_BUTTON = "pref_key_enter_button"; - public static final String FORCE_TIMESTAMPS = "pref_key_force_timestamps"; - public static final String SHOW_NEW_TIMESTAMP_DELAY = "pref_key_timestamp_delay"; - public static final String COMPOSE_FAVORITES = "pref_key_compose_favorites"; - public static final String FONT_FAMILY = "pref_key_font_family"; - public static final String FONT_SIZE = "pref_key_font_size"; - public static final String FONT_WEIGHT = "pref_key_font_weight"; - public static final String MESSAGE_COUNT = "pref_key_message_count"; - public static final String PROXIMITY_CALLING = "pref_key_prox_sensor_calling"; - public static final String DELIVERY_REPORTS = "pref_key_delivery"; - public static final String DELIVERY_TOAST = "pref_key_delivery_toast"; - public static final String DELIVERY_VIBRATE = "pref_key_delivery_vibrate"; - public static final String DELETE_OLD_MESSAGES = "pref_key_delete_old_messages"; - public static final String DELETE_UNREAD_MESSAGES = "pref_key_delete_old_unread_messages"; - public static final String DELETE_READ_MESSAGES = "pref_key_delete_old_read_messages"; - public static final String YAPPY = "pref_key_endlessjabber"; - public static final String BLOCKED_ENABLED = "pref_key_blocked_enabled"; - public static final String BLOCKED_SENDERS = "pref_key_blocked_senders"; - public static final String BLOCKED_FUTURE = "pref_key_block_future"; - public static final String SHOULD_I_ANSWER = "pref_key_should_i_answer"; - public static final String MOBILE_ONLY = "pref_key_mobile_only"; - public static final String COMPOSE_GROUP = "pref_key_compose_group"; - public static final String SPLIT_SMS = "pref_key_split"; - public static final String SPLIT_COUNTER = "pref_key_split_counter"; - public static final String LONG_AS_MMS = "pref_key_long_as_mms"; - public static final String LONG_AS_MMS_AFTER = "pref_key_long_as_mms_after"; - public static final String NOTIFICATIONS = "pref_key_notifications"; - public static final String NOTIFICATION_LED = "pref_key_led"; - public static final String NOTIFICATION_LED_COLOR = "pref_key_theme_led"; - public static final String WAKE = "pref_key_wake"; - public static final String NOTIFICATION_TICKER = "pref_key_ticker"; - public static final String PRIVATE_NOTIFICATION = "pref_key_notification_private"; - public static final String NOTIFICATION_VIBRATE = "pref_key_vibration"; - public static final String NOTIFICATION_TONE = "pref_key_ringtone"; - public static final String NOTIFICATION_CALL_BUTTON = "pref_key_notification_call"; - public static final String DELAYED = "pref_key_delayed"; - public static final String DELAY_DURATION = "pref_key_delay_duration"; - public static final String NIGHT_AUTO = "pref_key_night_auto"; - public static final String DAY_START = "pref_key_day_start"; - public static final String NIGHT_START = "pref_key_night_start"; - public static final String QK_RESPONSES = "pref_key_qk_responses"; - public static final String MMS_ENABLED = "pref_key_mms_enabled"; - public static final String AUTO_DATA = "pref_key_auto_data"; - public static final String MMSC_URL = "mmsc_url"; - public static final String MMS_PORT = "mms_port"; - public static final String MMS_PROXY = "mms_proxy"; - public static final String AUTOMATICALLY_CONFIGURE_MMS = "pref_key_automatically_configure_mms"; - public static final String MMS_CONTACT_SUPPORT = "pref_key_mms_contact_support"; - public static final String DONATE = "pref_key_donate"; - public static final String DISMISSED_READ = "pref_key_dismiss_read"; - public static final String MAX_MMS_ATTACHMENT_SIZE = "pref_mms_max_attachment_size"; - public static final String QUICKREPLY = "pref_key_quickreply_enabled"; - public static final String QUICKREPLY_TAP_DISMISS = "pref_key_quickreply_dismiss"; - public static final String QUICKCOMPOSE = "pref_key_quickcompose"; - public static final String STRIP_UNICODE = "pref_key_strip_unicode"; - public static final String VERSION = "pref_key_version"; - public static final String CHANGELOG = "pref_key_changelog"; - public static final String THANKS = "pref_key_thanks"; - public static final String GOOGLE_PLUS = "pref_key_google_plus"; - public static final String GITHUB = "pref_key_github"; - public static final String CROWDIN = "pref_key_crowdin"; - - public static final String WELCOME_SEEN = "pref_key_welcome_seen"; - - public static final String DEFAULT_NOTIFICATION_TONE = "content://settings/system/notification_sound"; - - public static final String CATEGORY_TAG = "settings_category_fragment_tag"; - - public static final String GOOGLE_PLUS_URL = "https://plus.google.com/communities/104505769539048913485"; - public static final String GITHUB_URL = "https://github.com/qklabs/qksms"; - public static final String CROWDIN_URL = "https://crowdin.com/project/qksms"; - - private QKActivity mContext; - private PreferenceManager mPreferenceManager; - private SharedPreferences mPrefs; - private Resources mRes; - private ListView mListView; - - private Preference mThemeLed; - private EditTextPreference mMmscUrl; - private EditTextPreference mMmsProxy; - private EditTextPreference mMmsPort; - - private ColorPickerDialog mLedColorPickerDialog; - - private String[] mFontFamilies; - private String[] mFontSizes; - private String[] mFontWeights; - private int[] mLedColors; - - private ListPreference mMaxMmsAttachmentSize; - private String[] mMaxMmsAttachmentSizes; - - private int mResource; - - protected static SettingsFragment newInstance(int category) { - SettingsFragment fragment = new SettingsFragment(); - - Bundle args = new Bundle(); - args.putInt("category", category); - fragment.setArguments(args); - - return fragment; - } - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - Bundle args = getArguments(); - setHasOptionsMenu(true); - - mContext = (QKActivity) getActivity(); - mPrefs = mContext.getPrefs(); - mRes = mContext.getResources(); - - mContext.setTitle(R.string.title_settings); - - mResource = args.getInt("category", R.xml.settings); - addPreferencesFromResource(mResource); - - // Set `this` to be the preferences click/change listener for all the preferences. - PreferenceScreen screen = getPreferenceScreen(); - for (int i = 0; i < screen.getPreferenceCount(); i++) { - Preference pref = screen.getPreference(i); - pref.setOnPreferenceClickListener(this); - pref.setOnPreferenceChangeListener(this); - - // If this is a preference category, make sure to go through all the subpreferences as - // well. - if (pref instanceof PreferenceCategory) { - Stack<PreferenceCategory> stack = new Stack<>(); - stack.push((PreferenceCategory) pref); - - do { - PreferenceCategory category = stack.pop(); - for (int j = 0; j < category.getPreferenceCount(); j++) { - Preference subPref = category.getPreference(j); - subPref.setOnPreferenceClickListener(this); - subPref.setOnPreferenceChangeListener(this); - - if (subPref instanceof PreferenceCategory) { - stack.push((PreferenceCategory) subPref); - } - } - } while (!stack.isEmpty()); - } - } - - Preference icon = findPreference(ICON); - if (icon != null) { - icon.setOnPreferenceClickListener(this); - } - - mThemeLed = findPreference(NOTIFICATION_LED_COLOR); - if (mThemeLed != null) { - - mLedColors = new int[]{ - mRes.getColor(R.color.blue_light), mRes.getColor(R.color.purple_light), - mRes.getColor(R.color.green_light), mRes.getColor(R.color.yellow_light), - mRes.getColor(R.color.red_light), mRes.getColor(R.color.white_pure) - }; - - mLedColorPickerDialog = new ColorPickerDialog(); - mLedColorPickerDialog.initialize(R.string.pref_theme_led, mLedColors, Integer.parseInt(mPrefs.getString(NOTIFICATION_LED_COLOR, "-48060")), 3, 2); - mLedColorPickerDialog.setOnColorSelectedListener(new ColorPickerSwatch.OnColorSelectedListener() { - - @Override - public void onColorSelected(int color) { - mPrefs.edit().putString(mThemeLed.getKey(), "" + color).apply(); - onPreferenceChange(findPreference(mThemeLed.getKey()), color); - } - }); - } - - ListPreference font_family = (ListPreference) findPreference(FONT_FAMILY); - if (font_family != null) { - mFontFamilies = mRes.getStringArray(R.array.font_families); - font_family.setSummary(mFontFamilies[Integer.parseInt(font_family.getValue())]); - } - - ListPreference font_size = (ListPreference) findPreference(FONT_SIZE); - if (font_size != null) { - mFontSizes = mRes.getStringArray(R.array.font_sizes); - font_size.setSummary(mFontSizes[Integer.parseInt(font_size.getValue())]); - } - - ListPreference font_weight = (ListPreference) findPreference(FONT_WEIGHT); - if (font_weight != null) { - mFontWeights = mRes.getStringArray(R.array.font_weights); - int i = Integer.parseInt(font_weight.getValue()); - font_weight.setSummary(mFontWeights[i == 2 ? 0 : 1]); - } - - EditTextPreference deleteUnread = (EditTextPreference) findPreference(DELETE_UNREAD_MESSAGES); - if (deleteUnread != null) { - deleteUnread.setSummary(mContext.getString(R.string.pref_delete_old_messages_unread_summary, QKPreferences.getString(QKPreference.AUTO_DELETE_UNREAD))); - } - - EditTextPreference deleteRead = (EditTextPreference) findPreference(DELETE_READ_MESSAGES); - if (deleteRead != null) { - deleteRead.setSummary(mContext.getString(R.string.pref_delete_old_messages_read_summary, QKPreferences.getString(QKPreference.AUTO_DELETE_READ))); - } - - Preference day_start = findPreference(DAY_START); - if (day_start != null) { - day_start.setSummary(DateFormatter.getSummaryTimestamp(mContext, mPrefs.getString(DAY_START, "6:00"))); - } - - Preference night_start = findPreference(NIGHT_START); - if (night_start != null) { - night_start.setSummary(DateFormatter.getSummaryTimestamp(mContext, mPrefs.getString(NIGHT_START, "21:00"))); - } - - mMmscUrl = (EditTextPreference) findPreference(MMSC_URL); - if (mMmscUrl != null) { - mMmscUrl.setSummary(mMmscUrl.getText()); - } - - mMmsProxy = (EditTextPreference) findPreference(MMS_PROXY); - if (mMmsProxy != null) { - mMmsProxy.setSummary(mMmsProxy.getText()); - } - - mMmsPort = (EditTextPreference) findPreference(MMS_PORT); - if (mMmsPort != null) { - mMmsPort.setSummary(mMmsPort.getText()); - } - - mMaxMmsAttachmentSize = (ListPreference) findPreference(MAX_MMS_ATTACHMENT_SIZE); - if (mMaxMmsAttachmentSize != null) { - mMaxMmsAttachmentSizes = mRes.getStringArray(R.array.max_mms_attachment_sizes); - - String value = mMaxMmsAttachmentSize.getValue(); - String summary = mMaxMmsAttachmentSizes[mMaxMmsAttachmentSize.findIndexOfValue(value)]; - mMaxMmsAttachmentSize.setSummary(summary); - } - - Preference version = findPreference(VERSION); - if (version != null) { - String v = "unknown"; - try { - PackageInfo info = mContext.getPackageManager().getPackageInfo(mContext.getPackageName(), 0); - v = info.versionName; - } catch (PackageManager.NameNotFoundException e) { - e.printStackTrace(); - } - version.setSummary(v); - } - - // Status and nav bar tinting are only supported on kit kat or above. - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { - removePreference(CATEGORY_APPEARANCE_SYSTEM_BARS); - } - } - - @Override - public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { - inflater.inflate(R.menu.settings, menu); - super.onCreateOptionsMenu(menu, inflater); - } - - /** - * Removed top level preferences from the layout - */ - private void removePreference(String key) { - Preference pref = findPreference(key); - PreferenceScreen screen = getPreferenceScreen(); - if (pref != null && screen != null) { - screen.removePreference(pref); - } - } - - /** - * Removes a preference from a given category - */ - private void removePreference(String key, String category) { - Preference pref = findPreference(key); - PreferenceCategory cat = (PreferenceCategory) findPreference(category); - if (pref != null && cat != null) { - cat.removePreference(pref); - } - } - - private void setPreferenceEnabled(String key, boolean enabled) { - Preference pref = findPreference(key); - if (pref != null) { - pref.setEnabled(enabled); - } else { - Log.w(TAG, "null preference for key " + key + ", can't set enabled to " + enabled); - } - } - - @Override - public void onViewCreated(View view, Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); - KeyboardUtils.hide(mContext, view); - mListView = (ListView) view.findViewById(android.R.id.list); - - LiveViewManager.registerView(QKPreference.BACKGROUND, this, key -> { - ListviewHelper.applyCustomScrollbar(mContext, mListView); - - View view1 = getView(); - if (view1 != null) { - view1.setBackgroundColor(ThemeManager.getBackgroundColor()); - } - }); - } - - @Override - public boolean onPreferenceChange(Preference preference, Object newValue) { - - String key = preference.getKey(); - - String valueString = newValue == null ? "null" : newValue.toString(); - if (key.equals(NOTIFICATION_LED_COLOR)) { - // Format the color as a nice string if it's the LED color. - valueString = ThemeManager.getColorString(Integer.parseInt(valueString)); - } - - Log.d(TAG, "onPreferenceChange key:" + key + " newValue: " + valueString); - AnalyticsManager.getInstance().sendEvent( - AnalyticsManager.CATEGORY_PREFERENCE_CHANGE, - key, - valueString - ); - - switch (key) { - case BACKGROUND: - ThemeManager.setTheme(ThemeManager.Theme.fromString((String) newValue)); - break; - case STATUS_TINT: - ThemeManager.setStatusBarTintEnabled(mContext, (Boolean) newValue); - break; - case NAVIGATION_TINT: - ThemeManager.setNavigationBarTintEnabled(mContext, (Boolean) newValue); - break; - case FONT_FAMILY: - preference.setSummary(mFontFamilies[Integer.parseInt("" + newValue)]); - break; - case FONT_SIZE: - preference.setSummary(mFontSizes[Integer.parseInt("" + newValue)]); - break; - case FONT_WEIGHT: - int i = Integer.parseInt("" + newValue); - preference.setSummary(mFontWeights[i == 2 ? 0 : 1]); - break; - case COLOR_SENT: - ThemeManager.setSentBubbleColored((Boolean) newValue); - break; - case COLOR_RECEIVED: - ThemeManager.setReceivedBubbleColored((Boolean) newValue); - break; - case NIGHT_AUTO: - updateAlarmManager(mContext, (Boolean) newValue); - break; - case DAY_START: - case NIGHT_START: - updateAlarmManager(mContext, true); - break; - - case DELETE_OLD_MESSAGES: - if ((Boolean) newValue) { - new QKDialog() - .setContext(mContext) - .setTitle(R.string.pref_delete_old_messages) - .setMessage(R.string.dialog_delete_old_messages) - .setPositiveButton(R.string.yes, v -> { - QKPreferences.setBoolean(QKPreference.AUTO_DELETE, true); - ((CheckBoxPreference) preference).setChecked(true); - DeleteOldMessagesService.setupAutoDeleteAlarm(mContext); - mContext.makeToast(R.string.toast_deleting_old_messages); - }) - .setNegativeButton(R.string.cancel, null) - .show(); - return false; - } - break; - - case DELETE_UNREAD_MESSAGES: - preference.setSummary(mContext.getString(R.string.pref_delete_old_messages_unread_summary, newValue)); - break; - - case DELETE_READ_MESSAGES: - preference.setSummary(mContext.getString(R.string.pref_delete_old_messages_read_summary, newValue)); - break; - - case YAPPY: - if ((Boolean) newValue) { - try { - EndlessJabberInterface.EnableIntegration(mContext, EndlessJabber.class, true, false); - } catch (Exception e) { - e.printStackTrace(); - } - if (!EndlessJabberInterface.IsInstalled(mContext)) { - EndlessJabberInterface.OpenGooglePlayLink(mContext); - } - } else { - try { - EndlessJabberInterface.DisableIntegration(mContext, EndlessJabber.class); - } catch (Exception e) { - e.printStackTrace(); - } - } - break; - case QUICKCOMPOSE: - NotificationManager.initQuickCompose(getActivity(), (Boolean) newValue, !(Boolean) newValue); - break; - case MMSC_URL: - case MMS_PROXY: - case MMS_PORT: - preference.setSummary(newValue.toString()); - break; - case MAX_MMS_ATTACHMENT_SIZE: - // Update the summary in the list preference - ListPreference listpref = (ListPreference) preference; - int index = listpref.findIndexOfValue((String) newValue); - preference.setSummary(mMaxMmsAttachmentSizes[index]); - // Update the SMS helper static class with the new option - SmsHelper.setMaxAttachmentSizeSetting(mContext, (String) newValue); - break; - case DELAY_DURATION: - try { - int duration = Integer.parseInt((String) newValue); - - if (duration < 1 || duration > 30) - throw new Exception("Duration out of bounds"); - - } catch (Exception e) { - Toast.makeText(mContext, R.string.delayed_duration_bounds_error, Toast.LENGTH_SHORT).show(); - } - break; - } - - return true; - } - - @Override - public boolean onPreferenceClick(Preference preference) { - - String key = preference.getKey() != null ? preference.getKey() : ""; - - AnalyticsManager.getInstance().sendEvent(AnalyticsManager.CATEGORY_PREFERENCE_CLICK, key, null); - - // Categories - int resId = 0; - switch (key) { - case CATEGORY_APPEARANCE: - resId = R.xml.settings_appearance; - break; - case CATEGORY_GENERAL: - resId = R.xml.settings_general; - break; - case CATEGORY_NOTIFICATIONS: - resId = R.xml.settings_notifications; - break; - case CATEGORY_MMS: - resId = R.xml.settings_mms; - break; - case CATEGORY_QUICKREPLY: - resId = R.xml.settings_quickreply; - break; - case CATEGORY_QUICKCOMPOSE: - resId = R.xml.settings_quickcompose; - break; - case CATEGORY_ABOUT: - resId = R.xml.settings_about; - break; - } - if (resId != 0) { - Fragment fragment = SettingsFragment.newInstance(resId); - getFragmentManager() - .beginTransaction() - .addToBackStack(null) - .replace(R.id.content_frame, fragment, CATEGORY_TAG) - .commit(); - } - - switch (key) { - case THEME: - ThemeManager.showColorPickerDialog(mContext); - break; - case ICON: - ThemeManager.setIcon(mContext); - break; - case BUBBLES: - new BubblePreferenceDialog().setContext(mContext).show(); - break; - case BLOCKED_FUTURE: - BlockedNumberDialog.showDialog(mContext); - break; - case SHOULD_I_ANSWER: - final String packageName = "org.mistergroup.muzutozvednout"; - if (!PackageUtils.isAppInstalled(mContext, packageName)) { - String referrer = "referrer=utm_source%3Dqksms%26utm_medium%3Dapp%26utm_campaign%3Dqksmssettings"; - new QKDialog() - .setContext(mContext) - .setTitle(R.string.dialog_should_i_answer_title) - .setMessage(R.string.dialog_should_i_answer_message) - .setNegativeButton(R.string.cancel, null) - .setPositiveButton(R.string.okay, v -> { - try { - startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + packageName + "&" + referrer))); - } catch (android.content.ActivityNotFoundException anfe) { - startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=" + packageName + "&" + referrer))); - } - }) - .show(); - - new Handler().postDelayed(() -> { - mPrefs.edit().putBoolean(SHOULD_I_ANSWER, false).commit(); - ((CheckBoxPreference) preference).setChecked(false); - }, 500); - } - break; - case NOTIFICATION_LED_COLOR: - mLedColorPickerDialog.show(getActivity().getFragmentManager(), "colorpicker"); - break; - case DAY_START: - case NIGHT_START: - TimePickerFragment fragment = new TimePickerFragment(); - fragment.setPreference(preference); - fragment.setOnPreferenceChangeListener(this); - fragment.show(getFragmentManager(), "timepicker"); - break; - case QK_RESPONSES: - showQkResponseEditor(); - break; - case AUTOMATICALLY_CONFIGURE_MMS: - // Show the MMS setup dialogs. See the MMSSetupDialog class for info about what the - // arguments mean. - MMSSetupFragment f = new MMSSetupFragment(); - Bundle args = new Bundle(); - args.putBoolean(MMSSetupFragment.ARG_ASK_FIRST, false); - args.putString(MMSSetupFragment.ARG_DONT_ASK_AGAIN_PREF, null); - f.setArguments(args); - - getFragmentManager().beginTransaction() - .add(f, MMSSetupFragment.TAG) - .commit(); - break; - case MMS_CONTACT_SUPPORT: - // Opens an email compose intent with MMS debugging information - MMSSetupFragment.contactSupport(getActivity()); - break; - case CHANGELOG: - DialogHelper.showChangelog(mContext); - break; - case THANKS: - new QKDialog() - .setContext(mContext) - .setTitle(R.string.pref_about_thanks_title) - .setTripleLineItems(R.array.contributor_names, R.array.contributor_githubs, R.array.contributor_projects, - new AdapterView.OnItemClickListener() { - @Override - public void onItemClick(AdapterView<?> parent, View view, int position, long id) { - String baseUrl = ((QKTextView) view.findViewById(R.id.list_item_subtitle)).getText().toString(); - startBrowserIntent("https://" + baseUrl); - } - }) - .show(); - break; - case DONATE: - DonationManager.getInstance(mContext).showDonateDialog(); - break; - case GOOGLE_PLUS: - startBrowserIntent(GOOGLE_PLUS_URL); - break; - case GITHUB: - startBrowserIntent(GITHUB_URL); - break; - case CROWDIN: - startBrowserIntent(CROWDIN_URL); - break; - } - - return false; - } - - private void startBrowserIntent(final String baseUrl) { - Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(baseUrl)); - startActivity(browserIntent); - } - - public boolean isCategoryList() { - return mResource == R.xml.settings_main; - } - - public void showQkResponseEditor() { - - Set<String> defaultResponses = new HashSet<>(Arrays.asList(mContext.getResources().getStringArray(R.array.qk_responses))); - Set<String> responseSet = mPrefs.getStringSet(SettingsFragment.QK_RESPONSES, defaultResponses); - ArrayList<String> responses = new ArrayList<>(); - responses.addAll(responseSet); - Collections.sort(responses); - for (int i = responses.size(); i < 12; i++) { - responses.add(""); - } - - final QKResponseAdapter adapter = new QKResponseAdapter(mContext, R.layout.list_item_qk_response, responses); - ListView listView = new ListView(mContext); - listView.setDividerHeight(0); - listView.setAdapter(adapter); - - new QKDialog() - .setContext(mContext) - .setTitle(R.string.title_qk_responses) - .setCustomView(listView) - .setPositiveButton(R.string.save, new View.OnClickListener() { - @Override - public void onClick(View v) { - mPrefs.edit().putStringSet(SettingsFragment.QK_RESPONSES, new HashSet<>(adapter.getResponses())).apply(); - } - }) - .setNegativeButton(R.string.cancel, null) - .show(getFragmentManager(), "qk_response"); - } - - public static void updateAlarmManager(Context context, boolean enabled) { - AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); - - SimpleDateFormat simpleDateFormat = new SimpleDateFormat("H:mm"); - Calendar calendar = Calendar.getInstance(); - - Calendar dayCalendar = Calendar.getInstance(); - dayCalendar.setTimeInMillis(System.currentTimeMillis()); - try { - calendar.setTime(simpleDateFormat.parse(PreferenceManager.getDefaultSharedPreferences(context).getString(DAY_START, "6:00"))); - } catch (ParseException e) { - e.printStackTrace(); - } - dayCalendar.set(Calendar.HOUR_OF_DAY, calendar.get(Calendar.HOUR_OF_DAY)); - dayCalendar.set(Calendar.MINUTE, calendar.get(Calendar.MINUTE)); - Intent day = new Intent(context, NightModeAutoReceiver.class); - PendingIntent dayIntent = PendingIntent.getBroadcast(context, 0, day, 0); - - Calendar nightCalendar = Calendar.getInstance(); - nightCalendar.setTimeInMillis(System.currentTimeMillis()); - try { - calendar.setTime(simpleDateFormat.parse(PreferenceManager.getDefaultSharedPreferences(context).getString(NIGHT_START, "21:00"))); - } catch (ParseException e) { - e.printStackTrace(); - } - nightCalendar.set(Calendar.HOUR_OF_DAY, calendar.get(Calendar.HOUR_OF_DAY)); - nightCalendar.set(Calendar.MINUTE, calendar.get(Calendar.MINUTE)); - Intent night = new Intent(context, NightModeAutoReceiver.class); - PendingIntent nightIntent = PendingIntent.getBroadcast(context, 1, night, 0); - - context.sendBroadcast(night); - - if (enabled) { - alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, dayCalendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, dayIntent); - alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, nightCalendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, nightIntent); - } else { - alarmManager.cancel(dayIntent); - alarmManager.cancel(nightIntent); - } - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/settings/TimePickerFragment.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/settings/TimePickerFragment.java deleted file mode 100644 index 66373d100..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/settings/TimePickerFragment.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.moez.QKSMS.ui.settings; - -import android.app.Dialog; -import android.app.DialogFragment; -import android.app.TimePickerDialog; -import android.content.SharedPreferences; -import android.os.Bundle; -import android.preference.Preference; -import android.preference.PreferenceManager; -import android.text.format.DateFormat; -import android.util.Log; -import android.widget.TimePicker; -import com.moez.QKSMS.common.utils.DateFormatter; - -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.Date; - -public class TimePickerFragment extends DialogFragment implements TimePickerDialog.OnTimeSetListener { - private final String TAG = "TimePickerPreference"; - - private Preference mPreference; - private Preference.OnPreferenceChangeListener mListener; - private SharedPreferences mPrefs; - - public void setPreference(Preference preference) { - mPreference = preference; - } - - public void setOnPreferenceChangeListener(Preference.OnPreferenceChangeListener l) { - mListener = l; - } - - @Override - public Dialog onCreateDialog(Bundle savedInstanceState) { - if (mPreference == null) { - Log.w(TAG, "No preference set"); - return null; - } - - mPrefs = PreferenceManager.getDefaultSharedPreferences(getActivity()); - - SimpleDateFormat simpleDateFormat = new SimpleDateFormat("H:mm"); - - // Use the current time as the default values for the picker - final Calendar c = Calendar.getInstance(); - - try { - Date date = simpleDateFormat.parse(mPrefs.getString(mPreference.getKey(), "6:00")); - c.setTime(date); - } catch (ParseException e) { - e.printStackTrace(); - } - - int hour = c.get(Calendar.HOUR_OF_DAY); - int minute = c.get(Calendar.MINUTE); - boolean isUsing24HourTime = DateFormat.is24HourFormat(getActivity()); - return new TimePickerDialog(getActivity(), this, hour, minute, isUsing24HourTime); - } - - public void onTimeSet(TimePicker view, int hourOfDay, int minute) { - // Format the minutes with padded zeros so we don't get stuff like "6:2" instead - // of 6:02 - String newValue = String.format("%d:%02d", hourOfDay, minute); - mPrefs.edit().putString(mPreference.getKey(), newValue).apply(); - mPreference.setSummary(DateFormatter.getSummaryTimestamp(getActivity(), newValue)); - mListener.onPreferenceChange(mPreference, newValue); - SettingsFragment.updateAlarmManager(getActivity(), true); - } -} \ No newline at end of file diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/view/AttachmentImageView.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/view/AttachmentImageView.java deleted file mode 100644 index bc2ac3a86..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/view/AttachmentImageView.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.moez.QKSMS.ui.view; - -import android.content.Context; -import android.graphics.Bitmap; -import android.util.AttributeSet; -import android.widget.ImageView; - -public class AttachmentImageView extends ImageView { - private boolean mHasAttachment = false; - - public AttachmentImageView(Context context) { - super(context); - } - - public AttachmentImageView(Context context, AttributeSet attrs) { - super(context, attrs); - } - - public AttachmentImageView(Context context, AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); - } - - @Override - public void setImageBitmap(Bitmap bm) { - super.setImageBitmap(bm); - mHasAttachment = bm != null; - } - - public boolean hasAttachment() { - return mHasAttachment; - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/view/AutoCompleteContactView.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/view/AutoCompleteContactView.java deleted file mode 100644 index 5b869aa1e..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/view/AutoCompleteContactView.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.moez.QKSMS.ui.view; - -import android.content.Context; -import android.content.SharedPreferences; -import android.util.AttributeSet; -import android.util.TypedValue; -import android.widget.MultiAutoCompleteTextView; -import com.android.ex.chips.BaseRecipientAdapter; -import com.android.ex.chips.RecipientEditTextView; -import com.moez.QKSMS.common.FontManager; -import com.moez.QKSMS.common.LiveViewManager; -import com.moez.QKSMS.enums.QKPreference; -import com.moez.QKSMS.ui.ThemeManager; -import com.moez.QKSMS.ui.base.QKActivity; -import com.moez.QKSMS.ui.settings.SettingsFragment; - -public class AutoCompleteContactView extends RecipientEditTextView { - public static final String TAG = "AutoCompleteContactView"; - - private QKActivity mContext; - private BaseRecipientAdapter mAdapter; - - public AutoCompleteContactView(Context context) { - this(context, null); - if (!isInEditMode()) { - init(context); - } - } - - public AutoCompleteContactView(Context context, AttributeSet attrs) { - super(context, attrs); - if (!isInEditMode()) { - init(context); - } - } - - private void init(Context context) { - mContext = (QKActivity) context; - - mAdapter = new BaseRecipientAdapter(BaseRecipientAdapter.QUERY_TYPE_PHONE, getContext()); - - setThreshold(1); - setTokenizer(new MultiAutoCompleteTextView.CommaTokenizer()); - setAdapter(mAdapter); - setOnItemClickListener(this); - - LiveViewManager.registerView(QKPreference.FONT_FAMILY, this, key -> { - setTypeface(FontManager.getFont(mContext)); - }); - - LiveViewManager.registerView(QKPreference.FONT_WEIGHT, this, key -> { - setTypeface(FontManager.getFont(mContext)); - }); - - LiveViewManager.registerView(QKPreference.FONT_SIZE, this, key -> { - setTextSize(TypedValue.COMPLEX_UNIT_SP, FontManager.getTextSize(mContext, FontManager.TEXT_TYPE_PRIMARY)); - }); - - LiveViewManager.registerView(QKPreference.BACKGROUND, this, key -> { - setTextColor(ThemeManager.getTextOnBackgroundPrimary()); - setHintTextColor(ThemeManager.getTextOnBackgroundSecondary()); - }); - - LiveViewManager.registerView(QKPreference.MOBILE_ONLY, this, key -> { - if (mAdapter != null) { - SharedPreferences prefs1 = mContext.getPrefs(); - mAdapter.setShowMobileOnly(prefs1.getBoolean(SettingsFragment.MOBILE_ONLY, false)); - } - }); - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/view/AvatarView.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/view/AvatarView.java deleted file mode 100644 index 7d2acbf8f..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/view/AvatarView.java +++ /dev/null @@ -1,341 +0,0 @@ -package com.moez.QKSMS.ui.view; - -import android.content.AsyncQueryHandler; -import android.content.ContentResolver; -import android.content.Context; -import android.content.Intent; -import android.content.res.TypedArray; -import android.database.Cursor; -import android.graphics.Bitmap; -import android.graphics.Canvas; -import android.graphics.Paint; -import android.graphics.PorterDuff; -import android.graphics.drawable.BitmapDrawable; -import android.graphics.drawable.Drawable; -import android.net.Uri; -import android.os.Bundle; -import android.provider.ContactsContract; -import android.support.v4.content.ContextCompat; -import android.text.TextUtils; -import android.util.AttributeSet; -import android.view.View; -import android.view.accessibility.AccessibilityEvent; -import android.view.accessibility.AccessibilityNodeInfo; -import android.widget.ImageView; - -import com.moez.QKSMS.R; -import com.moez.QKSMS.common.LiveViewManager; -import com.moez.QKSMS.common.TypefaceManager; -import com.moez.QKSMS.enums.QKPreference; -import com.moez.QKSMS.common.utils.ImageUtils; -import com.moez.QKSMS.common.utils.Units; -import com.moez.QKSMS.ui.ThemeManager; - -public class AvatarView extends ImageView implements View.OnClickListener { - private final String TAG = "AvatarView"; - - static final String[] PHONE_LOOKUP_PROJECTION = new String[]{ - ContactsContract.PhoneLookup._ID, - ContactsContract.PhoneLookup.LOOKUP_KEY, - }; - - public static final String ME = "Me"; - - static final int PHONE_ID_COLUMN_INDEX = 0; - static final int PHONE_LOOKUP_STRING_COLUMN_INDEX = 1; - static final private int TOKEN_PHONE_LOOKUP = 1; - static final private int TOKEN_PHONE_LOOKUP_AND_TRIGGER = 3; - static final private String EXTRA_URI_CONTENT = "uri_content"; - protected String[] mExcludeMimes = null; - private Uri mContactUri; - private String mContactPhone; - private QueryHandler mQueryHandler; - private Bundle mExtras = null; - private String mInitial = "#"; - private Paint mPaint; - private Drawable mDefaultDrawable; - private int mYOffset; - - /** - * When setImageDrawable is called with a drawable, we circle crop to size of this view and use - * that instead. Keep the original in case our size changes, or in case the size wasn't ready. - */ - private Drawable mOriginalDrawable; - - public AvatarView(Context context) { - this(context, null); - } - - public AvatarView(Context context, AttributeSet attrs) { - this(context, attrs, 0); - } - - public AvatarView(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - - if (!isInEditMode()) { - mQueryHandler = new QueryHandler(context.getContentResolver()); - mPaint = new Paint(); - mPaint.setTextSize(Units.dpToPx(context, 32)); - mPaint.setTextAlign(Paint.Align.CENTER); - mPaint.setAntiAlias(true); - mPaint.setTypeface(TypefaceManager.obtainTypeface(getContext(), TypefaceManager.Typefaces.ROBOTO_LIGHT)); - - mDefaultDrawable = ContextCompat.getDrawable(context, R.drawable.ic_person); - - final TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.AvatarView, defStyle, 0); - for (int i = 0; i < a.getIndexCount(); i++) { - if (a.getIndex(i) == R.styleable.AvatarView_initialSize) { - mPaint.setTextSize(a.getDimensionPixelSize(a.getIndex(i), (int) mPaint.getTextSize())); - } - } - a.recycle(); - - mYOffset = (int) ((mPaint.descent() + mPaint.ascent()) / 2); - - setOnClickListener(this); - - LiveViewManager.registerView(QKPreference.THEME, this, key -> { - mPaint.setColor(ThemeManager.getTextOnColorPrimary()); - mDefaultDrawable.setColorFilter(ThemeManager.getTextOnColorPrimary(), PorterDuff.Mode.SRC_ATOP); - - if (getBackground() == null) { - setBackgroundResource(R.drawable.circle); - } - getBackground().setColorFilter(ThemeManager.getColor(), PorterDuff.Mode.SRC_ATOP); - }); - } - } - - /** - * True if a contact, an email address or a phone number has been assigned - */ - private boolean isAssigned() { - return mContactPhone != null; - } - - /** - * Assign the contact uri that this QuickContactBadge should be associated - * with. Note that this is only used for displaying the QuickContact window and - * won't bind the contact's photo for you. Call {@link #setImageDrawable(Drawable)} to set the - * photo. - * - * @param contactUri Either a {@link android.provider.ContactsContract.Contacts#CONTENT_URI} or - * {@link android.provider.ContactsContract.Contacts#CONTENT_LOOKUP_URI} style URI. - */ - public void assignContactUri(Uri contactUri) { - mContactUri = contactUri; - mContactPhone = null; - } - - public Uri getContactUri() { - return mContactUri; - } - - /** - * Assign a contact based on a phone number. This should only be used when - * the contact's URI is not available, as an extra query will have to be - * performed to lookup the URI based on the phone number. - * - * @param phoneNumber The phone number of the contact. - * @param lazyLookup If this is true, the lookup query will not be performed - * until this view is clicked. - */ - public void assignContactFromPhone(String phoneNumber, boolean lazyLookup) { - assignContactFromPhone(phoneNumber, lazyLookup, new Bundle()); - } - - /** - * Assign a contact based on a phone number. This should only be used when - * the contact's URI is not available, as an extra query will have to be - * performed to lookup the URI based on the phone number. - * - * @param phoneNumber The phone number of the contact. - * @param lazyLookup If this is true, the lookup query will not be performed - * until this view is clicked. - * @param extras A bundle of extras to populate the contact edit page with if the contact - * is not found and the user chooses to add the phone number to an existing contact or - * create a new contact. Uses the same string constants as those found in - * {@link android.provider.ContactsContract.Intents.Insert} - */ - public void assignContactFromPhone(String phoneNumber, boolean lazyLookup, Bundle extras) { - mContactPhone = phoneNumber; - mExtras = extras; - if (!lazyLookup && mQueryHandler != null) { - mQueryHandler.startQuery(TOKEN_PHONE_LOOKUP, null, - Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, mContactPhone), - PHONE_LOOKUP_PROJECTION, null, null, null); - } else { - mContactUri = null; - } - } - - public void setContactName(String name) { - if (TextUtils.isEmpty(name) || name.equals(ME)) { - mInitial = ""; - super.setImageDrawable(mDefaultDrawable); - } else if (name.length() == 1) { - mInitial = "" + name.toUpperCase(); - if (mOriginalDrawable == null) super.setImageDrawable(null); - } else if (isPhoneNumberFormat(name)) { - mInitial = ""; - if (mOriginalDrawable == null) super.setImageDrawable(mDefaultDrawable); - } else { - mInitial = "" + name.toUpperCase().charAt(0); - if (mOriginalDrawable == null) super.setImageDrawable(null); - } - - invalidate(); - } - - private boolean isPhoneNumberFormat(String name) { - if (TextUtils.isEmpty(name)) { - return false; - } - - char c = name.charAt(0); - return !name.contains("@") && (c == '+' || c == '(' || Character.isDigit(c)); - } - - @Override - public void onClick(View v) { - // If contact has been assigned, mExtras should no longer be null, but do a null check - // anyway just in case assignContactFromPhone or Email was called with a null bundle or - // wasn't assigned previously. - final Bundle extras = (mExtras == null) ? new Bundle() : mExtras; - - if (mQueryHandler != null) { - if (mContactPhone != null) { - extras.putString(EXTRA_URI_CONTENT, mContactPhone); - mQueryHandler.startQuery(TOKEN_PHONE_LOOKUP_AND_TRIGGER, extras, - Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, mContactPhone), - PHONE_LOOKUP_PROJECTION, null, null, null); - } else if (mContactUri != null) { - mQueryHandler.startQuery(TOKEN_PHONE_LOOKUP_AND_TRIGGER, extras, mContactUri, - PHONE_LOOKUP_PROJECTION, null, null, null); - } - } - } - - @Override - public void onInitializeAccessibilityEvent(AccessibilityEvent event) { - super.onInitializeAccessibilityEvent(event); - event.setClassName(AvatarView.class.getName()); - } - - @Override - public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { - super.onInitializeAccessibilityNodeInfo(info); - info.setClassName(AvatarView.class.getName()); - } - - @Override - protected void onSizeChanged(int w, int h, int oldw, int oldh) { - super.onSizeChanged(w, h, oldw, oldh); - - // Set the image, in case we didn't previously have the actual measurements of the view - setImageWhenReady(); - } - - /** - * Circle crops the given drawable and sets it as the background. If the given drawable is null, - * just generate a colored drawable and set that. - * - * @param drawable - */ - @Override - public void setImageDrawable(Drawable drawable) { - mOriginalDrawable = drawable; - setImageWhenReady(); - } - - private void setImageWhenReady() { - if (isInEditMode()) { - super.setImageDrawable(mOriginalDrawable); - return; - } - - if (getWidth() > 0 && getHeight() > 0) { - // If our size is initialized correctly, then set up the drawable here. - if (mOriginalDrawable != null) { - // Circle crop the given bitmap. - Bitmap orig = ((BitmapDrawable) mOriginalDrawable).getBitmap(); - Bitmap bitmap = orig.copy(Bitmap.Config.ARGB_8888, true); - - int w = getWidth(); - - Bitmap roundBitmap = ImageUtils.getCircleBitmap(bitmap, w); - super.setImageDrawable(new BitmapDrawable(getResources(), roundBitmap)); - getBackground().setColorFilter(0x00000000, PorterDuff.Mode.SRC_ATOP); - } else { - super.setImageDrawable(TextUtils.isEmpty(mInitial) ? mDefaultDrawable : null); - getBackground().setColorFilter(ThemeManager.getColor(), PorterDuff.Mode.SRC_ATOP); - } - } - } - - @Override - protected void onDraw(Canvas canvas) { - super.onDraw(canvas); - - if (getDrawable() == null && !isInEditMode()) { - int xPos = (getWidth() / 2); - int yPos = (getHeight() / 2) - mYOffset; - canvas.drawText("" + mInitial, xPos, yPos, mPaint); - } - } - - private class QueryHandler extends AsyncQueryHandler { - - public QueryHandler(ContentResolver cr) { - super(cr); - } - - @Override - protected void onQueryComplete(int token, Object cookie, Cursor cursor) { - Uri lookupUri = null; - Uri createUri = null; - boolean trigger = false; - Bundle extras = (cookie != null) ? (Bundle) cookie : new Bundle(); - try { - switch (token) { - case TOKEN_PHONE_LOOKUP_AND_TRIGGER: - trigger = true; - if (extras.getString(EXTRA_URI_CONTENT) != null) { - createUri = Uri.fromParts("tel", extras.getString(EXTRA_URI_CONTENT), null); - } - - //$FALL-THROUGH$ - case TOKEN_PHONE_LOOKUP: { - if (cursor != null && cursor.moveToFirst()) { - long contactId = cursor.getLong(PHONE_ID_COLUMN_INDEX); - String lookupKey = cursor.getString(PHONE_LOOKUP_STRING_COLUMN_INDEX); - lookupUri = ContactsContract.Contacts.getLookupUri(contactId, lookupKey); - } - break; - } - } - } finally { - if (cursor != null) { - cursor.close(); - } - } - - mContactUri = lookupUri; - - if (trigger && lookupUri != null) { - // Found contact, so trigger QuickContact - ContactsContract.QuickContact.showQuickContact(getContext(), AvatarView.this, lookupUri, - ContactsContract.QuickContact.MODE_LARGE, mExcludeMimes); - } else if (createUri != null) { - // Prompt user to add this person to contacts - final Intent intent = new Intent(ContactsContract.Intents.SHOW_OR_CREATE_CONTACT, createUri); - if (extras != null) { - extras.remove(EXTRA_URI_CONTENT); - intent.putExtras(extras); - } - getContext().startActivity(intent); - } - } - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/view/ComposeView.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/view/ComposeView.java deleted file mode 100644 index 04ff176b8..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/view/ComposeView.java +++ /dev/null @@ -1,1035 +0,0 @@ -package com.moez.QKSMS.ui.view; - -import android.animation.Animator; -import android.animation.AnimatorListenerAdapter; -import android.animation.ObjectAnimator; -import android.animation.ValueAnimator; -import android.app.Activity; -import android.content.ActivityNotFoundException; -import android.content.ContentValues; -import android.content.Context; -import android.content.Intent; -import android.content.SharedPreferences; -import android.content.res.Resources; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.graphics.Matrix; -import android.graphics.PorterDuff; -import android.graphics.drawable.AnimationDrawable; -import android.graphics.drawable.Drawable; -import android.media.ExifInterface; -import android.net.Uri; -import android.os.AsyncTask; -import android.os.Build; -import android.os.Bundle; -import android.os.Environment; -import android.os.Handler; -import android.provider.MediaStore; -import android.support.v4.content.ContextCompat; -import android.text.InputType; -import android.text.TextUtils; -import android.util.AttributeSet; -import android.util.Log; -import android.view.KeyEvent; -import android.view.View; -import android.view.animation.AccelerateDecelerateInterpolator; -import android.view.inputmethod.EditorInfo; -import android.widget.FrameLayout; -import android.widget.ImageButton; -import android.widget.ImageView; -import android.widget.LinearLayout; -import android.widget.Toast; -import com.github.lzyzsd.circleprogress.DonutProgress; -import com.moez.QKSMS.common.LiveViewManager; -import com.moez.QKSMS.enums.QKPreference; -import com.moez.QKSMS.mmssms.Transaction; -import com.moez.QKSMS.mmssms.Utils; -import com.moez.QKSMS.R; -import com.moez.QKSMS.common.AnalyticsManager; -import com.moez.QKSMS.data.Conversation; -import com.moez.QKSMS.data.ConversationLegacy; -import com.moez.QKSMS.interfaces.ActivityLauncher; -import com.moez.QKSMS.interfaces.RecipientProvider; -import com.moez.QKSMS.common.utils.ImageUtils; -import com.moez.QKSMS.common.utils.PhoneNumberUtils; -import com.moez.QKSMS.common.utils.Units; -import com.moez.QKSMS.transaction.NotificationManager; -import com.moez.QKSMS.transaction.SmsHelper; -import com.moez.QKSMS.ui.ThemeManager; -import com.moez.QKSMS.ui.base.QKActivity; -import com.moez.QKSMS.ui.dialog.DefaultSmsHelper; -import com.moez.QKSMS.ui.dialog.QKDialog; -import com.moez.QKSMS.ui.dialog.mms.MMSSetupFragment; -import com.moez.QKSMS.ui.settings.SettingsFragment; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; -import java.text.SimpleDateFormat; -import java.util.Date; - -public class ComposeView extends LinearLayout implements View.OnClickListener { - public final static String TAG = "ComposeView"; - - private final String KEY_DELAYED_INFO_DIALOG_SHOWN = "delayed_info_dialog_shown"; - - private final int ANIMATION_DURATION = 300; - - public interface OnSendListener { - void onSend(String[] addresses, String body); - } - - enum SendButtonState { - SEND, // send a messaage - ATTACH, // open the attachment panel - CLOSE, // close the attachment panel - CANCEL // cancel a message while it's sending - } - - private QKActivity mContext; - private SharedPreferences mPrefs; - private Resources mRes; - - private Conversation mConversation; - private ConversationLegacy mConversationLegacy; - - private ActivityLauncher mActivityLauncher; - private OnSendListener mOnSendListener; - private RecipientProvider mRecipientProvider; - - // Analytics - // This string is sent along to events that happen in ComposeView, so that we know where they're - // happening (i.e. QKReply, QKCompose, etc) - private String mLabel; - - // Views - private QKEditText mReplyText; - private FrameLayout mButton; - private DonutProgress mProgress; - private ImageView mButtonBackground; - private ImageView mComposeIcon; - private ImageButton mAttach; - private ImageButton mCamera; - private ImageButton mDelay; - private View mAttachmentPanel; - private QKTextView mLetterCount; - private FrameLayout mAttachmentLayout; - private AttachmentImageView mAttachment; - private ImageButton mCancel; - - // State - private boolean mDelayedMessagingEnabled; - private boolean mSendingCancelled; - private boolean mIsSendingBlocked; - private String mSendingBlockedMessage; - - private String mCurrentPhotoPath; - private ValueAnimator mProgressAnimator; - private int mDelayDuration = 3000; - - private SendButtonState mButtonState = SendButtonState.ATTACH; - - private static final int REQUEST_CODE_IMAGE = 0x00F1; - private static final int REQUEST_CODE_CAMERA = 0x00F2; - - public ComposeView(Context context, AttributeSet attributeSet) { - this(context, attributeSet, 0); - } - - public ComposeView(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - - mContext = (QKActivity) context; - mPrefs = mContext.getPrefs(); - mRes = mContext.getResources(); - - mDelayedMessagingEnabled = mPrefs.getBoolean(SettingsFragment.DELAYED, false); - try { - mDelayDuration = Integer.parseInt(mPrefs.getString(SettingsFragment.DELAY_DURATION, "3")); - if (mDelayDuration < 1) { - mDelayDuration = 1; - } else if (mDelayDuration > 30) { - mDelayDuration = 30; - } - mDelayDuration *= 1000; - } catch (Exception e) { - mDelayDuration = 3000; - } - } - - @Override - public void onFinishInflate() { - super.onFinishInflate(); - - // Get references to the views - mReplyText = (QKEditText) findViewById(R.id.compose_reply_text); - mButton = (FrameLayout) findViewById(R.id.compose_button); - mProgress = (DonutProgress) findViewById(R.id.progress); - mButtonBackground = (ImageView) findViewById(R.id.compose_button_background); - mComposeIcon = (ImageView) findViewById(R.id.compose_icon); - mAttachmentPanel = findViewById(R.id.attachment_panel); - mAttach = (ImageButton) findViewById(R.id.attach); - mCamera = (ImageButton) findViewById(R.id.camera); - mDelay = (ImageButton) findViewById(R.id.delay); - mLetterCount = (QKTextView) findViewById(R.id.compose_letter_count); - mAttachmentLayout = (FrameLayout) findViewById(R.id.attachment); - mAttachment = (AttachmentImageView) findViewById(R.id.compose_attachment); - mCancel = (ImageButton) findViewById(R.id.cancel); - - mButton.setOnClickListener(this); - mAttach.setOnClickListener(this); - mCamera.setOnClickListener(this); - mCancel.setOnClickListener(this); - mDelay.setOnClickListener(this); - - LiveViewManager.registerView(QKPreference.THEME, this, key -> { - mButtonBackground.setColorFilter(ThemeManager.getColor(), PorterDuff.Mode.SRC_ATOP); - mComposeIcon.setColorFilter(ThemeManager.getTextOnColorPrimary(), PorterDuff.Mode.SRC_ATOP); - mAttachmentPanel.setBackgroundColor(ThemeManager.getColor()); - mAttach.setColorFilter(ThemeManager.getTextOnColorPrimary(), PorterDuff.Mode.SRC_ATOP); - mCamera.setColorFilter(ThemeManager.getTextOnColorPrimary(), PorterDuff.Mode.SRC_ATOP); - updateDelayButton(); - mProgress.setUnfinishedStrokeColor(ThemeManager.getTextOnColorSecondary()); - mProgress.setFinishedStrokeColor(ThemeManager.getTextOnColorPrimary()); - if (ThemeManager.getSentBubbleRes() != 0) mReplyText.setBackgroundResource(ThemeManager.getSentBubbleRes()); - }); - - LiveViewManager.registerView(QKPreference.BACKGROUND, this, key -> { - mReplyText.getBackground().setColorFilter(ThemeManager.getNeutralBubbleColor(), PorterDuff.Mode.SRC_ATOP); - getBackground().setColorFilter(ThemeManager.getBackgroundColor(), PorterDuff.Mode.SRC_ATOP); - }); - - // There is an option for using the return button instead of the emoticon button in the - // keyboard; set that up here. - switch (Integer.parseInt(mPrefs.getString(SettingsFragment.ENTER_BUTTON, "0"))) { - case 0: // emoji - break; - case 1: // new line - mReplyText.setInputType(InputType.TYPE_CLASS_TEXT | - InputType.TYPE_TEXT_FLAG_CAP_SENTENCES | - InputType.TYPE_TEXT_VARIATION_LONG_MESSAGE); - mReplyText.setSingleLine(false); - break; - case 2: // send - mReplyText.setImeOptions(EditorInfo.IME_FLAG_NO_EXTRACT_UI); - mReplyText.setInputType(InputType.TYPE_CLASS_TEXT | - InputType.TYPE_TEXT_FLAG_CAP_SENTENCES); - mReplyText.setSingleLine(false); - mReplyText.setOnKeyListener(new OnKeyListener() { //Workaround because ACTION_SEND does not support multiline mode - @Override - public boolean onKey(View v, int keyCode, KeyEvent event) { - if (keyCode == 66) { - sendSms(); - return true; - } - return false; - }}); - break; - } - - mReplyText.setTextChangedListener(new QKEditText.TextChangedListener() { - @Override - public void onTextChanged(CharSequence s) { - int length = s.length(); - - updateButtonState(length); - - // If the reply is within 10 characters of the SMS limit (160), it will start counting down - // If the reply exceeds the SMS limit, it will count down until an extra message will have to be sent, and shows how many messages will currently be sent - if (length < 150) { - mLetterCount.setText(""); - } else if (150 <= length && length <= 160) { - mLetterCount.setText("" + (160 - length)); - } else if (160 < length) { - mLetterCount.setText((160 - length % 160) + "/" + (length / 160 + 1)); - } - } - }); - - mProgressAnimator = new ValueAnimator(); - mProgressAnimator.setInterpolator(new AccelerateDecelerateInterpolator()); - mProgressAnimator.setDuration(mDelayDuration); - mProgressAnimator.setIntValues(0, 360); - mProgressAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { - @Override - public void onAnimationUpdate(ValueAnimator animation) { - mProgress.setProgress((int) animation.getAnimatedValue()); - } - }); - mProgressAnimator.addListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animation) { - super.onAnimationEnd(animation); - mProgress.setVisibility(INVISIBLE); - mProgress.setProgress(0); - - if (!mSendingCancelled) { - sendSms(); - // In case they only enabled it for a particular message, let's set it back to the pref value - mDelayedMessagingEnabled = mPrefs.getBoolean(SettingsFragment.DELAYED, false); - updateDelayButton(); - } else { - mSendingCancelled = false; - updateButtonState(); - } - } - }); - } - - /** - * Sets the ActivityLauncher. This can be an Activity, a Fragment, or in general something that - * implements startActivityForResult(Intent, int), and onActivityResult(int, int, Intent); this - * instance must be able to launch and get results for activties. - * <p/> - * Additionally, in the onActivityResult(int, int, Intent) method, the ActivityLauncher instance - * should pass along that result value to this ComposeFragment, using its own onActivityResult - * method. - * - * @param launcher - */ - public void setActivityLauncher(ActivityLauncher launcher) { - mActivityLauncher = launcher; - } - - /** - * Sets a listener to be pinged when an SMS message is sent. - * - * @param l - */ - public void setOnSendListener(OnSendListener l) { - mOnSendListener = l; - } - - /** - * Sets a RecipientProvider. The RecipientProvider provides one method, getRecipientAddresses, - * which returns a String[] of recipient addresses. This method will be called when we're trying - * to send an SMS/MMS message, and onOpenConversation has NOT been called with a non-null - * Conversation object, i.e. we cannot use the Conversation object to get recipient addresses. - * - * @param p - */ - public void setRecipientProvider(RecipientProvider p) { - mRecipientProvider = p; - } - - /** - * Handles activity results that were started by this View. Returns true if the result was - * handled by this view, false otherwise. - * - * @param requestCode - * @param resultCode - * @param data - */ - public boolean onActivityResult(int requestCode, int resultCode, final Intent data) { - boolean result = false; - - if (requestCode == REQUEST_CODE_IMAGE && resultCode == Activity.RESULT_OK) { - result = true; - - Toast.makeText(mContext, R.string.compose_loading_attachment, Toast.LENGTH_LONG).show(); - new ImageLoaderTask(mContext, data.getData()).execute(); - } else if (requestCode == REQUEST_CODE_CAMERA && resultCode == Activity.RESULT_OK) { - result = true; - Toast.makeText(mContext, R.string.compose_loading_attachment, Toast.LENGTH_LONG).show(); - new ImageLoaderFromCameraTask().execute((Void[]) null); - } - - return result; - } - - private void updateButtonState() { - updateButtonState(mReplyText == null ? 0 : mReplyText.getText().length()); - } - - /** - * Sets the button image based on the length of the reply text, and whether or not the drawable - * is set. - */ - private void updateButtonState(int length) { - SendButtonState buttonState; - - if (mAttachmentPanel.getVisibility() == View.VISIBLE) { - buttonState = SendButtonState.CLOSE; - } else if (length > 0 || mAttachment.hasAttachment()) { - buttonState = SendButtonState.SEND; - } else { - buttonState = SendButtonState.ATTACH; - } - - updateButtonState(buttonState); - } - - private void updateButtonState(SendButtonState buttonState) { - if (mButtonState != buttonState) { - - // Check if we need to switch animations - AnimationDrawable animation = null; - if (buttonState == SendButtonState.SEND) { - animation = (AnimationDrawable) ContextCompat.getDrawable(mContext, R.drawable.plus_to_arrow); - } else if (mButtonState == SendButtonState.SEND) { - animation = (AnimationDrawable) ContextCompat.getDrawable(mContext, R.drawable.arrow_to_plus); - } - if (animation != null) { - mComposeIcon.setImageDrawable(animation); - animation.start(); - } - - // Handle any necessary rotation - float rotation = mComposeIcon.getRotation(); - float target = buttonState == SendButtonState.ATTACH || buttonState == SendButtonState.SEND ? 0 : 45; - ObjectAnimator.ofFloat(mComposeIcon, "rotation", rotation, target) - .setDuration(ANIMATION_DURATION) - .start(); - - mButtonState = buttonState; - } - } - - /** - * Sets the text of the Reply edit text. - * - * @param text - */ - public void setText(String text) { - mReplyText.setText(text); - mReplyText.setSelection(mReplyText.getText().length()); - } - - public void setSendingUnblocked() { - mSendingBlockedMessage = null; - mIsSendingBlocked = false; - } - - public void setSendingBlocked(String message) { - mSendingBlockedMessage = message; - mIsSendingBlocked = true; - } - - /** - * Requests focus to the Reply edit text. - */ - public void requestReplyTextFocus() { - mReplyText.requestFocus(); - } - - public void sendDelayedSms() { - mProgress.setVisibility(VISIBLE); - updateButtonState(SendButtonState.CANCEL); - mProgressAnimator.start(); - } - - public void sendSms() { - String body = mReplyText.getText().toString(); - - final Drawable attachment; - if (mAttachment.hasAttachment()) { - attachment = mAttachment.getDrawable(); - } else { - attachment = null; - } - - String[] recipients = null; - if (mConversation != null) { - recipients = mConversation.getRecipients().getNumbers(); - for (int i = 0; i < recipients.length; i++) { - recipients[i] = PhoneNumberUtils.stripSeparators(recipients[i]); - } - } else if (mRecipientProvider != null) { - recipients = mRecipientProvider.getRecipientAddresses(); - } - - // If we have some recipients, send the message! - if (recipients != null && recipients.length > 0) { - clearAttachment(); - - mReplyText.setText(""); - - AnalyticsManager.getInstance().sendEvent( - AnalyticsManager.CATEGORY_MESSAGES, - AnalyticsManager.ACTION_SEND_MESSAGE, - mLabel - ); - - Transaction sendTransaction = new Transaction(mContext, SmsHelper.getSendSettings(mContext)); - - com.moez.QKSMS.mmssms.Message message = new com.moez.QKSMS.mmssms.Message(body, recipients); - message.setType(com.moez.QKSMS.mmssms.Message.TYPE_SMSMMS); - if (attachment != null) { - message.setImage(ImageUtils.drawableToBitmap(attachment)); - } - - // Notify the listener about the new text message - if (mOnSendListener != null) { - mOnSendListener.onSend(recipients, message.getSubject()); - } - - long threadId = mConversation != null ? mConversation.getThreadId() : 0; - if (!message.toString().equals("")) { - sendTransaction.sendNewMessage(message, threadId); - } - NotificationManager.update(mContext); - - if (mConversationLegacy != null) { - mConversationLegacy.markRead(); - } - - // Reset the image button state - updateButtonState(); - - // Otherwise, show a toast to the user to prompt them to add recipients. - } else { - Toast.makeText( - mContext, - mRes.getString(R.string.error_no_recipients), - Toast.LENGTH_SHORT - ).show(); - } - } - - @Override - public void onClick(View v) { - switch (v.getId()) { - case R.id.compose_button: - handleComposeButtonClick(); - break; - - case R.id.cancel: - clearAttachment(); - break; - - case R.id.attach: - if (hasSetupMms()) { - mAttachmentPanel.setVisibility(GONE); - updateButtonState(); - chooseAttachmentFromGallery(); - } - break; - - case R.id.camera: - if (hasSetupMms()) { - mAttachmentPanel.setVisibility(GONE); - updateButtonState(); - attachFromCamera(); - } - break; - - case R.id.delay: - if (!mPrefs.getBoolean(KEY_DELAYED_INFO_DIALOG_SHOWN, false) && !mDelayedMessagingEnabled) { - showDelayedMessagingInfo(); - } else { - toggleDelayedMessaging(); - } - break; - } - } - - private void toggleDelayedMessaging() { - mDelayedMessagingEnabled = !mDelayedMessagingEnabled; - updateDelayButton(); - mAttachmentPanel.setVisibility(GONE); - updateButtonState(); - } - - private void showDelayedMessagingInfo() { - new QKDialog() - .setContext(mContext) - .setTitle(R.string.pref_delayed) - .setMessage(R.string.delayed_messaging_info) - .setNegativeButton(R.string.just_once, new OnClickListener() { - @Override - public void onClick(View v) { - toggleDelayedMessaging(); - } - }) - .setPositiveButton(R.string.enable, new OnClickListener() { - @Override - public void onClick(View v) { - mPrefs.edit().putBoolean(SettingsFragment.DELAYED, true).apply(); - toggleDelayedMessaging(); - } - }) - .show(); - mPrefs.edit().putBoolean(KEY_DELAYED_INFO_DIALOG_SHOWN, true).apply(); //This should be changed, the dialog should be shown each time when delayed messaging is disabled. - } - - private void handleComposeButtonClick() { - switch (mButtonState) { - case ATTACH: - mAttachmentPanel.setVisibility(VISIBLE); - updateButtonState(); - break; - - case SEND: - // If the API version is less than KitKat, they can send an SMS; so do this. - if (Build.VERSION.SDK_INT < 19) { - if (mDelayedMessagingEnabled) { - sendDelayedSms(); - } else { - sendSms(); - } - } else { - // Otherwise... check if we're not the default SMS app - boolean isDefaultSmsApp = Utils.isDefaultSmsApp(mContext); - - // Now make sure that a client hasn't blocked sending, i.e. in the welcome - // screen when we have a demo conversation. - if (mIsSendingBlocked) { - // Show the sending blocked message (if it exists) - Toast.makeText( - mContext, - mSendingBlockedMessage, - Toast.LENGTH_SHORT - ).show(); - - } else if (!isDefaultSmsApp) { - // Ask to become the default SMS app - new DefaultSmsHelper(mContext, R.string.not_default_send).showIfNotDefault(this); - - } else if (!TextUtils.isEmpty(mReplyText.getText()) || mAttachment.hasAttachment()) { - if (mDelayedMessagingEnabled) { - sendDelayedSms(); - } else { - sendSms(); - } - } - } - break; - - case CLOSE: - mAttachmentPanel.setVisibility(GONE); - updateButtonState(); - break; - - case CANCEL: - mSendingCancelled = true; - mProgressAnimator.end(); - //updateButtonState(); - break; - } - } - - private boolean hasSetupMms() { - if (TextUtils.isEmpty(mPrefs.getString(SettingsFragment.MMSC_URL, "")) - && TextUtils.isEmpty(mPrefs.getString(SettingsFragment.MMS_PROXY, "")) - && TextUtils.isEmpty(mPrefs.getString(SettingsFragment.MMS_PORT, ""))) { - - // Not so fast! You need to set up MMS first. - MMSSetupFragment f = new MMSSetupFragment(); - Bundle args = new Bundle(); - args.putBoolean(MMSSetupFragment.ARG_ASK_FIRST, true); - f.setArguments(args); - - ((Activity) mContext).getFragmentManager() - .beginTransaction() - .add(f, MMSSetupFragment.TAG) - .commit(); - - return false; - } - - return true; - } - - private void attachFromCamera() { - - AnalyticsManager.getInstance().sendEvent( - AnalyticsManager.CATEGORY_MESSAGES, - AnalyticsManager.ACTION_ATTACH_FROM_CAMERA, - mLabel - ); - - Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); - if (cameraIntent.resolveActivity(mContext.getPackageManager()) != null) { - - File file = null; - try { - file = createImageFile(); - } catch (IOException e) { - e.printStackTrace(); - } - - if (file != null) { - cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file)); - mActivityLauncher.startActivityForResult(cameraIntent, REQUEST_CODE_CAMERA); - } - } else { - // Send a toast saying there was a camera error - if (mContext != null) { - String message = mContext.getResources().getString(R.string.attachment_camera_error); - Toast.makeText(mContext, message, Toast.LENGTH_SHORT).show(); - } - } - } - - private void chooseAttachmentFromGallery() { - - AnalyticsManager.getInstance().sendEvent( - AnalyticsManager.CATEGORY_MESSAGES, - AnalyticsManager.ACTION_ATTACH_IMAGE, - mLabel - ); - - try { - Intent photoPickerIntent = new Intent(Intent.ACTION_PICK); - photoPickerIntent.setType("image/*"); - mActivityLauncher.startActivityForResult(photoPickerIntent, REQUEST_CODE_IMAGE); - } catch (ActivityNotFoundException e) { - // Send a toast saying no picture apps - if (mContext != null) { - String message = mContext.getResources().getString(R.string.attachment_app_not_found); - Toast.makeText(mContext, message, Toast.LENGTH_SHORT).show(); - } - } - } - - private File createImageFile() throws IOException { - // Create an image file name - String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); - String imageFileName = "JPEG_" + timeStamp + "_"; - File storageDir = Environment.getExternalStoragePublicDirectory( - Environment.DIRECTORY_PICTURES); - File image = File.createTempFile( - imageFileName, /* prefix */ - ".jpg", /* suffix */ - storageDir /* directory */ - ); - - // Save a file: path for use with ACTION_VIEW intents - mCurrentPhotoPath = image.getAbsolutePath(); - return image; - } - - /** - * Sets the conversation for this compose view. This will setup the ComposeView with drafts. - * - * @param conversationLegacy - */ - public void onOpenConversation(Conversation conversation, ConversationLegacy conversationLegacy) { - long threadId = mConversation != null ? mConversation.getThreadId() : -1; - if (threadId > 0) sendPendingDelayedMessage(); - long newThreadId = conversation != null ? conversation.getThreadId() : -1; - if (mConversation != null && mConversationLegacy != null && threadId != newThreadId) { - // Save the old draft first before updating the conversation objects. - saveDraft(); - } - - mConversation = conversation; - mConversationLegacy = conversationLegacy; - - // If the conversation was different, set up the draft here. - if (threadId != newThreadId || newThreadId == -1) { - setupDraft(); - } - } - - /** - * If there's a pending delayed message, end the progress animation and go ahead with sending the message - */ - private void sendPendingDelayedMessage() { - if (mButtonState == SendButtonState.CANCEL && mProgressAnimator != null) { - mProgressAnimator.end(); - } - } - - /** - * Saves a draft to the conversation. - */ - public void saveDraft() { - // If the conversation_reply view is null, then we won't worry about saving drafts at all. We also don't save - // drafts if a message is about to be sent (delayed) - if (mReplyText != null && mButtonState != SendButtonState.CANCEL) { - String draft = mReplyText.getText().toString(); - - if (mConversation != null) { - if (mConversationLegacy.hasDraft() && TextUtils.isEmpty(draft)) { - mConversationLegacy.clearDrafts(); - - } else if (!TextUtils.isEmpty(draft) && - (!mConversationLegacy.hasDraft() || !draft.equals(mConversationLegacy.getDraft()))) { - mConversationLegacy.saveDraft(draft); - } - } else { - // Only show the draft if we saved text, not if we just cleared some - if (!TextUtils.isEmpty(draft)) { - if (mRecipientProvider != null) { - String[] addresses = mRecipientProvider.getRecipientAddresses(); - - if (addresses != null && addresses.length > 0) { - // save the message for each of the addresses - for (int i = 0; i < addresses.length; i++) { - ContentValues values = new ContentValues(); - values.put("address", addresses[i]); - values.put("date", System.currentTimeMillis()); - values.put("read", 1); - values.put("type", 4); - - // attempt to create correct thread id - long threadId = Utils.getOrCreateThreadId(mContext, addresses[i]); - - Log.v(TAG, "saving message with thread id: " + threadId); - - values.put("thread_id", threadId); - Uri messageUri = mContext.getContentResolver().insert(Uri.parse("content://sms/draft"), values); - - Log.v(TAG, "inserted to uri: " + messageUri); - - ConversationLegacy mConversationLegacy = new ConversationLegacy(mContext, threadId); - mConversationLegacy.saveDraft(draft); - } - } - } - } - } - } - - } - - /** - * Displays the draft message to the user. - */ - private void setupDraft() { - if (mConversationLegacy != null) { - if (mConversationLegacy.hasDraft()) { - String text = mConversationLegacy.getDraft(); - - mReplyText.setText(text); - mReplyText.setSelection(text != null ? text.length() : 0); - clearAttachment(); - } else { - // Since this view can be reused, it's important to set the text to empty when there - // isn't a new draft. Or else the previous conversation's draft can be carried on to - // this new conversation. - mReplyText.setText(""); - clearAttachment(); - } - } - } - - /** - * Loads message data from an intent. Currently supports text/plain and image/* ACTION_SEND - * intents. - * - * @param intent The intent with the data to load. - */ - public void loadMessageFromIntent(final Intent intent) { - String type = intent == null ? null : intent.getType(); - - if (intent != null) { - - if (type != null) { - - if ("text/plain".equals(type)) { - mReplyText.setText(intent.getStringExtra(Intent.EXTRA_TEXT)); - - } else if (type.startsWith("image/")) { - - Uri uri = intent.getData(); - - // If the Uri is null, try looking elsewhere for it. [1] [2] - // [1]: http://stackoverflow.com/questions/10386885/intent-filter-intent-getdata-returns-null - // [2]: http://developer.android.com/reference/android/content/Intent.html#ACTION_SEND - if (uri == null) { - Bundle extras = intent.getExtras(); - if (extras != null) { - uri = (Uri) extras.get(Intent.EXTRA_STREAM); - } - } - - new ImageLoaderTask(mContext, uri).execute(); - - // If the Uri is still null here, throw the exception. - if (uri == null) { - // TODO show the user some kind of feedback - } - } - } else { - if (intent.getExtras() != null) { - String body = intent.getExtras().getString("sms_body"); - if (body != null) { - mReplyText.setText(body); - } - } - } - } - } - - /** - * Clears the image from the attachment view. - */ - public void clearAttachment() { - mAttachment.setImageBitmap(null); - mAttachmentLayout.setVisibility(View.GONE); - updateButtonState(); - } - - /** - * Sets the image of the attachment view. - * - * @param imageBitmap the bitmap - */ - public void setAttachment(Bitmap imageBitmap) { - if (imageBitmap == null) { - clearAttachment(); - } else { - AnalyticsManager.getInstance().sendEvent( - AnalyticsManager.CATEGORY_MESSAGES, - AnalyticsManager.ACTION_ATTACH_IMAGE, - mLabel - ); - - mAttachment.setImageBitmap(imageBitmap); - mAttachmentLayout.setVisibility(View.VISIBLE); - updateButtonState(); - } - } - - public void setLabel(String label) { - mLabel = label; - } - - public static Bitmap rotateImage(Bitmap source, float angle) { - Matrix matrix = new Matrix(); - matrix.postRotate(angle); - return Bitmap.createBitmap(source, 0, 0, source.getWidth(), source.getHeight(), matrix, - true); - } - - private class ImageLoaderFromCameraTask extends AsyncTask<Void, Void, Bitmap> { - - @Override - protected Bitmap doInBackground(Void... params) {// Get the dimensions of the View - int targetW = mAttachment.getMaxWidth(); - int targetH = mAttachment.getMaxHeight(); - - // Get the dimensions of the bitmap - BitmapFactory.Options bmOptions = new BitmapFactory.Options(); - bmOptions.inJustDecodeBounds = true; - int photoW = bmOptions.outWidth; - int photoH = bmOptions.outHeight; - - // Determine how much to scale down the image - int scaleFactor = Math.min(photoW / targetW, photoH / targetH); - - // Decode the image file into a Bitmap sized to fill the View - bmOptions.inJustDecodeBounds = false; - bmOptions.inSampleSize = scaleFactor; - bmOptions.inPurgeable = true; - - Bitmap bitmap = BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions); - - long maxAttachmentSize = - SmsHelper.getSendSettings(mContext).getMaxAttachmentSize(); - bitmap = ImageUtils.shrink(bitmap, 90, maxAttachmentSize); - - // Now, rotation the bitmap according to the Exif data. - ExifInterface ei = null; - try { - ei = new ExifInterface(mCurrentPhotoPath); - } catch (IOException e) { - e.printStackTrace(); - } - int orientation = ei.getAttributeInt(ExifInterface.TAG_ORIENTATION, - ExifInterface.ORIENTATION_UNDEFINED); - - switch(orientation) { - case ExifInterface.ORIENTATION_ROTATE_90: - return rotateImage(bitmap, 90); - case ExifInterface.ORIENTATION_ROTATE_180: - return rotateImage(bitmap, 180); - case ExifInterface.ORIENTATION_ROTATE_270: - return rotateImage(bitmap, 270); - case ExifInterface.ORIENTATION_NORMAL: - default: - return rotateImage(bitmap, 0); // No rotation - } - } - - @Override - protected void onPostExecute(Bitmap bitmap) { - super.onPostExecute(bitmap); - setAttachment(bitmap); - mCurrentPhotoPath = null; - } - } - - private class ImageLoaderTask extends AsyncTask<Uri, Void, Void> { - final Context mContext; - final Uri mUri; - final Handler mHandler; - - public ImageLoaderTask(final Context context, final Uri uri) { - mContext = context; - mUri = uri; - mHandler = new Handler(); - } - - public void execute() { - execute(mUri); - } - - @Override - protected Void doInBackground(Uri... params) { - - if (params.length < 1) { - Log.e(TAG, "ImageLoaderTask called with no Uri"); - return null; - } - - try { - Uri uri = params[0]; - - // Decode the image from the Uri into a bitmap [1], and shrink it - // according to the user's settings. - // [1]: http://stackoverflow.com/questions/13930009/how-can-i-get-an-image-from-another-application - InputStream inputStream = mContext.getContentResolver().openInputStream(uri); - Bitmap bitmap = BitmapFactory.decodeStream(inputStream); - - long maxAttachmentSize = - SmsHelper.getSendSettings(mContext).getMaxAttachmentSize(); - bitmap = ImageUtils.shrink(bitmap, 90, maxAttachmentSize); - - // Now, rotation the bitmap according to the Exif data. - final int rotation = ImageUtils.getOrientation(mContext, uri); - Matrix matrix = new Matrix(); - matrix.postRotate(rotation); - bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), - bitmap.getHeight(), matrix, true); - - // Can't post UI updates on a background thread. - final Bitmap imageBitmap = bitmap; - mHandler.post(new Runnable() { - @Override - public void run() { - setAttachment(imageBitmap); - } - }); - - } catch (FileNotFoundException | NullPointerException e) { - // Make a toast to the user that the file they've requested to view - // isn't available. - mHandler.post(new Runnable() { - @Override - public void run() { - Toast.makeText( - mContext, - mRes.getString(R.string.error_file_not_found), - Toast.LENGTH_SHORT - ).show(); - } - }); - } - return null; - } - } - - private void updateDelayButton() { - mDelay.setColorFilter(mDelayedMessagingEnabled ? - ThemeManager.getTextOnColorPrimary() : ThemeManager.getTextOnColorSecondary(), - PorterDuff.Mode.SRC_ATOP); - } - - public boolean isReplyTextEmpty() { - return TextUtils.isEmpty(mReplyText.getText()); - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/view/MessageListRecyclerView.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/view/MessageListRecyclerView.java deleted file mode 100644 index 0d5c529a7..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/view/MessageListRecyclerView.java +++ /dev/null @@ -1,80 +0,0 @@ -package com.moez.QKSMS.ui.view; - -import android.content.Context; -import android.support.v7.widget.RecyclerView; -import android.util.AttributeSet; -import android.view.ContextMenu; -import android.view.View; -import com.moez.QKSMS.common.utils.Units; - -/** - * Based off of: - * https://gist.github.com/JohNan/df776dc4926a1676cc05 - * https://gist.github.com/Teovald/cba0aa150e60b727636d - */ -public class MessageListRecyclerView extends RecyclerView { - private final String TAG = "MessageListRecyclerView"; - - private View mComposeView; - private int mComposeViewHeight; - - public MessageListRecyclerView(Context context) { - super(context); - } - - public MessageListRecyclerView(Context context, AttributeSet attrs) { - super(context, attrs); - } - - public void setComposeView(View view) { - mComposeView = view; - mComposeView.addOnLayoutChangeListener(new OnLayoutChangeListener() { - @Override - public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { - if (bottom - top != mComposeViewHeight) { - mComposeViewHeight = bottom - top; - int padding = Units.dpToPx(getContext(), 8); - setPadding(padding, padding, padding, padding + mComposeViewHeight); - - LayoutManager manager = getLayoutManager(); - if (manager instanceof WrappingLinearLayoutManager) { - ((WrappingLinearLayoutManager) manager).setFooterSize(mComposeViewHeight); - } - } - } - }); - - setOnScrollListener(new RecyclerScrollListener()); - } - - public void resetComposeViewPosition() { - if (mComposeView != null) { - mComposeView.setTranslationY(0); - } - } - - private class RecyclerScrollListener extends OnScrollListener { - - @Override - public void onScrolled(RecyclerView recyclerView, int dx, int dy) { - - float translation = mComposeView.getTranslationY(); - translation -= dy; - if (translation > mComposeViewHeight) { - translation = mComposeViewHeight; - } else if (translation < 0) { - translation = 0; - } - - mComposeView.setTranslationY(translation); - } - } - - private ContextMenu.ContextMenuInfo mContextMenuInfo = null; - - @Override - protected ContextMenu.ContextMenuInfo getContextMenuInfo() { - return mContextMenuInfo; - } - -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/view/QKEditText.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/view/QKEditText.java deleted file mode 100644 index 3bc8c1c59..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/view/QKEditText.java +++ /dev/null @@ -1,106 +0,0 @@ -package com.moez.QKSMS.ui.view; - -import android.content.Context; -import android.os.Build; -import android.text.Editable; -import android.text.SpannableStringBuilder; -import android.text.TextUtils; -import android.text.TextWatcher; -import android.util.AttributeSet; -import android.util.TypedValue; -import com.moez.QKSMS.common.FontManager; -import com.moez.QKSMS.common.LiveViewManager; -import com.moez.QKSMS.enums.QKPreference; -import com.moez.QKSMS.ui.ThemeManager; - -public class QKEditText extends android.widget.EditText { - public static final String TAG = "QKEditText"; - - public interface TextChangedListener { - void onTextChanged(CharSequence s); - } - - private Context mContext; - private boolean mTextChangedListenerEnabled = true; - - public QKEditText(Context context) { - super(context); - - if (!isInEditMode()) { - init(context); - } - } - - public QKEditText(Context context, AttributeSet attrs) { - super(context, attrs); - - if (!isInEditMode()) { - init(context); - } - } - - public QKEditText(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - - if (!isInEditMode()) { - init(context); - } - } - - private void init(Context context) { - mContext = context; - - LiveViewManager.registerView(QKPreference.FONT_FAMILY, this, key -> { - setTypeface(FontManager.getFont(mContext)); - }); - - LiveViewManager.registerView(QKPreference.FONT_WEIGHT, this, key -> { - setTypeface(FontManager.getFont(mContext)); - }); - - LiveViewManager.registerView(QKPreference.FONT_SIZE, this, key -> { - setTextSize(TypedValue.COMPLEX_UNIT_SP, FontManager.getTextSize(mContext, FontManager.TEXT_TYPE_PRIMARY)); - }); - - LiveViewManager.registerView(QKPreference.BACKGROUND, this, key -> { - setTextColor(ThemeManager.getTextOnBackgroundPrimary()); - setHintTextColor(ThemeManager.getTextOnBackgroundSecondary()); - }); - - setText(getText()); - } - - @Override - public void setText(CharSequence text, BufferType type) { - if (!TextUtils.isEmpty(text) || Build.VERSION.SDK_INT < 19) { - text = new SpannableStringBuilder(text); - } - super.setText(text, type); - } - - public void setTextChangedListenerEnabled(boolean textChangedListenerEnabled) { - mTextChangedListenerEnabled = textChangedListenerEnabled; - } - - public void setTextChangedListener(final TextChangedListener listener) { - if (listener != null) { - addTextChangedListener(new TextWatcher() { - @Override - public void beforeTextChanged(CharSequence s, int start, int count, int after) { - - } - - @Override - public void onTextChanged(CharSequence s, int start, int before, int count) { - } - - @Override - public void afterTextChanged(Editable s) { - if (mTextChangedListenerEnabled) { - listener.onTextChanged(s); - } - } - }); - } - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/view/QKImageView.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/view/QKImageView.java deleted file mode 100644 index 18854e9a1..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/view/QKImageView.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.moez.QKSMS.ui.view; - -import android.content.Context; -import android.graphics.PorterDuff; -import android.graphics.drawable.Drawable; -import android.util.AttributeSet; -import android.widget.ImageView; -import com.moez.QKSMS.common.LiveViewManager; -import com.moez.QKSMS.enums.QKPreference; -import com.moez.QKSMS.ui.ThemeManager; - -public class QKImageView extends ImageView { - - private static final String TAG = "QKImageView"; - private Drawable mDrawable; - - public QKImageView(Context context) { - super(context); - init(); - } - - public QKImageView(Context context, AttributeSet attrs) { - super(context, attrs); - init(); - } - - public QKImageView(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - init(); - } - - public void init() { - LiveViewManager.registerView(QKPreference.THEME, this, key -> { - setImageDrawable(mDrawable); - }); - } - - @Override - public void setImageDrawable(Drawable drawable) { - // Have to set this as null to refresh - super.setImageDrawable(null); - mDrawable = drawable; - - if (mDrawable != null) { - mDrawable.setColorFilter(ThemeManager.getColor(), PorterDuff.Mode.SRC_ATOP); - super.setImageDrawable(drawable); - } - } - - @Override - public void onAttachedToWindow() { - super.onAttachedToWindow(); - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/view/QKLinearLayout.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/view/QKLinearLayout.java deleted file mode 100644 index 233cee5dd..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/view/QKLinearLayout.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.moez.QKSMS.ui.view; - -import android.annotation.TargetApi; -import android.content.Context; -import android.content.res.TypedArray; -import android.graphics.PorterDuff; -import android.graphics.drawable.Drawable; -import android.os.Build; -import android.util.AttributeSet; -import android.widget.LinearLayout; - -import com.moez.QKSMS.R; - -public class QKLinearLayout extends LinearLayout { - private final String TAG = "QKLinearLayout"; - - private int mBackgroundTint = 0xFFFFFFFF; - - public QKLinearLayout(Context context) { - super(context); - init(context, null); - } - - public QKLinearLayout(Context context, AttributeSet attrs) { - super(context, attrs); - init(context, attrs); - } - - private void init(Context context, AttributeSet attrs) { - if (attrs != null) { - TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.QKLinearLayout); - - for (int i = 0; i < a.length(); i++) { - int attr = a.getIndex(i); - - switch (attr) { - case R.styleable.QKLinearLayout_backgroundTint: - mBackgroundTint = a.getInt(i, 0xFFFFFFFF); - break; - } - } - - if (Build.VERSION.SDK_INT < 16) { - setBackgroundDrawable(getBackground()); - } else { - setBackground(getBackground()); - } - - a.recycle(); - } - } - - public void setBackgroundTint(int backgroundTint) { - if (mBackgroundTint != backgroundTint) { - mBackgroundTint = backgroundTint; - - if (Build.VERSION.SDK_INT < 16) { - setBackgroundDrawable(getBackground()); - } else { - setBackground(getBackground()); - } - } - } - - @TargetApi(16) - @Override - public void setBackground(Drawable background) { - background.mutate().setColorFilter(mBackgroundTint, PorterDuff.Mode.MULTIPLY); - super.setBackground(background); - } - - @Override - public void setBackgroundDrawable(Drawable background) { - background.mutate().setColorFilter(mBackgroundTint, PorterDuff.Mode.MULTIPLY); - super.setBackgroundDrawable(background); - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/view/QKPreference.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/view/QKPreference.java deleted file mode 100644 index c8cda9671..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/view/QKPreference.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.moez.QKSMS.ui.view; - -import android.content.Context; -import android.preference.Preference; -import android.view.View; -import android.view.ViewGroup; -import android.widget.LinearLayout; -import com.moez.QKSMS.R; - -/** - * Regular android preferences don't have basic functionality when you manually add them to views - * other than preferencegroups, this just cleans up some boilerplate code to set ours up - */ -public class QKPreference extends Preference { - - private OnPreferenceClickListener mOnPreferenceClickListener; - - public QKPreference(Context context, OnPreferenceClickListener onPreferenceClickListener, String key, int title, int summary) { - super(context); - mOnPreferenceClickListener = onPreferenceClickListener; - - setKey(key); - setEnabled(true); - setLayoutResource(R.layout.list_item_preference); - if (title != 0) setTitle(title); - if (summary != 0) setSummary(summary); - } - - public View getView() { - return getView(null, null); - } - - @Override - public View getView(View convertView, ViewGroup parent) { - View view = super.getView(convertView, parent); - view.setLayoutParams(new LinearLayout.LayoutParams( - ViewGroup.LayoutParams.MATCH_PARENT, - ViewGroup.LayoutParams.WRAP_CONTENT)); - - view.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - if (mOnPreferenceClickListener != null) { - mOnPreferenceClickListener.onPreferenceClick(QKPreference.this); - } - } - }); - - return view; - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/view/QKRingtonePreference.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/view/QKRingtonePreference.java deleted file mode 100644 index 348fda676..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/view/QKRingtonePreference.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.moez.QKSMS.ui.view; - -import android.content.Context; -import android.media.RingtoneManager; -import android.preference.RingtonePreference; -import android.view.View; -import android.view.ViewGroup; -import android.widget.LinearLayout; -import com.moez.QKSMS.R; - -/** - * Regular android preferences don't have basic functionality when you manually add them to views - * other than preferencegroups, this just cleans up some boilerplate code to set ours up - */ -public class QKRingtonePreference extends RingtonePreference { - - private OnPreferenceClickListener mOnPreferenceClickListener; - - public QKRingtonePreference(Context context, OnPreferenceClickListener onPreferenceClickListener, String key, - int title, int summary) { - super(context); - mOnPreferenceClickListener = onPreferenceClickListener; - - setKey(key); - setEnabled(true); - setLayoutResource(R.layout.list_item_preference); - setRingtoneType(RingtoneManager.TYPE_NOTIFICATION); - if (title != 0) setTitle(title); - if (summary != 0) setSummary(summary); - } - - public View getView() { - return getView(null, null); - } - - @Override - public View getView(View convertView, ViewGroup parent) { - View view = super.getView(convertView, parent); - view.setLayoutParams(new LinearLayout.LayoutParams( - ViewGroup.LayoutParams.MATCH_PARENT, - ViewGroup.LayoutParams.WRAP_CONTENT)); - - view.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - if (mOnPreferenceClickListener != null) { - mOnPreferenceClickListener.onPreferenceClick(QKRingtonePreference.this); - } - } - }); - - return view; - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/view/QKSwitch.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/view/QKSwitch.java deleted file mode 100644 index fb17cfdb7..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/view/QKSwitch.java +++ /dev/null @@ -1,87 +0,0 @@ -package com.moez.QKSMS.ui.view; - -import android.content.Context; -import android.content.res.ColorStateList; -import android.content.res.Resources; -import android.graphics.Color; -import android.support.v4.graphics.drawable.DrawableCompat; -import android.support.v7.widget.SwitchCompat; -import android.util.AttributeSet; -import com.moez.QKSMS.R; -import com.moez.QKSMS.common.LiveViewManager; -import com.moez.QKSMS.enums.QKPreference; -import com.moez.QKSMS.ui.ThemeManager; - -public class QKSwitch extends SwitchCompat { - - private Resources mRes; - - public QKSwitch(Context context) { - super(context); - init(context); - } - - public QKSwitch(Context context, AttributeSet attrs) { - super(context, attrs); - init(context); - } - - private void init(Context context) { - mRes = context.getResources(); - - LiveViewManager.registerView(QKPreference.THEME, this, key -> { - DrawableCompat.setTintList(getThumbDrawable(), getSwitchThumbColorStateList()); - DrawableCompat.setTintList(getTrackDrawable(), getSwitchTrackColorStateList()); - }); - - LiveViewManager.registerView(QKPreference.BACKGROUND, this, key -> { - DrawableCompat.setTintList(getThumbDrawable(), getSwitchThumbColorStateList()); - DrawableCompat.setTintList(getTrackDrawable(), getSwitchTrackColorStateList()); - }); - } - - private ColorStateList getSwitchThumbColorStateList() { - final int[][] states = new int[3][]; - final int[] colors = new int[3]; - - // Disabled state - states[0] = new int[]{-android.R.attr.state_enabled}; - colors[0] = mRes.getColor(ThemeManager.isNightMode() ? - R.color.switch_thumb_disabled_dark : R.color.switch_thumb_disabled_light); - - // Checked state - states[1] = new int[]{android.R.attr.state_checked}; - colors[1] = ThemeManager.getColor(); - - // Unchecked enabled state state - states[2] = new int[0]; - colors[2] = mRes.getColor(ThemeManager.isNightMode() ? - R.color.switch_thumb_enabled_dark : R.color.switch_thumb_enabled_light); - - return new ColorStateList(states, colors); - } - - private ColorStateList getSwitchTrackColorStateList() { - final int[][] states = new int[3][]; - final int[] colors = new int[3]; - - // Disabled state - states[0] = new int[]{-android.R.attr.state_enabled}; - colors[0] = mRes.getColor(ThemeManager.isNightMode() ? - R.color.switch_track_disabled_dark : R.color.switch_track_disabled_light); - - // Checked state - states[1] = new int[]{android.R.attr.state_checked}; - colors[1] = Color.argb(0x4D, // 30% alpha - Color.red(ThemeManager.getColor()), - Color.green(ThemeManager.getColor()), - Color.blue(ThemeManager.getColor())); - - // Unchecked enabled state state - states[2] = new int[0]; - colors[2] = mRes.getColor(ThemeManager.isNightMode() ? - R.color.switch_track_enabled_dark : R.color.switch_track_enabled_light); - - return new ColorStateList(states, colors); - } -} \ No newline at end of file diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/view/QKSwitchPreference.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/view/QKSwitchPreference.java deleted file mode 100644 index d519ba944..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/view/QKSwitchPreference.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.moez.QKSMS.ui.view; - -import android.content.Context; -import android.content.SharedPreferences; -import android.preference.SwitchPreference; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.LinearLayout; -import com.moez.QKSMS.R; - -/** - * Regular android preferences don't have basic functionality when you manually add them to views - * other than preferencegroups, this just cleans up some boilerplate code to set ours up - */ -public class QKSwitchPreference extends SwitchPreference { - - private SharedPreferences mPrefs; - private OnPreferenceClickListener mOnPreferenceClickListener; - private boolean mDefaultValue; - private QKSwitch mCheckBox; - - public QKSwitchPreference(Context context, OnPreferenceClickListener onPreferenceClickListener, - String key, SharedPreferences prefs, boolean defaultValue, int title, int summary) { - super(context); - mPrefs = prefs; - mOnPreferenceClickListener = onPreferenceClickListener; - - setKey(key); - setEnabled(true); - mDefaultValue = prefs.getBoolean(key, defaultValue); - if (title != 0) setTitle(title); - if (summary != 0) setSummary(summary); - } - - public View getView() { - return getView(null, null); - } - - @Override - public View getView(View convertView, ViewGroup parent) { - if (convertView == null) { - convertView = LayoutInflater.from(getContext()).inflate(R.layout.list_item_preference, parent, false); - convertView.setLayoutParams(new LinearLayout.LayoutParams( - ViewGroup.LayoutParams.MATCH_PARENT, - ViewGroup.LayoutParams.WRAP_CONTENT)); - - - LinearLayout frameLayout = (LinearLayout) convertView.findViewById(android.R.id.widget_frame); - LayoutInflater.from(getContext()).inflate(R.layout.view_switch, frameLayout); - } - super.onBindView(convertView); - - mCheckBox = (QKSwitch) convertView.findViewById(android.R.id.checkbox); - mCheckBox.setChecked(mDefaultValue); - - convertView.setOnClickListener(v -> { - mPrefs.edit().putBoolean(getKey(), !mCheckBox.isChecked()).apply(); - mCheckBox.setChecked(!mCheckBox.isChecked()); - if (mOnPreferenceClickListener != null) { - mOnPreferenceClickListener.onPreferenceClick(QKSwitchPreference.this); - } - }); - - return convertView; - } - - @Override - public boolean isChecked() { - return mCheckBox == null ? super.isChecked() : mCheckBox.isChecked(); - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/view/QKTextView.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/view/QKTextView.java deleted file mode 100644 index 674541497..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/view/QKTextView.java +++ /dev/null @@ -1,145 +0,0 @@ -package com.moez.QKSMS.ui.view; - -import android.content.Context; -import android.content.SharedPreferences; -import android.content.res.TypedArray; -import android.os.Build; -import android.preference.PreferenceManager; -import android.text.Layout; -import android.text.SpannableStringBuilder; -import android.util.AttributeSet; -import android.util.TypedValue; -import android.widget.TextView; -import com.moez.QKSMS.R; -import com.moez.QKSMS.common.FontManager; -import com.moez.QKSMS.common.LiveViewManager; -import com.moez.QKSMS.common.utils.TextUtils; -import com.moez.QKSMS.enums.QKPreference; -import com.moez.QKSMS.ui.ThemeManager; -import com.moez.QKSMS.ui.settings.SettingsFragment; - -public class QKTextView extends TextView { - private final String TAG = "QKTextView"; - - private Context mContext; - private int mType = FontManager.TEXT_TYPE_PRIMARY; - private boolean mOnColorBackground = false; - - public QKTextView(Context context) { - super(context); - - if (!isInEditMode()) { - init(context, null); - } - } - - public QKTextView(Context context, AttributeSet attrs) { - super(context, attrs); - - if (!isInEditMode()) { - init(context, attrs); - } - } - - public QKTextView(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - - if (!isInEditMode()) { - init(context, attrs); - } - } - - private void init(Context context, AttributeSet attrs) { - mContext = context; - - - if (attrs != null) { - final TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.QKTextView); - mType = array.getInt(R.styleable.QKTextView_type, FontManager.TEXT_TYPE_PRIMARY); - array.recycle(); - } - - setTextColor(FontManager.getTextColor(mContext, mType)); - setText(getText()); - - setType(mType); - } - - public void setType(int type) { - mType = type; - - // Register for theme updates if we're text that changes color dynamically. - if (mType == FontManager.TEXT_TYPE_CATEGORY) { - LiveViewManager.registerView(QKPreference.THEME, this, key -> - setTextColor(FontManager.getTextColor(mContext, mType))); - } - - LiveViewManager.registerView(QKPreference.FONT_FAMILY, this, key -> { - setTypeface(FontManager.getFont(mContext, type)); - }); - - LiveViewManager.registerView(QKPreference.FONT_WEIGHT, this, key -> { - setTypeface(FontManager.getFont(mContext, type)); - }); - - LiveViewManager.registerView(QKPreference.FONT_SIZE, this, key -> { - setTextSize(TypedValue.COMPLEX_UNIT_SP, FontManager.getTextSize(mContext, mType)); - }); - - LiveViewManager.registerView(QKPreference.BACKGROUND, this, key -> { - setTextColor(FontManager.getTextColor(mContext, mType)); - }); - - LiveViewManager.registerView(QKPreference.TEXT_FORMATTING, this, key -> { - setText(getText(), BufferType.NORMAL); - }); - } - - public void setOnColorBackground(boolean onColorBackground) { - if (onColorBackground != mOnColorBackground) { - mOnColorBackground = onColorBackground; - - if (onColorBackground) { - if (mType == FontManager.TEXT_TYPE_PRIMARY) { - setTextColor(ThemeManager.getTextOnColorPrimary()); - setLinkTextColor(ThemeManager.getTextOnColorPrimary()); - } else if (mType == FontManager.TEXT_TYPE_SECONDARY || - mType == FontManager.TEXT_TYPE_TERTIARY) { - setTextColor(ThemeManager.getTextOnColorSecondary()); - } - } else { - if (mType == FontManager.TEXT_TYPE_PRIMARY) { - setTextColor(ThemeManager.getTextOnBackgroundPrimary()); - setLinkTextColor(ThemeManager.getColor()); - } else if (mType == FontManager.TEXT_TYPE_SECONDARY || - mType == FontManager.TEXT_TYPE_TERTIARY) { - setTextColor(ThemeManager.getTextOnBackgroundSecondary()); - } - } - } - } - - @Override - public void setText(CharSequence text, BufferType type) { - - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext()); - - if (mType == FontManager.TEXT_TYPE_DIALOG_BUTTON) { - text = text.toString().toUpperCase(); - } - - if (prefs.getBoolean(SettingsFragment.MARKDOWN_ENABLED, false)) { - text = TextUtils.styleText(text); - if (text == null || text.length() <= 0 || Build.VERSION.SDK_INT >= 19) { - super.setText(text, BufferType.EDITABLE); - return; - } - - SpannableStringBuilder builder = new SpannableStringBuilder(text); - super.setText(builder, BufferType.EDITABLE); - } else { - super.setText(text, BufferType.NORMAL); - } - - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/view/RobotoTextView.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/view/RobotoTextView.java deleted file mode 100644 index 5230d5e23..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/view/RobotoTextView.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.moez.QKSMS.ui.view; - -import android.content.Context; -import android.content.res.TypedArray; -import android.graphics.Paint; -import android.graphics.Typeface; -import android.support.v7.widget.AppCompatTextView; -import android.util.AttributeSet; -import android.widget.TextView; -import com.moez.QKSMS.R; -import com.moez.QKSMS.common.TypefaceManager; - -public class RobotoTextView extends AppCompatTextView { - - public RobotoTextView(Context context) { - this(context, null); - } - - public RobotoTextView(Context context, AttributeSet attrs) { - super(context, attrs); - - if (!isInEditMode()) { - initTypeface(this, context, attrs); - } - } - - public RobotoTextView(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - - if (!isInEditMode()) { - initTypeface(this, context, attrs); - } - } - - private void initTypeface(TextView textView, Context context, AttributeSet attrs) { - Typeface typeface = null; - - if (attrs != null) { - TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.RobotoTextView); - - if (a.hasValue(R.styleable.RobotoTextView_typeface)) { - int typefaceValue = a.getInt(R.styleable.RobotoTextView_typeface, TypefaceManager.Typefaces.ROBOTO_REGULAR); - typeface = TypefaceManager.obtainTypeface(context, typefaceValue); - } - - a.recycle(); - } - - if (typeface == null) { - typeface = TypefaceManager.obtainTypeface(context, TypefaceManager.Typefaces.ROBOTO_REGULAR); - } - - textView.setPaintFlags(textView.getPaintFlags() | Paint.SUBPIXEL_TEXT_FLAG | Paint.ANTI_ALIAS_FLAG); - textView.setTypeface(typeface); - } - -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/view/RunnableToast.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/view/RunnableToast.java deleted file mode 100644 index c956dd423..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/view/RunnableToast.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.moez.QKSMS.ui.view; - -import android.content.Context; -import android.support.annotation.StringRes; -import android.widget.Toast; - -public class RunnableToast implements Runnable { - - private Context mContext; - private String mText; - private int mDuration; - - public RunnableToast(Context context, String text, int duration) { - mContext = context; - mText = text; - mDuration = duration; - } - - public RunnableToast(Context context, @StringRes int id, int duration) { - mContext = context; - mText = context.getString(id); - mDuration = duration; - } - - @Override - public void run() { - Toast.makeText(mContext, mText, mDuration).show(); - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/view/SmoothLinearLayoutManager.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/view/SmoothLinearLayoutManager.java deleted file mode 100644 index 76f145e9a..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/view/SmoothLinearLayoutManager.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.moez.QKSMS.ui.view; - -import android.content.Context; -import android.graphics.PointF; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.LinearSmoothScroller; -import android.support.v7.widget.RecyclerView; -import android.util.AttributeSet; -import android.util.DisplayMetrics; - -public class SmoothLinearLayoutManager extends LinearLayoutManager { - private static final float MILLISECONDS_PER_INCH = 50f; - - private Context mContext; - - public SmoothLinearLayoutManager(Context context) { - super(context); - mContext = context; - } - - public SmoothLinearLayoutManager(Context context, int orientation, boolean reverseLayout) { - super(context, orientation, reverseLayout); - mContext = context; - } - - public SmoothLinearLayoutManager(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { - super(context, attrs, defStyleAttr, defStyleRes); - mContext = context; - } - - @Override - public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state, final int position) { - super.smoothScrollToPosition(recyclerView, state, position); - - LinearSmoothScroller smoothScroller = new LinearSmoothScroller(mContext) { - - //This controls the direction in which smoothScroll looks for your view - @Override - public PointF computeScrollVectorForPosition(int targetPosition) { - return new PointF(0, 1); - } - - //This returns the milliseconds it takes to scroll one pixel. - @Override - protected float calculateSpeedPerPixel(DisplayMetrics displayMetrics) { - return MILLISECONDS_PER_INCH / displayMetrics.densityDpi; - } - }; - - smoothScroller.setTargetPosition(position); - startSmoothScroll(smoothScroller); - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/view/StarredContactsView.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/view/StarredContactsView.java deleted file mode 100644 index a2025d89c..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/view/StarredContactsView.java +++ /dev/null @@ -1,181 +0,0 @@ -package com.moez.QKSMS.ui.view; - -import android.app.LoaderManager; -import android.content.Context; -import android.content.CursorLoader; -import android.content.Loader; -import android.content.SharedPreferences; -import android.database.Cursor; -import android.graphics.PorterDuff; -import android.net.Uri; -import android.os.Bundle; -import android.util.AttributeSet; -import android.view.LayoutInflater; -import android.view.View; -import android.widget.ImageView; -import android.widget.LinearLayout; -import com.moez.QKSMS.R; -import com.moez.QKSMS.common.LiveViewManager; -import com.moez.QKSMS.enums.QKPreference; -import com.moez.QKSMS.data.Contact; -import com.moez.QKSMS.data.ContactHelper; -import com.moez.QKSMS.ui.ThemeManager; -import com.moez.QKSMS.ui.base.QKActivity; -import com.moez.QKSMS.ui.settings.SettingsFragment; - -public class StarredContactsView extends LinearLayout implements LoaderManager.LoaderCallbacks<Cursor>, View.OnClickListener { - private final String TAG = "StarredContactsView"; - - private QKActivity mContext; - private SharedPreferences mPrefs; - private Cursor mCursor; - private LinearLayout mFavoritesBackground; - private QKTextView mTitle; - private LinearLayout mFavorites; - private AutoCompleteContactView mRecipients; - private ComposeView mComposeView; - private View mToggle; - private ImageView mIndicator; - - - public StarredContactsView(Context context) { - super(context); - if (!isInEditMode()) { - init(context); - } - } - - public StarredContactsView(Context context, AttributeSet attrs) { - super(context, attrs); - if (!isInEditMode()) { - init(context); - } - } - - private void init(Context context) { - mContext = (QKActivity) context; - mPrefs = mContext.getPrefs(); - } - - @Override - protected void onFinishInflate() { - super.onFinishInflate(); - - mFavoritesBackground = (LinearLayout) findViewById(R.id.starred_contacts); - mFavoritesBackground.setBackgroundColor(ThemeManager.getBackgroundColor()); - - mTitle = (QKTextView) findViewById(R.id.title); - - mFavorites = (LinearLayout) findViewById(R.id.favorites); - - mToggle = findViewById(R.id.toggle); - mToggle.setOnClickListener(this); - - mIndicator = (ImageView) findViewById(R.id.indicator); - - if (mPrefs.getBoolean(SettingsFragment.COMPOSE_FAVORITES, true)) { - expand(); - } else { - collapse(); - } - - LiveViewManager.registerView(QKPreference.BACKGROUND, this, key -> { - mIndicator.setColorFilter(ThemeManager.getTextOnBackgroundSecondary(), PorterDuff.Mode.SRC_ATOP); - mFavoritesBackground.setBackgroundColor(ThemeManager.getBackgroundColor()); - }); - } - - public void setComposeScreenViews(AutoCompleteContactView recipients, ComposeView composeView) { - mRecipients = recipients; - mComposeView = composeView; - mContext.getLoaderManager().initLoader(0, null, this); - } - - @Override - public Loader<Cursor> onCreateLoader(int id, Bundle args) { - return new CursorLoader(mContext, ContactHelper.CONTACTS_URI, ContactHelper.Favorites.PROJECTION, - ContactHelper.Favorites.SELECTION, null, null); - } - - @Override - public void onLoadFinished(Loader<Cursor> loader, Cursor data) { - mCursor = data; - mFavorites.removeAllViews(); - - LayoutInflater inflater = LayoutInflater.from(mContext); - - if (data.moveToFirst()) { - do { - // only add them to the favorites list if they have a phone number - if (mCursor.getInt(ContactHelper.Favorites.HAS_PHONE_NUMBER) > 0) { - - final String photoUri = mCursor.getString(ContactHelper.Favorites.PHOTO_THUMBNAIL_URI); - final Contact contact = Contact.get(ContactHelper.getPhoneNumber( - mContext, mCursor.getString(ContactHelper.Favorites.ID)), true); - - final View.OnClickListener onClickListener = new View.OnClickListener() { - @Override - public void onClick(View v) { - collapse(); - mRecipients.submitItem(contact.getName(), contact.getNumber(), - photoUri == null ? null : Uri.parse(photoUri)); - mComposeView.requestReplyTextFocus(); - } - }; - - View view = inflater.inflate(R.layout.view_favorite_contact, null); - view.setOnClickListener(onClickListener); - - AvatarView avatar = (AvatarView) view.findViewById(R.id.avatar); - avatar.setOnClickListener(onClickListener); - avatar.setImageDrawable(contact.getAvatar(mContext, null)); - avatar.setContactName(contact.getName()); - - QKTextView name = (QKTextView) view.findViewById(R.id.name); - name.setOnClickListener(onClickListener); - name.setText(contact.getName()); - - mFavorites.addView(view); - } - } while (data.moveToNext()); - } - - if (mFavorites.getChildCount() > 0) { - mFavoritesBackground.setVisibility(View.VISIBLE); - } - } - - @Override - public void onLoaderReset(Loader<Cursor> loader) { - mCursor = null; - } - - public void toggle() { - if (mFavorites.getVisibility() == View.VISIBLE) { - collapse(); - } else { - expand(); - } - } - - public void expand() { - mTitle.setTextColor(ThemeManager.getTextOnBackgroundPrimary()); - mFavorites.setVisibility(View.VISIBLE); - mIndicator.setRotation(0f); - } - - public void collapse() { - mTitle.setTextColor(ThemeManager.getTextOnBackgroundSecondary()); - mFavorites.setVisibility(View.GONE); - mIndicator.setRotation(90f); - } - - @Override - public void onClick(View v) { - switch (v.getId()) { - case R.id.toggle: - toggle(); - break; - } - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/view/WrapLayout.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/view/WrapLayout.java deleted file mode 100644 index 95e61163c..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/view/WrapLayout.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.moez.QKSMS.ui.view; - -import android.content.Context; -import android.util.AttributeSet; -import android.view.View; -import android.widget.LinearLayout; - -import com.moez.QKSMS.R; - -public class WrapLayout extends LinearLayout { - public static final String TAG = "WrapLayout"; - - private View mSpace; - - public WrapLayout(Context context) { - super(context); - } - - public WrapLayout(Context context, AttributeSet attrs) { - this(context, attrs, 0); - } - - public WrapLayout(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - } - - @Override - public void onFinishInflate() { - mSpace = findViewById(R.id.space); - } - - /** - * Ask all children to measure themselves and compute the measurement of this - * layout based on the children. - */ - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - setOrientation(LinearLayout.HORIZONTAL); - mSpace.setVisibility(View.GONE); - super.onMeasure(widthMeasureSpec, heightMeasureSpec); - - final int contentWidth = getMeasuredWidth() - getPaddingLeft() - getPaddingRight(); - final int count = getChildCount(); - - // Iterate through all children, measuring them and computing our dimensions - // from their size. - int totalChildWidth = 0; - for (int i = 0; i < count; i++) { - final View child = getChildAt(i); - if (child.getVisibility() != GONE) { - // Measure the child. - measureChildWithMargins(child, widthMeasureSpec, 0, heightMeasureSpec, 0); - totalChildWidth += child.getMeasuredWidth(); - } - } - - if (totalChildWidth > contentWidth) { - setOrientation(LinearLayout.VERTICAL); - } else { - mSpace.setVisibility(View.VISIBLE); - } - super.onMeasure(widthMeasureSpec, heightMeasureSpec); - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/view/WrappingLinearLayoutManager.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/view/WrappingLinearLayoutManager.java deleted file mode 100644 index 1b5439b89..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/view/WrappingLinearLayoutManager.java +++ /dev/null @@ -1,191 +0,0 @@ -package com.moez.QKSMS.ui.view; - -import android.content.Context; -import android.support.v7.widget.RecyclerView; -import android.util.Log; -import android.view.View; -import com.moez.QKSMS.BuildConfig; - -/** - * {@link android.support.v7.widget.LinearLayoutManager} which wraps its content. Note that this class will always - * wrap the content regardless of {@link android.support.v7.widget.RecyclerView} layout parameters. - * <p/> - * Now it's impossible to run add/remove animations with child views which have arbitrary dimensions (height for - * VERTICAL orientation and width for HORIZONTAL). However if child views have fixed dimensions - * {@link #setChildSize(int)} method might be used to let the layout manager know how big they are going to be. - * If animations are not used at all then a normal measuring procedure will run and child views will be measured during - * the measure pass. - */ -public class WrappingLinearLayoutManager extends android.support.v7.widget.LinearLayoutManager { - - private static final int CHILD_WIDTH = 0; - private static final int CHILD_HEIGHT = 1; - private static final int DEFAULT_CHILD_SIZE = 100; - - private final int[] childDimensions = new int[2]; - private final RecyclerView view; - - private int mFooterSize; - private int childSize = DEFAULT_CHILD_SIZE; - - @SuppressWarnings("UnusedDeclaration") - public WrappingLinearLayoutManager(Context context) { - super(context); - this.view = null; - } - - @SuppressWarnings("UnusedDeclaration") - public WrappingLinearLayoutManager(Context context, int orientation, boolean reverseLayout) { - super(context, orientation, reverseLayout); - this.view = null; - } - - @SuppressWarnings("UnusedDeclaration") - public WrappingLinearLayoutManager(RecyclerView view) { - super(view.getContext()); - this.view = view; - } - - @SuppressWarnings("UnusedDeclaration") - public WrappingLinearLayoutManager(RecyclerView view, int orientation, boolean reverseLayout) { - super(view.getContext(), orientation, reverseLayout); - this.view = view; - } - - public static int makeUnspecifiedSpec() { - return View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); - } - - @Override - public void onMeasure(RecyclerView.Recycler recycler, RecyclerView.State state, int widthSpec, int heightSpec) { - final int widthMode = View.MeasureSpec.getMode(widthSpec); - final int heightMode = View.MeasureSpec.getMode(heightSpec); - - final int widthSize = View.MeasureSpec.getSize(widthSpec); - final int heightSize = View.MeasureSpec.getSize(heightSpec); - - final boolean exactWidth = widthMode == View.MeasureSpec.EXACTLY; - final boolean exactHeight = heightMode == View.MeasureSpec.EXACTLY; - - final int unspecified = makeUnspecifiedSpec(); - - if (exactWidth && exactHeight) { - // in case of exact calculations for both dimensions let's use default "onMeasure" implementation - super.onMeasure(recycler, state, widthSpec, heightSpec); - return; - } - - final boolean vertical = getOrientation() == VERTICAL; - - initChildDimensions(widthSize, heightSize, vertical); - - int height = 0; - - // it's possible to get scrap views in recycler which are bound to old (invalid) adapter entities. This - // happens because their invalidation happens after "onMeasure" method. As a workaround let's clear the - // recycler now (it should not cause any performance issues while scrolling as "onMeasure" is never - // called whiles scrolling) - recycler.clear(); - - final int stateItemCount = state.getItemCount(); - final int adapterItemCount = getItemCount(); - // adapter always contains actual data while state might contain old data (f.e. data before the animation is - // done). As we want to measure the view with actual data we must use data from the adapter and not from the - // state - for (int i = 0; i < adapterItemCount; i++) { - if (i < stateItemCount) { - // we should not exceed state count, otherwise we'll get IndexOutOfBoundsException. For such items - // we will use previously calculated dimensions - measureChild(recycler, i, widthSpec, unspecified, childDimensions); - } else { - logMeasureWarning(i); - } - height += childDimensions[CHILD_HEIGHT]; - if (height >= heightSize) { - break; - } - } - - final boolean fit = (vertical && height < heightSize); - if (fit) { - // we really should wrap the contents of the view, let's do it - - if (exactHeight) { - height = heightSize; - } else { - height += getPaddingTop() + getPaddingBottom(); - } - - setMeasuredDimension(widthSize, height + mFooterSize); - } else { - // if calculated height/width exceeds requested height/width let's use default "onMeasure" implementation - super.onMeasure(recycler, state, widthSpec, heightSpec); - } - } - - private void logMeasureWarning(int child) { - if (BuildConfig.DEBUG) { - Log.w("WrappingLinearLayoutManager", "Can't measure child #" + child + ", previously used dimensions will be reused." + - "To remove this message either use #setChildSize() method or don't run RecyclerView animations"); - } - } - - private void initChildDimensions(int width, int height, boolean vertical) { - if (childDimensions[CHILD_WIDTH] != 0 || childDimensions[CHILD_HEIGHT] != 0) { - // already initialized, skipping - return; - } - if (vertical) { - childDimensions[CHILD_WIDTH] = width; - childDimensions[CHILD_HEIGHT] = childSize; - } else { - childDimensions[CHILD_WIDTH] = childSize; - childDimensions[CHILD_HEIGHT] = height; - } - } - - @Override - public void setOrientation(int orientation) { - // might be called before the constructor of this class is called - //noinspection ConstantConditions - if (childDimensions != null) { - if (getOrientation() != orientation) { - childDimensions[CHILD_WIDTH] = 0; - childDimensions[CHILD_HEIGHT] = 0; - } - } - super.setOrientation(orientation); - } - - public void setFooterSize(int footerSize) { - if (mFooterSize != footerSize) { - mFooterSize = footerSize; - requestLayout(); - } - } - - private void measureChild(RecyclerView.Recycler recycler, int position, int widthSpec, int heightSpec, int[] dimensions) { - final View child = recycler.getViewForPosition(position); - - final RecyclerView.LayoutParams p = (RecyclerView.LayoutParams) child.getLayoutParams(); - - final int hPadding = getPaddingLeft() + getPaddingRight(); - final int vPadding = getPaddingTop() + getPaddingBottom(); - - final int hMargin = p.leftMargin + p.rightMargin; - final int vMargin = p.topMargin + p.bottomMargin; - - final int hDecoration = getRightDecorationWidth(child) + getLeftDecorationWidth(child); - final int vDecoration = getTopDecorationHeight(child) + getBottomDecorationHeight(child); - - final int childWidthSpec = getChildMeasureSpec(widthSpec, hPadding + hMargin + hDecoration, p.width, canScrollHorizontally()); - final int childHeightSpec = getChildMeasureSpec(heightSpec, vPadding + vMargin + vDecoration, p.height, canScrollVertically()); - - child.measure(childWidthSpec, childHeightSpec); - - dimensions[CHILD_WIDTH] = getDecoratedMeasuredWidth(child) + p.leftMargin + p.rightMargin; - dimensions[CHILD_HEIGHT] = getDecoratedMeasuredHeight(child) + p.bottomMargin + p.topMargin; - - recycler.recycleView(child); - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/view/colorpicker/ColorPickerDialog.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/view/colorpicker/ColorPickerDialog.java deleted file mode 100644 index 1dd777786..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/view/colorpicker/ColorPickerDialog.java +++ /dev/null @@ -1,119 +0,0 @@ -package com.moez.QKSMS.ui.view.colorpicker; - -import android.app.AlertDialog; -import android.app.Dialog; -import android.app.DialogFragment; -import android.os.Bundle; -import android.view.LayoutInflater; -import android.view.View; -import android.widget.ProgressBar; -import com.moez.QKSMS.R; - -public class ColorPickerDialog extends DialogFragment implements ColorPickerSwatch.OnColorSelectedListener { - protected AlertDialog mAlertDialog; - protected int[] mColors = null; - protected int mColumns; - protected ColorPickerSwatch.OnColorSelectedListener mListener; - private ColorPickerPalette mPalette; - private ProgressBar mProgress; - protected int mSelectedColor; - protected int mSize; - protected int mTitleResId = R.string.color_picker_default_title; - - private void refreshPalette() { - if (mPalette != null && mColors != null) { - mPalette.drawPalette(mColors, mSelectedColor); - } - } - - public void initialize(int titleId, int[] colors, int selectedColor, int columns, int size) { - setArguments(titleId, columns, size); - setColors(colors, selectedColor); - } - - public void onColorSelected(int selectedColor) { - if (mListener != null) { - mListener.onColorSelected(selectedColor); - } - - if ((getTargetFragment() instanceof ColorPickerSwatch.OnColorSelectedListener)) { - ((ColorPickerSwatch.OnColorSelectedListener) getTargetFragment()).onColorSelected(selectedColor); - } - - if (selectedColor != mSelectedColor) { - mSelectedColor = selectedColor; - mPalette.drawPalette(mColors, mSelectedColor); - } - - dismiss(); - } - - public void onCreate(Bundle bundle) { - super.onCreate(bundle); - if (getArguments() != null) { - mTitleResId = getArguments().getInt("title_id"); - mColumns = getArguments().getInt("columns"); - mSize = getArguments().getInt("size"); - } - - if (bundle != null) { - mColors = bundle.getIntArray("colors"); - mSelectedColor = ((Integer) bundle.getSerializable("selected_color")).intValue(); - } - } - - public Dialog onCreateDialog(Bundle bundle) { - View view = LayoutInflater.from(getActivity()).inflate(R.layout.dialog_color_picker_led, null); - mProgress = ((ProgressBar) view.findViewById(android.R.id.progress)); - mPalette = ((ColorPickerPalette) view.findViewById(R.id.color_picker)); - mPalette.init(mSize, mColumns, this); - - if (mColors != null) { - showPaletteView(); - } - - mAlertDialog = new AlertDialog.Builder(getActivity()).setTitle(mTitleResId).setView(view).create(); - return mAlertDialog; - } - - public void onSaveInstanceState(Bundle bundle) { - super.onSaveInstanceState(bundle); - bundle.putIntArray("colors", mColors); - bundle.putSerializable("selected_color", Integer.valueOf(mSelectedColor)); - } - - public void setArguments(int titleId, int columns, int size) { - Bundle bundle = new Bundle(); - bundle.putInt("title_id", titleId); - bundle.putInt("columns", columns); - bundle.putInt("size", size); - setArguments(bundle); - } - - public void setColors(int[] colors, int selected) { - if (mColors != colors || mSelectedColor != selected) { - mColors = colors; - mSelectedColor = selected; - refreshPalette(); - } - } - - public void setOnColorSelectedListener(ColorPickerSwatch.OnColorSelectedListener onColorSelectedListener) { - mListener = onColorSelectedListener; - } - - public void showPaletteView() { - if (mProgress != null && mPalette != null) { - mProgress.setVisibility(View.GONE); - refreshPalette(); - mPalette.setVisibility(View.VISIBLE); - } - } - - public void showProgressBarView() { - if (mProgress != null && mPalette != null) { - mProgress.setVisibility(View.VISIBLE); - mPalette.setVisibility(View.GONE); - } - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/view/colorpicker/ColorPickerPalette.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/view/colorpicker/ColorPickerPalette.java deleted file mode 100644 index d7cddb297..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/view/colorpicker/ColorPickerPalette.java +++ /dev/null @@ -1,131 +0,0 @@ -package com.moez.QKSMS.ui.view.colorpicker; - -import android.content.Context; -import android.content.res.Resources; -import android.util.AttributeSet; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ImageView; -import android.widget.TableLayout; -import android.widget.TableRow; -import com.moez.QKSMS.R; - -public class ColorPickerPalette extends TableLayout { - private String mDescription; - private String mDescriptionSelected; - private int mMarginSize; - private int mNumColumns; - public ColorPickerSwatch.OnColorSelectedListener mOnColorSelectedListener; - private int mSwatchLength; - - public ColorPickerPalette(Context context) { - super(context); - } - - public ColorPickerPalette(Context context, AttributeSet attributeSet) { - super(context, attributeSet); - } - - private void addSwatchToRow(TableRow tableRow, View view, int line) { - if (line % 2 == 0) { - tableRow.addView(view); - return; - } - tableRow.addView(view, 0); - } - - private ImageView createBlankSpace() { - ImageView imageView = new ImageView(getContext()); - TableRow.LayoutParams layoutParams = new TableRow.LayoutParams(mSwatchLength, mSwatchLength); - layoutParams.setMargins(mMarginSize, mMarginSize, mMarginSize, mMarginSize); - imageView.setLayoutParams(layoutParams); - return imageView; - } - - private ColorPickerSwatch createColorSwatch(int color, int selectedColor) { - ColorPickerSwatch colorPickerSwatch = new ColorPickerSwatch(getContext(), color, color == selectedColor, mOnColorSelectedListener); - TableRow.LayoutParams layoutParams = new TableRow.LayoutParams(mSwatchLength, mSwatchLength); - layoutParams.setMargins(mMarginSize, mMarginSize, mMarginSize, mMarginSize); - colorPickerSwatch.setLayoutParams(layoutParams); - return colorPickerSwatch; - } - - private TableRow createTableRow() { - TableRow localTableRow = new TableRow(getContext()); - localTableRow.setLayoutParams(new ViewGroup.LayoutParams(-2, -2)); - return localTableRow; - } - - private void setSwatchDescription(int rowNumber, int index, int rowElements, boolean selected, View swatch) { - int accessibilityIndex; - if (rowNumber % 2 == 0) { - // We're in a regular-ordered row - accessibilityIndex = index; - } else { - // We're in a backwards-ordered row. - int rowMax = ((rowNumber + 1) * mNumColumns); - accessibilityIndex = rowMax - rowElements; - } - - String description; - if (selected) { - description = String.format(mDescriptionSelected, accessibilityIndex); - } else { - description = String.format(mDescription, accessibilityIndex); - } - swatch.setContentDescription(description); - } - - public void drawPalette(int[] colors, int selectedColor) { - if (colors == null) { - return; - } - - removeAllViews(); - int tableElements = 0; - int rowElements = 0; - int rowNumber = 0; - - // Fills the table with swatches based on the array of colors. - TableRow row = createTableRow(); - for (int color : colors) { - tableElements++; - - View colorSwatch = createColorSwatch(color, selectedColor); - setSwatchDescription(rowNumber, tableElements, rowElements, color == selectedColor, colorSwatch); - addSwatchToRow(row, colorSwatch, rowNumber); - - rowElements++; - if (rowElements == mNumColumns) { - addView(row); - row = createTableRow(); - rowElements = 0; - rowNumber++; - } - } - - // Create blank views to fill the row if the last row has not been filled. - if (rowElements > 0) { - while (rowElements != mNumColumns) { - addSwatchToRow(row, createBlankSpace(), rowNumber); - rowElements++; - } - addView(row); - } - } - - public void init(int size, int numColumns, ColorPickerSwatch.OnColorSelectedListener onColorSelectedListener) { - mNumColumns = numColumns; - Resources resources = getResources(); - if (size == 1) { - mSwatchLength = resources.getDimensionPixelSize(R.dimen.color_swatch_large); - mMarginSize = resources.getDimensionPixelSize(R.dimen.color_swatch_margins_large); - } else { - mSwatchLength = resources.getDimensionPixelSize(R.dimen.color_swatch_small); - mMarginSize = resources.getDimensionPixelSize(R.dimen.color_swatch_margins_small); - } - mOnColorSelectedListener = onColorSelectedListener; - mDescription = resources.getString(R.string.color_swatch_description); - mDescriptionSelected = resources.getString(R.string.color_swatch_description_selected); - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/view/colorpicker/ColorPickerSwatch.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/view/colorpicker/ColorPickerSwatch.java deleted file mode 100644 index 82cebaf33..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/view/colorpicker/ColorPickerSwatch.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.moez.QKSMS.ui.view.colorpicker; - -import android.content.Context; -import android.graphics.drawable.Drawable; -import android.support.v4.content.ContextCompat; -import android.view.LayoutInflater; -import android.view.View; -import android.widget.FrameLayout; -import android.widget.ImageView; -import com.moez.QKSMS.R; - -public class ColorPickerSwatch extends FrameLayout implements View.OnClickListener { - private ImageView mCheckmarkImage; - private int mColor; - private OnColorSelectedListener mOnColorSelectedListener; - private ImageView mSwatchImage; - - public ColorPickerSwatch(Context paramContext, int color, boolean checked, OnColorSelectedListener onColorSelectedListener) { - super(paramContext); - mColor = color; - mOnColorSelectedListener = onColorSelectedListener; - LayoutInflater.from(paramContext).inflate(R.layout.view_color_picker_swatch, this); - mSwatchImage = ((ImageView) findViewById(R.id.color_picker_swatch)); - mCheckmarkImage = ((ImageView) findViewById(R.id.color_picker_checkmark)); - setColor(color); - setChecked(checked); - setOnClickListener(this); - } - - private void setChecked(boolean checked) { - if (checked) { - mCheckmarkImage.setVisibility(View.VISIBLE); - return; - } - - mCheckmarkImage.setVisibility(View.GONE); - } - - public void onClick(View view) { - if (mOnColorSelectedListener != null) { - mOnColorSelectedListener.onColorSelected(mColor); - } - } - - protected void setColor(int color) { - Drawable[] drawables = new Drawable[1]; - drawables[0] = ContextCompat.getDrawable(getContext(), R.drawable.color_picker_swatch); - mSwatchImage.setImageDrawable(new ColorStateDrawable(drawables, color)); - } - - public interface OnColorSelectedListener { - void onColorSelected(int color); - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/view/colorpicker/ColorStateDrawable.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/view/colorpicker/ColorStateDrawable.java deleted file mode 100644 index a72a909aa..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/view/colorpicker/ColorStateDrawable.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.moez.QKSMS.ui.view.colorpicker; - -import android.graphics.Color; -import android.graphics.PorterDuff; -import android.graphics.drawable.Drawable; -import android.graphics.drawable.LayerDrawable; - -public class ColorStateDrawable extends LayerDrawable { - private int mColor; - - public ColorStateDrawable(Drawable[] drawables, int color) { - super(drawables); - mColor = color; - } - - private int getPressedColor(int color) { - float[] hsv = new float[3]; - Color.colorToHSV(color, hsv); - hsv[2] = (0.7F * hsv[2]); - return Color.HSVToColor(hsv); - } - - public boolean isStateful() { - return true; - } - - protected boolean onStateChange(int[] states) { - boolean pressed = false; - for (int state : states) { - if (state == android.R.attr.state_pressed || state == android.R.attr.state_focused) { - pressed = true; - } - } - - if (pressed) { - super.setColorFilter(getPressedColor(mColor), PorterDuff.Mode.SRC_ATOP); - } else { - super.setColorFilter(mColor, PorterDuff.Mode.SRC_ATOP); - } - - return super.onStateChange(states); - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/welcome/BaseWelcomeFragment.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/welcome/BaseWelcomeFragment.java deleted file mode 100644 index e78cfcb9e..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/welcome/BaseWelcomeFragment.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.moez.QKSMS.ui.welcome; - -import android.os.Bundle; -import android.support.v4.view.ViewPager; -import android.view.View; -import com.moez.QKSMS.ui.base.QKFragment; - -public class BaseWelcomeFragment extends QKFragment { - - public interface WelcomeScrollListener { - void onScrollOffsetChanged(WelcomeActivity activity, float offset); - } - - protected static ViewPager mPager; - protected static WelcomeActivity mContext; - - public static void setPager(ViewPager pager) { - mPager = pager; - } - - public static void setContext(WelcomeActivity context) { - mContext = context; - } - - @Override - public void onViewCreated(View view, Bundle savedInstanceState) { - // Do nothing - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/welcome/PagerScroller.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/welcome/PagerScroller.java deleted file mode 100644 index d1f9fafd6..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/welcome/PagerScroller.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.moez.QKSMS.ui.welcome; - -import android.content.Context; -import android.view.animation.Interpolator; -import android.widget.Scroller; - -public class PagerScroller extends Scroller { - - private int mDuration = 500; - - public PagerScroller(Context context) { - super(context); - } - - public PagerScroller(Context context, Interpolator interpolator) { - super(context, interpolator); - } - - public PagerScroller(Context context, Interpolator interpolator, boolean flywheel) { - super(context, interpolator, flywheel); - } - - - @Override - public void startScroll(int startX, int startY, int dx, int dy, int duration) { - // Ignore received duration, use fixed one instead - super.startScroll(startX, startY, dx, dy, mDuration); - } - - @Override - public void startScroll(int startX, int startY, int dx, int dy) { - // Ignore received duration, use fixed one instead - super.startScroll(startX, startY, dx, dy, mDuration); - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/welcome/WelcomeActivity.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/welcome/WelcomeActivity.java deleted file mode 100644 index 3fbbe30f7..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/welcome/WelcomeActivity.java +++ /dev/null @@ -1,169 +0,0 @@ -package com.moez.QKSMS.ui.welcome; - -import android.app.Fragment; -import android.content.SharedPreferences; -import android.graphics.PorterDuff; -import android.os.Bundle; -import android.preference.PreferenceManager; -import android.support.v4.view.ViewPager; -import android.view.View; -import android.widget.ImageView; -import com.moez.QKSMS.R; -import com.moez.QKSMS.common.LiveViewManager; -import com.moez.QKSMS.enums.QKPreference; -import com.moez.QKSMS.ui.ThemeManager; -import com.moez.QKSMS.ui.base.QKActivity; -import com.moez.QKSMS.ui.settings.SettingsFragment; -import com.moez.QKSMS.ui.view.RobotoTextView; - - -public class WelcomeActivity extends QKActivity implements ViewPager.OnPageChangeListener, View.OnClickListener { - - public static final int WELCOME_REQUEST_CODE = 31415; - - private ViewPager mPager; - private ImageView mPrevious; - private ImageView mNext; - private ImageView[] mIndicators; - private View mBackground; - private RobotoTextView mSkip; - private boolean mFinished; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_welcome); - - getSupportActionBar().hide(); - - mBackground = findViewById(R.id.welcome); - mBackground.setBackgroundColor(ThemeManager.getColor()); - - mPrevious = (ImageView) findViewById(R.id.welcome_previous); - mPrevious.setOnClickListener(this); - - mNext = (ImageView) findViewById(R.id.welcome_next); - mNext.setOnClickListener(this); - - mSkip = (RobotoTextView) findViewById(R.id.welcome_skip); - mSkip.setOnClickListener(this); - - mIndicators = new ImageView[]{ - (ImageView) findViewById(R.id.welcome_indicator_0), - (ImageView) findViewById(R.id.welcome_indicator_1), - (ImageView) findViewById(R.id.welcome_indicator_2)}; - tintIndicators(0xFFFFFFFF); - - mPager = (ViewPager) findViewById(R.id.welcome_pager); - BaseWelcomeFragment.setPager(mPager); - BaseWelcomeFragment.setContext(this); - mPager.setOnPageChangeListener(this); - mPager.setAdapter(new WelcomePagerAdapter(getFragmentManager())); - - LiveViewManager.registerView(QKPreference.THEME, this, key -> { - mBackground.setBackgroundColor(ThemeManager.getColor()); - }); - } - - public void setColorBackground(int color) { - mBackground.setBackgroundColor(color); - } - - public void tintIndicators(int color) { - if (mIndicators != null) { - for (ImageView indicator : mIndicators) { - indicator.setColorFilter(color, PorterDuff.Mode.SRC_ATOP); - } - } - - if (mSkip != null) { - mSkip.setTextColor(color); - } - - if (mPrevious != null) { - mPrevious.setColorFilter(color, PorterDuff.Mode.SRC_ATOP); - } - - if (mNext != null) { - mNext.setColorFilter(color, PorterDuff.Mode.SRC_ATOP); - } - } - - public void setFinished() { - if (mSkip != null) { - mFinished = true; - mSkip.setText(R.string.welcome_finish); - mSkip.setVisibility(View.VISIBLE); - } - } - - @Override - public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - Fragment fragment = ((WelcomePagerAdapter) mPager.getAdapter()).getItem(position); - if (fragment instanceof BaseWelcomeFragment.WelcomeScrollListener) { - ((BaseWelcomeFragment.WelcomeScrollListener) fragment).onScrollOffsetChanged(this, positionOffset); - } - - if (position + 1 < mPager.getAdapter().getCount()) { - Fragment fragment2 = ((WelcomePagerAdapter) mPager.getAdapter()).getItem(position + 1); - if (fragment2 instanceof BaseWelcomeFragment.WelcomeScrollListener) { - ((BaseWelcomeFragment.WelcomeScrollListener) fragment2).onScrollOffsetChanged(this, 1 - positionOffset); - } - } - } - - @Override - public void onPageSelected(int i) { - if (mIndicators != null) { - for (ImageView indicator : mIndicators) { - indicator.setAlpha(0.56f); - } - - mIndicators[i].setAlpha(1.00f); - } - - if (mSkip != null) { - mSkip.setVisibility(i == 0 || mFinished ? View.VISIBLE : View.INVISIBLE); - } - - if (mPrevious != null) { - mPrevious.setEnabled(i > 0); - mPrevious.setAlpha(i > 0 ? 1f : 0.6f); - } - - if (mNext != null) { - mNext.setEnabled(i + 1 < mPager.getAdapter().getCount()); - mNext.setAlpha(i + 1 < mPager.getAdapter().getCount() ? 1f : 0.6f); - } - } - - @Override - public void onPageScrollStateChanged(int i) { - - } - - @Override - public void onClick(View v) { - switch (v.getId()) { - case R.id.welcome_skip: - setResult(RESULT_OK, null); - finish(); - break; - case R.id.welcome_previous: - mPager.setCurrentItem(mPager.getCurrentItem() - 1); - break; - case R.id.welcome_next: - mPager.setCurrentItem(mPager.getCurrentItem() + 1); - break; - } - } - - @Override - protected void onStop() { - super.onStop(); - - SharedPreferences.Editor prefs = PreferenceManager.getDefaultSharedPreferences(this).edit(); - prefs.putBoolean(SettingsFragment.WELCOME_SEEN, true); - prefs.apply(); - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/welcome/WelcomeIntroFragment.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/welcome/WelcomeIntroFragment.java deleted file mode 100644 index cca20e1b4..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/welcome/WelcomeIntroFragment.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.moez.QKSMS.ui.welcome; - -import android.os.Bundle; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; - -import com.moez.QKSMS.R; -import com.moez.QKSMS.ui.view.QKTextView; - -public class WelcomeIntroFragment extends BaseWelcomeFragment implements View.OnClickListener { - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.fragment_welcome_greeting, container, false); - - QKTextView start = (QKTextView) view.findViewById(R.id.welcome_start); - start.setOnClickListener(this); - - return view; - } - - @Override - public void onClick(View v) { - switch (v.getId()) { - case R.id.welcome_start: - mPager.setCurrentItem(1); - break; - } - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/welcome/WelcomeNightFragment.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/welcome/WelcomeNightFragment.java deleted file mode 100644 index 210e0c310..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/welcome/WelcomeNightFragment.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.moez.QKSMS.ui.welcome; - -import android.animation.ArgbEvaluator; -import android.animation.ValueAnimator; -import android.graphics.PorterDuff; -import android.os.Bundle; -import android.preference.PreferenceManager; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.view.animation.DecelerateInterpolator; -import com.moez.QKSMS.R; -import com.moez.QKSMS.ui.ThemeManager; -import com.moez.QKSMS.ui.settings.SettingsFragment; -import com.moez.QKSMS.ui.view.QKTextView; -import com.moez.QKSMS.ui.view.RobotoTextView; - -public class WelcomeNightFragment extends BaseWelcomeFragment implements BaseWelcomeFragment.WelcomeScrollListener, View.OnClickListener { - private final String TAG = "WelcomeNightFragment"; - - private ArgbEvaluator mArgbEvaluator = new ArgbEvaluator(); - private RobotoTextView mNightTitle; - private RobotoTextView mNightDescription; - private QKTextView mNightHint; - private String mNightShyamalan; - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.fragment_welcome_night, container, false); - - mNightTitle = (RobotoTextView) view.findViewById(R.id.welcome_night_title); - mNightDescription = (RobotoTextView) view.findViewById(R.id.welcome_night_description); - mNightHint = (QKTextView) view.findViewById(R.id.welcome_night_hint); - mNightHint.setOnClickListener(this); - - mContext.setFinished(); - - return view; - } - - @Override - public void onScrollOffsetChanged(WelcomeActivity activity, float offset) { - int colorBackground = (Integer) mArgbEvaluator.evaluate(Math.abs(offset), ThemeManager.getBackgroundColor(), ThemeManager.getColor()); - int colorAccent = (Integer) mArgbEvaluator.evaluate(1 - Math.abs(offset), 0xFFFFFFFF, ThemeManager.getColor()); - - activity.setColorBackground(colorBackground); - activity.tintIndicators(colorAccent); - - if (mNightTitle != null) { - mNightTitle.setTextColor(colorAccent); - } - - if (mNightDescription != null) { - mNightDescription.setTextColor(colorAccent); - } - - if (mNightHint != null) { - mNightHint.setTextColor(colorBackground); - mNightHint.getBackground().setColorFilter(colorAccent, PorterDuff.Mode.SRC_ATOP); - } - } - - @Override - public void onClick(View v) { - if (v.getId() == R.id.welcome_night_hint) { - boolean night = ThemeManager.getTheme() == ThemeManager.Theme.LIGHT; - - int backgroundColor = mContext.getResources().getColor(night ? R.color.grey_light_mega_ultra : R.color.grey_material); - int newBackgroundColor = mContext.getResources().getColor(night ? R.color.grey_material : R.color.grey_light_mega_ultra); - ThemeManager.setTheme(night ? ThemeManager.Theme.DARK : ThemeManager.Theme.LIGHT); - - ValueAnimator colorAnimation = ValueAnimator.ofObject(new ArgbEvaluator(), backgroundColor, newBackgroundColor); - colorAnimation.setDuration(ThemeManager.TRANSITION_LENGTH); - colorAnimation.setInterpolator(new DecelerateInterpolator()); - colorAnimation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { - @Override - public void onAnimationUpdate(ValueAnimator animation) { - int color = (Integer) animation.getAnimatedValue(); - mContext.setColorBackground(color); - mNightHint.setTextColor(color); - - } - }); - colorAnimation.start(); - - PreferenceManager.getDefaultSharedPreferences(mContext) - .edit() - .putString(SettingsFragment.BACKGROUND, night ? ThemeManager.Theme.PREF_GREY : ThemeManager.Theme.PREF_OFFWHITE) - .commit(); - } - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/welcome/WelcomePagerAdapter.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/welcome/WelcomePagerAdapter.java deleted file mode 100644 index f389c1051..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/welcome/WelcomePagerAdapter.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.moez.QKSMS.ui.welcome; - -import android.app.Fragment; -import android.app.FragmentManager; -import android.support.v13.app.FragmentPagerAdapter; -import android.util.Log; - -public class WelcomePagerAdapter extends FragmentPagerAdapter { - private final String TAG = "WelcomePagerAdapter"; - - private Fragment[] mFragments = new Fragment[3]; - - public final int PAGE_INTRO = 0; - public final int PAGE_THEME = 1; - public final int PAGE_NIGHT = 2; - - public WelcomePagerAdapter(FragmentManager fm) { - super(fm); - } - - @Override - public Fragment getItem(int i) { - if (mFragments[i] == null) { - switch (i) { - case PAGE_INTRO: - mFragments[i] = new WelcomeIntroFragment(); - break; - case PAGE_THEME: - mFragments[i] = new WelcomeThemeFragment(); - break; - case PAGE_NIGHT: - mFragments[i] = new WelcomeNightFragment(); - break; - default: - Log.e(TAG, "Uh oh, the pager requested a fragment at index " + i + "which doesn't exist"); - } - } - - return mFragments[i]; - } - - @Override - public int getCount() { - return mFragments.length; - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/welcome/WelcomeThemeFragment.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/welcome/WelcomeThemeFragment.java deleted file mode 100644 index 4d34bd9ac..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/welcome/WelcomeThemeFragment.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.moez.QKSMS.ui.welcome; - -import android.graphics.Color; -import android.os.Bundle; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import com.moez.QKSMS.R; -import com.moez.QKSMS.ui.ThemeManager; -import com.moez.QKSMS.ui.view.colorpicker.ColorPickerPalette; -import com.moez.QKSMS.ui.view.colorpicker.ColorPickerSwatch; - -public class WelcomeThemeFragment extends BaseWelcomeFragment implements ColorPickerSwatch.OnColorSelectedListener, BaseWelcomeFragment.WelcomeScrollListener { - private final String TAG = "WelcomeThemeFragment"; - - private ColorPickerPalette mPallette; - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.fragment_welcome_theme, container, false); - - mPallette = (ColorPickerPalette) view.findViewById(R.id.welcome_themes); - mPallette.init(19, 4, this); - mPallette.drawPalette(ThemeManager.PALETTE, ThemeManager.getColor()); - - return view; - } - - @Override - public void onColorSelected(int color) { - ThemeManager.setColor(mContext, color); - mPallette.drawPalette(ThemeManager.PALETTE, color); - } - - @Override - public void onScrollOffsetChanged(WelcomeActivity activity, float offset) { - if (mPallette != null) { - offset = (float) Math.pow(1 - offset, 4); - int alpha = (int) (255 * 0.6 * offset); - mPallette.setBackgroundColor(Color.argb(alpha, 0, 0, 0)); - } - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/widget/WidgetProvider.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/widget/WidgetProvider.java deleted file mode 100644 index 72e5691e3..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/widget/WidgetProvider.java +++ /dev/null @@ -1,175 +0,0 @@ -/* - * Copyright (C) 2012 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.moez.QKSMS.ui.widget; - -import android.annotation.TargetApi; -import android.app.PendingIntent; -import android.appwidget.AppWidgetManager; -import android.appwidget.AppWidgetProvider; -import android.appwidget.AppWidgetProviderInfo; -import android.content.ComponentName; -import android.content.Context; -import android.content.Intent; -import android.net.Uri; -import android.os.Build; -import android.os.Bundle; -import android.util.Log; -import android.widget.RemoteViews; - -import com.moez.QKSMS.R; -import com.moez.QKSMS.ui.MainActivity; -import com.moez.QKSMS.ui.ThemeManager; -import com.moez.QKSMS.ui.popup.QKComposeActivity; - -public class WidgetProvider extends AppWidgetProvider { - public static final String ACTION_NOTIFY_DATASET_CHANGED = "com.moez.QKSMS.intent.action.ACTION_NOTIFY_DATASET_CHANGED"; - - private static final String TAG = "WidgetProvider"; - - /** - * Update all widgets in the list - */ - @Override - public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { - super.onUpdate(context, appWidgetManager, appWidgetIds); - - for (int appWidgetId : appWidgetIds) { - updateWidget(context, appWidgetId, isSmallWidget(appWidgetManager, appWidgetId)); - } - } - - @Override - public void onReceive(Context context, Intent intent) { - Log.v(TAG, "onReceive intent: " + intent); - String action = intent.getAction(); - - // The base class AppWidgetProvider's onReceive handles the normal widget intents. Here - // we're looking for an intent sent by the messaging app when it knows a message has - // been sent or received (or a conversation has been read) and is telling the widget it - // needs to update. - if (ACTION_NOTIFY_DATASET_CHANGED.equals(action)) { - AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); - int[] appWidgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(context, WidgetProvider.class)); - - // We need to update all Mms appwidgets on the home screen. - appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetIds, R.id.conversation_list); - } else { - super.onReceive(context, intent); - } - } - - /** - * Update widget when widget size changes - */ - @Override - public void onAppWidgetOptionsChanged(Context context, AppWidgetManager appWidgetManager, - int appWidgetId, Bundle newOptions) { - Log.v("TAG", "Changed widget dimensions"); - updateWidget(context, appWidgetId, isSmallWidget(appWidgetManager,appWidgetId)); - - super.onAppWidgetOptionsChanged(context, appWidgetManager, appWidgetId, newOptions); - } - - /** - * Returns 1 when widget has less than 4 columns, else 0 - */ - @TargetApi(16) - private static int isSmallWidget(AppWidgetManager appWidgetManager, int appWidgetId) { - - int size; - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { - Bundle options = appWidgetManager.getAppWidgetOptions(appWidgetId); - size = options.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH); - } else { - AppWidgetProviderInfo appWidgetInfo = appWidgetManager.getAppWidgetInfo(appWidgetId); - size = appWidgetInfo.minWidth; - } - int n = 2; - while (70 * n - 30 < size) { - ++n; - } - int columns = n - 1; - - if (columns < 4) return 1; - else return 0; - } - - /** - * Update the widget appWidgetId - */ - private static void updateWidget(Context context, int appWidgetId, int smallWidget) { - Log.v(TAG, "updateWidget appWidgetId: " + appWidgetId); - RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget); - PendingIntent clickIntent; - - // Launch an intent to avoid ANRs - final Intent intent = new Intent(context, WidgetService.class); - intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); - intent.putExtra("small_widget", smallWidget); - intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME))); - remoteViews.setRemoteAdapter(R.id.conversation_list, intent); - - remoteViews.setTextViewText(R.id.widget_label, context.getString(R.string.title_conversation_list)); - remoteViews.setTextColor(R.id.widget_label, ThemeManager.getTextOnColorPrimary()); - - remoteViews.setInt(R.id.conversation_list_background, "setColorFilter", ThemeManager.getBackgroundColor()); - remoteViews.setInt(R.id.header_background, "setColorFilter", ThemeManager.getColor()); - - // Open Mms's app conversation list when click on header - final Intent convIntent = new Intent(context, MainActivity.class); - clickIntent = PendingIntent.getActivity(context, 0, convIntent, PendingIntent.FLAG_UPDATE_CURRENT); - remoteViews.setOnClickPendingIntent(R.id.widget_header, clickIntent); - - // On click intent for Compose - final Intent composeIntent = new Intent(context, QKComposeActivity.class); - clickIntent = PendingIntent.getActivity(context, 0, composeIntent, PendingIntent.FLAG_UPDATE_CURRENT); - remoteViews.setOnClickPendingIntent(R.id.widget_compose, clickIntent); - - // On click intent for Conversation - Intent startActivityIntent = new Intent(context, MainActivity.class); - PendingIntent startActivityPendingIntent = PendingIntent.getActivity(context, 0, startActivityIntent, PendingIntent.FLAG_UPDATE_CURRENT); - remoteViews.setPendingIntentTemplate(R.id.conversation_list, startActivityPendingIntent); - - AppWidgetManager.getInstance(context).updateAppWidget(appWidgetId, remoteViews); - } - - /* - * notifyDatasetChanged call when the conversation list changes so the mms widget will - * update and reflect the changes - */ - public static void notifyDatasetChanged(Context context) { - if (context != null) { - Log.v(TAG, "notifyDatasetChanged"); - final Intent intent = new Intent(ACTION_NOTIFY_DATASET_CHANGED); - context.sendBroadcast(intent); - } - } - - public static void notifyThemeChanged(Context context) { - if (context != null) { - AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); - int[] appWidgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(context, WidgetProvider.class)); - - for (int appWidgetId : appWidgetIds) { - updateWidget(context, appWidgetId, isSmallWidget(appWidgetManager, appWidgetId)); - } - } - - notifyDatasetChanged(context); - } - -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/ui/widget/WidgetService.java b/QKSMS/src/main/java/com/moez/QKSMS/ui/widget/WidgetService.java deleted file mode 100644 index 1bce49bcc..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/ui/widget/WidgetService.java +++ /dev/null @@ -1,306 +0,0 @@ -/* - * Copyright (C) 2012 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.moez.QKSMS.ui.widget; - -import android.app.PendingIntent; -import android.appwidget.AppWidgetManager; -import android.content.Context; -import android.content.Intent; -import android.database.Cursor; -import android.graphics.Bitmap; -import android.graphics.drawable.Drawable; -import android.provider.Telephony.Threads; -import android.text.Spannable; -import android.text.SpannableStringBuilder; -import android.text.style.ForegroundColorSpan; -import android.text.style.TextAppearanceSpan; -import android.util.Log; -import android.view.View; -import android.widget.RemoteViews; -import android.widget.RemoteViewsService; - -import com.moez.QKSMS.R; -import com.moez.QKSMS.common.ConversationPrefsHelper; -import com.moez.QKSMS.common.utils.ImageUtils; -import com.moez.QKSMS.common.utils.MessageUtils; -import com.moez.QKSMS.data.ContactHelper; -import com.moez.QKSMS.data.Conversation; -import com.moez.QKSMS.ui.MainActivity; -import com.moez.QKSMS.ui.ThemeManager; -import com.moez.QKSMS.ui.messagelist.MessageListActivity; - -public class WidgetService extends RemoteViewsService { - private static final String TAG = "WidgetService"; - - /** - * Lock to avoid race condition between widgets. - */ - private static final Object sWidgetLock = new Object(); - - @Override - public RemoteViewsFactory onGetViewFactory(Intent intent) { - Log.v(TAG, "onGetViewFactory intent: " + intent); - return new WidgetFactory(getApplicationContext(), intent); - } - - /** - * Remote Views Factory for Mms Widget. - */ - private static class WidgetFactory implements RemoteViewsService.RemoteViewsFactory { - private static final int MAX_CONVERSATIONS_COUNT = 25; - private final Context mContext; - private final int mAppWidgetId; - private final int mSmallWidget; - private boolean mShouldShowViewMore; - private Cursor mConversationCursor; - private int mUnreadConvCount; - private final AppWidgetManager mAppWidgetManager; - - public WidgetFactory(Context context, Intent intent) { - mContext = context; - mAppWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); - mSmallWidget = intent.getIntExtra("small_widget", 0); - mAppWidgetManager = AppWidgetManager.getInstance(context); - Log.v(TAG, "WidgetFactory intent: " + intent + "widget id: " + mAppWidgetId); - } - - @Override - public void onCreate() { - Log.v(TAG, "onCreate"); - } - - @Override - public void onDestroy() { - Log.v(TAG, "onDestroy"); - synchronized (sWidgetLock) { - if (mConversationCursor != null && !mConversationCursor.isClosed()) { - mConversationCursor.close(); - mConversationCursor = null; - } - } - } - - @Override - public void onDataSetChanged() { - Log.v(TAG, "onDataSetChanged"); - synchronized (sWidgetLock) { - if (mConversationCursor != null) { - mConversationCursor.close(); - mConversationCursor = null; - } - mConversationCursor = queryAllConversations(); - mUnreadConvCount = queryUnreadCount(); - onLoadComplete(); - } - } - - private Cursor queryAllConversations() { - return mContext.getContentResolver().query(Conversation.sAllThreadsUri, Conversation.ALL_THREADS_PROJECTION, - null, null, null); - } - - private int queryUnreadCount() { - Cursor cursor = null; - int unreadCount = 0; - try { - cursor = mContext.getContentResolver().query(Conversation.sAllThreadsUri, Conversation.ALL_THREADS_PROJECTION, - Threads.READ + "=0", null, null); - if (cursor != null) { - unreadCount = cursor.getCount(); - } - } finally { - if (cursor != null) { - cursor.close(); - } - } - return unreadCount; - } - - /** - * Returns the number of items should be shown in the widget list. This method also updates - * the boolean that indicates whether the "show more" item should be shown. - * - * @return the number of items to be displayed in the list. - */ - @Override - public int getCount() { - Log.v(TAG, "getCount"); - synchronized (sWidgetLock) { - if (mConversationCursor == null) { - return 0; - } - final int count = getConversationCount(); - mShouldShowViewMore = count < mConversationCursor.getCount(); - return count + (mShouldShowViewMore ? 1 : 0); - } - } - - /** - * Returns the number of conversations that should be shown in the widget. This method - * doesn't update the boolean that indicates that the "show more" item should be included - * in the list. - * - * @return - */ - private int getConversationCount() { - Log.v(TAG, "getConversationCount"); - - return Math.min(mConversationCursor.getCount(), MAX_CONVERSATIONS_COUNT); - } - - /* - * Add color to a given text - */ - private SpannableStringBuilder addColor(CharSequence text, int color) { - SpannableStringBuilder builder = new SpannableStringBuilder(text); - if (color != 0) { - builder.setSpan(new ForegroundColorSpan(color), 0, text.length(), - Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); - } - return builder; - } - - /** - * @return the {@link RemoteViews} for a specific position in the list. - */ - @Override - public RemoteViews getViewAt(int position) { - Log.v(TAG, "getViewAt position: " + position); - synchronized (sWidgetLock) { - // "View more conversations" view. - if (mConversationCursor == null || (mShouldShowViewMore && position >= getConversationCount())) { - return getViewMoreConversationsView(); - } - - if (!mConversationCursor.moveToPosition(position)) { - // If we ever fail to move to a position, return the "View More conversations" view. - Log.w(TAG, "Failed to move to position: " + position); - return getViewMoreConversationsView(); - } - - Conversation conversation = Conversation.from(mContext, mConversationCursor); - RemoteViews remoteViews = new RemoteViews(mContext.getPackageName(), R.layout.list_item_conversation_widget); - if (mSmallWidget == 0) { - remoteViews.setViewVisibility(R.id.avatar, View.VISIBLE); - bindAvatar(remoteViews, conversation); - } - else remoteViews.setViewVisibility(R.id.avatar, View.GONE); - bindIndicators(remoteViews, conversation); - bindDate(remoteViews, conversation); - bindName(remoteViews, conversation); - bindSnippet(remoteViews, conversation); - - // On click intent. - Intent clickIntent = new Intent(); - clickIntent.putExtra(MessageListActivity.ARG_THREAD_ID, conversation.getThreadId()); - remoteViews.setOnClickFillInIntent(R.id.conversation, clickIntent); - - return remoteViews; - } - } - - private void bindAvatar(RemoteViews remoteViews, Conversation conversation) { - - Drawable avatar = conversation.getRecipients().get(0).getAvatar(mContext, null); - Bitmap avatarBitmap = avatar != null ? ImageUtils.drawableToBitmap(avatar) : null; - if (avatarBitmap == null) { - avatarBitmap = ContactHelper.blankContact(mContext, conversation.getRecipients().formatNames(", ")); - } - avatarBitmap = ImageUtils.getCircleBitmap(avatarBitmap, avatarBitmap.getWidth()); - remoteViews.setImageViewBitmap(R.id.avatar, avatarBitmap); - } - - private void bindIndicators(RemoteViews remoteViews, Conversation conversation) { - remoteViews.setInt(R.id.muted, "setColorFilter", ThemeManager.getColor()); - remoteViews.setInt(R.id.error, "setColorFilter", ThemeManager.getColor()); - remoteViews.setInt(R.id.unread, "setColorFilter", ThemeManager.getColor()); - remoteViews.setViewVisibility(R.id.muted, new ConversationPrefsHelper(mContext, conversation.getThreadId()) - .getNotificationsEnabled() ? View.GONE : View.VISIBLE); - remoteViews.setViewVisibility(R.id.error, conversation.hasError() ? View.VISIBLE : View.GONE); - remoteViews.setViewVisibility(R.id.unread, conversation.hasUnreadMessages() ? View.VISIBLE : View.GONE); - } - - private void bindName(RemoteViews remoteViews, Conversation conversation) { - SpannableStringBuilder from = addColor(conversation.getRecipients().formatNames(", "), ThemeManager.getTextOnBackgroundPrimary()); - - if (conversation.hasDraft()) { - from.append(mContext.getResources().getString(R.string.draft_separator)); - int before = from.length(); - from.append(mContext.getResources().getString(R.string.has_draft)); - from.setSpan(new TextAppearanceSpan(mContext, android.R.style.TextAppearance_Small, - ThemeManager.getTextOnBackgroundPrimary()), before, from.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE); - from.setSpan(new ForegroundColorSpan(ThemeManager.getColor()), before, from.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE); - } - - remoteViews.setTextViewText(R.id.name, from); - } - - private void bindDate(RemoteViews remoteViews, Conversation conversation) { - remoteViews.setTextViewText(R.id.date, addColor(MessageUtils.formatTimeStampString(mContext, conversation.getDate()), - conversation.hasUnreadMessages() ? ThemeManager.getColor() : ThemeManager.getTextOnBackgroundSecondary())); - } - - private void bindSnippet(RemoteViews remoteViews, Conversation conversation) { - remoteViews.setTextViewText(R.id.snippet, addColor(conversation.getSnippet(), conversation.hasUnreadMessages() ? - ThemeManager.getTextOnBackgroundPrimary() : ThemeManager.getTextOnBackgroundSecondary())); - } - - /** - * @return the "View more conversations" view. When the user taps this item, they're - * taken to the messaging app's conversation list. - */ - private RemoteViews getViewMoreConversationsView() { - Log.v(TAG, "getViewMoreConversationsView"); - RemoteViews view = new RemoteViews(mContext.getPackageName(), R.layout.widget_loading); - view.setTextViewText(R.id.loading_text, "View more conversations"); - PendingIntent pendingIntent = PendingIntent.getActivity(mContext, 0, - new Intent(mContext, MainActivity.class), PendingIntent.FLAG_UPDATE_CURRENT); - view.setOnClickPendingIntent(R.id.widget_loading, pendingIntent); - return view; - } - - @Override - public RemoteViews getLoadingView() { - RemoteViews view = new RemoteViews(mContext.getPackageName(), R.layout.widget_loading); - view.setTextViewText(R.id.loading_text, mContext.getText(R.string.loading_conversations)); - return view; - } - - @Override - public int getViewTypeCount() { - return 2; - } - - @Override - public long getItemId(int position) { - return position; - } - - @Override - public boolean hasStableIds() { - return true; - } - - private void onLoadComplete() { - Log.v(TAG, "onLoadComplete"); - RemoteViews remoteViews = new RemoteViews(mContext.getPackageName(), R.layout.widget); - - mAppWidgetManager.partiallyUpdateAppWidget(mAppWidgetId, remoteViews); - } - - } -} diff --git a/QKSMS/src/main/java/org/mistergroup/muzutozvednout/ShouldIAnswerBinder.java b/QKSMS/src/main/java/org/mistergroup/muzutozvednout/ShouldIAnswerBinder.java deleted file mode 100644 index 8524f814b..000000000 --- a/QKSMS/src/main/java/org/mistergroup/muzutozvednout/ShouldIAnswerBinder.java +++ /dev/null @@ -1,98 +0,0 @@ -package org.mistergroup.muzutozvednout; - -import android.content.ComponentName; -import android.content.Context; -import android.content.Intent; -import android.content.ServiceConnection; -import android.os.Bundle; -import android.os.Handler; -import android.os.IBinder; -import android.os.Message; -import android.os.Messenger; -import android.os.RemoteException; - -/** - * Created by Mister Group s.r.o. on 30.11.2015. - */ -public class ShouldIAnswerBinder { - public static final int RATING_UNKNOWN = 0; - public static final int RATING_POSITIVE = 1; - public static final int RATING_NEGATIVE = 2; - public static final int RATING_NEUTRAL = 3; - - private Callback callback; - public boolean isBound; - - public interface Callback { - void onNumberRating(String number, int rating); - - void onServiceConnected(); - - void onServiceDisconnected(); - } - - public void setCallback(Callback callback) { - this.callback = callback; - } - - public void bind(Context context) { - Intent intent=new Intent("org.mistergroup.muzutozvednout.PublicService"); - intent.setPackage("org.mistergroup.muzutozvednout"); - context.bindService(intent, mConnection, Context.BIND_AUTO_CREATE); - } - - public void unbind(Context context) { - if ((isBound) && (serviceMessenger != null)) { - context.unbindService(mConnection); - } - } - - public void getNumberRating(String number) throws RemoteException { - Message msg = new Message(); - msg.what = 1; - Bundle data = new Bundle(); - data.putString("number", number); - msg.setData(data); - msg.replyTo = messenger; - serviceMessenger.send(msg); - } - - private final Messenger messenger = new Messenger(new IncomingHandler()); - private static Messenger serviceMessenger = null; - - private ServiceConnection mConnection = new ServiceConnection() { - public void onServiceConnected(ComponentName className, IBinder service) { - serviceMessenger = new Messenger(service); - isBound = true; - if (callback != null) - callback.onServiceConnected(); - } - - public void onServiceDisconnected(ComponentName className) { - serviceMessenger = null; - isBound = false; - if (callback != null) - callback.onServiceDisconnected(); - } - }; - - private class IncomingHandler extends Handler { - static final int GET_NUMBER_RATING = 1; - - @Override - public void handleMessage(Message msg) { - switch (msg.what) { - case GET_NUMBER_RATING: - Bundle inData = msg.getData(); - String number = inData.getString("number"); - int rating = inData.getInt("rating"); - if (callback != null) - callback.onNumberRating(number, rating); - - break; - default: - super.handleMessage(msg); - } - } - } -} diff --git a/QKSMS/src/main/java/org/w3c/dom/events/DocumentEvent.java b/QKSMS/src/main/java/org/w3c/dom/events/DocumentEvent.java deleted file mode 100644 index aaf877bc9..000000000 --- a/QKSMS/src/main/java/org/w3c/dom/events/DocumentEvent.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (c) 2000 World Wide Web Consortium, - * (Massachusetts Institute of Technology, Institut National de - * Recherche en Informatique et en Automatique, Keio University). All - * Rights Reserved. This program is distributed under the W3C's Software - * Intellectual Property License. This program is distributed in the - * hope that it will be useful, but WITHOUT ANY WARRANTY; without even - * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - * PURPOSE. - * See W3C License http://www.w3.org/Consortium/Legal/ for more details. - */ - -package org.w3c.dom.events; - -import org.w3c.dom.DOMException; - -/** - * The <code>DocumentEvent</code> interface provides a mechanism by which the - * user can create an Event of a type supported by the implementation. It is - * expected that the <code>DocumentEvent</code> interface will be - * implemented on the same object which implements the <code>Document</code> - * interface in an implementation which supports the Event model. - * <p>See also the <a href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Events-20001113'>Document Object Model (DOM) Level 2 Events Specification</a>. - * @since DOM Level 2 - */ -public interface DocumentEvent { - /** - * - * @param eventType The <code>eventType</code> parameter specifies the - * type of <code>Event</code> interface to be created. If the - * <code>Event</code> interface specified is supported by the - * implementation this method will return a new <code>Event</code> of - * the interface type requested. If the <code>Event</code> is to be - * dispatched via the <code>dispatchEvent</code> method the - * appropriate event init method must be called after creation in - * order to initialize the <code>Event</code>'s values. As an example, - * a user wishing to synthesize some kind of <code>UIEvent</code> - * would call <code>createEvent</code> with the parameter "UIEvents". - * The <code>initUIEvent</code> method could then be called on the - * newly created <code>UIEvent</code> to set the specific type of - * UIEvent to be dispatched and set its context information.The - * <code>createEvent</code> method is used in creating - * <code>Event</code>s when it is either inconvenient or unnecessary - * for the user to create an <code>Event</code> themselves. In cases - * where the implementation provided <code>Event</code> is - * insufficient, users may supply their own <code>Event</code> - * implementations for use with the <code>dispatchEvent</code> method. - * @return The newly created <code>Event</code> - * @exception org.w3c.dom.DOMException - * NOT_SUPPORTED_ERR: Raised if the implementation does not support the - * type of <code>Event</code> interface requested - */ - public Event createEvent(String eventType) - throws DOMException; - -} diff --git a/QKSMS/src/main/java/org/w3c/dom/events/Event.java b/QKSMS/src/main/java/org/w3c/dom/events/Event.java deleted file mode 100644 index 14a9239ed..000000000 --- a/QKSMS/src/main/java/org/w3c/dom/events/Event.java +++ /dev/null @@ -1,141 +0,0 @@ -/* - * Copyright (c) 2000 World Wide Web Consortium, - * (Massachusetts Institute of Technology, Institut National de - * Recherche en Informatique et en Automatique, Keio University). All - * Rights Reserved. This program is distributed under the W3C's Software - * Intellectual Property License. This program is distributed in the - * hope that it will be useful, but WITHOUT ANY WARRANTY; without even - * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - * PURPOSE. - * See W3C License http://www.w3.org/Consortium/Legal/ for more details. - */ - -package org.w3c.dom.events; - -/** - * The <code>Event</code> interface is used to provide contextual information - * about an event to the handler processing the event. An object which - * implements the <code>Event</code> interface is generally passed as the - * first parameter to an event handler. More specific context information is - * passed to event handlers by deriving additional interfaces from - * <code>Event</code> which contain information directly relating to the - * type of event they accompany. These derived interfaces are also - * implemented by the object passed to the event listener. - * <p>See also the <a href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Events-20001113'>Document Object Model (DOM) Level 2 Events Specification</a>. - * @since DOM Level 2 - */ -public interface Event { - // PhaseType - /** - * The current event phase is the capturing phase. - */ - public static final short CAPTURING_PHASE = 1; - /** - * The event is currently being evaluated at the target - * <code>EventTarget</code>. - */ - public static final short AT_TARGET = 2; - /** - * The current event phase is the bubbling phase. - */ - public static final short BUBBLING_PHASE = 3; - - /** - * The name of the event (case-insensitive). The name must be an XML name. - */ - public String getType(); - - /** - * Used to indicate the <code>EventTarget</code> to which the event was - * originally dispatched. - */ - public EventTarget getTarget(); - - /** - * Used to indicate the <code>EventTarget</code> whose - * <code>EventListeners</code> are currently being processed. This is - * particularly useful during capturing and bubbling. - */ - public EventTarget getCurrentTarget(); - - /** - * Used to indicate which phase of event flow is currently being - * evaluated. - */ - public short getEventPhase(); - - /** - * Used to indicate whether or not an event is a bubbling event. If the - * event can bubble the value is true, else the value is false. - */ - public boolean getBubbles(); - - /** - * Used to indicate whether or not an event can have its default action - * prevented. If the default action can be prevented the value is true, - * else the value is false. - */ - public boolean getCancelable(); - - /** - * Used to specify the time (in milliseconds relative to the epoch) at - * which the event was created. Due to the fact that some systems may - * not provide this information the value of <code>timeStamp</code> may - * be not available for all events. When not available, a value of 0 - * will be returned. Examples of epoch time are the time of the system - * start or 0:0:0 UTC 1st January 1970. - */ - public long getTimeStamp(); - - /** - * The <code>stopPropagation</code> method is used prevent further - * propagation of an event during event flow. If this method is called - * by any <code>EventListener</code> the event will cease propagating - * through the tree. The event will complete dispatch to all listeners - * on the current <code>EventTarget</code> before event flow stops. This - * method may be used during any stage of event flow. - */ - public void stopPropagation(); - - /** - * If an event is cancelable, the <code>preventDefault</code> method is - * used to signify that the event is to be canceled, meaning any default - * action normally taken by the implementation as a result of the event - * will not occur. If, during any stage of event flow, the - * <code>preventDefault</code> method is called the event is canceled. - * Any default action associated with the event will not occur. Calling - * this method for a non-cancelable event has no effect. Once - * <code>preventDefault</code> has been called it will remain in effect - * throughout the remainder of the event's propagation. This method may - * be used during any stage of event flow. - */ - public void preventDefault(); - - /** - * The <code>initEvent</code> method is used to initialize the value of an - * <code>Event</code> created through the <code>DocumentEvent</code> - * interface. This method may only be called before the - * <code>Event</code> has been dispatched via the - * <code>dispatchEvent</code> method, though it may be called multiple - * times during that phase if necessary. If called multiple times the - * final invocation takes precedence. If called from a subclass of - * <code>Event</code> interface only the values specified in the - * <code>initEvent</code> method are modified, all other attributes are - * left unchanged. - * @param eventTypeArg Specifies the event type. This type may be any - * event type currently defined in this specification or a new event - * type.. The string must be an XML name. Any new event type must not - * begin with any upper, lower, or mixed case version of the string - * "DOM". This prefix is reserved for future DOM event sets. It is - * also strongly recommended that third parties adding their own - * events use their own prefix to avoid confusion and lessen the - * probability of conflicts with other new events. - * @param canBubbleArg Specifies whether or not the event can bubble. - * @param cancelableArg Specifies whether or not the event's default - * action can be prevented. - */ - public void initEvent(String eventTypeArg, - boolean canBubbleArg, - boolean cancelableArg); - -} diff --git a/QKSMS/src/main/java/org/w3c/dom/events/EventException.java b/QKSMS/src/main/java/org/w3c/dom/events/EventException.java deleted file mode 100644 index 7a6ff2620..000000000 --- a/QKSMS/src/main/java/org/w3c/dom/events/EventException.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (c) 2000 World Wide Web Consortium, - * (Massachusetts Institute of Technology, Institut National de - * Recherche en Informatique et en Automatique, Keio University). All - * Rights Reserved. This program is distributed under the W3C's Software - * Intellectual Property License. This program is distributed in the - * hope that it will be useful, but WITHOUT ANY WARRANTY; without even - * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - * PURPOSE. - * See W3C License http://www.w3.org/Consortium/Legal/ for more details. - */ - -package org.w3c.dom.events; - -/** - * Event operations may throw an <code>EventException</code> as specified in - * their method descriptions. - * <p>See also the <a href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Events-20001113'>Document Object Model (DOM) Level 2 Events Specification</a>. - * @since DOM Level 2 - */ -public class EventException extends RuntimeException { - public EventException(short code, String message) { - super(message); - this.code = code; - } - public short code; - // EventExceptionCode - /** - * If the <code>Event</code>'s type was not specified by initializing the - * event before the method was called. Specification of the Event's type - * as <code>null</code> or an empty string will also trigger this - * exception. - */ - public static final short UNSPECIFIED_EVENT_TYPE_ERR = 0; - -} diff --git a/QKSMS/src/main/java/org/w3c/dom/events/EventListener.java b/QKSMS/src/main/java/org/w3c/dom/events/EventListener.java deleted file mode 100644 index 1df80202c..000000000 --- a/QKSMS/src/main/java/org/w3c/dom/events/EventListener.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (c) 2000 World Wide Web Consortium, - * (Massachusetts Institute of Technology, Institut National de - * Recherche en Informatique et en Automatique, Keio University). All - * Rights Reserved. This program is distributed under the W3C's Software - * Intellectual Property License. This program is distributed in the - * hope that it will be useful, but WITHOUT ANY WARRANTY; without even - * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - * PURPOSE. - * See W3C License http://www.w3.org/Consortium/Legal/ for more details. - */ - -package org.w3c.dom.events; - -/** - * The <code>EventListener</code> interface is the primary method for - * handling events. Users implement the <code>EventListener</code> interface - * and register their listener on an <code>EventTarget</code> using the - * <code>AddEventListener</code> method. The users should also remove their - * <code>EventListener</code> from its <code>EventTarget</code> after they - * have completed using the listener. - * <p> When a <code>Node</code> is copied using the <code>cloneNode</code> - * method the <code>EventListener</code>s attached to the source - * <code>Node</code> are not attached to the copied <code>Node</code>. If - * the user wishes the same <code>EventListener</code>s to be added to the - * newly created copy the user must add them manually. - * <p>See also the <a href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Events-20001113'>Document Object Model (DOM) Level 2 Events Specification</a>. - * @since DOM Level 2 - */ -public interface EventListener { - /** - * This method is called whenever an event occurs of the type for which - * the <code> EventListener</code> interface was registered. - * @param evt The <code>Event</code> contains contextual information - * about the event. It also contains the <code>stopPropagation</code> - * and <code>preventDefault</code> methods which are used in - * determining the event's flow and default action. - */ - public void handleEvent(Event evt); - -} diff --git a/QKSMS/src/main/java/org/w3c/dom/events/EventTarget.java b/QKSMS/src/main/java/org/w3c/dom/events/EventTarget.java deleted file mode 100644 index ef9a19351..000000000 --- a/QKSMS/src/main/java/org/w3c/dom/events/EventTarget.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright (c) 2000 World Wide Web Consortium, - * (Massachusetts Institute of Technology, Institut National de - * Recherche en Informatique et en Automatique, Keio University). All - * Rights Reserved. This program is distributed under the W3C's Software - * Intellectual Property License. This program is distributed in the - * hope that it will be useful, but WITHOUT ANY WARRANTY; without even - * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - * PURPOSE. - * See W3C License http://www.w3.org/Consortium/Legal/ for more details. - */ - -package org.w3c.dom.events; - -/** - * The <code>EventTarget</code> interface is implemented by all - * <code>Nodes</code> in an implementation which supports the DOM Event - * Model. Therefore, this interface can be obtained by using - * binding-specific casting methods on an instance of the <code>Node</code> - * interface. The interface allows registration and removal of - * <code>EventListeners</code> on an <code>EventTarget</code> and dispatch - * of events to that <code>EventTarget</code>. - * <p>See also the <a href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Events-20001113'>Document Object Model (DOM) Level 2 Events Specification</a>. - * @since DOM Level 2 - */ -public interface EventTarget { - /** - * This method allows the registration of event listeners on the event - * target. If an <code>EventListener</code> is added to an - * <code>EventTarget</code> while it is processing an event, it will not - * be triggered by the current actions but may be triggered during a - * later stage of event flow, such as the bubbling phase. - * <br> If multiple identical <code>EventListener</code>s are registered - * on the same <code>EventTarget</code> with the same parameters the - * duplicate instances are discarded. They do not cause the - * <code>EventListener</code> to be called twice and since they are - * discarded they do not need to be removed with the - * <code>removeEventListener</code> method. - * @param type The event type for which the user is registering - * @param listener The <code>listener</code> parameter takes an interface - * implemented by the user which contains the methods to be called - * when the event occurs. - * @param useCapture If true, <code>useCapture</code> indicates that the - * user wishes to initiate capture. After initiating capture, all - * events of the specified type will be dispatched to the registered - * <code>EventListener</code> before being dispatched to any - * <code>EventTargets</code> beneath them in the tree. Events which - * are bubbling upward through the tree will not trigger an - * <code>EventListener</code> designated to use capture. - */ - public void addEventListener(String type, - EventListener listener, - boolean useCapture); - - /** - * This method allows the removal of event listeners from the event - * target. If an <code>EventListener</code> is removed from an - * <code>EventTarget</code> while it is processing an event, it will not - * be triggered by the current actions. <code>EventListener</code>s can - * never be invoked after being removed. - * <br>Calling <code>removeEventListener</code> with arguments which do - * not identify any currently registered <code>EventListener</code> on - * the <code>EventTarget</code> has no effect. - * @param type Specifies the event type of the <code>EventListener</code> - * being removed. - * @param listener The <code>EventListener</code> parameter indicates the - * <code>EventListener </code> to be removed. - * @param useCapture Specifies whether the <code>EventListener</code> - * being removed was registered as a capturing listener or not. If a - * listener was registered twice, one with capture and one without, - * each must be removed separately. Removal of a capturing listener - * does not affect a non-capturing version of the same listener, and - * vice versa. - */ - public void removeEventListener(String type, - EventListener listener, - boolean useCapture); - - /** - * This method allows the dispatch of events into the implementations - * event model. Events dispatched in this manner will have the same - * capturing and bubbling behavior as events dispatched directly by the - * implementation. The target of the event is the - * <code> EventTarget</code> on which <code>dispatchEvent</code> is - * called. - * @param evt Specifies the event type, behavior, and contextual - * information to be used in processing the event. - * @return The return value of <code>dispatchEvent</code> indicates - * whether any of the listeners which handled the event called - * <code>preventDefault</code>. If <code>preventDefault</code> was - * called the value is false, else the value is true. - * @exception org.w3c.dom.events.EventException - * UNSPECIFIED_EVENT_TYPE_ERR: Raised if the <code>Event</code>'s type - * was not specified by initializing the event before - * <code>dispatchEvent</code> was called. Specification of the - * <code>Event</code>'s type as <code>null</code> or an empty string - * will also trigger this exception. - */ - public boolean dispatchEvent(Event evt) - throws EventException; - -} diff --git a/QKSMS/src/main/java/org/w3c/dom/smil/ElementExclusiveTimeContainer.java b/QKSMS/src/main/java/org/w3c/dom/smil/ElementExclusiveTimeContainer.java deleted file mode 100644 index 34eab7bfb..000000000 --- a/QKSMS/src/main/java/org/w3c/dom/smil/ElementExclusiveTimeContainer.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (c) 2000 World Wide Web Consortium, - * (Massachusetts Institute of Technology, Institut National de - * Recherche en Informatique et en Automatique, Keio University). All - * Rights Reserved. This program is distributed under the W3C's Software - * Intellectual Property License. This program is distributed in the - * hope that it will be useful, but WITHOUT ANY WARRANTY; without even - * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more - * details. - */ - -package org.w3c.dom.smil; - -import org.w3c.dom.DOMException; -import org.w3c.dom.NodeList; - -/** - * This interface defines a time container with semantics based upon par, but - * with the additional constraint that only one child element may play at a - * time. - */ -public interface ElementExclusiveTimeContainer extends ElementTimeContainer { - /** - * Controls the end of the container. Need to address thr id-ref value. - * @exception org.w3c.dom.DOMException - * NO_MODIFICATION_ALLOWED_ERR: Raised if this attribute is readonly. - */ - public String getEndSync(); - public void setEndSync(String endSync) - throws DOMException; - - /** - * This should support another method to get the ordered collection of - * paused elements (the paused stack) at a given point in time. - * @return All paused elements at the current time. - */ - public NodeList getPausedElements(); - -} - diff --git a/QKSMS/src/main/java/org/w3c/dom/smil/ElementLayout.java b/QKSMS/src/main/java/org/w3c/dom/smil/ElementLayout.java deleted file mode 100644 index 1e7c05c56..000000000 --- a/QKSMS/src/main/java/org/w3c/dom/smil/ElementLayout.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (c) 2000 World Wide Web Consortium, - * (Massachusetts Institute of Technology, Institut National de - * Recherche en Informatique et en Automatique, Keio University). All - * Rights Reserved. This program is distributed under the W3C's Software - * Intellectual Property License. This program is distributed in the - * hope that it will be useful, but WITHOUT ANY WARRANTY; without even - * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more - * details. - */ - -package org.w3c.dom.smil; - -import org.w3c.dom.DOMException; - -/** - * This interface is used by SMIL elements root-layout, top-layout and region. - * - */ -public interface ElementLayout { - /** - * @exception org.w3c.dom.DOMException - * NO_MODIFICATION_ALLOWED_ERR: Raised if this attribute is readonly. - */ - public String getTitle(); - public void setTitle(String title) - throws DOMException; - - /** - * @exception org.w3c.dom.DOMException - * NO_MODIFICATION_ALLOWED_ERR: Raised if this attribute is readonly. - */ - public String getBackgroundColor(); - public void setBackgroundColor(String backgroundColor) - throws DOMException; - - /** - * @exception org.w3c.dom.DOMException - * NO_MODIFICATION_ALLOWED_ERR: Raised if this attribute is readonly. - */ - public int getHeight(); - public void setHeight(int height) - throws DOMException; - - /** - * @exception org.w3c.dom.DOMException - * NO_MODIFICATION_ALLOWED_ERR: Raised if this attribute is readonly. - */ - public int getWidth(); - public void setWidth(int width) - throws DOMException; - -} - diff --git a/QKSMS/src/main/java/org/w3c/dom/smil/ElementParallelTimeContainer.java b/QKSMS/src/main/java/org/w3c/dom/smil/ElementParallelTimeContainer.java deleted file mode 100644 index 9eea8ecda..000000000 --- a/QKSMS/src/main/java/org/w3c/dom/smil/ElementParallelTimeContainer.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (c) 2000 World Wide Web Consortium, - * (Massachusetts Institute of Technology, Institut National de - * Recherche en Informatique et en Automatique, Keio University). All - * Rights Reserved. This program is distributed under the W3C's Software - * Intellectual Property License. This program is distributed in the - * hope that it will be useful, but WITHOUT ANY WARRANTY; without even - * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more - * details. - */ - -package org.w3c.dom.smil; - -import org.w3c.dom.DOMException; - -/** - * A <code>parallel</code> container defines a simple parallel time grouping - * in which multiple elements can play back at the same time. It may have to - * specify a repeat iteration. (?) - */ -public interface ElementParallelTimeContainer extends ElementTimeContainer { - /** - * Controls the end of the container. Need to address thr id-ref value. - * @exception org.w3c.dom.DOMException - * NO_MODIFICATION_ALLOWED_ERR: Raised if this attribute is readonly. - */ - public String getEndSync(); - public void setEndSync(String endSync) - throws DOMException; - - /** - * This method returns the implicit duration in seconds. - * @return The implicit duration in seconds or -1 if the implicit is - * unknown (indefinite?). - */ - public float getImplicitDuration(); - -} - diff --git a/QKSMS/src/main/java/org/w3c/dom/smil/ElementSequentialTimeContainer.java b/QKSMS/src/main/java/org/w3c/dom/smil/ElementSequentialTimeContainer.java deleted file mode 100644 index bca584164..000000000 --- a/QKSMS/src/main/java/org/w3c/dom/smil/ElementSequentialTimeContainer.java +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright (c) 2000 World Wide Web Consortium, - * (Massachusetts Institute of Technology, Institut National de - * Recherche en Informatique et en Automatique, Keio University). All - * Rights Reserved. This program is distributed under the W3C's Software - * Intellectual Property License. This program is distributed in the - * hope that it will be useful, but WITHOUT ANY WARRANTY; without even - * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more - * details. - */ - -package org.w3c.dom.smil; - -/** - * A <code>seq</code> container defines a sequence of elements in which - * elements play one after the other. - */ -public interface ElementSequentialTimeContainer extends ElementTimeContainer { -} - diff --git a/QKSMS/src/main/java/org/w3c/dom/smil/ElementSyncBehavior.java b/QKSMS/src/main/java/org/w3c/dom/smil/ElementSyncBehavior.java deleted file mode 100644 index e75feccc0..000000000 --- a/QKSMS/src/main/java/org/w3c/dom/smil/ElementSyncBehavior.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (c) 2000 World Wide Web Consortium, - * (Massachusetts Institute of Technology, Institut National de - * Recherche en Informatique et en Automatique, Keio University). All - * Rights Reserved. This program is distributed under the W3C's Software - * Intellectual Property License. This program is distributed in the - * hope that it will be useful, but WITHOUT ANY WARRANTY; without even - * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more - * details. - */ - -package org.w3c.dom.smil; - -/** - * The synchronization behavior extension. - */ -public interface ElementSyncBehavior { - /** - * The runtime synchronization behavior for an element. - */ - public String getSyncBehavior(); - - /** - * The sync tolerance for the associated element. It has an effect only if - * the element has <code>syncBehavior="locked"</code> . - */ - public float getSyncTolerance(); - - /** - * Defines the default value for the runtime synchronization behavior for - * an element, and all descendents. - */ - public String getDefaultSyncBehavior(); - - /** - * Defines the default value for the sync tolerance for an element, and - * all descendents. - */ - public float getDefaultSyncTolerance(); - - /** - * If set to true, forces the time container playback to sync to this - * element. - */ - public boolean getSyncMaster(); - -} - diff --git a/QKSMS/src/main/java/org/w3c/dom/smil/ElementTargetAttributes.java b/QKSMS/src/main/java/org/w3c/dom/smil/ElementTargetAttributes.java deleted file mode 100644 index 23a37b638..000000000 --- a/QKSMS/src/main/java/org/w3c/dom/smil/ElementTargetAttributes.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2000 World Wide Web Consortium, - * (Massachusetts Institute of Technology, Institut National de - * Recherche en Informatique et en Automatique, Keio University). All - * Rights Reserved. This program is distributed under the W3C's Software - * Intellectual Property License. This program is distributed in the - * hope that it will be useful, but WITHOUT ANY WARRANTY; without even - * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more - * details. - */ - -package org.w3c.dom.smil; - -/** - * This interface define the set of animation target extensions. - */ -public interface ElementTargetAttributes { - /** - * The name of the target attribute. - */ - public String getAttributeName(); - public void setAttributeName(String attributeName); - - // attributeTypes - public static final short ATTRIBUTE_TYPE_AUTO = 0; - public static final short ATTRIBUTE_TYPE_CSS = 1; - public static final short ATTRIBUTE_TYPE_XML = 2; - - /** - * A code representing the value of the attributeType attribute, as - * defined above. Default value is <code>ATTRIBUTE_TYPE_CODE</code> . - */ - public short getAttributeType(); - public void setAttributeType(short attributeType); - -} - diff --git a/QKSMS/src/main/java/org/w3c/dom/smil/ElementTest.java b/QKSMS/src/main/java/org/w3c/dom/smil/ElementTest.java deleted file mode 100644 index 577bf6a3d..000000000 --- a/QKSMS/src/main/java/org/w3c/dom/smil/ElementTest.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright (c) 2000 World Wide Web Consortium, - * (Massachusetts Institute of Technology, Institut National de - * Recherche en Informatique et en Automatique, Keio University). All - * Rights Reserved. This program is distributed under the W3C's Software - * Intellectual Property License. This program is distributed in the - * hope that it will be useful, but WITHOUT ANY WARRANTY; without even - * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more - * details. - */ - -package org.w3c.dom.smil; - -import org.w3c.dom.DOMException; - -/** - * Defines the test attributes interface. See the Test attributes definition - * . - */ -public interface ElementTest { - /** - * The systemBitrate value. - * @exception org.w3c.dom.DOMException - * NO_MODIFICATION_ALLOWED_ERR: Raised if this attribute is readonly. - */ - public int getSystemBitrate(); - public void setSystemBitrate(int systemBitrate) - throws DOMException; - - /** - * The systemCaptions value. - * @exception org.w3c.dom.DOMException - * NO_MODIFICATION_ALLOWED_ERR: Raised if this attribute is readonly. - */ - public boolean getSystemCaptions(); - public void setSystemCaptions(boolean systemCaptions) - throws DOMException; - - /** - * The systemLanguage value. - * @exception org.w3c.dom.DOMException - * NO_MODIFICATION_ALLOWED_ERR: Raised if this attribute is readonly. - */ - public String getSystemLanguage(); - public void setSystemLanguage(String systemLanguage) - throws DOMException; - - /** - * The result of the evaluation of the systemRequired attribute. - */ - public boolean getSystemRequired(); - - /** - * The result of the evaluation of the systemScreenSize attribute. - */ - public boolean getSystemScreenSize(); - - /** - * The result of the evaluation of the systemScreenDepth attribute. - */ - public boolean getSystemScreenDepth(); - - /** - * The value of the systemOverdubOrSubtitle attribute. - * @exception org.w3c.dom.DOMException - * NO_MODIFICATION_ALLOWED_ERR: Raised if this attribute is readonly. - */ - public String getSystemOverdubOrSubtitle(); - public void setSystemOverdubOrSubtitle(String systemOverdubOrSubtitle) - throws DOMException; - - /** - * The value of the systemAudioDesc attribute. - * @exception org.w3c.dom.DOMException - * NO_MODIFICATION_ALLOWED_ERR: Raised if this attribute is readonly. - */ - public boolean getSystemAudioDesc(); - public void setSystemAudioDesc(boolean systemAudioDesc) - throws DOMException; - -} - diff --git a/QKSMS/src/main/java/org/w3c/dom/smil/ElementTime.java b/QKSMS/src/main/java/org/w3c/dom/smil/ElementTime.java deleted file mode 100644 index 0ac227a69..000000000 --- a/QKSMS/src/main/java/org/w3c/dom/smil/ElementTime.java +++ /dev/null @@ -1,161 +0,0 @@ -/* - * Copyright (c) 2000 World Wide Web Consortium, - * (Massachusetts Institute of Technology, Institut National de - * Recherche en Informatique et en Automatique, Keio University). All - * Rights Reserved. This program is distributed under the W3C's Software - * Intellectual Property License. This program is distributed in the - * hope that it will be useful, but WITHOUT ANY WARRANTY; without even - * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more - * details. - * - * Difference to the original copy of this file: - * 1) ADD public static final short FILL_AUTO = 2; - * 2) ADD public short getFillDefault(); - * 3) AND public void setFillDefault(short fillDefault) - * throws DOMException; - */ - -package org.w3c.dom.smil; - -import org.w3c.dom.DOMException; - -/** - * This interface defines the set of timing attributes that are common to all - * timed elements. - */ -public interface ElementTime { - /** - * The desired value (as a list of times) of the begin instant of this - * node. - * @exception org.w3c.dom.DOMException - * NO_MODIFICATION_ALLOWED_ERR: Raised if this attribute is readonly. - */ - public TimeList getBegin(); - public void setBegin(TimeList begin) - throws DOMException; - - /** - * The list of active ends for this node. - * @exception org.w3c.dom.DOMException - * NO_MODIFICATION_ALLOWED_ERR: Raised if this attribute is readonly. - */ - public TimeList getEnd(); - public void setEnd(TimeList end) - throws DOMException; - - /** - * The desired simple duration value of this node in seconds. Negative - * value means "indefinite". - * @exception org.w3c.dom.DOMException - * NO_MODIFICATION_ALLOWED_ERR: Raised if this attribute is readonly. - */ - public float getDur(); - public void setDur(float dur) - throws DOMException; - - // restartTypes - public static final short RESTART_ALWAYS = 0; - public static final short RESTART_NEVER = 1; - public static final short RESTART_WHEN_NOT_ACTIVE = 2; - - /** - * A code representing the value of the restart attribute, as defined - * above. Default value is <code>RESTART_ALWAYS</code> . - * @exception org.w3c.dom.DOMException - * NO_MODIFICATION_ALLOWED_ERR: Raised if this attribute is readonly. - */ - public short getRestart(); - public void setRestart(short restart) - throws DOMException; - - // fillTypes - public static final short FILL_REMOVE = 0; - public static final short FILL_FREEZE = 1; - public static final short FILL_AUTO = 2; - - /** - * A code representing the value of the fill attribute, as defined - * above. Default value is <code>FILL_REMOVE</code> . - * @exception org.w3c.dom.DOMException - * NO_MODIFICATION_ALLOWED_ERR: Raised if this attribute is readonly. - */ - public short getFill(); - public void setFill(short fill) - throws DOMException; - - /** - * The repeatCount attribute causes the element to play repeatedly - * (loop) for the specified number of times. A negative value repeat the - * element indefinitely. Default value is 0 (unspecified). - * @exception org.w3c.dom.DOMException - * NO_MODIFICATION_ALLOWED_ERR: Raised if this attribute is readonly. - */ - public float getRepeatCount(); - public void setRepeatCount(float repeatCount) - throws DOMException; - - /** - * The repeatDur causes the element to play repeatedly (loop) for the - * specified duration in milliseconds. Negative means "indefinite". - * @exception org.w3c.dom.DOMException - * NO_MODIFICATION_ALLOWED_ERR: Raised if this attribute is readonly. - */ - public float getRepeatDur(); - public void setRepeatDur(float repeatDur) - throws DOMException; - - /** - * Causes this element to begin the local timeline (subject to sync - * constraints). - * @return <code>true</code> if the method call was successful and the - * element was begun. <code>false</code> if the method call failed. - * Possible reasons for failure include: The element doesn't support - * the <code>beginElement</code> method. (the <code>beginEvent</code> - * attribute is not set to <code>"undefinite"</code> ) The element is - * already active and can't be restart when it is active. (the - * <code>restart</code> attribute is set to <code>"whenNotActive"</code> - * ) The element is active or has been active and can't be restart. - * (the <code>restart</code> attribute is set to <code>"never"</code> ). - * - */ - public boolean beginElement(); - - /** - * Causes this element to end the local timeline (subject to sync - * constraints). - * @return <code>true</code> if the method call was successful and the - * element was endeed. <code>false</code> if method call failed. - * Possible reasons for failure include: The element doesn't support - * the <code>endElement</code> method. (the <code>endEvent</code> - * attribute is not set to <code>"undefinite"</code> ) The element is - * not active. - */ - public boolean endElement(); - - /** - * Causes this element to pause the local timeline (subject to sync - * constraints). - */ - public void pauseElement(); - - /** - * Causes this element to resume a paused local timeline. - */ - public void resumeElement(); - - /** - * Seeks this element to the specified point on the local timeline - * (subject to sync constraints). If this is a timeline, this must seek - * the entire timeline (i.e. propagate to all timeChildren). - * @param seekTo The desired position on the local timeline in - * milliseconds. - */ - public void seekElement(float seekTo); - - public short getFillDefault(); - public void setFillDefault(short fillDefault) - throws DOMException; - -} - diff --git a/QKSMS/src/main/java/org/w3c/dom/smil/ElementTimeContainer.java b/QKSMS/src/main/java/org/w3c/dom/smil/ElementTimeContainer.java deleted file mode 100644 index 69b39e820..000000000 --- a/QKSMS/src/main/java/org/w3c/dom/smil/ElementTimeContainer.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (c) 2000 World Wide Web Consortium, - * (Massachusetts Institute of Technology, Institut National de - * Recherche en Informatique et en Automatique, Keio University). All - * Rights Reserved. This program is distributed under the W3C's Software - * Intellectual Property License. This program is distributed in the - * hope that it will be useful, but WITHOUT ANY WARRANTY; without even - * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more - * details. - */ - -package org.w3c.dom.smil; - -import org.w3c.dom.NodeList; - -/** - * This is a placeholder - subject to change. This represents generic - * timelines. - */ -public interface ElementTimeContainer extends ElementTime { - /** - * A NodeList that contains all timed childrens of this node. If there are - * no timed children, the <code>Nodelist</code> is empty. An iterator - * is more appropriate here than a node list but it requires Traversal - * module support. - */ - public NodeList getTimeChildren(); - - /** - * Returns a list of child elements active at the specified invocation. - * @param instant The desired position on the local timeline in - * milliseconds. - * @return List of timed child-elements active at instant. - */ - public NodeList getActiveChildrenAt(float instant); - -} - diff --git a/QKSMS/src/main/java/org/w3c/dom/smil/ElementTimeControl.java b/QKSMS/src/main/java/org/w3c/dom/smil/ElementTimeControl.java deleted file mode 100644 index cf50c4e1c..000000000 --- a/QKSMS/src/main/java/org/w3c/dom/smil/ElementTimeControl.java +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Copyright (c) 2000 World Wide Web Consortium, - * (Massachusetts Institute of Technology, Institut National de - * Recherche en Informatique et en Automatique, Keio University). All - * Rights Reserved. This program is distributed under the W3C's Software - * Intellectual Property License. This program is distributed in the - * hope that it will be useful, but WITHOUT ANY WARRANTY; without even - * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more - * details. - */ - -package org.w3c.dom.smil; - -import org.w3c.dom.DOMException; - -/** - */ -public interface ElementTimeControl { - /** - * Causes this element to begin the local timeline (subject to sync - * constraints). - * @return <code>true</code> if the method call was successful and the - * element was begun. <code>false</code> if the method call failed. - * Possible reasons for failure include: The element doesn't support - * the <code>beginElement</code> method. (the <code>begin</code> - * attribute is not set to <code>"indefinite"</code> ) The element is - * already active and can't be restart when it is active. (the - * <code>restart</code> attribute is set to <code>"whenNotActive"</code> - * ) The element is active or has been active and can't be restart. - * (the <code>restart</code> attribute is set to <code>"never"</code> ). - * - * @exception org.w3c.dom.DOMException - * SYNTAX_ERR: The element was not defined with the appropriate syntax - * to allow <code>beginElement</code> calls. - */ - public boolean beginElement() - throws DOMException; - - /** - * Causes this element to begin the local timeline (subject to sync - * constraints), at the passed offset from the current time when the - * method is called. If the offset is >= 0, the semantics are - * equivalent to an event-base begin with the specified offset. If the - * offset is < 0, the semantics are equivalent to beginElement(), but - * the element active duration is evaluated as though the element had - * begun at the passed (negative) offset from the current time when the - * method is called. - * @param offset The offset in seconds at which to begin the element. - * @return <code>true</code> if the method call was successful and the - * element was begun. <code>false</code> if the method call failed. - * Possible reasons for failure include: The element doesn't support - * the <code>beginElementAt</code> method. (the <code>begin</code> - * attribute is not set to <code>"indefinite"</code> ) The element is - * already active and can't be restart when it is active. (the - * <code>restart</code> attribute is set to <code>"whenNotActive"</code> - * ) The element is active or has been active and can't be restart. - * (the <code>restart</code> attribute is set to <code>"never"</code> ). - * - * @exception org.w3c.dom.DOMException - * SYNTAX_ERR: The element was not defined with the appropriate syntax - * to allow <code>beginElementAt</code> calls. - */ - public boolean beginElementAt(float offset) - throws DOMException; - - /** - * Causes this element to end the local timeline (subject to sync - * constraints). - * @return <code>true</code> if the method call was successful and the - * element was ended. <code>false</code> if method call failed. - * Possible reasons for failure include: The element doesn't support - * the <code>endElement</code> method. (the <code>end</code> attribute - * is not set to <code>"indefinite"</code> ) The element is not active. - * - * @exception org.w3c.dom.DOMException - * SYNTAX_ERR: The element was not defined with the appropriate syntax - * to allow <code>endElement</code> calls. - */ - public boolean endElement() - throws DOMException; - - /** - * Causes this element to end the local timeline (subject to sync - * constraints) at the specified offset from the current time when the - * method is called. - * @param offset The offset in seconds at which to end the element. Must - * be >= 0. - * @return <code>true</code> if the method call was successful and the - * element was ended. <code>false</code> if method call failed. - * Possible reasons for failure include: The element doesn't support - * the <code>endElementAt</code> method. (the <code>end</code> - * attribute is not set to <code>"indefinite"</code> ) The element is - * not active. - * @exception org.w3c.dom.DOMException - * SYNTAX_ERR: The element was not defined with the appropriate syntax - * to allow <code>endElementAt</code> calls. - */ - public boolean endElementAt(float offset) - throws DOMException; - -} - diff --git a/QKSMS/src/main/java/org/w3c/dom/smil/ElementTimeManipulation.java b/QKSMS/src/main/java/org/w3c/dom/smil/ElementTimeManipulation.java deleted file mode 100644 index 696ab01d2..000000000 --- a/QKSMS/src/main/java/org/w3c/dom/smil/ElementTimeManipulation.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (c) 2000 World Wide Web Consortium, - * (Massachusetts Institute of Technology, Institut National de - * Recherche en Informatique et en Automatique, Keio University). All - * Rights Reserved. This program is distributed under the W3C's Software - * Intellectual Property License. This program is distributed in the - * hope that it will be useful, but WITHOUT ANY WARRANTY; without even - * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more - * details. - */ - -package org.w3c.dom.smil; - -import org.w3c.dom.DOMException; - -/** - * This interface support use-cases commonly associated with animation. - * "accelerate" and "decelerate" are float values in the timing draft and - * percentage values even in this draft if both of them represent a - * percentage. - */ -public interface ElementTimeManipulation { - /** - * Defines the playback speed of element time. The value is specified as - * a multiple of normal (parent time container) play speed. Legal values - * are signed floating point values. Zero values are not allowed. The - * default is <code>1.0</code> (no modification of speed). - * @exception org.w3c.dom.DOMException - * NO_MODIFICATION_ALLOWED_ERR: Raised if this attribute is readonly. - */ - public float getSpeed(); - public void setSpeed(float speed) - throws DOMException; - - /** - * The percentage value of the simple acceleration of time for the - * element. Allowed values are from <code>0</code> to <code>100</code> . - * Default value is <code>0</code> (no acceleration). - * <br> The sum of the values for accelerate and decelerate must not exceed - * 100. If it does, the deceleration value will be reduced to make the - * sum legal. - * @exception org.w3c.dom.DOMException - * NO_MODIFICATION_ALLOWED_ERR: Raised if this attribute is readonly. - */ - public float getAccelerate(); - public void setAccelerate(float accelerate) - throws DOMException; - - /** - * The percentage value of the simple decelerate of time for the - * element. Allowed values are from <code>0</code> to <code>100</code> . - * Default value is <code>0</code> (no deceleration). - * <br> The sum of the values for accelerate and decelerate must not exceed - * 100. If it does, the deceleration value will be reduced to make the - * sum legal. - * @exception org.w3c.dom.DOMException - * NO_MODIFICATION_ALLOWED_ERR: Raised if this attribute is readonly. - */ - public float getDecelerate(); - public void setDecelerate(float decelerate) - throws DOMException; - - /** - * The autoReverse attribute controls the "play forwards then backwards" - * functionality. Default value is <code>false</code> . - * @exception org.w3c.dom.DOMException - * NO_MODIFICATION_ALLOWED_ERR: Raised if this attribute is readonly. - */ - public boolean getAutoReverse(); - public void setAutoReverse(boolean autoReverse) - throws DOMException; - -} - diff --git a/QKSMS/src/main/java/org/w3c/dom/smil/SMILAnimateColorElement.java b/QKSMS/src/main/java/org/w3c/dom/smil/SMILAnimateColorElement.java deleted file mode 100644 index 9bd9d13a6..000000000 --- a/QKSMS/src/main/java/org/w3c/dom/smil/SMILAnimateColorElement.java +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright (c) 2000 World Wide Web Consortium, - * (Massachusetts Institute of Technology, Institut National de - * Recherche en Informatique et en Automatique, Keio University). All - * Rights Reserved. This program is distributed under the W3C's Software - * Intellectual Property License. This program is distributed in the - * hope that it will be useful, but WITHOUT ANY WARRANTY; without even - * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more - * details. - */ - -package org.w3c.dom.smil; - -/** - * This interface represents the SMIL <code>animateColor</code> element. - */ -public interface SMILAnimateColorElement extends SMILAnimation { -} - diff --git a/QKSMS/src/main/java/org/w3c/dom/smil/SMILAnimateElement.java b/QKSMS/src/main/java/org/w3c/dom/smil/SMILAnimateElement.java deleted file mode 100644 index 9393e00c5..000000000 --- a/QKSMS/src/main/java/org/w3c/dom/smil/SMILAnimateElement.java +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright (c) 2000 World Wide Web Consortium, - * (Massachusetts Institute of Technology, Institut National de - * Recherche en Informatique et en Automatique, Keio University). All - * Rights Reserved. This program is distributed under the W3C's Software - * Intellectual Property License. This program is distributed in the - * hope that it will be useful, but WITHOUT ANY WARRANTY; without even - * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more - * details. - */ - -package org.w3c.dom.smil; - -/** - * This interface represents the SMIL <code>animate</code> element. - */ -public interface SMILAnimateElement extends SMILAnimation { -} - diff --git a/QKSMS/src/main/java/org/w3c/dom/smil/SMILAnimateMotionElement.java b/QKSMS/src/main/java/org/w3c/dom/smil/SMILAnimateMotionElement.java deleted file mode 100644 index dcac1cde8..000000000 --- a/QKSMS/src/main/java/org/w3c/dom/smil/SMILAnimateMotionElement.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (c) 2000 World Wide Web Consortium, - * (Massachusetts Institute of Technology, Institut National de - * Recherche en Informatique et en Automatique, Keio University). All - * Rights Reserved. This program is distributed under the W3C's Software - * Intellectual Property License. This program is distributed in the - * hope that it will be useful, but WITHOUT ANY WARRANTY; without even - * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more - * details. - */ - -package org.w3c.dom.smil; - -import org.w3c.dom.DOMException; - -/** - * This interface present the <code>animationMotion</code> element in SMIL. - */ -public interface SMILAnimateMotionElement extends SMILAnimateElement { - /** - * Specifies the curve that describes the attribute value as a function - * of time. Check with the SVG spec for better support - * @exception org.w3c.dom.DOMException - * NO_MODIFICATION_ALLOWED_ERR: Raised if this attribute is readonly. - */ - public String getPath(); - public void setPath(String path) - throws DOMException; - - /** - * Specifies the origin of motion for the animation. - * @exception org.w3c.dom.DOMException - * NO_MODIFICATION_ALLOWED_ERR: Raised if this attribute is readonly. - */ - public String getOrigin(); - public void setOrigin(String origin) - throws DOMException; - -} - diff --git a/QKSMS/src/main/java/org/w3c/dom/smil/SMILAnimation.java b/QKSMS/src/main/java/org/w3c/dom/smil/SMILAnimation.java deleted file mode 100644 index 9d08538c8..000000000 --- a/QKSMS/src/main/java/org/w3c/dom/smil/SMILAnimation.java +++ /dev/null @@ -1,124 +0,0 @@ -/* - * Copyright (c) 2000 World Wide Web Consortium, - * (Massachusetts Institute of Technology, Institut National de - * Recherche en Informatique et en Automatique, Keio University). All - * Rights Reserved. This program is distributed under the W3C's Software - * Intellectual Property License. This program is distributed in the - * hope that it will be useful, but WITHOUT ANY WARRANTY; without even - * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more - * details. - */ - -package org.w3c.dom.smil; - -import org.w3c.dom.DOMException; - -/** - * This interface define the set of animation extensions for SMIL. The - * attributes will go in a XLink interface. - */ -public interface SMILAnimation extends SMILElement, ElementTargetAttributes, ElementTime, ElementTimeControl { - // additiveTypes - public static final short ADDITIVE_REPLACE = 0; - public static final short ADDITIVE_SUM = 1; - - /** - * A code representing the value of the additive attribute, as defined - * above. Default value is <code>ADDITIVE_REPLACE</code> . - * @exception org.w3c.dom.DOMException - * NO_MODIFICATION_ALLOWED_ERR: Raised if this attribute is readonly. - */ - public short getAdditive(); - public void setAdditive(short additive) - throws DOMException; - - // accumulateTypes - public static final short ACCUMULATE_NONE = 0; - public static final short ACCUMULATE_SUM = 1; - - /** - * A code representing the value of the accumulate attribute, as defined - * above. Default value is <code>ACCUMULATE_NONE</code> . - * @exception org.w3c.dom.DOMException - * NO_MODIFICATION_ALLOWED_ERR: Raised if this attribute is readonly. - */ - public short getAccumulate(); - public void setAccumulate(short accumulate) - throws DOMException; - - // calcModeTypes - public static final short CALCMODE_DISCRETE = 0; - public static final short CALCMODE_LINEAR = 1; - public static final short CALCMODE_PACED = 2; - public static final short CALCMODE_SPLINE = 3; - - /** - * A code representing the value of the calcMode attribute, as defined - * above. - * @exception org.w3c.dom.DOMException - * NO_MODIFICATION_ALLOWED_ERR: Raised if this attribute is readonly. - */ - public short getCalcMode(); - public void setCalcMode(short calcMode) - throws DOMException; - - /** - * A <code>DOMString</code> representing the value of the keySplines - * attribute. Need an interface a point (x1,y1,x2,y2) - * @exception org.w3c.dom.DOMException - * NO_MODIFICATION_ALLOWED_ERR: Raised if this attribute is readonly. - */ - public String getKeySplines(); - public void setKeySplines(String keySplines) - throws DOMException; - - /** - * A list of the time value of the keyTimes attribute. - * @exception org.w3c.dom.DOMException - * NO_MODIFICATION_ALLOWED_ERR: Raised if this attribute is readonly. - */ - public TimeList getKeyTimes(); - public void setKeyTimes(TimeList keyTimes) - throws DOMException; - - /** - * A <code>DOMString</code> representing the value of the values - * attribute. - * @exception org.w3c.dom.DOMException - * NO_MODIFICATION_ALLOWED_ERR: Raised if this attribute is readonly. - */ - public String getValues(); - public void setValues(String values) - throws DOMException; - - /** - * A <code>DOMString</code> representing the value of the from attribute. - * - * @exception org.w3c.dom.DOMException - * NO_MODIFICATION_ALLOWED_ERR: Raised if this attribute is readonly. - */ - public String getFrom(); - public void setFrom(String from) - throws DOMException; - - /** - * A <code>DOMString</code> representing the value of the to attribute. - * @exception org.w3c.dom.DOMException - * NO_MODIFICATION_ALLOWED_ERR: Raised if this attribute is readonly. - */ - public String getTo(); - public void setTo(String to) - throws DOMException; - - /** - * A <code>DOMString</code> representing the value of the by attribute. - * @exception org.w3c.dom.DOMException - * NO_MODIFICATION_ALLOWED_ERR: Raised if this attribute is readonly. - */ - public String getBy(); - public void setBy(String by) - throws DOMException; - -} - diff --git a/QKSMS/src/main/java/org/w3c/dom/smil/SMILDocument.java b/QKSMS/src/main/java/org/w3c/dom/smil/SMILDocument.java deleted file mode 100644 index e14681067..000000000 --- a/QKSMS/src/main/java/org/w3c/dom/smil/SMILDocument.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (c) 2000 World Wide Web Consortium, - * (Massachusetts Institute of Technology, Institut National de - * Recherche en Informatique et en Automatique, Keio University). All - * Rights Reserved. This program is distributed under the W3C's Software - * Intellectual Property License. This program is distributed in the - * hope that it will be useful, but WITHOUT ANY WARRANTY; without even - * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more - * details. - * - * Difference to the original copy of this file: - * 1) ADD public SMILElement getHead(); - * 2) ADD public SMILElement getBody(); - * 3) ADD public SMILLayoutElement getLayout(); - */ - -package org.w3c.dom.smil; - -import org.w3c.dom.Document; - -/** - * A SMIL document is the root of the SMIL Hierarchy and holds the entire - * content. Beside providing access to the hierarchy, it also provides some - * convenience methods for accessing certain sets of information from the - * document. Cover document timing, document locking?, linking modality and - * any other document level issues. Are there issues with nested SMIL files? - * Is it worth talking about different document scenarios, corresponding to - * differing profiles? E.g. Standalone SMIL, HTML integration, etc. - */ -public interface SMILDocument extends Document, ElementSequentialTimeContainer { - - /** - * Returns the element that contains the layout node of this document, - * i.e. the <code>HEAD</code> element. - */ - public SMILElement getHead(); - - /** - * Returns the element that contains the par's of the document, i.e. the - * <code>BODY</code> element. - */ - public SMILElement getBody(); - - /** - * Returns the element that contains the layout information of the presentation, - * i.e. the <code>LAYOUT</code> element. - */ - public SMILLayoutElement getLayout(); -} - diff --git a/QKSMS/src/main/java/org/w3c/dom/smil/SMILElement.java b/QKSMS/src/main/java/org/w3c/dom/smil/SMILElement.java deleted file mode 100644 index 6e689dfd6..000000000 --- a/QKSMS/src/main/java/org/w3c/dom/smil/SMILElement.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (c) 2000 World Wide Web Consortium, - * (Massachusetts Institute of Technology, Institut National de - * Recherche en Informatique et en Automatique, Keio University). All - * Rights Reserved. This program is distributed under the W3C's Software - * Intellectual Property License. This program is distributed in the - * hope that it will be useful, but WITHOUT ANY WARRANTY; without even - * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more - * details. - */ - -package org.w3c.dom.smil; - -import org.w3c.dom.DOMException; -import org.w3c.dom.Element; - -/** - * The <code>SMILElement</code> interface is the base for all SMIL element - * types. It follows the model of the <code>HTMLElement</code> in the HTML - * DOM, extending the base <code>Element</code> class to denote SMIL-specific - * elements. - * <p> Note that the <code>SMILElement</code> interface overlaps with the - * <code>HTMLElement</code> interface. In practice, an integrated document - * profile that include HTML and SMIL modules will effectively implement both - * interfaces (see also the DOM documentation discussion of Inheritance vs - * Flattened Views of the API ). // etc. This needs attention - */ -public interface SMILElement extends Element { - /** - * The unique id. - * @exception org.w3c.dom.DOMException - * NO_MODIFICATION_ALLOWED_ERR: Raised if this attribute is readonly. - */ - public String getId(); - public void setId(String id) - throws DOMException; - -} - diff --git a/QKSMS/src/main/java/org/w3c/dom/smil/SMILLayoutElement.java b/QKSMS/src/main/java/org/w3c/dom/smil/SMILLayoutElement.java deleted file mode 100644 index d812dac7b..000000000 --- a/QKSMS/src/main/java/org/w3c/dom/smil/SMILLayoutElement.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (c) 2000 World Wide Web Consortium, - * (Massachusetts Institute of Technology, Institut National de - * Recherche en Informatique et en Automatique, Keio University). All - * Rights Reserved. This program is distributed under the W3C's Software - * Intellectual Property License. This program is distributed in the - * hope that it will be useful, but WITHOUT ANY WARRANTY; without even - * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more - * details. - * - * Difference to the original copy of this file: - * 1) ADD public SMILRootLayoutElement getRootLayout(); - * 2) ADD public NodeList getRegions(); - */ - -package org.w3c.dom.smil; - -import org.w3c.dom.NodeList; - -/** - * Declares layout type for the document. See the LAYOUT element definition . - * - */ -public interface SMILLayoutElement extends SMILElement { - /** - * The mime type of the layout langage used in this layout element.The - * default value of the type attribute is "text/smil-basic-layout". - */ - public String getType(); - - /** - * <code>true</code> if the player can understand the mime type, - * <code>false</code> otherwise. - */ - public boolean getResolved(); - - /** - * Returns the root layout element of this document. - */ - public SMILRootLayoutElement getRootLayout(); - - /** - * Return the region elements of this document. - */ - public NodeList getRegions(); -} - diff --git a/QKSMS/src/main/java/org/w3c/dom/smil/SMILMediaElement.java b/QKSMS/src/main/java/org/w3c/dom/smil/SMILMediaElement.java deleted file mode 100644 index 5d89679ad..000000000 --- a/QKSMS/src/main/java/org/w3c/dom/smil/SMILMediaElement.java +++ /dev/null @@ -1,157 +0,0 @@ -/* - * Copyright (c) 2000 World Wide Web Consortium, - * (Massachusetts Institute of Technology, Institut National de - * Recherche en Informatique et en Automatique, Keio University). All - * Rights Reserved. This program is distributed under the W3C's Software - * Intellectual Property License. This program is distributed in the - * hope that it will be useful, but WITHOUT ANY WARRANTY; without even - * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more - * details. - */ - -package org.w3c.dom.smil; - -import org.w3c.dom.DOMException; - -/** - * Declares media content. - */ -public interface SMILMediaElement extends ElementTime, SMILElement { - /** - * See the abstract attribute from . - * @exception org.w3c.dom.DOMException - * NO_MODIFICATION_ALLOWED_ERR: Raised if this attribute is readonly. - */ - public String getAbstractAttr(); - public void setAbstractAttr(String abstractAttr) - throws DOMException; - - /** - * See the alt attribute from . - * @exception org.w3c.dom.DOMException - * NO_MODIFICATION_ALLOWED_ERR: Raised if this attribute is readonly. - */ - public String getAlt(); - public void setAlt(String alt) - throws DOMException; - - /** - * See the author attribute from . - * @exception org.w3c.dom.DOMException - * NO_MODIFICATION_ALLOWED_ERR: Raised if this attribute is readonly. - */ - public String getAuthor(); - public void setAuthor(String author) - throws DOMException; - - /** - * See the clipBegin attribute from . - * @exception org.w3c.dom.DOMException - * NO_MODIFICATION_ALLOWED_ERR: Raised if this attribute is readonly. - */ - public String getClipBegin(); - public void setClipBegin(String clipBegin) - throws DOMException; - - /** - * See the clipEnd attribute from . - * @exception org.w3c.dom.DOMException - * NO_MODIFICATION_ALLOWED_ERR: Raised if this attribute is readonly. - */ - public String getClipEnd(); - public void setClipEnd(String clipEnd) - throws DOMException; - - /** - * See the copyright attribute from . - * @exception org.w3c.dom.DOMException - * NO_MODIFICATION_ALLOWED_ERR: Raised if this attribute is readonly. - */ - public String getCopyright(); - public void setCopyright(String copyright) - throws DOMException; - - /** - * See the longdesc attribute from . - * @exception org.w3c.dom.DOMException - * NO_MODIFICATION_ALLOWED_ERR: Raised if this attribute is readonly. - */ - public String getLongdesc(); - public void setLongdesc(String longdesc) - throws DOMException; - - /** - * See the port attribute from . - * @exception org.w3c.dom.DOMException - * NO_MODIFICATION_ALLOWED_ERR: Raised if this attribute is readonly. - */ - public String getPort(); - public void setPort(String port) - throws DOMException; - - /** - * See the readIndex attribute from . - * @exception org.w3c.dom.DOMException - * NO_MODIFICATION_ALLOWED_ERR: Raised if this attribute is readonly. - */ - public String getReadIndex(); - public void setReadIndex(String readIndex) - throws DOMException; - - /** - * See the rtpformat attribute from . - * @exception org.w3c.dom.DOMException - * NO_MODIFICATION_ALLOWED_ERR: Raised if this attribute is readonly. - */ - public String getRtpformat(); - public void setRtpformat(String rtpformat) - throws DOMException; - - /** - * See the src attribute from . - * @exception org.w3c.dom.DOMException - * NO_MODIFICATION_ALLOWED_ERR: Raised if this attribute is readonly. - */ - public String getSrc(); - public void setSrc(String src) - throws DOMException; - - /** - * See the stripRepeat attribute from . - * @exception org.w3c.dom.DOMException - * NO_MODIFICATION_ALLOWED_ERR: Raised if this attribute is readonly. - */ - public String getStripRepeat(); - public void setStripRepeat(String stripRepeat) - throws DOMException; - - /** - * See the title attribute from . - * @exception org.w3c.dom.DOMException - * NO_MODIFICATION_ALLOWED_ERR: Raised if this attribute is readonly. - */ - public String getTitle(); - public void setTitle(String title) - throws DOMException; - - /** - * See the transport attribute from . - * @exception org.w3c.dom.DOMException - * NO_MODIFICATION_ALLOWED_ERR: Raised if this attribute is readonly. - */ - public String getTransport(); - public void setTransport(String transport) - throws DOMException; - - /** - * See the type attribute from . - * @exception org.w3c.dom.DOMException - * NO_MODIFICATION_ALLOWED_ERR: Raised if this attribute is readonly. - */ - public String getType(); - public void setType(String type) - throws DOMException; - -} - diff --git a/QKSMS/src/main/java/org/w3c/dom/smil/SMILParElement.java b/QKSMS/src/main/java/org/w3c/dom/smil/SMILParElement.java deleted file mode 100644 index 0b3da84ba..000000000 --- a/QKSMS/src/main/java/org/w3c/dom/smil/SMILParElement.java +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (C) 2007-2008 Esmertec AG. - * Copyright (C) 2007-2008 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.w3c.dom.smil; - -public interface SMILParElement extends ElementParallelTimeContainer, - SMILElement { - -} diff --git a/QKSMS/src/main/java/org/w3c/dom/smil/SMILRefElement.java b/QKSMS/src/main/java/org/w3c/dom/smil/SMILRefElement.java deleted file mode 100644 index adeb2b354..000000000 --- a/QKSMS/src/main/java/org/w3c/dom/smil/SMILRefElement.java +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright (c) 2000 World Wide Web Consortium, - * (Massachusetts Institute of Technology, Institut National de - * Recherche en Informatique et en Automatique, Keio University). All - * Rights Reserved. This program is distributed under the W3C's Software - * Intellectual Property License. This program is distributed in the - * hope that it will be useful, but WITHOUT ANY WARRANTY; without even - * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more - * details. - */ - -package org.w3c.dom.smil; - -/** - * // audio, video, ... - */ -public interface SMILRefElement extends SMILMediaElement { -} - diff --git a/QKSMS/src/main/java/org/w3c/dom/smil/SMILRegionElement.java b/QKSMS/src/main/java/org/w3c/dom/smil/SMILRegionElement.java deleted file mode 100644 index 28f8d013d..000000000 --- a/QKSMS/src/main/java/org/w3c/dom/smil/SMILRegionElement.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (c) 2000 World Wide Web Consortium, - * (Massachusetts Institute of Technology, Institut National de - * Recherche en Informatique et en Automatique, Keio University). All - * Rights Reserved. This program is distributed under the W3C's Software - * Intellectual Property License. This program is distributed in the - * hope that it will be useful, but WITHOUT ANY WARRANTY; without even - * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more - * details. - * - * Difference to the original copy of this file: - * 1) ADD public int getLeft(); - * 2) ADD public void setLeft(int top) throws DOMException; - * 3) MODIFY public String getTop() to public int getTop(); - * 4) MODIFY public void setTop(String) to public void setTop(int); - */ - -package org.w3c.dom.smil; - -import org.w3c.dom.DOMException; - -/** - * Controls the position, size and scaling of media object elements. See the - * region element definition . - */ -public interface SMILRegionElement extends SMILElement, ElementLayout { - /** - * @exception org.w3c.dom.DOMException - * NO_MODIFICATION_ALLOWED_ERR: Raised if this attribute is readonly. - */ - public String getFit(); - public void setFit(String fit) - throws DOMException; - - /** - * @exception org.w3c.dom.DOMException - * NO_MODIFICATION_ALLOWED_ERR: Raised if this attribute is readonly. - */ - public int getLeft(); - public void setLeft(int top) - throws DOMException; - - /** - * @exception org.w3c.dom.DOMException - * NO_MODIFICATION_ALLOWED_ERR: Raised if this attribute is readonly. - */ - public int getTop(); - public void setTop(int top) - throws DOMException; - - /** - * @exception org.w3c.dom.DOMException - * NO_MODIFICATION_ALLOWED_ERR: Raised if this attribute is readonly. - */ - public int getZIndex(); - public void setZIndex(int zIndex) - throws DOMException; - -} - diff --git a/QKSMS/src/main/java/org/w3c/dom/smil/SMILRegionInterface.java b/QKSMS/src/main/java/org/w3c/dom/smil/SMILRegionInterface.java deleted file mode 100644 index b5e43c3b2..000000000 --- a/QKSMS/src/main/java/org/w3c/dom/smil/SMILRegionInterface.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (c) 2000 World Wide Web Consortium, - * (Massachusetts Institute of Technology, Institut National de - * Recherche en Informatique et en Automatique, Keio University). All - * Rights Reserved. This program is distributed under the W3C's Software - * Intellectual Property License. This program is distributed in the - * hope that it will be useful, but WITHOUT ANY WARRANTY; without even - * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more - * details. - */ - -package org.w3c.dom.smil; - -/** - * Declares rendering surface for an element. See the region attribute - * definition . - */ -public interface SMILRegionInterface { - /** - */ - public SMILRegionElement getRegion(); - public void setRegion(SMILRegionElement region); - -} - diff --git a/QKSMS/src/main/java/org/w3c/dom/smil/SMILRegionMediaElement.java b/QKSMS/src/main/java/org/w3c/dom/smil/SMILRegionMediaElement.java deleted file mode 100644 index 59493cded..000000000 --- a/QKSMS/src/main/java/org/w3c/dom/smil/SMILRegionMediaElement.java +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright (C) 2007-2008 Esmertec AG. - * Copyright (C) 2007-2008 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.w3c.dom.smil; - -public interface SMILRegionMediaElement extends SMILMediaElement, - SMILRegionInterface { -} diff --git a/QKSMS/src/main/java/org/w3c/dom/smil/SMILRootLayoutElement.java b/QKSMS/src/main/java/org/w3c/dom/smil/SMILRootLayoutElement.java deleted file mode 100644 index 327ecd6b2..000000000 --- a/QKSMS/src/main/java/org/w3c/dom/smil/SMILRootLayoutElement.java +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright (c) 2000 World Wide Web Consortium, - * (Massachusetts Institute of Technology, Institut National de - * Recherche en Informatique et en Automatique, Keio University). All - * Rights Reserved. This program is distributed under the W3C's Software - * Intellectual Property License. This program is distributed in the - * hope that it will be useful, but WITHOUT ANY WARRANTY; without even - * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more - * details. - */ - -package org.w3c.dom.smil; - -/** - * Declares layout properties for the root-layout element. See the - * root-layout element definition . - */ -public interface SMILRootLayoutElement extends SMILElement, ElementLayout { -} - diff --git a/QKSMS/src/main/java/org/w3c/dom/smil/SMILSetElement.java b/QKSMS/src/main/java/org/w3c/dom/smil/SMILSetElement.java deleted file mode 100644 index 8e0b1b72f..000000000 --- a/QKSMS/src/main/java/org/w3c/dom/smil/SMILSetElement.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright (c) 2000 World Wide Web Consortium, - * (Massachusetts Institute of Technology, Institut National de - * Recherche en Informatique et en Automatique, Keio University). All - * Rights Reserved. This program is distributed under the W3C's Software - * Intellectual Property License. This program is distributed in the - * hope that it will be useful, but WITHOUT ANY WARRANTY; without even - * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more - * details. - */ - -package org.w3c.dom.smil; - -/** - * This interface represents the set element. - */ -public interface SMILSetElement extends ElementTimeControl, ElementTime, ElementTargetAttributes, SMILElement { - /** - * Specifies the value for the attribute during the duration of this - * element. - */ - public String getTo(); - public void setTo(String to); - -} - diff --git a/QKSMS/src/main/java/org/w3c/dom/smil/SMILSwitchElement.java b/QKSMS/src/main/java/org/w3c/dom/smil/SMILSwitchElement.java deleted file mode 100644 index 27abb91cf..000000000 --- a/QKSMS/src/main/java/org/w3c/dom/smil/SMILSwitchElement.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (c) 2000 World Wide Web Consortium, - * (Massachusetts Institute of Technology, Institut National de - * Recherche en Informatique et en Automatique, Keio University). All - * Rights Reserved. This program is distributed under the W3C's Software - * Intellectual Property License. This program is distributed in the - * hope that it will be useful, but WITHOUT ANY WARRANTY; without even - * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more - * details. - */ - -package org.w3c.dom.smil; - -import org.w3c.dom.Element; - -/** - * Defines a block of content control. See the switch element definition . - */ -public interface SMILSwitchElement extends SMILElement { - /** - * Returns the slected element at runtime. <code>null</code> if the - * selected element is not yet available. - * @return The selected <code>Element</code> for thisd <code>switch</code> - * element. - */ - public Element getSelectedElement(); - -} - diff --git a/QKSMS/src/main/java/org/w3c/dom/smil/SMILTopLayoutElement.java b/QKSMS/src/main/java/org/w3c/dom/smil/SMILTopLayoutElement.java deleted file mode 100644 index 26214191b..000000000 --- a/QKSMS/src/main/java/org/w3c/dom/smil/SMILTopLayoutElement.java +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright (c) 2000 World Wide Web Consortium, - * (Massachusetts Institute of Technology, Institut National de - * Recherche en Informatique et en Automatique, Keio University). All - * Rights Reserved. This program is distributed under the W3C's Software - * Intellectual Property License. This program is distributed in the - * hope that it will be useful, but WITHOUT ANY WARRANTY; without even - * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more - * details. - */ - -package org.w3c.dom.smil; - -/** - * Declares layout properties for the top-layout element. See the top-layout - * element definition . - */ -public interface SMILTopLayoutElement extends SMILElement, ElementLayout { -} - diff --git a/QKSMS/src/main/java/org/w3c/dom/smil/Time.java b/QKSMS/src/main/java/org/w3c/dom/smil/Time.java deleted file mode 100644 index 7af3c6558..000000000 --- a/QKSMS/src/main/java/org/w3c/dom/smil/Time.java +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Copyright (c) 2000 World Wide Web Consortium, - * (Massachusetts Institute of Technology, Institut National de - * Recherche en Informatique et en Automatique, Keio University). All - * Rights Reserved. This program is distributed under the W3C's Software - * Intellectual Property License. This program is distributed in the - * hope that it will be useful, but WITHOUT ANY WARRANTY; without even - * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more - * details. - */ - -package org.w3c.dom.smil; - -import org.w3c.dom.DOMException; -import org.w3c.dom.Element; - -/** - * The <code>Time</code> interface is a datatype that represents times within - * the timegraph. A <code>Time</code> has a type, key values to describe the - * time, and a boolean to indicate whether the values are currently - * unresolved. Still need to address the wallclock values. - */ -public interface Time { - /** - * A boolean indicating whether the current <code>Time</code> has been - * fully resolved to the document schedule. Note that for this to be - * true, the current <code>Time</code> must be defined (not indefinite), - * the syncbase and all <code>Time</code> 's that the syncbase depends on - * must be defined (not indefinite), and the begin <code>Time</code> of - * all ascendent time containers of this element and all <code>Time</code> - * elements that this depends upon must be defined (not indefinite). - * <br> If this <code>Time</code> is based upon an event, this - * <code>Time</code> will only be resolved once the specified event has - * happened, subject to the constraints of the time container. - * <br> Note that this may change from true to false when the parent time - * container ends its simple duration (including when it repeats or - * restarts). - */ - public boolean getResolved(); - - /** - * The clock value in seconds relative to the parent time container begin. - * This indicates the resolved time relationship to the parent time - * container. This is only valid if resolved is true. - */ - public double getResolvedOffset(); - - // TimeTypes - public static final short SMIL_TIME_INDEFINITE = 0; - public static final short SMIL_TIME_OFFSET = 1; - public static final short SMIL_TIME_SYNC_BASED = 2; - public static final short SMIL_TIME_EVENT_BASED = 3; - public static final short SMIL_TIME_WALLCLOCK = 4; - public static final short SMIL_TIME_MEDIA_MARKER = 5; - - /** - * A code representing the type of the underlying object, as defined - * above. - */ - public short getTimeType(); - - /** - * The clock value in seconds relative to the syncbase or eventbase. - * Default value is <code>0</code> . - * @exception org.w3c.dom.DOMException - * NO_MODIFICATION_ALLOWED_ERR: Raised on attempts to modify this - * readonly attribute. - */ - public double getOffset(); - public void setOffset(double offset) - throws DOMException; - - /** - * The base element for a sync-based or event-based time. - * @exception org.w3c.dom.DOMException - * NO_MODIFICATION_ALLOWED_ERR: Raised on attempts to modify this - * readonly attribute. - */ - public Element getBaseElement(); - public void setBaseElement(Element baseElement) - throws DOMException; - - /** - * If <code>true</code> , indicates that a sync-based time is relative to - * the begin of the baseElement. If <code>false</code> , indicates that a - * sync-based time is relative to the active end of the baseElement. - * @exception org.w3c.dom.DOMException - * NO_MODIFICATION_ALLOWED_ERR: Raised on attempts to modify this - * readonly attribute. - */ - public boolean getBaseBegin(); - public void setBaseBegin(boolean baseBegin) - throws DOMException; - - /** - * The name of the event for an event-based time. Default value is - * <code>null</code> . - * @exception org.w3c.dom.DOMException - * NO_MODIFICATION_ALLOWED_ERR: Raised on attempts to modify this - * readonly attribute. - */ - public String getEvent(); - public void setEvent(String event) - throws DOMException; - - /** - * The name of the marker from the media element, for media marker times. - * Default value is <code>null</code> . - * @exception org.w3c.dom.DOMException - * NO_MODIFICATION_ALLOWED_ERR: Raised on attempts to modify this - * readonly attribute. - */ - public String getMarker(); - public void setMarker(String marker) - throws DOMException; - -} - diff --git a/QKSMS/src/main/java/org/w3c/dom/smil/TimeEvent.java b/QKSMS/src/main/java/org/w3c/dom/smil/TimeEvent.java deleted file mode 100644 index a79c4ca05..000000000 --- a/QKSMS/src/main/java/org/w3c/dom/smil/TimeEvent.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (c) 2000 World Wide Web Consortium, - * (Massachusetts Institute of Technology, Institut National de - * Recherche en Informatique et en Automatique, Keio University). All - * Rights Reserved. This program is distributed under the W3C's Software - * Intellectual Property License. This program is distributed in the - * hope that it will be useful, but WITHOUT ANY WARRANTY; without even - * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more - * details. - */ - -package org.w3c.dom.smil; - -import org.w3c.dom.events.Event; -import org.w3c.dom.views.AbstractView; - -/** - * The <code>TimeEvent</code> interface provides specific contextual - * information associated with Time events. - */ -public interface TimeEvent extends Event { - /** - * The <code>view</code> attribute identifies the - * <code>AbstractView</code> from which the event was generated. - */ - public AbstractView getView(); - - /** - * Specifies some detail information about the <code>Event</code> , - * depending on the type of event. - */ - public int getDetail(); - - /** - * The <code>initTimeEvent</code> method is used to initialize the value - * of a <code>TimeEvent</code> created through the - * <code>DocumentEvent</code> interface. This method may only be called - * before the <code>TimeEvent</code> has been dispatched via the - * <code>dispatchEvent</code> method, though it may be called multiple - * times during that phase if necessary. If called multiple times, the - * final invocation takes precedence. - * @param typeArg Specifies the event type. - * @param viewArg Specifies the <code>Event</code> 's - * <code>AbstractView</code> . - * @param detailArg Specifies the <code>Event</code> 's detail. - */ - public void initTimeEvent(String typeArg, - AbstractView viewArg, - int detailArg); - -} - diff --git a/QKSMS/src/main/java/org/w3c/dom/smil/TimeList.java b/QKSMS/src/main/java/org/w3c/dom/smil/TimeList.java deleted file mode 100644 index 7cec133fa..000000000 --- a/QKSMS/src/main/java/org/w3c/dom/smil/TimeList.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (c) 2000 World Wide Web Consortium, - * (Massachusetts Institute of Technology, Institut National de - * Recherche en Informatique et en Automatique, Keio University). All - * Rights Reserved. This program is distributed under the W3C's Software - * Intellectual Property License. This program is distributed in the - * hope that it will be useful, but WITHOUT ANY WARRANTY; without even - * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - * PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/ for more - * details. - */ - -package org.w3c.dom.smil; - -/** - * The <code>TimeList</code> interface provides the abstraction of an ordered - * collection of times, without defining or constraining how this collection - * is implemented. - * <p> The items in the <code>TimeList</code> are accessible via an integral - * index, starting from 0. - */ -public interface TimeList { - /** - * Returns the <code>index</code> th item in the collection. If - * <code>index</code> is greater than or equal to the number of times in - * the list, this returns <code>null</code> . - * @param index Index into the collection. - * @return The time at the <code>index</code> th position in the - * <code>TimeList</code> , or <code>null</code> if that is not a valid - * index. - */ - public Time item(int index); - - /** - * The number of times in the list. The range of valid child time indices - * is 0 to <code>length-1</code> inclusive. - */ - public int getLength(); - -} - diff --git a/QKSMS/src/main/java/org/w3c/dom/views/AbstractView.java b/QKSMS/src/main/java/org/w3c/dom/views/AbstractView.java deleted file mode 100644 index 97e8f0e2b..000000000 --- a/QKSMS/src/main/java/org/w3c/dom/views/AbstractView.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright (c) 2000 World Wide Web Consortium, - * (Massachusetts Institute of Technology, Institut National de - * Recherche en Informatique et en Automatique, Keio University). All - * Rights Reserved. This program is distributed under the W3C's Software - * Intellectual Property License. This program is distributed in the - * hope that it will be useful, but WITHOUT ANY WARRANTY; without even - * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - * PURPOSE. - * See W3C License http://www.w3.org/Consortium/Legal/ for more details. - */ - -package org.w3c.dom.views; - -/** - * A base interface that all views shall derive from. - * <p>See also the <a href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Views-20001113'>Document Object Model (DOM) Level 2 Views Specification</a>. - * @since DOM Level 2 - */ -public interface AbstractView { - /** - * The source <code>DocumentView</code> of which this is an - * <code>AbstractView</code>. - */ - public DocumentView getDocument(); - -} diff --git a/QKSMS/src/main/java/org/w3c/dom/views/DocumentView.java b/QKSMS/src/main/java/org/w3c/dom/views/DocumentView.java deleted file mode 100644 index 2cb9eebb8..000000000 --- a/QKSMS/src/main/java/org/w3c/dom/views/DocumentView.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (c) 2000 World Wide Web Consortium, - * (Massachusetts Institute of Technology, Institut National de - * Recherche en Informatique et en Automatique, Keio University). All - * Rights Reserved. This program is distributed under the W3C's Software - * Intellectual Property License. This program is distributed in the - * hope that it will be useful, but WITHOUT ANY WARRANTY; without even - * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - * PURPOSE. - * See W3C License http://www.w3.org/Consortium/Legal/ for more details. - */ - -package org.w3c.dom.views; - -/** - * The <code>DocumentView</code> interface is implemented by - * <code>Document</code> objects in DOM implementations supporting DOM - * Views. It provides an attribute to retrieve the default view of a - * document. - * <p>See also the <a href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Views-20001113'>Document Object Model (DOM) Level 2 Views Specification</a>. - * @since DOM Level 2 - */ -public interface DocumentView { - /** - * The default <code>AbstractView</code> for this <code>Document</code>, - * or <code>null</code> if none available. - */ - public AbstractView getDefaultView(); - -} diff --git a/QKSMS/src/main/res/color/text_primary_dark.xml b/QKSMS/src/main/res/color/text_primary_dark.xml deleted file mode 100644 index ca0b4bdf7..000000000 --- a/QKSMS/src/main/res/color/text_primary_dark.xml +++ /dev/null @@ -1,6 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> - -<selector xmlns:android="http://schemas.android.com/apk/res/android"> - <item android:state_enabled="false" android:color="@color/theme_dark_text_secondary" /> - <item android:color="@color/theme_dark_text_primary" /> -</selector> \ No newline at end of file diff --git a/QKSMS/src/main/res/color/text_primary_light.xml b/QKSMS/src/main/res/color/text_primary_light.xml deleted file mode 100644 index 4b287c4ee..000000000 --- a/QKSMS/src/main/res/color/text_primary_light.xml +++ /dev/null @@ -1,6 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> - -<selector xmlns:android="http://schemas.android.com/apk/res/android"> - <item android:state_enabled="false" android:color="@color/theme_light_text_secondary" /> - <item android:color="@color/theme_light_text_primary" /> -</selector> \ No newline at end of file diff --git a/QKSMS/src/main/res/drawable-nodpi/widget_preview.png b/QKSMS/src/main/res/drawable-nodpi/widget_preview.png deleted file mode 100755 index 8fa118773a748e2f451f8f47595f47ea631383a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58227 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 diff --git a/QKSMS/src/main/res/drawable-v21/ripple.xml b/QKSMS/src/main/res/drawable-v21/ripple.xml deleted file mode 100644 index ce3a60c18..000000000 --- a/QKSMS/src/main/res/drawable-v21/ripple.xml +++ /dev/null @@ -1,9 +0,0 @@ -<ripple xmlns:android="http://schemas.android.com/apk/res/android" - android:color="@color/ripple_material_light"> - <item android:id="@android:id/mask"> - <shape android:shape="rectangle"> - <solid android:color="@android:color/white" /> - <corners android:radius="2dp" /> - </shape> - </item> -</ripple> diff --git a/QKSMS/src/main/res/drawable-v21/ripple_light.xml b/QKSMS/src/main/res/drawable-v21/ripple_light.xml deleted file mode 100644 index c9777e2aa..000000000 --- a/QKSMS/src/main/res/drawable-v21/ripple_light.xml +++ /dev/null @@ -1,9 +0,0 @@ -<ripple xmlns:android="http://schemas.android.com/apk/res/android" - android:color="@color/ripple_material_dark"> - <item android:id="@android:id/mask"> - <shape android:shape="rectangle"> - <solid android:color="@android:color/white" /> - <corners android:radius="2dp" /> - </shape> - </item> -</ripple> diff --git a/QKSMS/src/main/res/drawable-xhdpi/ic_swatch_selected.png b/QKSMS/src/main/res/drawable-xhdpi/ic_swatch_selected.png deleted file mode 100755 index 27a65ad0ce0ea8fd0176566d22ffc139576df937..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1767 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 JPDHLkV1htOHS7QY diff --git a/QKSMS/src/main/res/drawable-xhdpi/shadow_bottom.png b/QKSMS/src/main/res/drawable-xhdpi/shadow_bottom.png deleted file mode 100644 index 4569174a101045744e2d952c938f2890601600bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2868 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 SB0U%Y0000<MNUMnLSTZHY-%t7 diff --git a/QKSMS/src/main/res/drawable-xhdpi/shadow_left.png b/QKSMS/src/main/res/drawable-xhdpi/shadow_left.png deleted file mode 100644 index 82c71c2f280955778b1b314eaa929a984152a921..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2865 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 P00000NkvXXu0mjfWSMC2 diff --git a/QKSMS/src/main/res/drawable-xxhdpi/card_mask.9.png b/QKSMS/src/main/res/drawable-xxhdpi/card_mask.9.png deleted file mode 100755 index 629489267c52314f9e8217a7b82e6dafe833bb66..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 547 zcmV+;0^I$HP)<h;3K|Lk000e1NJLTq001=r001=z1^@s6;pU@o0005%Nkl<ZcmeI& z1&&%#6o6sI1sh-qwJ5%Z`a<e`bPIKl)#9l~YI~{2aa%zB^{<~0oM-oxlYHYd%#S_b z-q69rCD$?bAD*1vk2kh6)52p|*o$3AVojdlkI#|BF6@Pc$7o^Z`Ekb08r8)$6tOVN zx%=byQN%TL{fMgL6v8uv3=7=EG1R<>`ix76I3CkKE`m$=<W|&s<UEM!7nj8=r=y-D z=5<V;OYNCcQFpN9V~`A6!kt;8Zu%b6KknwVQ7^C*(5NN6m^A9OSNCu;-o{>!8}$j9 z00+si3_gt$b;*Dr8Fq10R1Fcsq9Ujbi#lphkPJIAD5`@EL!&m(=@)g~z#tiRy<b$p z@Tg*MR0|7+M=hWxqaGO?B*X5@C`(C{C8PE#iP|TlwkwI+E~BDKqN0DIRAKC&Z{|@x znMY{~vTb`+<Go)>{c%d=BMOy|{T?Zax+kNW8lO*Tc;;Ks_!`C4|K`=CA9KXes3ZDc zp;i4_x|mPM84{EmYt=(6TE_w&6vaDrD~YPteCMn4Vx9$LAH`EmJ6<x5?|2dO5ofXC z;lrOZ_~^whvMNe0?;<;jiXZ#^I=F^{L;L*-xQ33On;7LZ@dy_7U?&n->G|hZkibst lfrUqCI=VBHv9<Wo^Btnn%1=3nnbQCO002ovPDHLkV1lLY1|9$a diff --git a/QKSMS/src/main/res/drawable-xxhdpi/dialog_background.9.png b/QKSMS/src/main/res/drawable-xxhdpi/dialog_background.9.png deleted file mode 100755 index e184334690fe0c65dca587cbc63179bc17f0e81c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2231 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 diff --git a/QKSMS/src/main/res/drawable-xxhdpi/scrollbar.9.png b/QKSMS/src/main/res/drawable-xxhdpi/scrollbar.9.png deleted file mode 100755 index bffee4fde66a6d11156f2c5c0581b04c602231bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 269 zcmV+o0rLKdP)<h;3K|Lk000e1NJLTq001Na001Kh1^@s6`~|2W0002gNkl<ZcmeI0 zg^|Kw7(_Xz5u^j`paL3UoF=e7NE=8ExD<jei;N?Y#lM|-ae2{SLis{5#NZs;Z4|gU zkK{xuOvr@XVnQYa;EUu)nKViFK=ZIHOTKO*1Rzf8WP#IJ9JYyHRR}<eOyNFLl9US_ zWTIpO?-`S*R0u$rIPf2bgq1>BG7lg$Ct0OX4Z%}Y3bh16ZC64JTnP09LR}X!cs!v; zdt`2fssf?vOMmwIAET(~7z>IHY2ljG7p{+5{SZ{pvXTm#)u~O$ganw7vZrkWS_!7x T{Wi>p00000NkvXXu0mjfBmrlj diff --git a/QKSMS/src/main/res/drawable-xxhdpi/send_background.png b/QKSMS/src/main/res/drawable-xxhdpi/send_background.png deleted file mode 100755 index 08202a1a4ba716654b2531a324ec15cd8b408f24..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1543 zcmeAS@N?(olHy`uVBq!ia0vp^6F``Q8Ax83A=Jgdz&InoC&bk!v+(~Y7<?gc(|5%J zU{tl21o;IseEq}vPxLd}(VyF2@qAGc_S?PFw*AK6-#siQ>hFGiu=0NrXjgvbddJ)I zQ#{oy#LPb}klb+lhsS{nM-EP(HaA|#I?gOCD0W-w+Hm%^T_Q2h=R0WJt+?|-+E{7h z>eH$(H?2wT4fUNp=i1Gh>gZaVr#nm?WoIm{oH;2&V%6(Y3nxpZWZKt9HFSn9JU5qt zfqA;8i(^Oy<JmjSi&88_STDqGo0ofg+s$on-<faQYG1vkC|1StHT$}W$`%{<ef)Lx za&&j?#%Y{Ii&U>|uXz1(^>yjj1_~3_b(U@FIG5pT#Zdc5_VoG4YoDL?S(rrBR|qAx zDyj1a2WWk%SU+{zmUp&xO<LyC?=H4g^O`So`kkwv`{`a@`|VZFU!JHjy<<}6blm81 z!Rafk_OTD<&uNmDs%|Rr+^}4*&y@F)YqM{`vG8F3@T=E<JUDPdcGtVrf;YC!Ucl5D zd*ku%wyv62&Ag4STAMA{PS08&v~cy=4J)b|ym&(nPqO3}{e0$N(>ji+-6fGX=2vAs zSX<HmOzDb}QF~X+mjL1O{3{$bwcg@U2@FeUlRC>1;HKfT_K@O~Z;GbBSya~s?lzrb zFlj+qr=W=FtEG(PP8!c<xXCQ;kdBjjxVN!Miaqm0f-=|3g@(2o4{j^;a@IA}Og4F; z{G{@{fAgQ{6QQn)S4~(vtF2V|whixW_i2Gr=3W1PHyyJ*@L%P1Mog^G|I7spyg$M< z+!&J-|0K^=l6fRwEuz@9e`%Da(_e{ypJZEq==?WUd(<p8f2qLc!aol=k5)9<uL<Z8 z{j;z?=?c?<mGhH+Ff&{dS;FjK&-#*GV5veN!(5Ri!XANBO1A`0+5V$*(VB;<u0I9O zYn;+rrg_TbkceteR98@Uw#ZYPTN+-{Y8qYwB5WdVcT|PTgS)HW9NjB%wASiKZOqfZ zb$ga**guwWjhy^_a=lkz&?T`hq3M?%HSs<=WXPDwsC^}<Cu*kSd6T0ar+MZmE9-1+ zsO9=-`>*Jhm*AfHkMjc~!+9*0aI_zqbRfR%$+DAAMTH(P_F7Mf?P*e#+SZbD*JMp} z#K~~Bo!gd(9!;FYR@+;1-B&Cu&Ydwl<IHi5BikLE#cDKGoDBI{B;2)Pq2TdDUJt6B zHCEkpne1Tfbz@1{Y>mv0S-dCnj|$#f!*VBgu~}|;VB`0%rh8&tT-!>wvhXc-vX0Ao za98kJ*e+)7wyWm%_zq8c$EbDn5^uL&>@uh6`Uf{{G?>cSe~|6IfT-lBgY$g(ML)bb zwC!2ku65fZ|IOg_o+b8TQL9?y;;3~dr)1I|->Gmrv}3-`Rqv9Nl~Q@x_A3_qma@MM zQ2eRkCY{tjDd1^_byn${h?3tNUQ53jPvuWL{bspI@4D)Po8mO&W2dW5cxPXIT<PB2 zzmxb5G+a5h(|q;!!@w-XGBcy|YwP><`z*IlY+~Nexc;(FM}NqDTVScd;OXk;vd$@? F2>@yisG<M> diff --git a/QKSMS/src/main/res/drawable-xxhdpi/tools_avatar.png b/QKSMS/src/main/res/drawable-xxhdpi/tools_avatar.png deleted file mode 100755 index 503d0b71d3921a88ef7cc4ea53a13232c946c29d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9436 zcmV<2BqQ62P)<h;3K|Lk000e1NJLTq004LZ004Lh0{{R34!XwR00090P)t-sOlfhE zq_vr;v!AlUo3FsSoQ}k(oS3Y>n5D9uu)@I5;FPDgqqxeRvc!<0vX`s6jE<L$p0C5) z@0Y5*s=v~gtGR@fq=%QNaek7_;_rr+r?0=tyq}M-kbk$DhP|GQ&*<=6QC!UH^lEa0 z-S+#CqO_m1$E3K+oUgv6xyYHVzM{6tow3B8vcVA!5s#m=s=v;ox5lTu&6umZslU;n zw8NLHzNNa&85SR!ufmd~w~U>$iJ7jRufM3e%9EtDs=dsPpRlOD%*&^b9vdVK3k<Em z&(5uw7!wwUm#e{@ij}Cigq5nS!qLg8m6fNqikq;7l%<cLw}+OeptZ@OwZtMHDvg}2 zm8iSKp^Kcf#K)qD!<K-uh<2vD%EFz65)m4+g>blzd#=OO#-@?txSgoJ&$x(l&Z?7@ zZeYiohQ67Dikhm+qmACSnbxwHp>}7mfNOStkk_-IzmR&VdS<+oet(LcvW<J6Z(X{T zgq(0=wUdFnjdrVjY=c!x)2)-gkb%9Jh$0sp!J(7UsgF1;GJH)($DNGLrIwCeP%I-U zrG9TGB{GAMqEa<8$)S>NMn92dTA68De1@2GN<(8fG<brPieOl)gL0;HVqiZ!-?^>W zuatvYQ(a0-!<C29v7Otsrlz*W)S{8-zpdoGqfk9TXGA`VYGSE}d^I2;a8FCLkcZLh z^=3>>mvm~7a&FYDpnYUxl4VkVU|5P+PAnK2wU>)~R!%}RI?bJnX;oE3DJd)~Inbz@ z;=s6zm#9`oN{Nx5tB!)nl74}ardL~PN={tlv!!!bR>qi<-?5qn0|tI<ZkVvlZ9hAn zdvV&TnsQ!YvVwp$HAAg>b<wu0qJww0i-DS9S3f~c$*!dC%)g+y)OmA$m1JU<nx}7i zi(_hfu9=sdgMputk*vet@AvqoZ+ExI*^i~f!nC)(fP}2L#_#Xvj(>fuvbMm9kF~_o z-{0M-Uuuwylv^t(!otJTi-WVIrPR{Nf0nqLPg%3JznBS~1^@s6C3I3wQvk>f?qmM` z96V3{@TJM>s9>Z1F3Nt#bgp0Ey{f?9e$9KVrJuZTaM1t&A!$iOK~#7FwAD9^<3=9^ z@Ke|vF6UaeB(WoqJECtKhNK8ekU<N)#G#`wfPk%7eg16sP`O~`)I)vkj)366y`WOn z<=xIX^nl;&YT@Q`_$$XB-<w(Oq353ReD&nv(n_ULq0!RnYN>SiWOcrL==IM0>7%RM zwk)gXn{7{ziN-C*(QP}f96mY!n$WrG;iX!dMkH2nujhF~n`p%HZ~(DoYt*PLSLa@} zTCT2WG>n>8lTZcL0XvR@ZQb!4JQEW`vmMVrUoF4Nh7VUbpTg9(biL>MzUK^M!WFDr zF%E%hxR2-c<yY1D!ir{Snr0|CZBjc1Y?_{jq?}le*LDEoWxzeZhqJx1@G9674$&|i zUmYb1M&yl+&4y_@PCSI$_SUXlc#~31_f6CE0aLg1vh@6kwzmfpf~wtg)TG#4y1%*E zXqevbLu3Su)kY%(4@|%3>x8<lTY8zo=a!KNFz1|bR9#E20=57&8r^QUN0G77X#dmh z0j8SOQ&sCWjhfA->mGjLEncnYXwuUO;^2(LNm`?}da~Q^w%c~t|L5n$#f$H~)m>9n z$31^z<D#`r-6TmsFI8VG?h1)@2Z=4fY7D@Mt66aSeNU16_t9>#eS7<Mk?@$<y5H?K zHrGCU0|$6DRd#9aMdE5G)l)D>Ue5R6W=L=_|NQ*VSKHg$yG7O-t7(nJWQX*B?sxnB z#>EQ;;OVR$c}})`7#2$X55`b8tr=^5L~R$h**@8-x9XVIxFv4?&s+Stv5A$50Ka=x zO`0ApKUd8q3M<w<@1SZ9nx;u;aQglKzAu<;O-HG?YIT?#i=E$p_F_U6JR0rG$@A2G zd^OyIRbU09XAHjYi~oJKEkI38MPfSjF|K5g)yHC&o4Tgf_$uJbmm#}L$Dh?*Sc*bQ zjf2FxjkHKi!^=CP+Xqp>DH5_|L4f;G3L%-yik&D*f$k4rT3L8TH`;Ttw^U*UbHY>3 zo6+Tm+v9o%+8(Sp#z3+ln=n}yEE6oxnasa+N6OrXYg8l8Bv&bgtM--(+yxwyVe&t| zlWGrdx9WlHfJRIizyaD(QL~AVK_28x<ax%}?g%nc<CN4wjgaay<W;{EAvFwcBeAIx z4~OpV|B9Wkd7stQE{4odFAIdgRW1UF2k^3NGQo3Mo{8cMw7s{^iHi_qec`Dt!QX4- zLRLQ?DzWJdc`+%rf9Kni{gNTeeU-5+5EFrnC>Ugxi%i{!Z2N!BbcCHf0&D<&ntZ%s zWB0mPWNi=bcH7R7d@tnocC;<AnUJ*(Igm2IAb6GqS)K=3farM^AU0z{;JLz0Km$hA z_WF9|iF<plVypi`a1BoE>E`mB?}eCT6Dc|%rBt%SJ+?pD7DLQD-xA0wu;5b3DCEAI zB5~6-h=R$|+!NpxE4H~7x(KWi>-#V-M6d<>HhPu_$q;=o=nSydgRQ~fJKSZ#U<=DG zf=;UwbRY-F{(Xesk6J_tLDd>9l^^Ra>y}E4swt}emoD=TN;_ZIc=n#?Ip_9X|CWv; zC{kvOYars_=r%Ech$V~#mQ-btwXEd;ie5k$uF)BZcMH`4(=3b0EOAE1GjVhr&zg0+ z@%G;D`RhFI53+sV?e)X+zRz2}C<2(dG~Pc{)fBf*O;LSis4M{!uEYvOf?@@11b{WN z;>Rj@9g=H`AH4R$#VY*2kZP8IS6cadKiEj;xM-aUUabPDW@?P<t)#l*{bQMzvP{Jt zRROS)*zo0JK9F2nTT4cL8ykrgq=9CNj6MSy;K7@fRZNLl07K8&A1W|TWJpFg5m+Ju zm-<P2@~I43@&giLH#U6p^U<}1g|&t5?yHlNlg*RevDi*BybgHHC>($Q89nx>va*(E zU;!-0a{KM?FY|A4xx}r=fvJs6RAb41ezA234Y`q3vjS=~8d#g1?w+~YJ2-f)t+}lk z;fPPBXYVC_8;Q}pV02vT@uQ2CJcEH{ATaKs?@hFb%LwKWSO+kd*@|_-s><VIZ+-_A zuK*he4&9yUo12^Kz1G&&i5M7Yr*JrK?su=He2LM~QE)+Sm2JIQ3$Vaoke34d!rAXj zG|ZF(D{6J694O{es_QOYJlT2xw^Gz3<^w@DVf*HK=XwF|>}+dmyVllj?{|RQd~<R? zw&SB}kCM}n^6iU47OR290{Dd&UihA#`W+6gM^O$8GVKT=!`9WMTPIVkz(Q^`=w28a znz(!S?##?wFUZ%xZbLX6afhSX0nwA`d&oC516<R30b~xJ&tj3eFqnSlJ9q300E3Ko zm=2jPhZPycI5N5Cs$Sbtftx^agG2Z4Pu%T;;yyruZ9}35P-7q+{RsRqeQ#}kV^jr? zlOtQNGl?XyLZK`F_SO4bEeBi%T&gRDU;=|o?*$>Za*McBUiW>H`#KdEREkdga<koT zbvhi*5rCcj@%Vl$obWQ)hAp;B#U_!q0$_0EzxA!%Pzf*>ky8v;1I$RqR;-X{A3VM= z>I?1d1&1ak$XJk!0z)k2d7zoN{mzjQ=hD)Wa}~ckios$CBDX%eBo#^M1*A}v%UM7D zrr^rb3V?Hpk!paS3C3p;6g_xcya8~)J#>G942@rViQCiD*=aXgt$O{)$cScaYzeVi zu)4aLPOXoQdZ8LKZ|g0wr~;{effO5l>zjgeV36tg#mo<`C=ZrY2#Tg2ulPcty`bBT z0?+jhQgx}g!^1s2R&f1(z1gg(uOBNYC|IT6j_!nAUIdNKsYlf!X4?{&#s0eF=W<{? z`zX~q9Zl+IV0;vLrRoAB7}mNwL*)e-;GW@O<FK)%#pCzaQ<%pJ$0!QMRyUV3>n^Vg zaA@A<iYhoc#exR*AAZf!3Jf-m7J69%0k0e(H)!!7qZb*x#Sy$Jt6>HQ8foG#xa6yW z_MTy*@s`nQ@z|7I^$*9#7u5{hJO=*e>75k7fU8D}kKf|rIM(UVr2-cF{8z^QJpx1H z*T5`r@#?ImRC6Sc&`M-!>R@seusuc#6D=N_O{r90S$wEgtBDIRG(+;8EVwRL<7lz$ zFH3|%-k0Ft{PNlG8w8e6jR7v#>GFy}&Vx@N7+g0peRqzsj5J#;O*W6m11bbxxv{u- z17MIf`Z0|L;G^A4WF2I$N_JtZ8Z|D3W)8q6)3e2VRsk@FmV$|I$SLLt@aCpem(W>V zdbmP@g9M&IqB{{iEfx#7O0~Mn)}>xtR4?8@s?Fwly#_J1x)fhN2uC6=A{QTO=^cyU z2>2#b$=PSt0{8_U)-M$2!E(V{UxJ0gN2>KGz`0(!M$4!jo$K*HaTmDCHx>!3Msz8a z`W8Ld1qH};CL4~p4yR<rs#l~!UJlGc9{(c09*Pu-7iu}$b6*D=z6RD_S4E&W7<5DM zRZNTa_Tk}M8vnT8rU%Rn!ASI#t}eCujV@)A9^es;Grqig5DrJyaRJt}UT5bO8~Eaq zy1F0dGL1=v`$S?gvDtiVY$nruK36L4=%79pN>03C2o40?6Vu&;?RKZtX?KGA@S)#N zjsh3p8|wNlwNhy|oAr9D-Rjr}IFll9qpbA{HV=x+X&#yY&gJ@d6i`g>d6SgQZxHZ! zJO<3pfl*`8mMcZz;M&4;_oSn}-`;O`dOYLfevf~A-24zw3P|o!+Vo1L#oE$hb)=Vf z?_>_b>o~MktzSra<zIrUOLD&cjT~5%Q%r&xuv82%9k*KT_WCpMZ2D$@zuj){cWN|# z58Q>M`X7S&*EirTBwE?j)MT+5Eq43OWfVD+iIA;ZPxw3?1J-g$@$<~|C{k4B!BQ!k zB}czuz_3WMSj>#f(&I=JHIDk`Gk2EvH=jHiZjX;>^nQ=$)`;`T($6*O4?g(d2GU(m zV6<6FkFm$@Jlc<eoLvW4_61vxOmc9nGvE@MA%9X-Sp={U;0`G%2AF3c#Rz6()*fd8 zp5IvUdR^IYD!H6KijR%?{bL&E2$ljS<VPTX^ig4<x?X8(vb0!?0FOM`U%qnyu&Ys~ zdPQuIGhBRCMc_Z8u~k%*2a5qVP^xK^v!xvf0&A-dv-9)56*{?E8@-L*NNOjI>4a`w zI$B=dKmE6VJ3ZZe`t+BDg@yIzE?Y~B5oBY_$bJlx0rsjIFEWbhbVWB^x>QX?{%r_W z)Rqg_;7HkdFrT<(%->-Ns*c0+5uAIuH@M8@iez^-S4WmcR`+*OsXGVRFb33mHgmB1 zZ)578HNjc{TdggQbRH~wpkoU_E@dWWbzMoxk1#Kb7%)%37L#Js7+?Wk3Qw1nm32t* zw{*wh=mzuTpYme41Dx7fK3aORy1JZ-L=Ljq2%btXZ=-8{r%<hLfwxd-Yg5a99$a%M zp#QI~lv0U4t~QB&4c^LuS!^l1MPP&=rx-z!E4IUtl~LDvB%8_Nj!SGrGCOzD`|%|x z4rehXXd<I&2z~Ihz-hM{-?N~n^q86%YzlAd_FGzfU4_Vj>rA4bocY~Ky1{gE7GEqT zuz>mJImP(aszc1?mjVox$+dgavuk8CU-Dk8JDrXftj1uU-ON1L>k)!`y^+(UW;?dD z-EM5@U)}-O<!$|<8c!n*G|3J8oZ_=EbrGW&U?^_D<jN@)lj2KtB_^(x18`(#ZD;`( z=1>p~9ZlYwoleJB$Ljmj`|0>m8gaC_eD5F=&aOw|j()3gxCe`~KX#C!RJZ=sKRo}I zutLa@3s}+;)cCyUkI2*nMgvi%>8*i)snJcyw#h`t&~`Q(P7V#ZgBT)#y}eL0xUjG= z8!t55^zEGk&27DXS8sx2@867{-iajRPP@H_?lEU<CmbPjz5na~`7aW@RRy4wA=T$a zzjNk~0j5+puwh|7DJC#qiV)|(Lg98cl}x&WA)G&<`T5XZD1;5!?KC&xf8RMc*Z1Mf z+%GyowrHG7PfwGv{&u?&2bp~&M#CB<sQ7i{n*Ps*1}XEsulBjGfvLuMFv%xw8NPq! z8iZS6fCC}CgngOaJHZfQZ)otA1}A1)@7#wIcw5X|9qjBedTjo&g3a_zr`6aq&}r|# zN4a;Y4lDlUEuowO1ud()#DM>t0aF8Yd<7;~GetfR$wJOaIFJlPeJk`l-`+h)?twgX z&0@TUqhM~rz4yN%6n%DjZou-M&1^2{cWA6Vq}XvUlY%d0$Irj@mPCR~Loggm;NL#; zQWb$IxloMW0hUL91ug<$Er;`II2wqCR*F|tQ^zO2{y(YU-v0)!w!dfW?du(!aJxgk z4PWNqbg6r~&1kXV2I;r8P>JoE_jWQVfVZldpPT^9Vs|iL(QkYMET%rr*BEmPe*=PX z@P3*K1n2)Zv4Y2e_w&E|ucuHv?XY!O24{L_+@B>kR%%unw+;^C`?Gxm#wH~Wucj6Z zO?w>87LIsjkN%;W`RM`Gkg4%`fM59rn8koG*dSQ?3|#SPDhN0G5c4T4yJYBphnn?^ zYEAR&S0`p?Hx5=Bj}Kq^yZ`Y8W~X~QjW#8Al(GqX;s`Yc`0%YV63l^Q76udbv83|M ztEe$9E(0`nh|h@xLIR@{7+RESG25X1Jd;cYgF!gTJ^R^b3+_N@Z*F+}#zW6=Z{Ng1 z(3jdsc&GmT@BZuG5-ZW!-cAcvveMRKZ?|KxB~y{9ld=W_<_B?!g5|`Oym01~qAGwH zbAik^7!35e$XFET#ZuN=|FeT;azir?Tuc%7UI>;3*k<g!c6A}P=3bbM?P5bM@A#s# zGjsMP3V^NYOn4`iJ**Tr7$iaj11@90RAc1&1&j=!#3oh_jDP+tq%6s=YBv+0G_!1v z_fq=o%$CmV`>OU@WVc%Aq%5nR1&{LK(xpb2ltjmXL2-);1c4VuuqelXMzGN!5ACN} zS~1$%Ov<E3>}Ry3!&n$CHJULlqgl+p&GJ9r*W>K_%&B(k?U(<#=bn4cx!3uhVzN_J z4=N04<fD(OwXT8U#CVflFHz5_t9#XxBje+fA$)JqI;6x!@uN|-e{kYr_t=lu*ME8A zWo#G>f9QX_b?f)Hz5eNEzJjY7fKy`#91SkHngx^Mt=pq^t&g2*1`!>3FLEY4U2n}Y z6&Gh`np}FR#1UGVn_CHmLfTTL(jt-OWuU?bc)v!~b>c)%xgjikI(+TM52B-9-xrk% zeH2>&e}P>6Uo3blb!~4!F=7j`2k_Rd+h2WsNB61zO8cBmZL>{PS7EK|EBv0IS7E9( ziBacHj)#;hE1_{rf6AqLLq>Ky44U&)T_3z_iPw2N!Qk}z%hB*A6k{KgtC6`5kwsDs z{~9_g3@SLB*jP+`-h2hNBRw`Qr3|iaMrsOamA2|igjQv#-!ovA`^>d+af$S>OFte8 zjZdP~7NGV-y$i4cWJBkPZbL%6zr^o1ukTCU03Tq$-@SUZ=xR|zO-c$6!|j@~I#^jv z3jYF(?o#l#8h(npR;|TAOWQcrTYtQMD$DOFHt+W(nteX;VX5Awm%t`fRBAKr1hDu^ z&~?g^DbNS?{zo1HW9o#A$+&vgi_d)fYEe;9L)nEi5jX7+Fl0%%tKu*g7nhcjRClr8 zuGXS$k>-M2f4s6H*H?_)gtpk_@_2k$YV@mUrOaNh7wCgV1)=4Ju6C7A)za#J^eDK# zkK&d>_yD4M+v}fyW;3u2Wi^KoVw|)KEIEZ2$4O4+;3H1NOG#?D*ep{@^e&f6pIg{_ z{3Cm5iP`O(sMQ->(yS6s&;z&+pMu41x7%wr6BuQ^+|b@>(k8UF7Cw69U58xEyWnZq z*0*q15COpqI5IX;#HZVnp&_A&i!(Zzz+4f(rsyIBOI<FXPwv-NeN<)D>Jul<pC8cc zO)g0x$idNIFjze7b~>E{(5yhmoE<M03pzXW4_q^?xsM*Ly-r|C5FnG{h-aQ-z)5KU zb3}Y$N=?mgz;tYJI3nRsuJl-yS$dNR!b+wpt18u#z83fS^Il)A*K5{ey@R8}L_H64 zy1fIno`Z?mwJx#h^3mD{r897KaP6hnfM&q#c0!BX@O$8-A%OWJE~u1QI9wiqWe{u* z20gCasoqL!Xk@?*O0j3a>2xa!{eE9?n5Z)|Gay5<$DEj0>(Xlm6J{!=NU`&mQLpZT zt8pLzj0A%6_L(nz433TDVnN|*p^zuyAc051lGAv62CO$F6bC&=8XJ`|<)qm;<1`Ep z2i>i0IiAK6kVl=Ztqd4{l;Re2Z`m1nn6|adH2z|y^~mtrw$xXnQd7~Mz|{n%$>JA_ z8tMS%>;;$)ZW4JKV913rV7ttrH@6fA{e=}ai$yy*P<!4vFbr#L8!ai6`~BEmtxyas zxW&cj8Z!iW29>7RX${R32hYD8{VHS8r1(E^nNKZD1VwcUTn)GK`9q9iEHS{WVj;k4 ziP)%Xk{4DWb5&U<gSF1qVP95hX;z_BZ}NHkNBllWh7Grp;sk(^xHKB~z-jMHi}RPW zF|S6$P`bm@P`ry7{4lOQ6bHpT9-mRngJecC>*}!{wM4EkiW@6z)xDL+j;YPVZnsqF z(C1dzROS)0$9E*xKgxjN1=iI7W2|Ye9dOS~to`q7Dh9`BK;dep4!{z_zSO|1F<c99 z3c!3G>uRJAE-4;smPy1^=rp3Nt4EvMsX}||5*Q{=_t8kL)}+tP)wQwUoYCT9%taWm zOQLG=wocrLfvZ6#U!>BKhXo1r)*4k!c{3x;5Ji8sIwu{^g?TixH>U)A5=BfHem z(P5bsgiTN5<T-l!sHr6DNK;!|TWece&gf_Xv&4CQ8mX^s#yPR}gP0q8P*f2ZiqW#Y z%#I@d17IeexU6C(sA2fCK(dIy*3uGxVX4~Q(_?2$eYtaPPN^RWpPrro`KUoJE-WE3 zf%6NDiVU>QeVP*Z|KQq<?R)k_1DpylVhbhn%OB6_zf{M7IU-u)8h}~Faj-NlDMkXx zEh#OvTCLPU^jg)S@$r@M+an_*=*U@gn6y-$)0UG1!J`F6Bj!GazVghRR;PFE#-2Sf z0D~J%`2&*KaT9!9S0f~mB0fK5sHO&B5evpDb9qCwos?N6rHugFdz*WEr>5?$T)%z$ z_W1Sj5hQ1CIQhG_Fn5%3G$}Ub!Bi3t^2)^8o*2wHpcY)VxZN1AJy%!8=dxfV5P-S( z2@A}G7cXf8thU-Kt1vhQ7-Yt9a^QFvNJtcz#Dz@|OyK+`Bj!zcnviFB*g5gbn3$J= z1Q?>J>E8PC#$Df+YWRpGEHSg6_#%K~BRP?K_r|5A@setgxzt%Dg$U~UbLZZ<))m%u zX>MhFd^~je^tel+REG3=xj`T=9L>+kA05rfhh#BouD;F@fY)wBZ{GkjZ8tk?Vl1MD z$Kg;=v%$sXB5?z|H#RaZ?NCxpQMU}qx}?IU?mzj%4<0^zvi9Ws^u+mzu)7n}GZ-Bn zKQ=e6O3XWw^RWSpsjh1A+G)3YVtvmnDW;1U3NL^+#>TKOkm59Og+d$=yf}dOMgop( zhHz^D*fQxawb|^)-+Slble<su-n@HrdHL>5*pnxZ$KLrrhq&o*W)7kYSbz_r@X;*J z&p&>={uZfC1$Q6qCyK6(K{;$QpCXtKFpN*h1bT5y#EEbmm$6`Zmd$2`uNM~<7H=}( zo6AqumY+O)eDUq}a<M|5Pn&52oOgOLdG){F45U)q4Z~p!Bk=FthI}OrV5Dlk5Fcrg zWRx`FgbOIc#@c1-@;pgJg}V9pgX6~^y!-g!!@D;h&OaWzxYpg>)vS~rmS-B7^g(2R zQDZL5b60n~5=dp1mzuKIa6Vy;8NnO&LL3KR9>5^O(|cp%I8dC1gA(8?-D(*sX01&< zSC2mC7r(G~Ei9}(Ubxn^LN@Lai{+U}7AzQwb&AZs#re2cT!2Rb3Qwc|-N(2Zf`8AR zjbtS=t|niDi>=Hha05k`+9A=}Y;(QG0KRwc9zIY@V>2U<m`w_~Sdl~E{Cuo)zRsxF z-?xb80jQFrqFFGlF>0>u5d3=<!TA_WzUIO4ESMu=!0@#U-ARRQ&N|my)l1~ib=b&l zU<(ow2Yg~<P8)IaA-G8gS1;T@6c@X?`^_jM4+ab@);Q*m9=5&6q3y&2m@+1emYK^H zq3o<{xY8}NT9xPxZPq!Za%!qEbR7v3A7-!HU66p}>@yPbH{f`IVeuzC4tvkUZeegy zg2a6CkFRk*&1D2bv4}&)Y$g#eDXFZkfx^pvR#^eA%o0M+;2HsQ*vV8J2?aW%(WnEH z1ve2`^SfZ$NKi~){=}X67m>LbFnb!Kk0G!qC8?~Tq3%|9yS-VahGezUf}}NR7zuZ? z+~R@)ole)()C4NoD8SjO!QTU8eOd6Id?oNKk0CRsF^s@e4W(d>>&mWl+k4sp?zP#J z7M#YX`@*NaRKOP(G&LE4B_q-FHSwrsa4`u5R60iPsZ83!Zi2Hv^`{>v&^CraF$`n| zOo{<68^c*Ft2o<RJ%#oSlKV!&y%@|F=)g5LK{Y-@FTO#E88$e$m?GjbieDu#t{kBH z`9JdpWite`in(0ClPR`%!Wsr#bHBT%$7(x!wz|4{sv?AT6xR{B)<X@bQ0NNiC?wtR zI>YT4Ts*{ut09<@2kj<+|Lhy57lkYsKmsS@8`{T3q`0OClC5XY;y7;9=DG|3D-_6A zO~y=PK|a9X>mVEVFkz=JOZx8fSj9LQm@xwsfAY^i5&VL12w);}U<fS{&IlGfRQKba zcI(+{+<9qpnXs<)p+|yXhN}Y+ADO7O45u%5X!`C`J3_aou&AhgnCX1#xxetp=qt3u z<mzNHE~+6ms>_Ckes<zwd%L|Fx2fQc)YcA|eVGu6fCjh87!R?E%>4qEt6I3v<B1|; zckfGO&SDG<vA}=9KAXhn0SY%WU<5S_hTsq1Jw;@zI?H7;yU-N|by(bk1<;#MdgE~? zfbQXRho#(*XIPjQvWl7031fadtNM!;L9s>aix0{lXdml}2we95ss2+vo$WX+T(z|( zuiLAmP|_6?;0vfIInX<lcU-!x*}wm=YGD(X$4MqI1aEsa>h-_=giXYSaY!`CXdfAH z9k=deeP#ct_O4EgLtw)FUQ5eCoi6^M4sat;4>QkCluF!4;RnOwoh2c{ngJuK|LW5@ z*k&Tr`jW4C7g+F6;Aiih!mFbG_O8o=s*F69AR#dWJrdomDR8YOC8!z)i9{vHpoZ;Q z-5D-{aUQ3_{-)=@FK|gNm$-;67A)NP{{Y+V%{}d%9fNphBFJuGF38cUfU32qWiV#U zCCEUFs=79RX19p5cXt#6hTgx$B0kMw1p|z#lfcQdS5F?Ji+ZcwF1vKOW038d1m*BA z25V|Hz-qO{A;sNGHfFbBw;rB(1J(KNRDkgy^lyFw3(c5;i0GIcsw=7!rmpUN|LtbH zJwZ_qX`P*bqkV!AREbZhi<FM?!z?(j@7CQjsl3R@-GS(6#Pi?r=og0*8`VQYn0s+o z13N!FM{l@bHW?5OtSPWsZD}b!l(15VM5+Nd1MUy&`sMPOC1D)Esh|40-dI2PVsd&c zTrC7RJ-uu;FuPQAlCF=Tj^0!;54l*wtD8d53nf@zT$aaYgM9hc@|iPR(nWCfC!hO! zA9jBtog)&Z?+!d&4RB{?mku2IpHsbOW$IF`QeB}eEu{B0F!}_vgs_5aggP=wwr1=O zz-KlkCqMu9zh;NK5nXR2&#o@5rU#a0mr_4CXJ^0;EuPF}<(8C)skp@bC3cfkD#%Vu zOn}8J1gfreU|~D|k*DmiFGeS?1_Dn5vr%u%ZknB)|6#qXqC#nLIJ8<vmP9I+@6W{0 z0jV+%dk9o|8<Cx1&~z>UO7`V{{MQu%ORG;;SKkQCZkb)$^x-*~y3qo#L*kG~4$JZ0 z1s0EmCAEq4AR`-x#N|c!8TK8>{f8~$Q>&{_p9TWpE^WF0Ub9jOqy%I<%E*W>Km|fi zKafZg8M#M~W(Wpv-6in1UifE!CFR+tO96)b^Z6gWeaYe|r=)>Vu4=!zpqSy}l8bS3 zVzxqH7`*mydCQq^efeMV+c2{LA2^VH=ft_rOAb88D94LL1aW);xBzEoGp-H~&(07J z-rscQUxOu!_~e$rrZYd^a^<AeBGIT+s`A4s#8do1SOTaFm@@bN@>_Q|eJ|o)`HNOx z{#;-w`Qf=LheVSnFhDON3NX-s#dq{At?yUA{M^6(SIfS%Y3xT1JViw0;uCN%AQ{E< zAmZrPHY1S#Ef(?ZuYW_8Apltb!7xTIzMBsJ+Bf0hf2%zgvH6={`})_v5f(--)xPnK iuYc{En<M^y|Na`QOeO@BHnzzC0000<MNUMnLSTZKVwbT1 diff --git a/QKSMS/src/main/res/drawable-xxxhdpi/ab_shadow.9.png b/QKSMS/src/main/res/drawable-xxxhdpi/ab_shadow.9.png deleted file mode 100755 index eae8c14f9a8982661f3dcd8d2e52b399269c8d3f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 156 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=0wlMXIamRyWKS2zkP61PleaQ9IEWlAGUENc z{*c<08ZWOe7g8GZ{e^CGrU_|#IJigu;$rDNd3HKWNWucc*-wj3zEJ=FXUWe=JPDFh zy?0LW-ucI6r_c4QKSwy!ZwcR@s4bkZYnJZDo{Lq-Sx&xENK3u*&I4#2gQu&X%Q~lo FCID|`J8A#` diff --git a/QKSMS/src/main/res/drawable-xxxhdpi/ic_accept.png b/QKSMS/src/main/res/drawable-xxxhdpi/ic_accept.png deleted file mode 100755 index 87892840e625bbd34200f74b5ff2586b5c9aff1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 587 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD0wg^q?%xcg6p}rHd>I(3)EF2VS{N990fib~ zFff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9;eUJonf*W>XMsm#F#`j)FbFd;%$g&? zz`%Ie)5S5Q;?~<62YnAa2(&(YZe3)xfY-r`(UWmy8}l;$UkwFpRtto796snVt@G{O zxpU{<oO;h|=aVn>T}khKzBh04cV}Q^5pX~y7SxtmJX{%jfG_>d13~B64Tka#9RcbI zr}%}kSk8QAZu!M9{pakKTMVavo@JQy`85;Ar);K<Pp=ujR7`zxok`&Nb;c7X)-z6+ z`kw#9neS{V&wn$Ce6nTK`dP=Yv_`)nY9GIY;eF->v-0_06dqd}x6jnU_P$tv!hN9t z6??G_$8G(7tkbvW+i=`?-G{ctGXiw%*$kdB3kY*PYiA7JHzmNto@K^!Z;sZ_+ZnI_ z_%ofK;k|{6aM$zpx<*ER?)%4tcs?Ee&uF>uIQKiR=f`bYuW`87{Cs|VFZ(6Vw4WRE zADJ{I*8Pdqn3phXe$mWmwVDS8$`a3)-*r38^7+q|*I&#ID%#h|MW~m^{hZX8)_bAy z$!WDssZ2JXmMW*p98`$66K>~J`)TR?*X*E%eZKZaKZDcfV^`}4^L+mN-Dx_@<(l53 z*XAV5S-*MaY>sC?qgEfC_+Y~N?b5RU?9MXX;ll`Pj`RAy8-Fs!Uw)wgjAI5*S3j3^ HP6<r_t;_3; diff --git a/QKSMS/src/main/res/drawable-xxxhdpi/ic_notification.png b/QKSMS/src/main/res/drawable-xxxhdpi/ic_notification.png deleted file mode 100644 index d5fb48d5064c4be045cb9bc3974a00bccd60670d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3181 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 diff --git a/QKSMS/src/main/res/drawable-xxxhdpi/ic_notification_failed.png b/QKSMS/src/main/res/drawable-xxxhdpi/ic_notification_failed.png deleted file mode 100644 index aa29a01fe94e1998cfb04bd70806ce420d99f70d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5443 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 diff --git a/QKSMS/src/main/res/drawable-xxxhdpi/ic_reply.png b/QKSMS/src/main/res/drawable-xxxhdpi/ic_reply.png deleted file mode 100755 index a689a25824ffb1a1b94b809f5b4094af458c3de7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 722 zcmV;@0xkWCP)<h;3K|Lk000e1NJLTq003YB003YJ1ONa4NRhv@0000WV@Og>004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00002VoOIv0RM-N%)bBt010qN zS#tmY3ljhU3ljkVnw%H_00K%$L_t(|+U?rUOH@%9#_^dHL?nk=^oy1S4Ok-4x<%0+ z;C~?K#t3X$NegEo6J#4D5JZr$l?#_5EkYC_S8ZBMM7t3p3DXKu#IK9n=!`RWX6|_J zo%6u^%>M9vU}o+;=e!9L+Mk303}65Q7{CAqFn|FJU;qOczyNLlvf6+wC<C&f4Djm9 z0*duT0jKpP0j2c?0p<1O0B7rq0V?ZD0jkv(0#vUr1MsUa0`RXd0jO1908qQW^MHEw zVT)C!8Kjps_W<?lmu810UXXSN5Ul=bzVV8Ctp_w)znISqbFp=R^VawBn+a~T0uWAp zFMCXKHC{lN^}XyeN=ICP@aucY^DquTRP_Oln4~jWK$P{peBn-XfavQ3{GmS@Ks@!m zuhOVC0APxw>Q|_kIW8#vh)Xl8_BUFY*Gdnv>Upa1D&e0)9=rZBSAR!$)7{tU#<CV< zGaBE9CP-eowWSQ61A1K8)So9CjXs&fKUSGxj`u9E%qQ~vYML<Q%E4AAw|T@cZ~4e} z0KiYW-8))Ll4gK+{Ah@fbN6sJNgr9h)&czEitESg_nGEz4Z<6R3yu`eDfsTzE^Ayd zb?}VM<{oM8T=I31W4~gx0_{rIthZRHSg&8}qB}{3y|VR|^hOPO`Chg|xTZJkaf#)U z6-N}uZQ7VUS#e!;;A#Bi;On~T$l2I`!l3TZUk-pp<*~~dVB3F}?EYwLJ0E}t%9Fb( z@?^9}kMA<CK0EzH9gr}90SsUO0~o*n1~7mD3=sO~7?W4x9lv;;>Hq)$07*qoM6N<$ Ef@~*0O#lD@ diff --git a/QKSMS/src/main/res/drawable-xxxhdpi/message_neutral.9.png b/QKSMS/src/main/res/drawable-xxxhdpi/message_neutral.9.png deleted file mode 100755 index 7ec1330f57fa362cace826474d644f95c0c8a4f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 444 zcmeAS@N?(olHy`uVBq!ia0vp^AiRi!8Av`&$l3s;0t0+PTzxVN|5FbDO+8tVln$gM zOM?7@8NTx?cU|Iq^-E>e-0%}WU!T;U^CL3Cz;Nd4h-wuE21Z6t7srqa#<#awx3Vzu zupCTHJNHZc*UX0*eY;t&bT@Qv-uN~8oL=S8pksUAM#xW(eE64Z+1%{v=g(g98*m9( zuTbgO*HxFnF8*u&Q8P2g!rw2Cxd$fgyD!<QrqvU7@<0l!e$uQLCsb<HiiNM)cFtR^ z68nClj?b+h9%)fV)hgb)H*F?uoVG^(q?dPC-{x5sC*C%-w6w%1;sxucrbsYwa&oSm zU-GJb`SF>@U%Bu3wQ^&ffbRU<=f|a{zgGY7YvH~xb01u;Kc-^%IP(9j!Z+-bj$exT u^X$_U^Az8?Z&s<6PUgLr?*8BC3xmw+$KRZ+r!N797=x#)pUXO@geCx6%jD<) diff --git a/QKSMS/src/main/res/drawable-xxxhdpi/message_neutral_2.9.png b/QKSMS/src/main/res/drawable-xxxhdpi/message_neutral_2.9.png deleted file mode 100755 index 71786b49849defd742448658cbca26df7ee7e368..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 815 zcmeAS@N?(olHy`uVBq!ia0vp^AiRi!8Av`&$l3s;&IkB}xcX!k{vR#?=%+_pH2(o9 z=aL}5V1{G2h1eQiGxon{D*N<gc|ybr^&1l|OaBY~Sbw^8Esvnpm*kXERX$rW-tBjm zEDaAkd;izgRO_T|UsaCUh<<+h?%bKT@)D8q3=E8CJY5_^Dj471c5Qkbz|-=O%dUOq z%-NUk9_E?)J3dq5?6=^uUwj|lZ_!q~bdvSu*Y?M=J#$_919OXv<-SeqiL{b+dtu?- zyyMwzo#c~w&pVO>H4L`}B{ph2tDM*=a-D5q+}^aLnPyHVt9=r$ItV;AP(6MieBZe% zuPX095{{~Pcv<Iq=F+?e&n`@2p02jm^yB>4sn=Fn|2dqZp^*IH`YfeuKavBNbR_ZZ z7u8tO5dTb-OEdP-a^0gLADT}F`CNOjTa|V1$9ap+M3!l+U}vcHlG?*+uw;dDgQ2T0 z<DH-@JO^49y<@zhv5GChB`}mhgl&$-n<bu{v!*Qd^vw#IJnPC5HPe-Nm<!gp|4clP z{`2Rd=07JMU5;F)@Tpn!XJqf6AJ3iY7L}}1ylTv4)zN=x9dF%=4*%x`n&uyF&(Ck` znDZw>NV@CBobrmUZ(Y~Ia{nxM%;w!ulDU$5dr@~-RBFYO^%)OO)pOlT%35nvGxf6n zgVTqc|4!#^xskf$J}1Lw&tG3YTv71SyP56ASNKLd@>o&qO=Z2}7vI=;Okb4pvz?5& w<D35d{r!t?KOR1O{N|T;OoA%$ZTpzm%@R(2xo}bem`oTvUHx3vIVCg!04zi5hX4Qo diff --git a/QKSMS/src/main/res/drawable-xxxhdpi/message_received.9.png b/QKSMS/src/main/res/drawable-xxxhdpi/message_received.9.png deleted file mode 100755 index 4470ec5c5314f1c7b425cd57bb9d4126121c747d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 620 zcmeAS@N?(olHy`uVBq!ia0vp^ML@iWgBeJ!vdv5YQn3L(A+A1|h5u;-fHnyGo)Z94 zvL!)&!3>u;yB@##r6P0tJHPU*xhKMZzCNix=SO6Of#Lp{LcY1q3=E75JzX3_Dj3(C zJ<ix-Ai(TkVEMdf-G8H>_r0^TrDkZ{c<;aDO3(WVZw+p3UMMZSe#4Ediq*dl$?Q^b zpI}qCZDX&XPM+@LS&j<PKR2qny~??H@u)zjY^2%*&m9|2l%~c7r1CH9m7E<Fd5t%) zZ-Q0lrpwc01Nm+hDW39)KIdYYdAd_W@!Qs7@itC|03Mg%^74~!?bFOP0v=@9bMN6S za^~Av;ml|GWP<aj?<W-7Wr~1=&9#${C!d|XEuv)Oi=>N37j?Ueck7A8>g*y(!246! zT$@|hJ#VY*@+_JBLhYjOqS-Fyoq0lcNfKyrUFQGn{$z+7`DWgC2RoL}a!LKqFa2xn zKks`zf67zsZ3PzMd0(g7o60Gu3AG5cOxSI4>Qc4kjgB8u_OXxHqr&c9e7elo#QV*g tmyh0kD+qo2;oG}MFLOlGKYK3Zzwam5oP2=&DKJ(UJYD@<);T3K0RUXuMC1Sf diff --git a/QKSMS/src/main/res/drawable-xxxhdpi/message_received_2.9.png b/QKSMS/src/main/res/drawable-xxxhdpi/message_received_2.9.png deleted file mode 100755 index 7dcd83f1cf1a640cc5623780ea6690696ae90adb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 951 zcmeAS@N?(olHy`uVBq!ia0vp^ML@iWgBeJ!vdv6jU|{46@CkAC$t?Uo3cw)%3>nef zR5KtIQ4-`A%<x+1Si^fZ#(({{%lHyjFsV<t+`9G)uWE|zrzc|8+n29SzVkEU##ftX zp3<Qo>rab*4i7u~>wba9s>e(D=kuf<y;~ks9A#x(tsxk_t-Dle^7rRUo}PR6_Kd7f zsSE=H6N9IVV@L(#+dHniZaavyTofuhtzc}QmexMgvhv`!f98`4KXARe{NkUq#ij$B zv!>*Ij6QMq-@U%lrB<`%*4WwEI6V6%v-0heosP@a$*#Zk`}c_p|J2=exZ<64{$<D- z=ihb6+4*b*Yi@^WUg23s;Ua%sabKPz^Ky&MUX@5PKl$u7&ogQ7e{<QA`enDX6lJFr zb0?L{7oL2{k+geSHXB>gcbV;_9dq4cE`3%Mv&vIE^2b<Dl2`HDxx&@XIVn3+&N{qV z_;?%lM(L~n-|khK9DCyKvq|5!{IdVf-LY3?vTcX0;^f+ny$X}33;cFaOBaxybW-z) zjAcTg>CS*4Pt~a*K_`VYS1y_4r9~X!<h3a26IYRY%qQz7X)#57JB9UrG8dKaNRcl( zK9!%TAmZm6M)r`4dWz1s|8RDP9Fl+Kp=*4Sb5lx|P2pjM;L?9ve6l1q9$C@Y)B0!T zf+_Dm9-k1D%xCHL&F6spHm|MhPmelE@64K}KKn%E@-;Uc??q)=8s;jNfAo?pRCQ~7 zwB<;CPvDBMpb(!Zja%2YaO}A3(&@(de+Rdw@wZQn_n4bE{Y;!9+v6nPBlR`PtYGmy z25sY)C2#**-hS)DvqN|8_g~ZF&;8r5Zr|Dc->RQ`C%9S!y->HSzYwybMJ^ba-WWVx L{an^LB{Ts58vQ{J diff --git a/QKSMS/src/main/res/drawable-xxxhdpi/message_received_alt.9.png b/QKSMS/src/main/res/drawable-xxxhdpi/message_received_alt.9.png deleted file mode 100755 index 960c62144193663dcb320229ceabbdf26a76c710..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 467 zcmeAS@N?(olHy`uVBq!ia0vp^ML@iWgBeJ!vdv5YQh@<JA+A1|h5xAsfTo@-NJ<A% zk|jZY!3^K|mAfu+zWSvyYi{_7pRZ5q&-oD<VPH7(bwsra0|TRkr;B4q1>@U0*9(t0 z@UR3{y`OHB@UQVzv|RO^RmFEX_pmg0`jyvc22SIBpDe4hDWL!Egjkks(OKftzvY@l zi1yB1rMb$&Q2%X7s+{t=t(>dE_s_6)nLe}n=qi)I)Tb)klS6+T*>-WF?`x%M;cb;i zbV4U(K2u<y{Oyr~weC&J6M^1(e4DOK+T1*6%abW8$Lp7LHn;q-_W*(u%t8?GX_g9M z5Po0+7=%~++;jAJ*x%ppbnP@>$8XGk`!MEz*!}wtDjMpP9)4?6_);vM`{-S0(zSeZ z>)1u|86U5I+axJffAgMhvG8is&zIgt_AH(+@{8en%j0h+lhQbV0m<O$>gTe~DWM4f DtQ6`? diff --git a/QKSMS/src/main/res/drawable-xxxhdpi/message_received_alt_2.9.png b/QKSMS/src/main/res/drawable-xxxhdpi/message_received_alt_2.9.png deleted file mode 100755 index 58efcffbe1dd4c8d43ea09e2a92d463d9d66e24c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 845 zcmeAS@N?(olHy`uVBq!ia0vp^ML@iWgBeJ!vdv5YQs)DFLR@_^3;z!n0QA$NEt>y; zlygatUogY5+d^y&uNnK_GnIXMvOFPTh5C&N(w9R&p05Abx|T=K>PvD;sVbkX81MF_ zcb0^Qo&9zHYpV6pZCh26Y(zgleRuB6TkX6mR|W>gSDr48Ar*{o@3=0KHsEPVWPNL3 z{5e@``}!4k{`<sEPxUU${Ks8mz1~Kt^!WNkm#<3qtasn4Sbuqg*)BQ$s$+AafARfa z)E94MT(Ix#rWJ3>@|g6vRK>!zbgnF@j(xJAD|@+cyzTP`M!CH=))cv{b~AZl<Nhpm z&W!cNC0}c%{Fo%Vx5MCcX;^6a!6oUbb|E>NcBReOvHI1?S9&fbl4cr@nNFC_-ZHJb zdl7Hsna-0;(xDT&K2H*jv=W~bZMIrTIQClK87sk^DTnXfurD<`A9sAx8}B1>(Pot* z6PV53hB@@*o?O|mXNzh&Q&EcdJ<b!ebR&f)I7e^NQn+ccC^_pBhmeZL1O>+?7EYoV zPhNU>`P^Inzv7SP-|w&5zsx^j|8HXa)3@x5FVp#79+ypjsjgH1D&YA{)k+V$UAu}@ zR!ypja(iCJyzB3LYvCm^zYJA!b55L{Z=199o0tB&TOuLO{$?5*)`h(Z%6K}>FK4Re zjz6t#dpc%++WzQh*t|trzauVA7nX0TxTN5^yXWIhZpS>~sw<CID(CLpa9P!IQ%3yB zQwLU`nzyE?J+J;#ao(l(axyo|%8cjU-CO;;xAgzNhlg{jiqp=l^y8{!Gdr4a^4_s8 RJAjFZ!PC{xWt~$(69C04>@ENR diff --git a/QKSMS/src/main/res/drawable-xxxhdpi/message_sent.9.png b/QKSMS/src/main/res/drawable-xxxhdpi/message_sent.9.png deleted file mode 100755 index 1ca7f9c687fec9fde2f598065b81e365dac66202..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 636 zcmeAS@N?(olHy`uVBq!ia0vp^ML@iWgBeJ!vdv5YQn3L(A+A1|h5u;-fHnyGo)Z94 zvL!)&!3>u;yKcYwr6TkAJHPU*xj#?74nGm0Kj%lJf#J;kb-eRFFfcG~^mK6ysbE}l z_9&xMAP>ud_wVw&|EC@jt@kXGl6b%VHh2F@nRAA5id&8)+fG?!5X-ef)K`nI*`U!= zh;7rxPl?aMCl&TN3Y>qJ>?$dr{?v-i&g0L4jXaLRyLvMZX-~egGRI-dj-J$mI^CBR z$~c%>PBGoSM)uUi=rX?4GrHC7o1RWv>&$6XU77!!k592-kpf2@1A}_QpTk!q8KSxK zg;sDZYnLfHp$H<TgGtjT6P)F$i|mCb&zy7SNs5}fvE|H@Cw=_Vii{?cBjmG9-EW>u zqETU@k>KRc89ql+l+=U`XLg))@li`6QAp*!qT9Y2^O-A7f?UaG`D8+UZw#1r=KJ~C zv;OCo<6-spzpAI!AN|%|T(o-s9XFc;>OwUfP0#iEuI(=Wulwv^v;XuzUmU!xcO8+O vwe8$Hy><C~_N!#?#l+v4TYKcA=fZH$<$}%2H@3e6#xjGatDnm{r-UW|VOTvT diff --git a/QKSMS/src/main/res/drawable-xxxhdpi/message_sent_2.9.png b/QKSMS/src/main/res/drawable-xxxhdpi/message_sent_2.9.png deleted file mode 100755 index bc0761028e27dba9565c1214f106f8f6b6617a4a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 962 zcmeAS@N?(olHy`uVBq!ia0vp^ML@iWgBeJ!vdv6jU|<vp@CkAC$t?Uo3Xnno7(Q=U zZ@L4isFEPRV20PXh2A%?G5+gkI>xu6Y=UaarwH`~+Z&gq#X{>(Kl#|Y_UF;k?aQrJ z-{BSf!ejl_^V#QL_m_r8ui_6%N{tfjK6Cf&{A!!6Dg_$GkIOy6ij$=#KmWeu>DhDd zY@+&4F)%POd%8G=R4~516WVmgfv4r6(P0B)UE}v{GiR=R{_p#V;()h>tl|Gz?VNAt z3mthD-x?pDZ%|_{<?plZ(ci<&5u$6=Wu0FMh`n96qwTtMM=tw5#c$sjoGywUH|UOU zZ~BpNGobjp!j%=pN4s4adxZ2P_BRCVI3_xMUFW0PO+R>?G=IuH=APiivwiu5tO-YX zJwji{e7vU0;mW#B;(qfL@568TmTZ$<_aeSMBw+{Zgj-*CKAOnBQuOd!wk1l_wU32* ztd-6?E#Q6PiE~Hki6_b)Ur#&|?%=Ka%`fY0R4JacJmr(o5x102hDVO2d=fpPmQuu> z)F$)Ku4vtoNnTnji6EXV(p>o@##41_NRX$Y>Qt6Uo3=YG-uK$>%<!J)kat8i-|5{H z?{f;~PbLMQ;N9`0_{7&0Nq5>^Wz}xB`f^V8Nw_RGImfxfu4Jp^!Bs~6I)~Tk&R6~A z8X>mf1jDvUKKBxvi15b~OgS#HM{^4rUAc2o|DDOim0@+8T6;o2b&00v>OK|r)-)1d z_e?O{Stnq|V>@p}F)d#)(a9o3XIuq->poc#bwW>U)``%N;!Ta`u5wg<X1Xu;g_*yn zEA=|x9Ubw5T3O+{KAzvXBRbRl!8QBY=j`^_|2k&%ujEsqneFT5tN9U{UnH|`ip}3X T*Wv;&(J^?s`njxgN@xNAavnqf diff --git a/QKSMS/src/main/res/drawable-xxxhdpi/message_sent_alt.9.png b/QKSMS/src/main/res/drawable-xxxhdpi/message_sent_alt.9.png deleted file mode 100755 index e9af79e97aba5573e2010cf59019e3d6577a0a9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 465 zcmeAS@N?(olHy`uVBq!ia0vp^ML@iWgBeJ!vdv5YQh@<JA+A1|h5xAsfTo@-NJ<A% zk|jZY!3^K|mAfu+zWSvyYwpjJuftF1N6h&VX<#^W(~E)v1_nkkPZ!6K3dXm0u1;ij z6kxfSnl|t2{eW8e?-|;USZ4Csu<z3TvH5dw<E9n%Z8e4SbbkhXy%?Kd+5Ya`p<Q3t zHZLidt~Ke5e@}4vPLpqf$M0~Sa^Ec>?J`+1`lwFnqDyBy)cnGdgikxUi!JS3Gk3#H zCAWo>c$ArMT4zpfT(c!5Re@dirqqcT?=rSc7bl&)|LElrM<+0dQ}_1(gA@N%6bXZ! zOl>V7aAkju-IL_i|7yPr&Y$vi{f+)_1?%cpua_^daj>8Gp~6|<*UoMugYBMYYU*#i z6#DDXy?4{Jvlni3Ut9H-D}L>ZTUotKiN8D-N^fL-{4L<~Zhl}eGI+ZBxvX<aXaWFa C2I~g^ diff --git a/QKSMS/src/main/res/drawable-xxxhdpi/message_sent_alt_2.9.png b/QKSMS/src/main/res/drawable-xxxhdpi/message_sent_alt_2.9.png deleted file mode 100755 index 163f61b81838540f6595fca68dcf7442a0b0c521..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 846 zcmeAS@N?(olHy`uVBq!ia0vp^ML@iWgBeJ!vdv5YQs)DFLR@_^3;z!n0QA$NEt>y; zlygatUogY5+d^y&uNnK_Gkq$1qP`+wdBlwgm;Xt(t_}TIf0{?o>PvEpDqpFs*d5-m z?Pu@*TCz0!Yig3pTkEZ&XKapcd;0m@JJ}Y;3I+zo*PbqpAr*{o@3=0KHsEPVWPNL3 z{5e@``}!4k{`<sEPxUU${Ks8mz20U~eAyo@tJvm`U-H6ce=zsW+PwQ^MZ%e#OW%Lc zfAwRjG4u1^I^Cz<Jy(0MC?KhD=^-cHUFoiTt9F!Gef$~Crx$#^<1Lr_mMpjCbHyq5 zj&}YObH9Gdy>orU#oZj6?<9rliu+WBJ##*4wmQ4L^LE#~H95{M(-WJG^crF|duH$4 zp>b=%(K$18HUzS+w9t>7xRhIQXZq$<Mi*1xo>(J1(cA3J#eXX|SAMgamg29(cVpAP zY(~qp%X+L&u1u5RI#C^6q@s|%?a9`LH8&@jGFom_)n=O1`+IAJkFT6#6AP!1ipK;6 zA{fh+fr>njJ<9#ne_a1k{rY{L|2zMjo&PiRUY)>%x^EL|?i5a|JM?KeUuj&_r1mF^ zR~Nf4T6J=HYDuE`g4=(08atj^D(`&hSlgXHHxGxcTL0zIDnCcluPKw6US}QEYYoeL zal~zA)9LukBdd34)+@*5JkeaWsb93#@}pvhx^K{yvk`N5Pk3&&(A{>P)un0N*0Gb6 zyUVVw;jvl&?u1tPi*LW|pa0tX?%>4SbpFE^zy9XGAF+LYo?TxXe|nYTUC)K*1zQqM VUVpz~J1`Y7c)I$ztaD0e0stt{^y>fs diff --git a/QKSMS/src/main/res/drawable-xxxhdpi/plus_to_arrow_00.png b/QKSMS/src/main/res/drawable-xxxhdpi/plus_to_arrow_00.png deleted file mode 100755 index 126ed2cf022906c93546042d68af403183cee2f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 248 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeE3?v1%WpM*3tpJ}8SD(zn|HOf3*Su!}b@7%2 z`2{oVcQ|3-yr<v%yukZ{`WGio10@PPT^vIy7?UM96GVEN0s}NOG+sD#vEANX{+?~Z zB1f?mj)_mQB(55)N(^z<3vgzBxQT=D8<VMz%OmRq{qBNhhBxny@rtx{vYm21>B-6X zj7e11>5={djb-ki53gto<XtSKksoT+czTf{yW2qx304N1Sj!p7HC&BAyBR!P{an^L HB{Ts5IErh( diff --git a/QKSMS/src/main/res/drawable-xxxhdpi/plus_to_arrow_01.png b/QKSMS/src/main/res/drawable-xxxhdpi/plus_to_arrow_01.png deleted file mode 100755 index b8fd4dad53cad92f20f1cfb4279f08edcbcada4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 933 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7Ro>V9xP$aSW+oe0!UDLQJ-Z>qDE{ z+j4JjOS-)+unS1%TI+Ai%|2>(*!c3x-Q`!q*Ikn;`CqJl@cqqCo;H`d7cg)sIPx!G zSOlcGuu=tYZfv~$QR|;8Yss--t_Qyt)%Ra|(e?92^XKndnSQWIuw=g!IbiOf8lk<G zVIO1Bp{QWi54<15`y?3I9!s%);Qk=@O@dMEfggye5hlr4_Q(~;EKpu{_*OaB1L=j* zYn}!&+-FElT-yjV&VwWSZ|!|f%>(Qf2`n?-{r2-<oOjGh`9PG-T828tcL#Ws56IQ5 z0W#M)$4C4QXRJ{+Y1qmHG-rXv8q;8)IsXsdvWR*7M`GU5-#ZLD81Ef&R6f9EBhdZ* zyM&#q*p?$MIS2D>q>nIsPuwY(pntF9S+0Ep|3s-?1HSCFo0l*67g)!$=C5Su?H%mz z6*aRGRl*dsv?Z=EoK4Vuow{yO1^532LTw3#eM)Mtg|09xO;~GL=VJNg=zoij8~1$f zNE~746yUnuIlbwN=MTx6&MJ<nwbIiV{r3O;%@cW1YVrojg&Ph>G&m-Hlsz!HLO@<o zS4ukn|D$YgL!PS>1m0K3Rv$mwUCV#Z-RR0OjWrG{azx!0%T0P*d#C)Woa>w)Vn_F{ z=vf%i6mYZ3$H6$|!0`%;HRqcA>JM<X<{nJh;>uUkr+(<K!MS~t4%QzA2I_;E4)faP z)iFNGJEs0<0oxC;ja!{(^#9Xn&f9Q}`8u2J0plB8FLF5B7IFPMe0#^^J-7eywihm4 zdqmlhzd&}G!lJcDGOoB9?dh*p-tks_!?7J_7ymHhU{vb5!1z30_Sj<1OAnQ8M9$uR z$Df@l(y%_G#L29t?|AaZZQTcNH5_2yu=D?<_`Yh91K%&?EiNr+TQ71z|A46kQ?@EF zy*Nomyl#ID65+Q<k>6Drw`Da0e}dr})gXrZ9B&iXwgJ<^3C8Tnh0RPqSS#3n_cB<2 zoC9R;;QgHVR-g4l?*-9oTAB^{4SzP6o%{a1fvKj0*{vbBB9^g6zj7vXcBUxMj>|v( zimS1DFlVp+&;T-q)w<xLS+dY9kiOT362=!LD?gS#SjWxPczCDu*ZfuD0;~ZHfefrT bDNDYDmoug;4eyr(W<Lf`S3j3^P6<r_SMZZg diff --git a/QKSMS/src/main/res/drawable-xxxhdpi/plus_to_arrow_02.png b/QKSMS/src/main/res/drawable-xxxhdpi/plus_to_arrow_02.png deleted file mode 100755 index 0bdd6e4004e660b17d55fce0837f6026964d7de3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 999 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7Ro>U|#3x;uuoF`1Tg_hr3Y{t{?4g zZ_5Ru=;q_MK#aHHx3~R^G5!2hX}MMP`9H_b?zLU*GwJD5`F|D-F6|2#xD>b+Ff78L z>{tUB0vT8ZKvY9dPtWR)%BLPju@=-nIQ~GarfXM3+uPrMjCbVzb-!qBy>We(M#F7} z{ReJ2#jIj@#}w23bHle*rXAb`Dpm)ga%C1Wyi@wak{w*Q5F}<iO)2ALg*W3JRtv_t z32Rp|?dbhrzQ*^+Pp$`g2j)ifFUUQ#8pOQ#f;n6D`{VDHobz}0)or-Te2Odk|6`Hk z_a7?#Y20{YPol-K=?wizx=quX(q(GD>1uRV-Y9)padbL^da}kE(Y_C#`wkUnG?j8h zdCN29*iT{FV8*dr^`~U|gY1H}Gq%ZX|1I>uGsoe=wTJ&$*4K&_C2>89m5gVa)0wzo zn)SKtd+n<t+FZ7?g#Y~Hvc_c1*TbEP*DVC!FW?TE_~zO})_A5pEhQ|utnavgY!rV~ z-s31TyVGgMz2)hL(i4={{N36wU3Jt@JTQl)?%2+_eWC~b_b9C?J;qrf)Vo3KWS;P? z2c<IUHTL>UdzwX9a!uWox^&%G@2tHZRJLE$fLYI+^Z%owz2aNmb4-1h^!J0L-_^ST zzZHGUT((|a(SN-6`Dv~L4`Ukc8%PD_m~}m1v*q8w|Ibb2u#C&bi9cAMzijOJ>vd{! zMu(|K+3X8^`Hw1W1-b2hT>ilNOL^7Sqp?*gneu-`PjsE^sPg^dWAWp`dq-ED*40ZN zIJ4fUd~y7-?-pmSNq4K39J-Y-=WQti-vf@C-iaMa#Q{9#i+K-yo6b}a;8C{tqqN?Q zr?>bMRo9$7{4|cmK*^@Z<j8K3k|WU;iVAtGEo)W!K3E<Ie9;@Roo8xcKF{@ijGL2p z+*987U-ggSAv4LFg{gC{{}WHlZd_c;SJ3tG{a?l(Ld(@F-flMFx)$_t7dzvb=3nf$ zw~O_DFzM@haBIFI>$P7GdFC_6bQx;&&X(O{b6YO)_u=OZ?hiuRuh%n4C**4BUEixv zF1SiL$5r$|Y(umm|Fvn4<X8*D71<A6V>qtSu>1Io$BDVJaiI+5g8N*o)_gtc$@M_( zfai<84YkXGsdP_==>{{waP5ZOvm3SwZksQ9;H|y)^o01?P5Fgwz=Rqguse_0>;3-! zg4zd`&gke}k!+tHzz{BY@1D>4r5#Kf4H^whn3T*4SPq-S`MGlOr7uPT$-oTE;OXk; Jvd$@?2>@mI#{K{R diff --git a/QKSMS/src/main/res/drawable-xxxhdpi/plus_to_arrow_03.png b/QKSMS/src/main/res/drawable-xxxhdpi/plus_to_arrow_03.png deleted file mode 100755 index 1caa19bbdbbe6b30bf71c8544885ff8b205a5b1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1017 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7Ro>U_RjK;uuoF`1UsQgttBnE)VZ- z%e@Uov(JO6;<cam%$eJ{P3z^lU#HApRTORC_4euZr97;5j)9C?4j~O(0-_6;Tv%5y z;N>>lxpU|32c3Nf^|Tar@$T1t=Tg1K+bl1X@nQZC*#g-rCFY-(`K(trd@%c0nbFT9 zGF{|O*s<kDxHl%paPQ!ZG+4@8rqRs1U%JkfE3PM-@%BPPpOZ&o1@*7blxXmcYzcl; z#k+%Nb)uK`8;Ogb_OzvH%*nf<+sB&I|4YpMpsk|*am5w9!F3(cj6eIEL}pwP+}&#O zf3_j(QdM5_V;dXR2C^?(@_1dt^WDb#oYiuSrQ45wbbQ0Lrb%<|#$bof)}pl!W~Esu z0L|;&C3d~(H}j0^+!0LE*BrUMu}=I5S6quI(3U>A<@F4!4w^a_zB~5v$gYOmK;dOi z9x(D>-X|seV3z$x_euBK=5=p1SSnpsTyg!2=%t5~ZdMp{u3x;}jki1dAhXzIE5^GI zW=*ru+Q@9Q=8vjaxr^<_)rnI6$%-+X*yNLDAL;LijL|Xv=wZ13wz%lSSrc~@oZb?0 z;AaF|a8<(en*BRPk{`_azhQfuO7}g%P{+(liQA8ammE<2{9#6$%Gvd;;RmKTzF@ds za$uvBu-@Ok6+%ruTy}@cq=dK0Z;NSEFcO=d>2qUmOV@|lT{q6(Hd@hOY#<%CiR1i_ zXg1LT8MT9^cMBKo|M^;~z&`De>go?W_ZOzvvcGAxf1o<KaE{%XPv6~2IR2yv_=PdP zlm4%}#zo*||K*T|yKVL|yaFX`k1RwJ?)@lFu!@<~Y`VeIf6fY~uK)i&siz!P4K9$L zcS!5T68^qWMppTCYzItB3q1C{w0R!j<S#S*2h$CX^+}R3n`G8Y+Zk`%TTp&juv4c& z)Lv+-ZJfvXO&X@6W-pr-PmVaSTuyJxev2B$kGl@PTp`@&6~*{FQ6k5PxxCV5@6y9+ za|=C!xK7yT?G{>Qa!k<f*~fW@Kcr~OOxx1^LAq^vMn1d2-`o%D4o|$m$F9DzA@{<n z8SnMab5~e=wq0Ub(^Hx;X&!Umu{AaK<KIbMs<A7v5So?zU&WU5e&=!}i(7V%)0{cm zvmMla2<_WoBNSAylZ)e_vwpX7qUyT~9T7X+4}Dktqpri+pXs9WN2u(8`H6$ebPoDT z33h)g`I5Y^KK|Zn#gi|*Z*ayx&g1p$;tF6~#1zu7f<aWkOjJS3fwco6g3NuwxV3bC V*SU^2X}~Pa;OXk;vd$@?2>@rFzLNj| diff --git a/QKSMS/src/main/res/drawable-xxxhdpi/plus_to_arrow_04.png b/QKSMS/src/main/res/drawable-xxxhdpi/plus_to_arrow_04.png deleted file mode 100755 index c1b863b3a2622c03ba902fc2f8aa9cfed46b8e92..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1032 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7Ro>U_S5Z;uuoF`1UsQgs)x_Ef2GA zZ_9<Eefxo|joZGi+xydRgU7Db^NNg2Uv4%%_=fBGou3KZLiPR{S`MroTmg)Wm_iy> zFo-JP;Wj*a^eA*=BUi>wCb^>qZ&oqQ`u`}tS!PNa+qYoGv*jPpyRc=Y3HF6CGHUNV z(c$dud9Zb%euL+{ZriAYJGC1bd{xEE+cq(%ZPSx;VpB^zohDPQ?$fGTyP;|YmqzT9 z3w%FUoasMn@=Z*F)B9Lbd%#~-gN50KjJ!|3H5`wVzngfn<c;Vo(}t5dJ>?U-k8P6q z&2I8<)(_rkI>#n1J>I&qLDoRtPqOE0ja+qV4VSl2VVK5z<{3A>YBU7j`&4*l>IWsA zlSe`q)(NFG%|EQky5qp|k8%yFJ9jMqGGl}I2F_y#HH|mU<zFxH>ERS78|j(b7y5jY zSaL}7e{$&b<T?E%5uY5N#JL;4bWb>0t9P!}=27BF{s`SJ)-_%KA5Jlmkvv?<e<&v6 zll`^cH|&yX`)!{c&^)|h-@}^SiAp*zyU!~BcU|+PcX8puKPMjAL?<igNOsQs;<@S9 zqrI%lpFCXT)_0#{Zo<hczx;1&CDcA%Uv5{ny7<klAFR`K4jKN^xc@`?lEvdgJH3t? zu6~#tF{#6Ni}s?ILhl+>`*&3wE!eqj>5Y50|8Oin@=*Hmqq+UoTl7!F9WtB2wf|F# zS=!OKLnlwPT;J0h8q%;^D6VOGO|xlCAHV1ZwyHzE|BhDOl74mm+C<e3)xB@tmxna` zZSJyVF60XfVZ5jRkL^W6#N_Vxg$uYoY-9Vws2|xSzHug3$J<BiJJvr4cY9>?J9Z*h z1+VJ|W7dpz<&cKY_FhkvSExLweY1k;Rs5gX6Pdl^4m|E?o_*%X+X#2o1z(c6FD0C` zHtn-!saN36yCj|N_P6=W$Bt&z`-xN8w#m)wPb`?MQ`5J1@ekjM`ZLX{Z#PUkylj2D z0eha2e1G!e6>qw3a0VxwWXMUedB5(5OlHAk#T_!*ZI$sCo=GqQla01`@|=deg2_rU zV%OGoN-x&enb~;Pre~{I-f@*9lNR1ETEqILDdn+V8*}X)mTzoAJ^TNCKD^KLV?g^+ zb53<OgLe~uTz#1M-hGW&t80b6Pi~6%;iZgyyN%Xmr0{wjYYg1QdzW$Xt2Yh1*GgVr zbbO=0)Jm-`{-oIp)w@2VaQE!z|93zkNA_yC;Ooa>Ywk4NmoK~UI>Y|u<Rt|179!^b aG5uAUzTo$zR3BgtXYh3Ob6Mw<&;$T>6X1ye diff --git a/QKSMS/src/main/res/drawable-xxxhdpi/plus_to_arrow_05.png b/QKSMS/src/main/res/drawable-xxxhdpi/plus_to_arrow_05.png deleted file mode 100755 index 11a189b55e2c3689feb16382afa69c17fdc5afb9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1003 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7Ro>VBX~E;uuoF`1Tg_1er{RwuhT@ zZ*R-J{q5+sUZ*!nIUsi2>)y$(|Ig0!`g=e8>zw?mUH5Ov&im;3?@^)3^1qxK4H^wh z9ZdMBl(e*YD;YlWevr0$kjL8b_vn5p?}Cimfr8Vu9o{fqar$=l_;)S=ps;-PgzHt0 zGg&+I9KvT@i(y=}^M|}5uix#a-J%MAy6Y9w4sDrq@eVty2G8YZkCIq9{y)0k<y#PC zwXfruorVMVjBCN`nSpxFD{=bWZf^(c5o<fVrRv&V(Sx4#eb&l$$Ict%TCUrw#i0I2 zf0Ci?DvmqvrbcjGuG{|VtcBkWjc*TcEOQfVyuF6&vfE>sY^H)utP^_P%<j4EWOJ_e z2J3RwhoRbb{1(3wA_PvJ$QCZ}_Bj5U;c}Gh-}h@d0whiv<O=0+SF9<Yz_&d2SgslC z5BWTE&h5W!&i$OhcG)Z9`%DA%SdNtin+tawJ#P5v;FioCH<mHnR8~2B_Shpe{_VBO z*A8XA{Bfiy-&I1MKj>lF<HF6SZ|AaH-t{_L^MR9yV_W<D7HQt?-&KSjY`I$z!RQyW z<&j*SklUj+o4n^aJPnzqUyrVtBfh?+onvu<v)=ZPvOdvW*&+((InLC!y!QW9uYWjc z#<$J;X1$PExTXDgOX6{*56`>w{{Jo(IUuvJr#;@i_M_UigPENbk@4qB<rm6adYD$7 z5M^9zeJj4jU>oChjfVXkqJkx^f9|uhS_n^_$Ywvg<+F&wg2jS=a#W=rvfo*s?kHHl zCF6z~k6Y-TW@(WFzt=C;@^HAInk;FhWIykKDpx{Zf!s62H*XK6m>k)@gFRi-;T*$# zWzoQVS+)gC_ZZgi_^SOvOUH4|^bXgI_L?1G{D(fqDoW39v+I~!5XGdmfHUm@!=X5) zd7BMEX~g9Ab-{Rt!Y_wTO^~yG_PA&@Q^6s5g|kPSpPl84XWK0~e}S1>qV%6Nt-1NG zF)b$z)-Gtjy@!GSvHq5WGAako)@{>u2%KRiD$Y_<_La$Nk^MC#*_+#C%Wr)t`=Wb; zWBJm@Zzsg(-tW^7kbk^^x!p|i`E8K}mOifqn&TV$7a8o^_)>V|^a&ix-yW)cC?7wc zGrs4e!P+8|?~aUl2TCk*IrYLDUMR&hO}f!@=UZ~lyKcKldqj07^dw6+Z5C1Z#((PZ sgr@XI#r8nkc2?M4c#AI+!R1mIHDj7PPR+~i1ZH9ePgg&ebxsLQ09EM68vp<R diff --git a/QKSMS/src/main/res/drawable-xxxhdpi/plus_to_arrow_06.png b/QKSMS/src/main/res/drawable-xxxhdpi/plus_to_arrow_06.png deleted file mode 100755 index f1dd87394a22ed50304bf929103fc7d9868de0e3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 957 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7Ro>U~chraSW+oe0!TYM>Sif?PKox z+}qo7*MNxj?AzPc?!H&?cJH>2Dl;cf`9E)`ZT#|+-}jx==S@F%X0l)DtmO`OmkBA} zWnm3q2xMRtz)3ay`1||){^<+N?j2L*n(&!%o?A}!1@85agIG_@WYC>>@!LZExFCjd zb9>3z3Avk?c5r_XscYN1i0gr#19yaV=WLM!cOR!KukkJTE+z7yGeh2<>w?I&a}Uy3 z3%>t|6uw(-&-Fp0u4(HekOt-m>-K2T182|rAJU4Lz3M*e&e}hJ7_yg&D%?7L{w>#o zcON$kT}#_l&CB&cU|;*zO&~q75x<4XH5zswKQ9z9`|bDmBTe>#R#xw7fAC$?s*r7v zE?_;DB$DU%VPp1zTj4uSe`n|wye+n8>Vaha)~!3^_G>pue_-3^daAbd*A9)@$M?zK zKNJ<3&s^|vdm_8h?TR~-dmo3lZ(U!wemdih58Z|`k-74Af9F4sV9Dm*Taz62q59{p zj&l3Oy6bof`>H?kt_l5W=^)>7H^xThx#g+@x6F53?`Al*eO~DY(L--Iyp9z9+4)f3 zzOGLEi<Ftdn_mxq`SewW%OqxNI5f;IRAzf5-*Pj`X8ysCT8D0x@3?=P!L8$xMW2Cn z|0xf@!Z|lLYzxWv-+te0heV<|*Y(F~HJsU{A_w{kM0Y(5Z@J0#rG4xBj}w@Vh%4Fi zDNc-D`F{eZ_(Mh?_eEjq7Vlg=4yo?YP+PoT{fF>@e+SoE?sG2NF6q6I=k!Jq?+qf{ z%*BS%pAF0nq>Y&_8<-mKmMU`!ICgyBD7!P)doPE8%MRAXAH<7Jr~MRCNbQ(qv6|tc zTZQ0kfv;&wCwDVw)}={wX_#MaKF?t6WaqL|av%GQmNnn3{~d|{AzQ<<;lbnkKiF%0 zjDL%_Uf#od;OPC9%NxvC@*gMHH2DXgkUr7=N2B48hLlF1QsW|xMk5XJ6;0o3_yR<( z)g4^CF24Od<FUiH*kYD2y!$tySm;_5C<O#?T&p{J8JGeNWJKKV>J|Z}n*EIKiEDdz zUthpbnfNx`2IxfFx@`}YfGJJ;CHIDF_wHr~G`Me&{x7k=tRjx_j@u5F^$VoS9_k<2 z#w@PwaPH_14*iA3-;VA39oX=~&Ujr2{*1xEI$_6O_Noc3y7iJD?Sa{n!PC{xWt~$( F697dGsGR@+ diff --git a/QKSMS/src/main/res/drawable-xxxhdpi/plus_to_arrow_07.png b/QKSMS/src/main/res/drawable-xxxhdpi/plus_to_arrow_07.png deleted file mode 100755 index 1a6465bf09104f862ae4c33713344dfc3b90f9bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 992 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7Ro>U|#O&;uuoF`1Vfn2H9v4*M~N@ zx8;J7EQmbUoqO9t((t=g%+BrF#bLGeyUVIt?#7-h{BJ$qL+sQx_F#rU237&q031|9 zgie{kx8Q~~+yT7*7b|Be@Y@{^-XY1Z(QyCledgwbw_dCtxC>a0DQu~<@MiqOG^cSV zN3Kp^2*ZAc@B~q(*X_2V2lNlrZn$>sI}g_fu{EJV4EGuKAG&4F^+0-o$(q^~4Eq>o z9lo`g>p}VFa##I`-C;mOWV$AD<SL#E1RAnDNz7?>L$V0akfjlw7uXW=LH4PyDg9vE z%(RCo`>N;x^8@`Grg<~gFpIQq^#^htoFl5e82{w`(|f^}ZLZM}-@t6hvrzZoPp${z z4^(`dGbR`AVfw+kgX6T|t%Upjp&}2$B3{3#W@D{jy!J}tz_Qt;0_#qHFx}s{m5FP^ z%e1|Ht{DxxH@LH{ixjxFFQ~!S{`c>s!_yX7<#~PHRhsa&l9j>yQSX6rYwiHa>&q+d z>TM{?R$;cNF}uNjO>CjbI=@G|ekU3@MYnZ}D2V;$=*$!AdiaQCUA2vx@|H{sO=tVI zzlB!cIzkxuYIxj~Zk}~cjLC`lU8CceakwC%>-jy|=MPgwobr2)vj%d1Fqo!r)z@8b z&c3<X_ZhP9Ztxb051Z3={G+^8GTXL$rvte+sOP!+>bR|%-4<h!zB${THJkUbjjJtR z`9tw7M=aK~Y!wpZ5a21)pOwTKbeH8%kMak>HKO-k@wh*-s_C<m=zHps#=K#DJ;VLy z-^&*pPE)?h>lz>NTQ>b+Y{(G?9Y?F^j?;gcf3)9__FrJT$BgsygqM58cQUwj)P9h- zl_<JsgVhbyO^iMDA$wc&POO{VfA5FrZddDuzh_>UesK!R7i3$+b?@j>3zbd&&cPfX zt$roA=W4nwu-kXU*P>{7o#J6$3z_*z8b*7k&S;tTL-PBBioJr|^-cdc*_7v=b!Gq4 zu3oSz&QneN5lc<8r$-9+1zFdRT<4C-RjJRZ>#*5yO*sE?kj$K)#u^T+5!H8rDei*U zwRfQm_t~re3f$5<{@gU6LD^7j;n{<dptPWK#yKOopaql`xUT(5DhH;l4-9LzegdT| z=Ip1SlqJ96+j6EKY%8AqKXz&ngZ*ORf5%mHivG<H6gg1QT_$tx@Yf2N`HxfZWFSc9 cx_K-s`(f*mO9v|~fjO7K)78&qol`;+0LHeT%>V!Z diff --git a/QKSMS/src/main/res/drawable-xxxhdpi/plus_to_arrow_08.png b/QKSMS/src/main/res/drawable-xxxhdpi/plus_to_arrow_08.png deleted file mode 100755 index 77cc8c526c526a57b5acd84cfcf25e0e1081a436..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 986 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7Ro>U|#6y;uuoF`1UsQggcoct{>Or z-rkmb`&(YlZOtP<#<sm1bFFPHH^zVFeZThC(ab;oH{$(Qoi~2s;jpNC0Rxu;*8+w` z*r-V>m^+w`96cJ_>n(cVyVCt;{fUgKf%3M7Y{e7f7;BiPG;QtTdLXS}x@Kz#!+nPN z2W}~_e&GF}#N^g+(juPm50g!cu3JOvjyNFmPRmla2HqY1KxRx!rdz|`iZI3+WuE4( z-$f6YJ5)#fb_N<4(z>+<Xy5{dHKBn(1M3e)S%VC;Tf-X)<epF3FPNaE7sRli;d}C8 z!355{5Fpb$VWMDyv0MO<DW0%NP@&;D(7;0p5x*mV25xEF`d<WSzH5Z`8isw0MTet! zK?Z8CDGdV}`2Nr>4iMMmn-pW(10mKAwawS8ln)r)S;SDsxb9$$@&Pj&nZ>_<@vNWw z=Pg%(oZ6vVrvvXDuU*kPSEBp0=z}NRSLCnl>v*(v*`kP6;prcr$ggHNo1h!Z@_xq; z>B$Al&K{3FUf;(wrFHA0#5>n!zv!yn5O&kP;Xdnc2Hy|n@461YO>N)0OYzRJ$1D0{ zIZ~rP<OJ~sh`Vo>ko_PoccfDA&OQDO*Y5t<d3~Y6H03*`Uo8qh@B48*iSOK&r5Wue zJJfq_*Dzl@_F#_jAItyRY6_RO9{cL4d*C>S!i{T-lrKFjoRfX$+2k9!cdqHg)E(;o zFHoCsp6}P@>y?|!8*XuwpS~zL^8<&T#Z$BQN3tG2Uw>fh4tCRxq7!rMiXLm7&wf(* zas6>0m(5>a^v$Uddj6p13|Em^jBvNW$+AUK@5=Xl_`v^xH)&_-i~cu1<Tu`nD>3?~ zKKBVz$`Q2+orZ`!lR7iIQ)-@UJ0$uQt*equg>Fw%)?erQYkk`-!*j<cpXfLj(cW@L zEadQA&u33F+WUWc^?!@#`w^qQXX)pL$NKvA9rhO)Pe0ho`GZybmBTT+kH5s%CP^eK zetP6Jx1&}3aoL}~XEXW>w)0;7IH6BvaetwHovX8s%Z9gy%&mmK{hsmAexsd713NG+ z9MOoV4hE)$lJ>3gq6hvjI38sNjPwARYo|0C@*B2nxE2GHtYOS%1}2mP-W$vWpKCV6 zH?(g&%dvs$I*1v)LC#(LfSb;dl#*k-To1$_2rW5k|AXQD!@8LM&tJcN;lY}DkObKo Y-l<pHaOyAl4a~C)p00i_>zopr0G2(z^#A|> diff --git a/QKSMS/src/main/res/drawable-xxxhdpi/plus_to_arrow_09.png b/QKSMS/src/main/res/drawable-xxxhdpi/plus_to_arrow_09.png deleted file mode 100755 index 9b195dd2a560e8cfb17078326ce09ae2e2c041c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 983 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7Ro>V4mmc;uuoF`1UsQl;lbQ_lJ?U zx8(v+b$Je$u{Zg4+UvfV>%{*Yj-UHkwk*W_+-siv{}VlxJiG%KSOr)E7y=ty_!YPo zFf3x=LZ>FonpLH`?}#~<z`mvN{p&CAo!*e1_P~U-VEY&2kG8uKP5b7l*sNlB$26y1 z)gzxvv*9*JXfH!@!6v31+#ePRCWyZaXDDYpcQi)X$&a-_df__31Pi|qpwK-trkumF zTo3dP9F0hF`QgrZ$1Nj|<wdu!$br~~{vHPD!pT4*3M9j%1nYtswhP{pVyx0=xXlnR z&3Nsh6>EX`gRC`%N;Rt)@{~(VnMwi}wlmflFs(Tv3Nn)SMuy7|7od?Z(pfUrG2}7- z$!3XY>INBYz42_vhdz+eN^KI1ui8I+vO8SLRq!NelO&_qgC>EPbL%~h3B)X8XcsHy zFOv|w$MMPN-;q3-8UJ>;Fdk6yJEWoPaCX7FpU3Aj?g(jDYjS;J%yj0^O~yIz<2{<z zzhqX@IB@vbqM#2x45#n&X16`+a^WxFQj_Y|dVT!oU*<)Xvu5s4{l|R6TRT%H%gFEZ zj+*txeCBVg*D~3(ru>+tVv{$=T}|cS=^p!{pIilM|IDX_sm#5c{^fCIy3)F<w=X15 zk2rcb_?YH#%UH3Bxfl1@^J*XHKDM{QT+ZT^N#w)QV~?cnUw33YcQ7Zpvy%V!ZyAqo zb?3KFmoH{?sud7@9)8)X&ZJ@aT*GgllFbh^zv!9tgY*1jt2x3Ce(ufFDQ1>B^txw* zea6wUhWCX(RFXxPEs)lF<iDrqcEQ5JI`ITWC&R;qr80lz66za_(rnWf^JhJ>-_yRk zP}A>T{k&3vH$9u)|NJPpK)GqIZbXCPipDaIiZ}1e?{HuL<bOEA<?;>t9Y+EiR&O*q zH7)=C=f@fcggu;0&IJ4pU-yIigQk-GH~*eO=?7AKTI~ZRV-0w-Co~oK?Ej#DU+m@o zuKj}NAF_+MTl*X+dgHPpP5j-}LdScD<}_x1;MnKlXmU_P=a3nTk-VnE2YdIpzUq&P zMT_*<68R?eFyx9H@SP!C!1zguaoS7M1GycuHyrKwFpp_RtqPARlSv3Lb#1b;tGlv* zp*(rF;6rBCg6cmnIDX8!`Xd;agiiDxPS?EkX!Qq~&+8fZ6U}BlUi_i{^-6~24{H8) oPts^$>R{4nz)l^w&83j(rCw@!>v(|_FvBu<y85}Sb4q9e0F$t(zyJUM diff --git a/QKSMS/src/main/res/drawable-xxxhdpi/plus_to_arrow_10.png b/QKSMS/src/main/res/drawable-xxxhdpi/plus_to_arrow_10.png deleted file mode 100755 index c693f0d0b9a1a9ed722945795a24dfaf5e3a3669..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 952 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7Ro>V6OLcaSW+oe0!U@V2QVk>&Nul z+j1dj_lKP7+}mzBze94@m;bhZwc`ESUq>Zt(jT2sQje+5<`$A=VGUpiWMCCQryA0h zGAv@?Qs7zuq<VXMy^{l3GiEl|D^?}Nvu505-f#Zzz?r{YuA&Nm8t-%DFXAd*$GBY6 zVF&Ymm3IzeV%z>jcrqShiQuwLc<aZ?A^y<e%AxH#IZGHGD%J30=K~co%vKiP7n&ds zlC+EXE!?f?FoQum(PGWql|V&vxU-u#Y+`ER+#vC<X=}BpLQIQoAn*N68#gkwbbruW zvv)PaL#CV_ogZPX%pl3ziEs0D)-fb9>GU7mP?pzrzT8qrs+OVLz^{30VuY^q^X)8l zhtzLGG5**lVt@D+v!vDj&4$H~3#7xk%^IvVb}tm#_cY<N$@%nBo+Eo+cU|7-GKKNZ z!Aj<9c050JugI!te4E6(fpOV^?O8ID9=*&@o4fD!!9cbG_LpiAzuCRjDtC21s*R`? z?>;7zV9C?4m3xxS-NS*b_cv{*WQk`!(_E^wruWDz&UyEYUT|cWpRJH*jo`U|_|{>d z$k7eguCs<RlwT-wm8>~^H0;>RHQk0E*77Ys`n|Y8_MvFR?=u#?=?QOdv+m!|w5Hwj z!&<iX%DNre4f(1!q8Y{H9<oLJmiJ!zqx4DYUHb$7wrw$A6T7Y9{gPJ?Z)>bs%uv?y z_yWWIV+p+9ziBVBUK5)-XZvD??nl`X)mQfZox9<h<Y^6uM}lQ;oHeHpWlFH$*DBod zPib0B%kzY_3cdNUyj&a1)Rg8vO|WM5usyWZBmMh}{!cI6fAFu&(Fp6+VhFEbz0=WN zp#Sdh-5uQ9AII4=SQm1?D_Fn(u5In?V&lByzCU=rdXzoieOffM;cP&Y&w9p_Z`^fc zlN)pc8m7f?ek+--xr-rMQC@eac+|HC+6P`5vfmKWm0iF+t<%y$F{<kNF{y;;DT|ky z3uYgeNU*i(QU9P5cf`0t>io{-^NaQC58D2pQvEM<kHPWR@kMdRR=-O<zxz0I;@h1P z%sRJxo^MuOv)=US4gFaRx&prqU%x-TBZBb|YlLv}h6R7y_LlI^{2-`zbdGe={oQJl zMG`bi-0a>RKDDbq;`E=NMbURX{gpUD=^vU6a8SO>b#rudnf+pcIg-KC)z4*}Q$iB} D_5Yt> diff --git a/QKSMS/src/main/res/drawable-xxxhdpi/plus_to_arrow_11.png b/QKSMS/src/main/res/drawable-xxxhdpi/plus_to_arrow_11.png deleted file mode 100755 index 49214250309bff813409f4dd4acd7805db504ccd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1002 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7Ro>VBYBI;uuoF`1Vfm6jgTyw~ups zByVra1*2;~IxTEtZgR>07cUmZZFT!v`~1(e%DbCOuiu{RrXE|r`-+lm6O%@RMgx<H z3zq`d0)|BlxT(<4(BF#Dj9Je=yg#yjhc9E+zYp^d-Ty88T+`vKOpRWYLZSU54c3nD zA5LG8fB8-GTUbK{Up?~~_hoxKb43+?F}zL^%Q54Y)^PYDXm;G`Mh?p<5rtnIyC28i zSi}7Z#B6_@edA4NiZ)QexdZweZXV_m@Ndcfpl-BQ==#wwW=|GedAgswioxtRZ~C!< z|FRnyd<!JMx$g63-1LDf=bJ8H?~i}iAMO9mY5c+9+(9#5tA=uppD%c3*LK({?J3t^ z5^Z_Q<Ojn&$0<n`Iom{{-3!i#e&qAneWa7&UgMhn%ndg~)`)+qV_zur^4n%%dsbDM zQ)U&+X3{;61in`ZEIaG4Etqjn^G$a7gK2Lkh<~t4PQ3N`+`rid_kS$@Xq)qmDePnA z-`<a+KGyecGTc*~+aI5}xw<y)x5$idn%7E!ZV517Bs24yxZd}|yVnzM8Q4yH^w2=A z^=#d-lhgj|ScxyYyOQDm|KGEgZMZqz;>M%(@^x;zrY6g?{`kL8bdh?_H@Py?nAb%! zw(%V0nov`)I?*J@On&zAoqpysu7&oiE$iPPn07Gj@y4`6ue~=gEsI^kFteU7o^$qB z*NgRWyUkBc%-f$}&3Z!SAwvz<?5!^AzVF(dcq=DGyCJsa@kiyHZ%e+<T4?Y#)OOxG z{X<88$j%IFO#fi!V;#r%$9;$F)D1H}?*Gjtt?96V<GjKfH}*aDA`0Sb1=9Gn9CmQH zzUWq1eL#^*z|M)Y?cn=+N3*yD{yf;ck<ILA>JPrUYtipjGyij(X1l?h{vgccXo1eL z=|3c&e%QQPRN<%LRNVp&y(7XenmjAG?G;X$I`>Ux-1GkG@rQ1ETK>)G_x~WBmDRsP zD#3J(OYV9Z^Bocj+>-;vziI0gYc+^3<bQSQ)((jWg-5m))$}j@!LZEKbzwK7U;m5c z{pSt&|9<4kJ6L#wH9NVM$7z-A#1Cbbq7NKG4y4_GEbHTvZqvnGs9<({)d{0J*|t8d z=I>tr{jU|nw}G|Juj0ZhX`O=}CWm7!gsT&rpS0I-RIt_^XT3MwT2?`R{X)aMBZfC5 xvz4ruRm-(Jj;T_&?X(Bwq7F!A!bf?SeswMtxVhx&I$$1V@O1TaS?83{1OU4c#(w|+ diff --git a/QKSMS/src/main/res/drawable-xxxhdpi/plus_to_arrow_12.png b/QKSMS/src/main/res/drawable-xxxhdpi/plus_to_arrow_12.png deleted file mode 100755 index d0c50070f2b002a52f62451f385d6022b30c1612..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1000 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7Ro>U|#R(;uuoF`1UsQhUjRS){p78 zx8>g6W>^6t&)$-~vQ2RHyR9Fu-kJPovETRD>}TPR&-`qfobpaf{Laq@Tq@eH8?_rW z8kjnmG>D{3OikZ5E`IhuCg9BE{aR5AMfhJl5w|~J8&R`A$(mK;+(~;m)rhLe1=E;B zzCFqBQY=_2rk|k8s&VG=Kk*YOu^ZhdzMGhxp#P?qd87EZqjlYXf8DZU*}*qWwV+mz zDW|v5L!s4Tk%v;>!5atL8Q2pP*8CQb7X7fJ%td6K@8Nm-Y}j)ewkO_AkO@0beIR9r z*wJ(QV%y?6HFRe8R&y8V+*anf9(3dC@$f^t7ul})&3XIDM~gBio^`Do_lh&hge#n1 zz%|YHKxU;?+gpK#?7%mV+!?-mTChG&j5M8hSgNvugX`c{i?Yw!4Zlx*V2`*ixcg}Z zKgXf15@nzC8-BOk>5bf=)0SOSq1SbID@WNE<A&c$WSSZ`yo=4r__M#vfngo%-wL5^ z?l%P9AKt}iapQ-8NK>}wn|G-UhodD5Bg}-$CEqay?hyO>Xl;j#@|(VM8{SptOnr9$ zp5(=8->nYFCHmU*OGTLRsV}V*>N~J?!Ts+H)g6}&1*e5R%v>|?DEG#W|I-(K<GB4O zJ>q)V%kZtmb$u)`-HGX}5p^BE1DH-L?MPbry-BG+w;@;Lfb2s9p0?8b#Mqq4|IS+2 zvMlZ1U})D=YFj9#c3^A6x+Ww3Lgh&t*03xs&|O#EpnGWEi@uuNP4k%F2wpqZy~24N zcal5n3B4mXXRsXp;-qt5aNFVh6J?4y%NcgIR|u$X(CgC`QLq=}J8lsX*8hFOJf@WT zN9D&<D`b@~aJ;U1%)ol$&)my*3k~fKdxR)lcik|TX@~!>yd84;lUP<wIKQ{sR3zc# z<bC|_4)ja(R*59--LTJ&{{gRwOwa9)+)Nr@f-F|3)~oEa>pQUbhqR%I!hLN=p6>O6 z=G(uVZ_z(iVxn|^cI&?i`R57lHeE$$ZeDLo{%Uq0afREyu%>$zlFO5CKm9XbeSzq< zkcMT;u3iw`nPau<q2-)DU8A3yv}%|Bsrf7~w#IuA^SmRTH&lKn2Q)Ybw3c))u$_0{ z;?LbBAq`t)=KnQQ=-IY|y<Ng@7n6kYo({{^?gINCi^+8Ha@F&26$sQFJ9|SuTjaZh sNJ8nFmFuU7vj#8(GO!BZqb8@#ahw?0vqa<tFb6Yuy85}Sb4q9e09>-X82|tP diff --git a/QKSMS/src/main/res/drawable-xxxhdpi/plus_to_arrow_13.png b/QKSMS/src/main/res/drawable-xxxhdpi/plus_to_arrow_13.png deleted file mode 100755 index 75f2a2bd7dcd27681029c4e4dd4c5ebdac29fd00..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 963 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7Ro>VD9pCaSW+oe0w{2f_5~6>%;Wh z+j4JjyT27kfRWj8<JYrln=X55#a4&c)~8$TJv8&2s(s3NeZeJ@7cg)sa4le1gh721 zabR>|6mh^pO`1Ge|0uIZZ@j32jrw1`nvS9u?NcqbRqpU)bSi(8?`o`bSaHsN=8Chy zj5{2|7aIOMzEzN~KziDtEpy_yKj`}9$`w64$KjU2cG>DdkUr~+-p||lrhar`VOr9b zdAeY_I#YpjoFmViZQ^S`gh?>(X^1U|;<5YS)u8qv{i8%rd_ky0+~i{iw<rb5H%Nap zC{w&}*3ImW*ddOs2~qJea&H+|9ZJg%;OlRFaHGymXwEi1e%I=TQx+_@-?|m=dG~0e zZCh?Z6w|)Xhq4b8uV~iY5Uca+F?&p6WlVSyhtF!Eoeb~VcgVMH5XsA7GkP4>ovg)t z+3oSF6Kn<cM|wSaJqwao2XOVX6za@ZX7jt<mToI>;G_P8`3tT44wPA6lvvMF!1FzU z)yG?um2pk-o|a!X_--FvV7~9r)4DsHyAEw(o5%UUy@NfFNBhCCWlFYrMt{!TF~~K` z`xM7e+%bECT=2tVVGAVWcAa=%CC&a|OLN85-Hc}x^^RYE(JOHy&-&HlrJL)H^UmPC zTvVmp@K^q;RI++bIm_LTFHg>o6<=2R#gE~)K>q@fu!Ft5PS!^bXL=VbXNvi;{^*$* zjONo=mLGkj%v$ho@*(~g{T3}*M@0^l_n2RhsebV7*MlI|5Bf(QYqXmdWY7LEg^5M% zQCZ629C3U9C&$ln3H;cvP=7Gt$l<blEr$<=_nd-rTn%RTtQI-&Pd7*Th{A=`YuOGT z)c?gjIWBWVVaC&-h6j2_&NfSKxEc0mDMRDjA9H4K-F|yGx=Q-h|J&!+%xF?!+1>i0 zOE+VQ|Dk`eKj+9zp4gDEUBva{jYx5kI|~_}m7A_Ky!Yw7<7r@Ezvh<u_y4($shi@x zPr`Yu_UjJ>Gx%N6{ULr>$Nx`M$RXoK*=AtkIcv61DURcvgvbNeH{73&gdf%ZHEUIE z3)_eC*@36;u9g;g5Sa7%@ey;5yW8cy>aAGzaMn4s3fnF5+kzX^&sB@OaWUT0eELwa z%&+A&sxofeH8TII_b}aQJ+D`#xQ?lVNuxod0WamjHR(x_f9=J22Z5QB!PC{xWt~$( F699gHsmA~S diff --git a/QKSMS/src/main/res/drawable-xxxhdpi/plus_to_arrow_14.png b/QKSMS/src/main/res/drawable-xxxhdpi/plus_to_arrow_14.png deleted file mode 100755 index fe636c7466d0265b81f2f9a0ecde13b60da3172b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7Ro>V2<~6aSW+oe0zs^f=n!f>%%|W za&K=Fy$vFPXzrhlx!HTw%f5fx^Y-Q2Rn@Ea8Cktw^W685s$Re$=S9v9Od1Uu4NM(G zQ2&`bm|R?4_jXi^DEwgmFQJuey)V4sf$SgK6D_Gb_9Su%%sKpDRJh>rp$Q?3cdUQ7 zU*KK1<L<Kuj;sah2b?1qc8i8Ed{_F@R}hhFJuj4@oas*EybaO1tOfdq+%0%k%N}y) zdJxxQwINy_D0IO12HWb^2mJThAIN`Hou$Be?|5vXij(7wT&s6qs~fa-><NzO`gfvV z{^J~XM!6$7H+0+YGxxMzElaSHQns`^wAZm~0*l~=TW&T_Pczv3SbT#+-MU#+qDAS4 zr2a06M3y&U_trD+bCB@aE^T~~Y2^pacl}G#|L~|MZmq32-p{z{KyPb;Xxk!@x}&Gr z&fk<Nd;Q`#gRJ11w})l6xJK3VwI}_Uvp#`+O_|vJpSlNPDz+M|Ip{Iv`232qk0QMf z<|P*{zrT-N<ha0^BbF6An`iX*ooHGA;l<MQy~4!_+e7BD8FUoN+qrR>9OZe_GQImq zRgYt)iL=U@Z6f`@)Ea!JJpZW7mB=vd;g;`#IpK%4Gv+ki>E)jw!fPOUTj2UO>Gi+W z8-B{4+vgtl<)F}<hU>R`{QpQE_~SbD`vi`yhJw)#j!t@U{^A3Lc}KRN=#-0SSzJ)v zT(JB<^A6#sxqsTTB-(lPY7hIZVldp#`rUNX0&cMf0zTWt{52dB0`DD&*XVTRNa6n2 z!!)Dy2fy}%l;;-&`d@noJYfHCF-w8PuZ-v9mqmMSKCExPS+FbaN62<1Ci@?|16bN0 zrm#;q|K_;g-JWX6zYj``KQ4X8I#agJXbtxR>0DczMct8U_W!RRv$VKrwdBHCi_M4s zOI?0g^7rGcb!xNz9@OLKJ9Lt7p~SljZ!<QR+k9)geD-L0RrjQyzS~0!HVK#<On!EL z0mI@4DYqvYeVgaVc(3e((|>{TyxlLW9kOPNU-Mr$W%u<bUxNd*?__;${@ho=S|Q?H zSh+BxTfOPKOqJ&+?Un@oOI4p`e)(Fk@4H$buFSQ7VG#qD0v_stD(i#{tJlTZ?IAZO Q0&^ULr>mdKI;Vst06*%a3IG5A diff --git a/QKSMS/src/main/res/drawable-xxxhdpi/plus_to_arrow_15.png b/QKSMS/src/main/res/drawable-xxxhdpi/plus_to_arrow_15.png deleted file mode 100755 index 94ec836b391fb987bebaf5e8dc11a9e161665c37..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 669 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7Ro>U`p|HaSW+oe0yi>BoQwe_e4FZ zk4!tfn|ANs?d{T5?b7AGhx^Em-Me2Oz56#o^3(iP^WI8Y>|dq7{MUxvwo#c!*0`QJ z;cU>rn8Lt3MVI*m1KR{f9tCCz2R4HSo&*NT0}MuBIk1FX?XQr_3_tnmdCV4UWYqfi zq5YBMz8v#cQVQoE{=Z>&#n55i;r|<%Gcp<;$^I*_IsAT`tS`@me;-~y&{MkIvy9C{ zdV!Ug!Y<j2goZ7G{|?90xTNe3JkIdaS?7SX%QpT}-U)Vxl=f&TI5{&f>EFPjFL<-e z#MI#z$LEh?6LUT5T}=<v&xk!B|7`Ax{Dwz&`s@@o#jZ#OvEr0B{aumXuxI;X+l-Wk zFM`v=1QMmABot~}BrBRu^esyDWPc#PgKzffBWgLUjEAgS)0WC4@c;WZ*Ku+X?*_>? z^E)maVyG-<TFX13{59`{{Pl)+87jZ=3GZcndNaC5`)YK6^cPL#yBm1c3*OZB`8u&+ z*MEbz1ws>TyZ@i-|FCmG-HwhE?~<F&vo5v%6St$`gj~Xk^KHwl|Mcx>Iw6-dVLkg2 z>p$mqG@f{u(6PP)sOH^{z7zkBd&CR-{kFFMmHphz?f1HlE!*dQ?sy~D_IuxglJ@(X z8&*F%{3G``!^(VXeuD$wLB_4yA-VtUl0Wm`-@aTeQgD0c)Nk7!vzuf+j`~wy_v&^Z zV^)Iihn;g1>)h5<D26=<uWnJS^D^>p`7QC{dCO;)9kP`ZQh|YU?a}|5`U2h$^0$8E kY8pAXLLwhu%wI@v+EE}E#lf=!nCuulUHx3vIVCg!08d#jp8x;= diff --git a/QKSMS/src/main/res/drawable/arrow_to_plus.xml b/QKSMS/src/main/res/drawable/arrow_to_plus.xml deleted file mode 100644 index 7402cb510..000000000 --- a/QKSMS/src/main/res/drawable/arrow_to_plus.xml +++ /dev/null @@ -1,52 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<animation-list xmlns:android="http://schemas.android.com/apk/res/android" - android:oneshot="true"> - <item - android:drawable="@drawable/plus_to_arrow_15" - android:duration="10" /> - <item - android:drawable="@drawable/plus_to_arrow_14" - android:duration="10" /> - <item - android:drawable="@drawable/plus_to_arrow_13" - android:duration="10" /> - <item - android:drawable="@drawable/plus_to_arrow_12" - android:duration="10" /> - <item - android:drawable="@drawable/plus_to_arrow_11" - android:duration="10" /> - <item - android:drawable="@drawable/plus_to_arrow_10" - android:duration="10" /> - <item - android:drawable="@drawable/plus_to_arrow_09" - android:duration="10" /> - <item - android:drawable="@drawable/plus_to_arrow_08" - android:duration="10" /> - <item - android:drawable="@drawable/plus_to_arrow_07" - android:duration="10" /> - <item - android:drawable="@drawable/plus_to_arrow_06" - android:duration="10" /> - <item - android:drawable="@drawable/plus_to_arrow_05" - android:duration="10" /> - <item - android:drawable="@drawable/plus_to_arrow_04" - android:duration="10" /> - <item - android:drawable="@drawable/plus_to_arrow_03" - android:duration="10" /> - <item - android:drawable="@drawable/plus_to_arrow_02" - android:duration="10" /> - <item - android:drawable="@drawable/plus_to_arrow_01" - android:duration="10" /> - <item - android:drawable="@drawable/plus_to_arrow_00" - android:duration="10" /> -</animation-list> \ No newline at end of file diff --git a/QKSMS/src/main/res/drawable/blank.xml b/QKSMS/src/main/res/drawable/blank.xml deleted file mode 100644 index 2dd45baef..000000000 --- a/QKSMS/src/main/res/drawable/blank.xml +++ /dev/null @@ -1,3 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> - -<shape /> \ No newline at end of file diff --git a/QKSMS/src/main/res/drawable/button_white.xml b/QKSMS/src/main/res/drawable/button_white.xml deleted file mode 100644 index f6236f318..000000000 --- a/QKSMS/src/main/res/drawable/button_white.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<selector xmlns:android="http://schemas.android.com/apk/res/android"> - <item android:state_pressed="true"> - <shape android:shape="rectangle"> - <corners android:radius="2dp" /> - <solid android:color="#99FFFFFF" /> - <padding android:bottom="8dp" - android:left="16dp" - android:right="16dp" - android:top="8dp" /> - </shape> - </item> - - <item> - <shape android:shape="rectangle"> - <corners android:radius="2dp" /> - <solid android:color="#FFFFFFFF" /> - <padding android:bottom="8dp" - android:left="16dp" - android:right="16dp" - android:top="8dp" /> - </shape> - </item> -</selector> \ No newline at end of file diff --git a/QKSMS/src/main/res/drawable/cancel_shadow.xml b/QKSMS/src/main/res/drawable/cancel_shadow.xml deleted file mode 100644 index 49b7a2e3e..000000000 --- a/QKSMS/src/main/res/drawable/cancel_shadow.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<shape xmlns:android="http://schemas.android.com/apk/res/android" - android:shape="rectangle"> - <gradient - android:endColor="#00000000" - android:gradientRadius="56" - android:startColor="#44000000" - android:type="radial" /> -</shape> \ No newline at end of file diff --git a/QKSMS/src/main/res/drawable/card.xml b/QKSMS/src/main/res/drawable/card.xml deleted file mode 100644 index 0edfb9c6b..000000000 --- a/QKSMS/src/main/res/drawable/card.xml +++ /dev/null @@ -1,31 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> - <item> - <shape - android:shape="rectangle" - android:dither="true"> - - <corners android:radius="2dp" /> - - <solid android:color="#ccc" /> - - </shape> - </item> - - <item android:bottom="2dp"> - <shape - android:shape="rectangle" - android:dither="true"> - - <corners android:radius="2dp" /> - - <solid android:color="@android:color/white" /> - - <padding - android:bottom="8dp" - android:left="8dp" - android:right="8dp" - android:top="8dp" /> - </shape> - </item> -</layer-list> \ No newline at end of file diff --git a/QKSMS/src/main/res/drawable/check_to_off.xml b/QKSMS/src/main/res/drawable/check_to_off.xml deleted file mode 100644 index 87971f4be..000000000 --- a/QKSMS/src/main/res/drawable/check_to_off.xml +++ /dev/null @@ -1,53 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> - -<animation-list xmlns:android="http://schemas.android.com/apk/res/android" - android:oneshot="true"> - <!--<item android:duration="15"> - <bitmap android:src="@drawable/btn_check_to_off_mtrl_000" android:tint="?attr/colorControlActivated" /> - </item> - <item android:duration="15"> - <bitmap android:src="@drawable/btn_check_to_off_mtrl_001" android:tint="?attr/colorControlActivated" /> - </item> - <item android:duration="15"> - <bitmap android:src="@drawable/btn_check_to_off_mtrl_002" android:tint="?attr/colorControlActivated" /> - </item> - <item android:duration="15"> - <bitmap android:src="@drawable/btn_check_to_off_mtrl_003" android:tint="?attr/colorControlActivated" /> - </item> - <item android:duration="15"> - <bitmap android:src="@drawable/btn_check_to_off_mtrl_004" android:tint="?attr/colorControlActivated" /> - </item> - <item android:duration="15"> - <bitmap android:src="@drawable/btn_check_to_off_mtrl_005" android:tint="?attr/colorControlActivated" /> - </item> - <item android:duration="15"> - <bitmap android:src="@drawable/btn_check_to_off_mtrl_006" android:tint="?attr/colorControlActivated" /> - </item> - <item android:duration="15"> - <bitmap android:src="@drawable/btn_check_to_off_mtrl_007" android:tint="?attr/colorControlActivated" /> - </item> - <item android:duration="15"> - <bitmap android:src="@drawable/btn_check_to_off_mtrl_008" android:tint="?attr/colorControlActivated" /> - </item> - <item android:duration="15"> - <bitmap android:src="@drawable/btn_check_to_off_mtrl_009" android:tint="?attr/colorControlActivated" /> - </item> - <item android:duration="15"> - <bitmap android:src="@drawable/btn_check_to_off_mtrl_010" android:tint="?attr/colorControlActivated" /> - </item> - <item android:duration="15"> - <bitmap android:src="@drawable/btn_check_to_off_mtrl_011" android:tint="?attr/colorControlActivated" /> - </item> - <item android:duration="15"> - <bitmap android:src="@drawable/btn_check_to_off_mtrl_012" android:tint="?attr/colorControlActivated" /> - </item> - <item android:duration="15"> - <bitmap android:src="@drawable/btn_check_to_off_mtrl_013" android:tint="?attr/colorControlActivated" /> - </item> - <item android:duration="15"> - <bitmap android:src="@drawable/btn_check_to_off_mtrl_014" android:tint="?attr/colorControlActivated" /> - </item> - <item android:duration="15"> - <bitmap android:src="@drawable/btn_check_to_off_mtrl_015" android:tint="?attr/colorControlActivated" /> - </item>--> -</animation-list> \ No newline at end of file diff --git a/QKSMS/src/main/res/drawable/check_to_on.xml b/QKSMS/src/main/res/drawable/check_to_on.xml deleted file mode 100644 index 7f62b9d41..000000000 --- a/QKSMS/src/main/res/drawable/check_to_on.xml +++ /dev/null @@ -1,53 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> - -<animation-list xmlns:android="http://schemas.android.com/apk/res/android" - android:oneshot="true"> - <!--<item android:duration="15"> - <bitmap android:src="@drawable/btn_check_to_on_mtrl_000" android:tint="?attr/colorControlActivated" /> - </item> - <item android:duration="15"> - <bitmap android:src="@drawable/btn_check_to_on_mtrl_001" android:tint="?attr/colorControlActivated" /> - </item> - <item android:duration="15"> - <bitmap android:src="@drawable/btn_check_to_on_mtrl_002" android:tint="?attr/colorControlActivated" /> - </item> - <item android:duration="15"> - <bitmap android:src="@drawable/btn_check_to_on_mtrl_003" android:tint="?attr/colorControlActivated" /> - </item> - <item android:duration="15"> - <bitmap android:src="@drawable/btn_check_to_on_mtrl_004" android:tint="?attr/colorControlActivated" /> - </item> - <item android:duration="15"> - <bitmap android:src="@drawable/btn_check_to_on_mtrl_005" android:tint="?attr/colorControlActivated" /> - </item> - <item android:duration="15"> - <bitmap android:src="@drawable/btn_check_to_on_mtrl_006" android:tint="?attr/colorControlActivated" /> - </item> - <item android:duration="15"> - <bitmap android:src="@drawable/btn_check_to_on_mtrl_007" android:tint="?attr/colorControlActivated" /> - </item> - <item android:duration="15"> - <bitmap android:src="@drawable/btn_check_to_on_mtrl_008" android:tint="?attr/colorControlActivated" /> - </item> - <item android:duration="15"> - <bitmap android:src="@drawable/btn_check_to_on_mtrl_009" android:tint="?attr/colorControlActivated" /> - </item> - <item android:duration="15"> - <bitmap android:src="@drawable/btn_check_to_on_mtrl_010" android:tint="?attr/colorControlActivated" /> - </item> - <item android:duration="15"> - <bitmap android:src="@drawable/btn_check_to_on_mtrl_011" android:tint="?attr/colorControlActivated" /> - </item> - <item android:duration="15"> - <bitmap android:src="@drawable/btn_check_to_on_mtrl_012" android:tint="?attr/colorControlActivated" /> - </item> - <item android:duration="15"> - <bitmap android:src="@drawable/btn_check_to_on_mtrl_013" android:tint="?attr/colorControlActivated" /> - </item> - <item android:duration="15"> - <bitmap android:src="@drawable/btn_check_to_on_mtrl_014" android:tint="?attr/colorControlActivated" /> - </item> - <item android:duration="15"> - <bitmap android:src="@drawable/btn_check_to_on_mtrl_015" android:tint="?attr/colorControlActivated" /> - </item>--> -</animation-list> \ No newline at end of file diff --git a/QKSMS/src/main/res/drawable/circle.xml b/QKSMS/src/main/res/drawable/circle.xml deleted file mode 100644 index 34f2dd483..000000000 --- a/QKSMS/src/main/res/drawable/circle.xml +++ /dev/null @@ -1,5 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<shape xmlns:android="http://schemas.android.com/apk/res/android" - android:shape="oval"> - <solid android:color="@android:color/white" /> -</shape> diff --git a/QKSMS/src/main/res/drawable/color_picker_swatch.xml b/QKSMS/src/main/res/drawable/color_picker_swatch.xml deleted file mode 100644 index 4de519558..000000000 --- a/QKSMS/src/main/res/drawable/color_picker_swatch.xml +++ /dev/null @@ -1,4 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<shape - xmlns:android="http://schemas.android.com/apk/res/android" - android:shape="oval" /> \ No newline at end of file diff --git a/QKSMS/src/main/res/drawable/compose_background.xml b/QKSMS/src/main/res/drawable/compose_background.xml deleted file mode 100644 index 74883f8de..000000000 --- a/QKSMS/src/main/res/drawable/compose_background.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<shape xmlns:android="http://schemas.android.com/apk/res/android" - android:shape="rectangle"> - <gradient - android:angle="90" - android:endColor="#00FFFFFF" - android:startColor="#BBFFFFFF" - android:centerColor="#8FFFFFFF"/> -</shape> \ No newline at end of file diff --git a/QKSMS/src/main/res/drawable/edittext.xml b/QKSMS/src/main/res/drawable/edittext.xml deleted file mode 100644 index df0c20ea8..000000000 --- a/QKSMS/src/main/res/drawable/edittext.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> - <item> - <shape android:shape="rectangle"> - <solid android:color="@color/white_pure" /> - <corners android:radius="2dp" /> - </shape> - </item> -</layer-list> \ No newline at end of file diff --git a/QKSMS/src/main/res/drawable/edittext_colour_selector.xml b/QKSMS/src/main/res/drawable/edittext_colour_selector.xml deleted file mode 100644 index 9497d2a1c..000000000 --- a/QKSMS/src/main/res/drawable/edittext_colour_selector.xml +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> - -<selector xmlns:android="http://schemas.android.com/apk/res/android"> - <item android:state_selected="true" - android:color="@color/white_pure" /> - <item android:color="@color/black" /> -</selector> \ No newline at end of file diff --git a/QKSMS/src/main/res/drawable/ic_add.xml b/QKSMS/src/main/res/drawable/ic_add.xml deleted file mode 100644 index 0c88b7cef..000000000 --- a/QKSMS/src/main/res/drawable/ic_add.xml +++ /dev/null @@ -1,9 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportHeight="24.0" - android:viewportWidth="24.0"> - <path - android:fillColor="#FF000000" - android:pathData="M19,13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z" /> -</vector> diff --git a/QKSMS/src/main/res/drawable/ic_arrow_left.xml b/QKSMS/src/main/res/drawable/ic_arrow_left.xml deleted file mode 100644 index 0577395ce..000000000 --- a/QKSMS/src/main/res/drawable/ic_arrow_left.xml +++ /dev/null @@ -1,10 +0,0 @@ -<vector - xmlns:android="http://schemas.android.com/apk/res/android" - android:width="48dp" - android:height="48dp" - android:viewportHeight="24.0" - android:viewportWidth="24.0"> - <path - android:fillColor="#FF000000" - android:pathData="M15.41,16.09l-4.58,-4.59 4.58,-4.59L14,5.5l-6,6 6,6z" /> -</vector> diff --git a/QKSMS/src/main/res/drawable/ic_arrow_right.xml b/QKSMS/src/main/res/drawable/ic_arrow_right.xml deleted file mode 100644 index 3615101a1..000000000 --- a/QKSMS/src/main/res/drawable/ic_arrow_right.xml +++ /dev/null @@ -1,9 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportHeight="24.0" - android:viewportWidth="24.0"> - <path - android:fillColor="#FF000000" - android:pathData="M8.59,16.34l4.58,-4.59 -4.58,-4.59L10,5.75l6,6 -6,6z" /> -</vector> diff --git a/QKSMS/src/main/res/drawable/ic_attach_audio.xml b/QKSMS/src/main/res/drawable/ic_attach_audio.xml deleted file mode 100644 index 1ce86d93f..000000000 --- a/QKSMS/src/main/res/drawable/ic_attach_audio.xml +++ /dev/null @@ -1,9 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportHeight="24.0" - android:viewportWidth="24.0"> - <path - android:fillColor="#FF000000" - android:pathData="M12,14c1.66,0 2.99,-1.34 2.99,-3L15,5c0,-1.66 -1.34,-3 -3,-3S9,3.34 9,5v6c0,1.66 1.34,3 3,3zM17.3,11c0,3 -2.54,5.1 -5.3,5.1S6.7,14 6.7,11L5,11c0,3.41 2.72,6.23 6,6.72L11,21h2v-3.28c3.28,-0.48 6,-3.3 6,-6.72h-1.7z" /> -</vector> diff --git a/QKSMS/src/main/res/drawable/ic_call.xml b/QKSMS/src/main/res/drawable/ic_call.xml deleted file mode 100644 index 28914c6f6..000000000 --- a/QKSMS/src/main/res/drawable/ic_call.xml +++ /dev/null @@ -1,9 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportWidth="24.0" - android:viewportHeight="24.0"> - <path - android:fillColor="#FFFFFFFF" - android:pathData="M6.62,10.79c1.44,2.83 3.76,5.14 6.59,6.59l2.2,-2.2c0.27,-0.27 0.67,-0.36 1.02,-0.24 1.12,0.37 2.33,0.57 3.57,0.57 0.55,0 1,0.45 1,1V20c0,0.55 -0.45,1 -1,1 -9.39,0 -17,-7.61 -17,-17 0,-0.55 0.45,-1 1,-1h3.5c0.55,0 1,0.45 1,1 0,1.25 0.2,2.45 0.57,3.57 0.11,0.35 0.03,0.74 -0.25,1.02l-2.2,2.2z"/> -</vector> diff --git a/QKSMS/src/main/res/drawable/ic_camera.xml b/QKSMS/src/main/res/drawable/ic_camera.xml deleted file mode 100644 index a1a55a589..000000000 --- a/QKSMS/src/main/res/drawable/ic_camera.xml +++ /dev/null @@ -1,12 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportHeight="24.0" - android:viewportWidth="24.0"> - <path - android:fillColor="#FF000000" - 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" /> - <path - android:fillColor="#FF000000" - 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" /> -</vector> diff --git a/QKSMS/src/main/res/drawable/ic_cancel.xml b/QKSMS/src/main/res/drawable/ic_cancel.xml deleted file mode 100644 index 984847175..000000000 --- a/QKSMS/src/main/res/drawable/ic_cancel.xml +++ /dev/null @@ -1,9 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportHeight="24.0" - android:viewportWidth="24.0"> - <path - android:fillColor="#FF000000" - android:pathData="M12,2C6.47,2 2,6.47 2,12s4.47,10 10,10 10,-4.47 10,-10S17.53,2 12,2zM17,15.59L15.59,17 12,13.41 8.41,17 7,15.59 10.59,12 7,8.41 8.41,7 12,10.59 15.59,7 17,8.41 13.41,12 17,15.59z" /> -</vector> diff --git a/QKSMS/src/main/res/drawable/ic_chat.xml b/QKSMS/src/main/res/drawable/ic_chat.xml deleted file mode 100644 index 8c44aa383..000000000 --- a/QKSMS/src/main/res/drawable/ic_chat.xml +++ /dev/null @@ -1,9 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportHeight="24.0" - android:viewportWidth="24.0"> - <path - android:fillColor="#FF000000" - android:pathData="M20,2L4,2c-1.1,0 -1.99,0.9 -1.99,2L2,22l4,-4h14c1.1,0 2,-0.9 2,-2L22,4c0,-1.1 -0.9,-2 -2,-2zM6,9h12v2L6,11L6,9zM14,14L6,14v-2h8v2zM18,8L6,8L6,6h12v2z" /> -</vector> diff --git a/QKSMS/src/main/res/drawable/ic_compose.xml b/QKSMS/src/main/res/drawable/ic_compose.xml deleted file mode 100644 index 231ae2ad8..000000000 --- a/QKSMS/src/main/res/drawable/ic_compose.xml +++ /dev/null @@ -1,9 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportHeight="24.0" - android:viewportWidth="24.0"> - <path - android:fillColor="#FFFFFFFF" - android:pathData="M3,17.25V21h3.75L17.81,9.94l-3.75,-3.75L3,17.25zM20.71,7.04c0.39,-0.39 0.39,-1.02 0,-1.41l-2.34,-2.34c-0.39,-0.39 -1.02,-0.39 -1.41,0l-1.83,1.83 3.75,3.75 1.83,-1.83z" /> -</vector> diff --git a/QKSMS/src/main/res/drawable/ic_delete.xml b/QKSMS/src/main/res/drawable/ic_delete.xml deleted file mode 100644 index 10ea0d388..000000000 --- a/QKSMS/src/main/res/drawable/ic_delete.xml +++ /dev/null @@ -1,9 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportHeight="24.0" - android:viewportWidth="24.0"> - <path - android:fillColor="#FF000000" - android:pathData="M6,19c0,1.1 0.9,2 2,2h8c1.1,0 2,-0.9 2,-2V7H6v12zM19,4h-3.5l-1,-1h-5l-1,1H5v2h14V4z" /> -</vector> diff --git a/QKSMS/src/main/res/drawable/ic_delivered.xml b/QKSMS/src/main/res/drawable/ic_delivered.xml deleted file mode 100644 index 777a37bbe..000000000 --- a/QKSMS/src/main/res/drawable/ic_delivered.xml +++ /dev/null @@ -1,9 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="16dp" - android:height="16dp" - android:viewportHeight="24.0" - android:viewportWidth="24.0"> - <path - android:fillColor="#FF000000" - android:pathData="M9,16.17L4.83,12l-1.42,1.41L9,19 21,7l-1.41,-1.41z" /> -</vector> diff --git a/QKSMS/src/main/res/drawable/ic_donate.xml b/QKSMS/src/main/res/drawable/ic_donate.xml deleted file mode 100644 index af5226ce0..000000000 --- a/QKSMS/src/main/res/drawable/ic_donate.xml +++ /dev/null @@ -1,9 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportHeight="24.0" - android:viewportWidth="24.0"> - <path - android:fillColor="#FF000000" - android:pathData="M20,6h-2.18c0.11,-0.31 0.18,-0.65 0.18,-1 0,-1.66 -1.34,-3 -3,-3 -1.05,0 -1.96,0.54 -2.5,1.35l-0.5,0.67 -0.5,-0.68C10.96,2.54 10.05,2 9,2 7.34,2 6,3.34 6,5c0,0.35 0.07,0.69 0.18,1L4,6c-1.11,0 -1.99,0.89 -1.99,2L2,19c0,1.11 0.89,2 2,2h16c1.11,0 2,-0.89 2,-2L22,8c0,-1.11 -0.89,-2 -2,-2zM15,4c0.55,0 1,0.45 1,1s-0.45,1 -1,1 -1,-0.45 -1,-1 0.45,-1 1,-1zM9,4c0.55,0 1,0.45 1,1s-0.45,1 -1,1 -1,-0.45 -1,-1 0.45,-1 1,-1zM20,19L4,19v-2h16v2zM20,14L4,14L4,8h5.08L7,10.83 8.62,12 11,8.76l1,-1.36 1,1.36L15.38,12 17,10.83 14.92,8L20,8v6z" /> -</vector> diff --git a/QKSMS/src/main/res/drawable/ic_drop_down.xml b/QKSMS/src/main/res/drawable/ic_drop_down.xml deleted file mode 100644 index 4727832c9..000000000 --- a/QKSMS/src/main/res/drawable/ic_drop_down.xml +++ /dev/null @@ -1,9 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportHeight="24.0" - android:viewportWidth="24.0"> - <path - android:fillColor="#FF000000" - android:pathData="M7,10l5,5 5,-5z" /> -</vector> diff --git a/QKSMS/src/main/res/drawable/ic_error.xml b/QKSMS/src/main/res/drawable/ic_error.xml deleted file mode 100644 index e25ee68b9..000000000 --- a/QKSMS/src/main/res/drawable/ic_error.xml +++ /dev/null @@ -1,9 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportHeight="24.0" - android:viewportWidth="24.0"> - <path - android:fillColor="#FF000000" - android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM13,17h-2v-2h2v2zM13,13h-2L11,7h2v6z" /> -</vector> diff --git a/QKSMS/src/main/res/drawable/ic_fold.xml b/QKSMS/src/main/res/drawable/ic_fold.xml deleted file mode 100644 index 75d364e79..000000000 --- a/QKSMS/src/main/res/drawable/ic_fold.xml +++ /dev/null @@ -1,9 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportHeight="24.0" - android:viewportWidth="24.0"> - <path - android:fillColor="#FF000000" - android:pathData="M7.41,18.59L8.83,20 12,16.83 15.17,20l1.41,-1.41L12,14l-4.59,4.59zM16.59,5.41L15.17,4 12,7.17 8.83,4 7.41,5.41 12,10l4.59,-4.59z" /> -</vector> diff --git a/QKSMS/src/main/res/drawable/ic_info.xml b/QKSMS/src/main/res/drawable/ic_info.xml deleted file mode 100644 index c386fc5cd..000000000 --- a/QKSMS/src/main/res/drawable/ic_info.xml +++ /dev/null @@ -1,9 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportHeight="24.0" - android:viewportWidth="24.0"> - <path - android:fillColor="#FF000000" - android:pathData="M11,17h2v-6h-2V17z M12,2C6.5,2,2,6.5,2,12s4.5,10,10,10c5.5,0,10-4.5,10-10S17.5,2,12,2z M12,20c-4.4,0-8-3.6-8-8s3.6-8,8-8c4.4,0,8,3.6,8,8S16.4,20,12,20z M11,9h2V7h-2V9z" /> -</vector> diff --git a/QKSMS/src/main/res/drawable/ic_info_fill.xml b/QKSMS/src/main/res/drawable/ic_info_fill.xml deleted file mode 100644 index 7c49aa8c5..000000000 --- a/QKSMS/src/main/res/drawable/ic_info_fill.xml +++ /dev/null @@ -1,9 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportHeight="24.0" - android:viewportWidth="24.0"> - <path - android:fillColor="#FF000000" - android:pathData="M12,2C6.5,2 2,6.5 2,12s4.5,10 10,10c5.5,0 10,-4.5 10,-10S17.5,2 12,2zM13,17h-2v-6h2V17zM13,9h-2V7h2V9z" /> -</vector> diff --git a/QKSMS/src/main/res/drawable/ic_lock.xml b/QKSMS/src/main/res/drawable/ic_lock.xml deleted file mode 100644 index 9c8a86450..000000000 --- a/QKSMS/src/main/res/drawable/ic_lock.xml +++ /dev/null @@ -1,10 +0,0 @@ -<vector - xmlns:android="http://schemas.android.com/apk/res/android" - android:width="16dp" - android:height="16dp" - android:viewportHeight="24.0" - android:viewportWidth="24.0"> - <path - android:fillColor="#FF000000" - android:pathData="M18,8h-1L17,6c0,-2.76 -2.24,-5 -5,-5S7,3.24 7,6v2L6,8c-1.1,0 -2,0.9 -2,2v10c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2L20,10c0,-1.1 -0.9,-2 -2,-2zM12,17c-1.1,0 -2,-0.9 -2,-2s0.9,-2 2,-2 2,0.9 2,2 -0.9,2 -2,2zM15.1,8L8.9,8L8.9,6c0,-1.71 1.39,-3.1 3.1,-3.1 1.71,0 3.1,1.39 3.1,3.1v2z" /> -</vector> diff --git a/QKSMS/src/main/res/drawable/ic_mark_read.xml b/QKSMS/src/main/res/drawable/ic_mark_read.xml deleted file mode 100644 index e7a87728e..000000000 --- a/QKSMS/src/main/res/drawable/ic_mark_read.xml +++ /dev/null @@ -1,9 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportHeight="24.0" - android:viewportWidth="24.0"> - <path - android:fillColor="#FF000000" - android:pathData="M21.99,8c0,-0.72 -0.37,-1.35 -0.94,-1.7L12,1 2.95,6.3C2.38,6.65 2,7.28 2,8v10c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2l-0.01,-10zM12,13L3.74,7.84 12,3l8.26,4.84L12,13z" /> -</vector> diff --git a/QKSMS/src/main/res/drawable/ic_mark_unread.xml b/QKSMS/src/main/res/drawable/ic_mark_unread.xml deleted file mode 100644 index 85922b37e..000000000 --- a/QKSMS/src/main/res/drawable/ic_mark_unread.xml +++ /dev/null @@ -1,9 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportHeight="24.0" - android:viewportWidth="24.0"> - <path - android:fillColor="#FF000000" - android:pathData="M20,4L4,4c-1.1,0 -1.99,0.9 -1.99,2L2,18c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2L22,6c0,-1.1 -0.9,-2 -2,-2zM20,8l-8,5 -8,-5L4,6l8,5 8,-5v2z" /> -</vector> diff --git a/QKSMS/src/main/res/drawable/ic_notifications.xml b/QKSMS/src/main/res/drawable/ic_notifications.xml deleted file mode 100644 index 02623821c..000000000 --- a/QKSMS/src/main/res/drawable/ic_notifications.xml +++ /dev/null @@ -1,9 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportHeight="24.0" - android:viewportWidth="24.0"> - <path - android:fillColor="#FF000000" - android:pathData="M12,22c1.1,0 2,-0.9 2,-2h-4c0,1.1 0.89,2 2,2zM18,16v-5c0,-3.07 -1.64,-5.64 -4.5,-6.32L13.5,4c0,-0.83 -0.67,-1.5 -1.5,-1.5s-1.5,0.67 -1.5,1.5v0.68C7.63,5.36 6,7.92 6,11v5l-2,2v1h16v-1l-2,-2z" /> -</vector> diff --git a/QKSMS/src/main/res/drawable/ic_notifications_muted.xml b/QKSMS/src/main/res/drawable/ic_notifications_muted.xml deleted file mode 100644 index 3f4f86457..000000000 --- a/QKSMS/src/main/res/drawable/ic_notifications_muted.xml +++ /dev/null @@ -1,9 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportHeight="24.0" - android:viewportWidth="24.0"> - <path - android:fillColor="#FF000000" - android:pathData="M20,18.69L7.84,6.14 5.27,3.49 4,4.76l2.8,2.8v0.01c-0.52,0.99 -0.8,2.16 -0.8,3.42v5l-2,2v1h13.73l2,2L21,19.72l-1,-1.03zM12,22c1.11,0 2,-0.89 2,-2h-4c0,1.11 0.89,2 2,2zM18,14.68L18,11c0,-3.08 -1.64,-5.64 -4.5,-6.32L13.5,4c0,-0.83 -0.67,-1.5 -1.5,-1.5s-1.5,0.67 -1.5,1.5v0.68c-0.15,0.03 -0.29,0.08 -0.42,0.12 -0.1,0.03 -0.2,0.07 -0.3,0.11h-0.01c-0.01,0 -0.01,0 -0.02,0.01 -0.23,0.09 -0.46,0.2 -0.68,0.31 0,0 -0.01,0 -0.01,0.01L18,14.68z" /> -</vector> diff --git a/QKSMS/src/main/res/drawable/ic_palette.xml b/QKSMS/src/main/res/drawable/ic_palette.xml deleted file mode 100644 index aa8f146cb..000000000 --- a/QKSMS/src/main/res/drawable/ic_palette.xml +++ /dev/null @@ -1,9 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportHeight="24.0" - android:viewportWidth="24.0"> - <path - android:fillColor="#FF000000" - android:pathData="M12,3c-4.97,0 -9,4.03 -9,9s4.03,9 9,9c0.83,0 1.5,-0.67 1.5,-1.5 0,-0.39 -0.15,-0.74 -0.39,-1.01 -0.23,-0.26 -0.38,-0.61 -0.38,-0.99 0,-0.83 0.67,-1.5 1.5,-1.5L16,16c2.76,0 5,-2.24 5,-5 0,-4.42 -4.03,-8 -9,-8zM6.5,12c-0.83,0 -1.5,-0.67 -1.5,-1.5S5.67,9 6.5,9 8,9.67 8,10.5 7.33,12 6.5,12zM9.5,8C8.67,8 8,7.33 8,6.5S8.67,5 9.5,5s1.5,0.67 1.5,1.5S10.33,8 9.5,8zM14.5,8c-0.83,0 -1.5,-0.67 -1.5,-1.5S13.67,5 14.5,5s1.5,0.67 1.5,1.5S15.33,8 14.5,8zM17.5,12c-0.83,0 -1.5,-0.67 -1.5,-1.5S16.67,9 17.5,9s1.5,0.67 1.5,1.5 -0.67,1.5 -1.5,1.5z" /> -</vector> diff --git a/QKSMS/src/main/res/drawable/ic_person.xml b/QKSMS/src/main/res/drawable/ic_person.xml deleted file mode 100644 index 0982aa5c8..000000000 --- a/QKSMS/src/main/res/drawable/ic_person.xml +++ /dev/null @@ -1,9 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportHeight="40.0" - android:viewportWidth="40.0"> - <path - android:fillColor="#FF000000" - android:pathData="M20,19c2.21,0 4,-1.79 4,-4s-1.79,-4 -4,-4 -4,1.79 -4,4 1.79,4 4, 4zM20,22c-2.67,0 -8,1.34 -8,4v2h16v-2c0,-2.66 -5.33,-4 -8,-4z" /> -</vector> diff --git a/QKSMS/src/main/res/drawable/ic_photo.xml b/QKSMS/src/main/res/drawable/ic_photo.xml deleted file mode 100644 index 7c62bb307..000000000 --- a/QKSMS/src/main/res/drawable/ic_photo.xml +++ /dev/null @@ -1,9 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportHeight="24.0" - android:viewportWidth="24.0"> - <path - android:fillColor="#FF000000" - 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" /> -</vector> diff --git a/QKSMS/src/main/res/drawable/ic_play.xml b/QKSMS/src/main/res/drawable/ic_play.xml deleted file mode 100644 index d2f88d00e..000000000 --- a/QKSMS/src/main/res/drawable/ic_play.xml +++ /dev/null @@ -1,9 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportHeight="24.0" - android:viewportWidth="24.0"> - <path - android:fillColor="#FFFFFFFF" - android:pathData="M10,16.5l6,-4.5 -6,-4.5v9zM12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8 8,3.59 8,8 -3.59,8 -8,8z" /> -</vector> diff --git a/QKSMS/src/main/res/drawable/ic_search.xml b/QKSMS/src/main/res/drawable/ic_search.xml deleted file mode 100644 index affc7ba26..000000000 --- a/QKSMS/src/main/res/drawable/ic_search.xml +++ /dev/null @@ -1,9 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportWidth="24.0" - android:viewportHeight="24.0"> - <path - android:fillColor="#FF000000" - 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"/> -</vector> diff --git a/QKSMS/src/main/res/drawable/ic_selected.xml b/QKSMS/src/main/res/drawable/ic_selected.xml deleted file mode 100644 index f06e295f9..000000000 --- a/QKSMS/src/main/res/drawable/ic_selected.xml +++ /dev/null @@ -1,9 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportHeight="24.0" - android:viewportWidth="24.0"> - <path - android:fillColor="#FF000000" - android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM10,17l-5,-5 1.41,-1.41L10,14.17l7.59,-7.59L19,8l-9,9z" /> -</vector> diff --git a/QKSMS/src/main/res/drawable/ic_settings.xml b/QKSMS/src/main/res/drawable/ic_settings.xml deleted file mode 100644 index 6d0c6e683..000000000 --- a/QKSMS/src/main/res/drawable/ic_settings.xml +++ /dev/null @@ -1,9 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportHeight="24.0" - android:viewportWidth="24.0"> - <path - android:fillColor="#FF000000" - android:pathData="M19.43,12.98c0.04,-0.32 0.07,-0.64 0.07,-0.98s-0.03,-0.66 -0.07,-0.98l2.11,-1.65c0.19,-0.15 0.24,-0.42 0.12,-0.64l-2,-3.46c-0.12,-0.22 -0.39,-0.3 -0.61,-0.22l-2.49,1c-0.52,-0.4 -1.08,-0.73 -1.69,-0.98l-0.38,-2.65C14.46,2.18 14.25,2 14,2h-4c-0.25,0 -0.46,0.18 -0.49,0.42l-0.38,2.65c-0.61,0.25 -1.17,0.59 -1.69,0.98l-2.49,-1c-0.23,-0.09 -0.49,0 -0.61,0.22l-2,3.46c-0.13,0.22 -0.07,0.49 0.12,0.64l2.11,1.65c-0.04,0.32 -0.07,0.65 -0.07,0.98s0.03,0.66 0.07,0.98l-2.11,1.65c-0.19,0.15 -0.24,0.42 -0.12,0.64l2,3.46c0.12,0.22 0.39,0.3 0.61,0.22l2.49,-1c0.52,0.4 1.08,0.73 1.69,0.98l0.38,2.65c0.03,0.24 0.24,0.42 0.49,0.42h4c0.25,0 0.46,-0.18 0.49,-0.42l0.38,-2.65c0.61,-0.25 1.17,-0.59 1.69,-0.98l2.49,1c0.23,0.09 0.49,0 0.61,-0.22l2,-3.46c0.12,-0.22 0.07,-0.49 -0.12,-0.64l-2.11,-1.65zM12,15.5c-1.93,0 -3.5,-1.57 -3.5,-3.5s1.57,-3.5 3.5,-3.5 3.5,1.57 3.5,3.5 -1.57,3.5 -3.5,3.5z" /> -</vector> diff --git a/QKSMS/src/main/res/drawable/ic_timer.xml b/QKSMS/src/main/res/drawable/ic_timer.xml deleted file mode 100644 index 89ca06033..000000000 --- a/QKSMS/src/main/res/drawable/ic_timer.xml +++ /dev/null @@ -1,9 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportHeight="24.0" - android:viewportWidth="24.0"> - <path - android:fillColor="#FF000000" - android:pathData="M15,1L9,1v2h6L15,1zM11,14h2L13,8h-2v6zM19.03,7.39l1.42,-1.42c-0.43,-0.51 -0.9,-0.99 -1.41,-1.41l-1.42,1.42C16.07,4.74 14.12,4 12,4c-4.97,0 -9,4.03 -9,9s4.02,9 9,9 9,-4.03 9,-9c0,-2.12 -0.74,-4.07 -1.97,-5.61zM12,20c-3.87,0 -7,-3.13 -7,-7s3.13,-7 7,-7 7,3.13 7,7 -3.13,7 -7,7z" /> -</vector> diff --git a/QKSMS/src/main/res/drawable/ic_unfold.xml b/QKSMS/src/main/res/drawable/ic_unfold.xml deleted file mode 100644 index 3127ed1e6..000000000 --- a/QKSMS/src/main/res/drawable/ic_unfold.xml +++ /dev/null @@ -1,9 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportHeight="24.0" - android:viewportWidth="24.0"> - <path - android:fillColor="#FF000000" - android:pathData="M12,5.83L15.17,9l1.41,-1.41L12,3 7.41,7.59 8.83,9 12,5.83zM12,18.17L8.83,15l-1.41,1.41L12,21l4.59,-4.59L15.17,15 12,18.17z" /> -</vector> diff --git a/QKSMS/src/main/res/drawable/ic_unread_indicator.xml b/QKSMS/src/main/res/drawable/ic_unread_indicator.xml deleted file mode 100644 index c8e90838c..000000000 --- a/QKSMS/src/main/res/drawable/ic_unread_indicator.xml +++ /dev/null @@ -1,9 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportHeight="24.0" - android:viewportWidth="24.0"> - <path - android:fillColor="#FF000000" - android:pathData="M12,2C6.5,2,2,6.5,2,12c0,5.5,4.5,10,10,10c5.5,0,10-4.5,10-10C22,6.5,17.5,2,12,2z" /> -</vector> \ No newline at end of file diff --git a/QKSMS/src/main/res/drawable/ic_unselected.xml b/QKSMS/src/main/res/drawable/ic_unselected.xml deleted file mode 100644 index 629f538c8..000000000 --- a/QKSMS/src/main/res/drawable/ic_unselected.xml +++ /dev/null @@ -1,9 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportHeight="24.0" - android:viewportWidth="24.0"> - <path - android:fillColor="#FF000000" - android:pathData="M12,2C6.5,2,2,6.5,2,12s4.5,10,10,10c5.5,0,10-4.5,10-10S17.5,2,12,2z M12,20c-4.4,0-8-3.6-8-8s3.6-8,8-8c4.4,0,8,3.6,8,8S16.4,20,12,20z" /> -</vector> \ No newline at end of file diff --git a/QKSMS/src/main/res/drawable/plus_to_arrow.xml b/QKSMS/src/main/res/drawable/plus_to_arrow.xml deleted file mode 100644 index 9d3f88da6..000000000 --- a/QKSMS/src/main/res/drawable/plus_to_arrow.xml +++ /dev/null @@ -1,52 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<animation-list xmlns:android="http://schemas.android.com/apk/res/android" - android:oneshot="true"> - <item - android:drawable="@drawable/plus_to_arrow_00" - android:duration="10" /> - <item - android:drawable="@drawable/plus_to_arrow_01" - android:duration="10" /> - <item - android:drawable="@drawable/plus_to_arrow_02" - android:duration="10" /> - <item - android:drawable="@drawable/plus_to_arrow_03" - android:duration="10" /> - <item - android:drawable="@drawable/plus_to_arrow_04" - android:duration="10" /> - <item - android:drawable="@drawable/plus_to_arrow_05" - android:duration="10" /> - <item - android:drawable="@drawable/plus_to_arrow_06" - android:duration="10" /> - <item - android:drawable="@drawable/plus_to_arrow_07" - android:duration="10" /> - <item - android:drawable="@drawable/plus_to_arrow_08" - android:duration="10" /> - <item - android:drawable="@drawable/plus_to_arrow_09" - android:duration="10" /> - <item - android:drawable="@drawable/plus_to_arrow_10" - android:duration="10" /> - <item - android:drawable="@drawable/plus_to_arrow_11" - android:duration="10" /> - <item - android:drawable="@drawable/plus_to_arrow_12" - android:duration="10" /> - <item - android:drawable="@drawable/plus_to_arrow_13" - android:duration="10" /> - <item - android:drawable="@drawable/plus_to_arrow_14" - android:duration="10" /> - <item - android:drawable="@drawable/plus_to_arrow_15" - android:duration="10" /> -</animation-list> \ No newline at end of file diff --git a/QKSMS/src/main/res/drawable/ripple.xml b/QKSMS/src/main/res/drawable/ripple.xml deleted file mode 100644 index 7f28622d1..000000000 --- a/QKSMS/src/main/res/drawable/ripple.xml +++ /dev/null @@ -1,15 +0,0 @@ -<selector xmlns:android="http://schemas.android.com/apk/res/android"> - <item android:state_pressed="true"> - <shape android:shape="rectangle"> - <solid android:color="@color/ripple_material_light" /> - <corners android:radius="2dp" /> - </shape> - </item> - - <item> - <shape android:shape="rectangle"> - <solid android:color="@android:color/transparent" /> - <corners android:radius="2dp" /> - </shape> - </item> -</selector> diff --git a/QKSMS/src/main/res/drawable/ripple_light.xml b/QKSMS/src/main/res/drawable/ripple_light.xml deleted file mode 100644 index 42157aae3..000000000 --- a/QKSMS/src/main/res/drawable/ripple_light.xml +++ /dev/null @@ -1,15 +0,0 @@ -<selector xmlns:android="http://schemas.android.com/apk/res/android"> - <item android:state_pressed="true"> - <shape android:shape="rectangle"> - <solid android:color="@color/ripple_material_dark" /> - <corners android:radius="2dp" /> - </shape> - </item> - - <item> - <shape android:shape="rectangle"> - <solid android:color="@android:color/transparent" /> - <corners android:radius="2dp" /> - </shape> - </item> -</selector> diff --git a/QKSMS/src/main/res/drawable/seek_thumb.xml b/QKSMS/src/main/res/drawable/seek_thumb.xml deleted file mode 100644 index 4c0c42934..000000000 --- a/QKSMS/src/main/res/drawable/seek_thumb.xml +++ /dev/null @@ -1,12 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> - <item> - <shape android:shape="oval"> - <solid android:color="@color/grey_light_ultra" /> - <size - android:width="16dp" - android:height="16dp" /> - </shape> - </item> - -</layer-list> \ No newline at end of file diff --git a/QKSMS/src/main/res/drawable/shadow_slidingmenu.xml b/QKSMS/src/main/res/drawable/shadow_slidingmenu.xml deleted file mode 100644 index 6b893aa78..000000000 --- a/QKSMS/src/main/res/drawable/shadow_slidingmenu.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<shape xmlns:android="http://schemas.android.com/apk/res/android" > - - <gradient - android:endColor="#16000000" - android:centerColor="#06000000" - android:startColor="#00000000" /> - -</shape> \ No newline at end of file diff --git a/QKSMS/src/main/res/drawable/system_bar_empty.xml b/QKSMS/src/main/res/drawable/system_bar_empty.xml deleted file mode 100644 index 2283d6f00..000000000 --- a/QKSMS/src/main/res/drawable/system_bar_empty.xml +++ /dev/null @@ -1,6 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> - -<shape xmlns:android="http://schemas.android.com/apk/res/android" - android:shape="rectangle"> - <solid android:color="@color/transparent" /> -</shape> \ No newline at end of file diff --git a/QKSMS/src/main/res/drawable/widget_header.xml b/QKSMS/src/main/res/drawable/widget_header.xml deleted file mode 100644 index 080afd8c4..000000000 --- a/QKSMS/src/main/res/drawable/widget_header.xml +++ /dev/null @@ -1,16 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> - <item> - <shape android:shape="rectangle"> - - <corners - android:bottomLeftRadius="0dp" - android:bottomRightRadius="0dp" - android:topLeftRadius="2dp" - android:topRightRadius="2dp" /> - - <solid android:color="@color/white_pure" /> - - </shape> - </item> -</layer-list> \ No newline at end of file diff --git a/QKSMS/src/main/res/drawable/widget_list_background.xml b/QKSMS/src/main/res/drawable/widget_list_background.xml deleted file mode 100644 index a1625d732..000000000 --- a/QKSMS/src/main/res/drawable/widget_list_background.xml +++ /dev/null @@ -1,16 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> - <item> - <shape android:shape="rectangle"> - - <corners - android:bottomLeftRadius="2dp" - android:bottomRightRadius="2dp" - android:topLeftRadius="0dp" - android:topRightRadius="0dp" /> - - <solid android:color="@color/white_pure" /> - - </shape> - </item> -</layer-list> \ No newline at end of file diff --git a/QKSMS/src/main/res/layout/activity_fragment.xml b/QKSMS/src/main/res/layout/activity_fragment.xml deleted file mode 100644 index 380efaa3c..000000000 --- a/QKSMS/src/main/res/layout/activity_fragment.xml +++ /dev/null @@ -1,27 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<LinearLayout android:id="@+id/root" - xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:orientation="vertical"> - - <include layout="@layout/view_toolbar" /> - - <FrameLayout - android:layout_width="match_parent" - android:layout_height="0dp" - android:layout_weight="1"> - - <FrameLayout - android:id="@+id/content_frame" - android:layout_width="match_parent" - android:layout_height="match_parent" /> - - <View - android:layout_width="match_parent" - android:layout_height="8dp" - android:background="@drawable/ab_shadow" /> - - </FrameLayout> - -</LinearLayout> \ No newline at end of file diff --git a/QKSMS/src/main/res/layout/activity_qkcompose.xml b/QKSMS/src/main/res/layout/activity_qkcompose.xml deleted file mode 100644 index a193b2252..000000000 --- a/QKSMS/src/main/res/layout/activity_qkcompose.xml +++ /dev/null @@ -1,46 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> - -<com.moez.QKSMS.ui.view.QKLinearLayout - android:id="@+id/popup" - xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:background="@drawable/dialog_background" - android:orientation="vertical" - app:backgroundTint="?attr/backgroundColor"> - - <include layout="@layout/view_toolbar" /> - - <ScrollView - android:layout_width="match_parent" - android:layout_height="wrap_content"> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="vertical"> - - <com.moez.QKSMS.ui.view.AutoCompleteContactView - android:id="@+id/compose_recipients" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:background="@null" - android:hint="@string/hint_contacts" - android:padding="16dp" /> - - <include layout="@layout/view_starred_contacts" /> - - <ViewStub - android:id="@+id/compose_view_stub" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:clipToPadding="false" - android:inflatedId="@+id/compose_view" - android:layout="@layout/view_compose" /> - - </LinearLayout> - - </ScrollView> - -</com.moez.QKSMS.ui.view.QKLinearLayout> diff --git a/QKSMS/src/main/res/layout/activity_qkreply.xml b/QKSMS/src/main/res/layout/activity_qkreply.xml deleted file mode 100644 index d83896d9e..000000000 --- a/QKSMS/src/main/res/layout/activity_qkreply.xml +++ /dev/null @@ -1,50 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> - -<com.moez.QKSMS.ui.view.QKLinearLayout - android:id="@+id/popup" - xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:background="@drawable/dialog_background" - android:clipToPadding="false" - android:focusable="true" - android:focusableInTouchMode="true" - android:orientation="vertical" - app:backgroundTint="?attr/backgroundColor"> - - <include layout="@layout/view_toolbar" /> - - <FrameLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_weight="1" - android:clipChildren="false" - android:clipToPadding="false" - android:foreground="@drawable/ab_shadow"> - - <ListView - android:id="@+id/popup_messages" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:cacheColorHint="@color/white_pure" - android:clipChildren="false" - android:clipToPadding="false" - android:paddingLeft="8dp" - android:paddingRight="8dp" - android:paddingTop="8dp" - android:scrollbarStyle="outsideOverlay" - android:stackFromBottom="true" - android:transcriptMode="alwaysScroll" /> - - </FrameLayout> - - <include - android:id="@+id/compose_view" - layout="@layout/view_compose" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_gravity="bottom" - android:clipToPadding="false" /> - -</com.moez.QKSMS.ui.view.QKLinearLayout> diff --git a/QKSMS/src/main/res/layout/activity_welcome.xml b/QKSMS/src/main/res/layout/activity_welcome.xml deleted file mode 100644 index 6a65be2c4..000000000 --- a/QKSMS/src/main/res/layout/activity_welcome.xml +++ /dev/null @@ -1,80 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<LinearLayout - android:id="@+id/welcome" - xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:gravity="center_horizontal" - android:orientation="vertical" - android:weightSum="1" - android:fitsSystemWindows="true"> - - <include layout="@layout/view_toolbar" /> - - <android.support.v4.view.ViewPager - android:id="@+id/welcome_pager" - xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="0dp" - android:layout_weight="1" /> - - <com.moez.QKSMS.ui.view.RobotoTextView - android:id="@+id/welcome_skip" - android:layout_width="wrap_content" - android:layout_height="36dp" - android:layout_weight="0" - android:gravity="center" - android:minHeight="36dp" - android:minWidth="88dp" - android:text="@string/welcome_skip" - android:textColor="@color/text_primary_dark" - android:textSize="18sp" /> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="64dp" - android:layout_weight="0" - android:gravity="center" - android:orientation="horizontal"> - - <ImageView - android:id="@+id/welcome_previous" - android:layout_width="64dp" - android:layout_height="64dp" - android:alpha="0.6" - android:padding="8dp" - android:src="@drawable/ic_arrow_left" /> - - <ImageView - android:id="@+id/welcome_indicator_0" - android:layout_width="16dp" - android:layout_height="16dp" - android:alpha="1.0" - android:padding="4dp" - android:src="@drawable/ic_unread_indicator" /> - - <ImageView - android:id="@+id/welcome_indicator_1" - android:layout_width="16dp" - android:layout_height="16dp" - android:alpha="0.6" - android:padding="4dp" - android:src="@drawable/ic_unread_indicator" /> - - <ImageView - android:id="@+id/welcome_indicator_2" - android:layout_width="16dp" - android:layout_height="16dp" - android:alpha="0.6" - android:padding="4dp" - android:src="@drawable/ic_unread_indicator" /> - - <ImageView - android:id="@+id/welcome_next" - android:layout_width="64dp" - android:layout_height="64dp" - android:alpha="1.0" - android:padding="8dp" - android:src="@drawable/ic_arrow_right" /> - </LinearLayout> -</LinearLayout> \ No newline at end of file diff --git a/QKSMS/src/main/res/layout/content_frame.xml b/QKSMS/src/main/res/layout/content_frame.xml deleted file mode 100644 index 08f5fba66..000000000 --- a/QKSMS/src/main/res/layout/content_frame.xml +++ /dev/null @@ -1,5 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<FrameLayout android:id="@+id/content_frame" - xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="match_parent" /> \ No newline at end of file diff --git a/QKSMS/src/main/res/layout/dialog_bubbles.xml b/QKSMS/src/main/res/layout/dialog_bubbles.xml deleted file mode 100644 index 7b117da05..000000000 --- a/QKSMS/src/main/res/layout/dialog_bubbles.xml +++ /dev/null @@ -1,65 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<ScrollView - xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:padding="8dp"> - - <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="vertical"> - - <LinearLayout - android:id="@+id/prefs" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="vertical" /> - - <com.moez.QKSMS.ui.view.QKTextView - android:id="@+id/in_1" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginTop="2dp" - android:background="@drawable/message_received_2" - android:gravity="center_vertical" - android:text="Hey there!" - android:textColor="@color/black" /> - - <com.moez.QKSMS.ui.view.QKTextView - android:id="@+id/in_2" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginBottom="8dp" - android:layout_marginTop="2dp" - android:background="@drawable/message_received_alt_2" - android:gravity="center_vertical" - android:text="Don't worry, this isn't a real message. We're just showing you how your chats will look!" - android:textColor="@color/black" /> - - <com.moez.QKSMS.ui.view.QKTextView - android:id="@+id/out_1" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="right" - android:layout_marginTop="2dp" - android:background="@drawable/message_sent_2" - android:gravity="center_vertical" - android:text="Sweet, here's an outgoing message" - android:textColor="@color/black" /> - - <com.moez.QKSMS.ui.view.QKTextView - android:id="@+id/out_2" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="right" - android:layout_marginBottom="8dp" - android:layout_marginTop="2dp" - android:background="@drawable/message_sent_alt_2" - android:gravity="center_vertical" - android:text="And another!" - android:textColor="@color/black" /> - - </LinearLayout> - -</ScrollView> \ No newline at end of file diff --git a/QKSMS/src/main/res/layout/dialog_color_picker.xml b/QKSMS/src/main/res/layout/dialog_color_picker.xml deleted file mode 100644 index 61c29e352..000000000 --- a/QKSMS/src/main/res/layout/dialog_color_picker.xml +++ /dev/null @@ -1,208 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - xmlns:tools="http://schemas.android.com/tools" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:orientation="vertical"> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="48dp" - android:paddingLeft="16dp" - android:paddingRight="16dp"> - - <com.moez.QKSMS.ui.view.QKTextView - android:id="@+id/tab_1" - android:layout_width="wrap_content" - android:layout_height="match_parent" - android:gravity="center" - android:paddingLeft="16dp" - android:paddingRight="16dp" - android:text="@string/title_palette" - app:type="primary_bold" /> - - <com.moez.QKSMS.ui.view.QKTextView - android:id="@+id/tab_2" - android:layout_width="wrap_content" - android:layout_height="match_parent" - android:gravity="center" - android:paddingLeft="16dp" - android:paddingRight="16dp" - android:text="@string/title_rgb" - app:type="primary_bold" /> - - </LinearLayout> - - <android.support.v4.view.ViewPager - android:id="@+id/pager" - android:layout_width="match_parent" - android:layout_height="320dp"> - - <com.moez.QKSMS.ui.view.colorpicker.ColorPickerPalette - android:id="@+id/palette" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:gravity="center" /> - - <LinearLayout - android:id="@+id/rgb" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:orientation="vertical"> - - <View - android:id="@+id/preview" - android:layout_width="match_parent" - android:layout_height="128dp" - android:background="#e2e28e" /> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="36dp" - android:layout_marginTop="16dp" - android:gravity="center_vertical"> - - <com.moez.QKSMS.ui.view.QKTextView - android:layout_width="24dp" - android:layout_height="wrap_content" - android:layout_marginLeft="16dp" - android:gravity="center" - android:lines="1" - android:text="R" - app:type="secondary" - tools:ignore="HardcodedText" /> - - <SeekBar - android:id="@+id/red" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_weight="1" - android:max="255" /> - - <com.moez.QKSMS.ui.view.QKTextView - android:id="@+id/red_value" - android:layout_width="36dp" - android:layout_height="wrap_content" - android:layout_marginRight="16dp" - android:gravity="center" - android:lines="1" - app:type="primary" - tools:text="41" /> - - </LinearLayout> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="36dp" - android:gravity="center_vertical"> - - <com.moez.QKSMS.ui.view.QKTextView - android:layout_width="24dp" - android:layout_height="wrap_content" - android:layout_marginLeft="16dp" - android:gravity="center" - android:lines="1" - android:text="G" - app:type="secondary" - tools:ignore="HardcodedText" /> - - <SeekBar - android:id="@+id/green" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_weight="1" - android:max="255" /> - - <com.moez.QKSMS.ui.view.QKTextView - android:id="@+id/green_value" - android:layout_width="36dp" - android:layout_height="wrap_content" - android:layout_marginRight="16dp" - android:gravity="center" - android:lines="1" - app:type="primary" - tools:text="22" /> - - </LinearLayout> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="36dp" - android:layout_marginBottom="16dp" - android:gravity="center_vertical"> - - <com.moez.QKSMS.ui.view.QKTextView - android:layout_width="24dp" - android:layout_height="wrap_content" - android:layout_marginLeft="16dp" - android:gravity="center" - android:lines="1" - android:text="B" - app:type="secondary" - tools:ignore="HardcodedText" /> - - <SeekBar - android:id="@+id/blue" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_weight="1" - android:max="255" /> - - <com.moez.QKSMS.ui.view.QKTextView - android:id="@+id/blue_value" - android:layout_width="36dp" - android:layout_height="wrap_content" - android:layout_marginRight="16dp" - android:gravity="center" - android:lines="1" - app:type="primary" - tools:text="231" /> - - </LinearLayout> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:focusableInTouchMode="true" - android:gravity="center_vertical"> - - <com.moez.QKSMS.ui.view.QKTextView - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginLeft="16dp" - android:text="@string/hint_hex" - app:type="primary" /> - - <com.moez.QKSMS.ui.view.QKEditText - android:id="@+id/hex" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginLeft="8dp" - android:layout_marginRight="8dp" - android:background="@drawable/edittext" - android:digits="1234567890abcdef" - android:imeOptions="actionDone" - android:lines="1" - android:maxLength="6" - android:paddingBottom="8dp" - android:paddingLeft="16dp" - android:paddingRight="16dp" - android:paddingTop="8dp" - android:selectAllOnFocus="true" - android:singleLine="true" /> - - <ImageView - android:id="@+id/error" - android:layout_width="24dp" - android:layout_height="24dp" - android:src="@drawable/ic_error" - android:visibility="invisible" /> - - </LinearLayout> - - </LinearLayout> - - </android.support.v4.view.ViewPager> - -</LinearLayout> \ No newline at end of file diff --git a/QKSMS/src/main/res/layout/dialog_color_picker_led.xml b/QKSMS/src/main/res/layout/dialog_color_picker_led.xml deleted file mode 100644 index a4cb534a7..000000000 --- a/QKSMS/src/main/res/layout/dialog_color_picker_led.xml +++ /dev/null @@ -1,31 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center" - android:gravity="center"> - - <FrameLayout - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center_horizontal" - android:gravity="center" - android:padding="28dp"> - - <ProgressBar - android:id="@android:id/progress" - style="?android:attr/progressBarStyleLarge" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center" - android:gravity="center" /> - - <com.moez.QKSMS.ui.view.colorpicker.ColorPickerPalette - android:id="@+id/color_picker" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center" - android:gravity="center" - android:visibility="gone" /> - </FrameLayout> -</ScrollView> \ No newline at end of file diff --git a/QKSMS/src/main/res/layout/dialog_conversation_details.xml b/QKSMS/src/main/res/layout/dialog_conversation_details.xml deleted file mode 100644 index 8f5957400..000000000 --- a/QKSMS/src/main/res/layout/dialog_conversation_details.xml +++ /dev/null @@ -1,53 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:orientation="vertical" - android:paddingLeft="24dp" - android:paddingRight="24dp"> - - <com.moez.QKSMS.ui.view.QKTextView - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:text="@string/dialog_conversation_details_last_message_date" - app:type="dialog_button" /> - - <com.moez.QKSMS.ui.view.QKTextView - android:id="@+id/date" - android:layout_width="match_parent" - android:layout_height="wrap_content" - app:type="secondary" /> - - <View - android:layout_width="match_parent" - android:layout_height="16dp" /> - - <com.moez.QKSMS.ui.view.QKTextView - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:text="@string/dialog_conversation_details_message_count" - app:type="dialog_button" /> - - <com.moez.QKSMS.ui.view.QKTextView - android:id="@+id/message_count" - android:layout_width="match_parent" - android:layout_height="wrap_content" - app:type="secondary" /> - - <View - android:layout_width="match_parent" - android:layout_height="16dp" /> - - <com.moez.QKSMS.ui.view.QKTextView - android:id="@+id/recipients" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:text="@string/dialog_conversation_details_recipients" - app:type="dialog_button" /> - - <View - android:layout_width="match_parent" - android:layout_height="8dp" /> - -</LinearLayout> \ No newline at end of file diff --git a/QKSMS/src/main/res/layout/dialog_delete_thread.xml b/QKSMS/src/main/res/layout/dialog_delete_thread.xml deleted file mode 100644 index 073f7b49b..000000000 --- a/QKSMS/src/main/res/layout/dialog_delete_thread.xml +++ /dev/null @@ -1,35 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?><!-- Copyright (C) 2009 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> - -<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - android:orientation="vertical" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:padding="15dip"> - - <com.moez.QKSMS.ui.view.QKTextView - android:id="@+id/message" - android:layout_width="match_parent" - android:layout_height="wrap_content" - app:type="primary" /> - - <CheckBox - android:id="@+id/delete_locked" - android:layout_height="wrap_content" - android:layout_width="match_parent" - android:text="@string/delete_unlocked" /> - -</LinearLayout> diff --git a/QKSMS/src/main/res/layout/dialog_donate.xml b/QKSMS/src/main/res/layout/dialog_donate.xml deleted file mode 100644 index 1ca79dcb0..000000000 --- a/QKSMS/src/main/res/layout/dialog_donate.xml +++ /dev/null @@ -1,121 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:orientation="vertical" - android:padding="16dp"> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="vertical" - android:padding="8dp"> - - <com.moez.QKSMS.ui.view.QKTextView - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:text="@string/donate_google" - app:type="dialog_title" /> - - <com.moez.QKSMS.ui.view.QKTextView - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:text="@string/donate_google_summary" - app:type="tertiary" /> - - </LinearLayout> - - <LinearLayout - android:id="@+id/donate_1" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="vertical" - android:padding="8dp"> - - <com.moez.QKSMS.ui.view.QKTextView - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:text="@string/product_name_donate_1" - app:type="primary" /> - - <com.moez.QKSMS.ui.view.QKTextView - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:text="@string/product_description_donate_1" - app:type="secondary" /> - - </LinearLayout> - - <LinearLayout - android:id="@+id/donate_5" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="vertical" - android:padding="8dp"> - - <com.moez.QKSMS.ui.view.QKTextView - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:text="@string/product_name_donate_5" - app:type="primary" /> - - <com.moez.QKSMS.ui.view.QKTextView - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:text="@string/product_description_donate_5" - app:type="secondary" /> - - </LinearLayout> - - <LinearLayout - android:id="@+id/donate_10" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="vertical" - android:padding="8dp"> - - <com.moez.QKSMS.ui.view.QKTextView - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:text="@string/product_name_donate_10" - app:type="primary" /> - - <com.moez.QKSMS.ui.view.QKTextView - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:text="@string/product_description_donate_10" - app:type="secondary" /> - - </LinearLayout> - - <com.moez.QKSMS.ui.view.QKTextView - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginTop="16dp" - android:padding="8dp" - android:text="@string/donate_paypal" - app:type="dialog_title" /> - - <LinearLayout - android:id="@+id/donate_paypal" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="vertical" - android:padding="8dp"> - - <com.moez.QKSMS.ui.view.QKTextView - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:text="@string/donate_paypal_button" - app:type="primary" /> - - <com.moez.QKSMS.ui.view.QKTextView - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:text="@string/donate_paypal_button_summary" - app:type="secondary" /> - - </LinearLayout> - -</LinearLayout> \ No newline at end of file diff --git a/QKSMS/src/main/res/layout/dialog_material.xml b/QKSMS/src/main/res/layout/dialog_material.xml deleted file mode 100644 index 8ef066948..000000000 --- a/QKSMS/src/main/res/layout/dialog_material.xml +++ /dev/null @@ -1,101 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> - -<com.moez.QKSMS.ui.view.QKLinearLayout - android:id="@+id/parentPanel" - xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:background="@drawable/dialog_background" - android:orientation="vertical" - app:backgroundTint="?attr/backgroundColor"> - - <LinearLayout - android:id="@+id/contentPanel" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginLeft="24dp" - android:layout_marginRight="24dp" - android:layout_marginTop="24dp" - android:orientation="vertical" - android:visibility="gone"> - - <com.moez.QKSMS.ui.view.QKTextView - android:id="@+id/alertTitle" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginBottom="24dp" - android:ellipsize="end" - android:singleLine="true" - android:visibility="gone" - app:type="dialog_title" /> - - <com.moez.QKSMS.ui.view.QKTextView - android:id="@+id/message" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginBottom="24dp" - android:lineSpacingExtra="4dp" - android:visibility="gone" - app:type="dialog_message" /> - </LinearLayout> - - <LinearLayout - android:id="@+id/customPanel" - android:layout_width="match_parent" - android:layout_height="0dp" - android:layout_weight="1" - android:orientation="vertical" - android:visibility="gone" /> - - <com.moez.QKSMS.ui.view.WrapLayout - android:id="@+id/buttonPanel" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginBottom="16dp" - android:gravity="bottom|right" - android:orientation="vertical" - android:paddingLeft="16dp" - android:paddingRight="16dp" - android:visibility="gone"> - - <com.moez.QKSMS.ui.view.QKTextView - android:id="@+id/buttonNeutral" - android:layout_width="wrap_content" - android:layout_height="36dp" - android:gravity="center_vertical" - android:paddingLeft="16dp" - android:paddingRight="16dp" - android:singleLine="true" - android:visibility="gone" - app:type="dialog_button" /> - - <View - android:id="@+id/space" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:layout_weight="1" /> - - <com.moez.QKSMS.ui.view.QKTextView - android:id="@+id/buttonNegative" - android:layout_width="wrap_content" - android:layout_height="36dp" - android:gravity="center_vertical" - android:paddingLeft="16dp" - android:paddingRight="16dp" - android:singleLine="true" - android:visibility="gone" - app:type="dialog_button" /> - - <com.moez.QKSMS.ui.view.QKTextView - android:id="@+id/buttonPositive" - android:layout_width="wrap_content" - android:layout_height="36dp" - android:gravity="center_vertical" - android:paddingLeft="16dp" - android:paddingRight="16dp" - android:singleLine="true" - android:visibility="gone" - app:type="dialog_button" /> - </com.moez.QKSMS.ui.view.WrapLayout> -</com.moez.QKSMS.ui.view.QKLinearLayout> diff --git a/QKSMS/src/main/res/layout/dialog_redeem.xml b/QKSMS/src/main/res/layout/dialog_redeem.xml deleted file mode 100644 index bc0c9a968..000000000 --- a/QKSMS/src/main/res/layout/dialog_redeem.xml +++ /dev/null @@ -1,14 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<com.moez.QKSMS.ui.view.QKEditText - android:id="@+id/compose_reply_text" - xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:background="@null" - android:hint="@string/hint_redeem" - android:maxLines="1" - android:paddingLeft="32dp" - android:paddingRight="32dp" - android:textColorHint="@color/grey_light" - app:type="primary" /> \ No newline at end of file diff --git a/QKSMS/src/main/res/layout/fragment_compose.xml b/QKSMS/src/main/res/layout/fragment_compose.xml deleted file mode 100644 index dfed99641..000000000 --- a/QKSMS/src/main/res/layout/fragment_compose.xml +++ /dev/null @@ -1,35 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:orientation="vertical"> - - <ScrollView - android:layout_width="match_parent" - android:layout_height="0dp" - android:layout_weight="1"> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:focusable="true" - android:focusableInTouchMode="true" - android:orientation="vertical"> - - <com.moez.QKSMS.ui.view.AutoCompleteContactView - android:id="@+id/compose_recipients" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:background="@null" - android:hint="@string/hint_contacts" - android:padding="16dp" /> - - <include layout="@layout/view_starred_contacts" /> - - </LinearLayout> - - </ScrollView> - - <include layout="@layout/view_compose" /> - -</LinearLayout> \ No newline at end of file diff --git a/QKSMS/src/main/res/layout/fragment_conversation.xml b/QKSMS/src/main/res/layout/fragment_conversation.xml deleted file mode 100644 index 61a15b6ec..000000000 --- a/QKSMS/src/main/res/layout/fragment_conversation.xml +++ /dev/null @@ -1,30 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> - -<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:clipToPadding="false" - android:focusable="true" - android:focusableInTouchMode="true" - android:orientation="horizontal" - android:windowSoftInputMode="adjustPan"> - - <com.moez.QKSMS.ui.view.MessageListRecyclerView - android:id="@+id/conversation" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:cacheColorHint="@color/white_pure" - android:clipToPadding="false" - android:divider="@color/transparent" - android:dividerHeight="2dp" - android:paddingLeft="8dp" - android:paddingRight="8dp" /> - - <include - android:id="@+id/compose_view" - layout="@layout/view_compose" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_gravity="bottom" - android:clipToPadding="false" /> -</FrameLayout> \ No newline at end of file diff --git a/QKSMS/src/main/res/layout/fragment_conversations.xml b/QKSMS/src/main/res/layout/fragment_conversations.xml deleted file mode 100644 index 3bad8f1da..000000000 --- a/QKSMS/src/main/res/layout/fragment_conversations.xml +++ /dev/null @@ -1,53 +0,0 @@ -<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:orientation="vertical"> - - <LinearLayout - android:id="@+id/empty_state" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_centerInParent="true" - android:alpha="0.5" - android:gravity="center" - android:orientation="vertical" - android:paddingBottom="32dp" - android:visibility="gone"> - - <ImageView - android:id="@+id/empty_state_icon" - android:layout_width="120dp" - android:layout_height="120dp" - android:src="@drawable/ic_chat" /> - - <com.moez.QKSMS.ui.view.QKTextView - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:gravity="center" - android:text="@string/hint_no_messages" - app:type="dialog_title" /> - - </LinearLayout> - - <android.support.v7.widget.RecyclerView - android:id="@+id/conversations_list" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:cacheColorHint="@color/transparent" - android:clipToPadding="false" - android:divider="@null" - android:paddingBottom="8sp" - android:paddingTop="8sp" - android:scrollbarStyle="outsideOverlay" /> - - <com.melnykov.fab.FloatingActionButton - android:id="@+id/fab" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_alignParentBottom="true" - android:layout_alignParentRight="true" - android:layout_margin="16dp" - android:src="@drawable/ic_add" /> - -</RelativeLayout> diff --git a/QKSMS/src/main/res/layout/fragment_search.xml b/QKSMS/src/main/res/layout/fragment_search.xml deleted file mode 100644 index 0b9b414fc..000000000 --- a/QKSMS/src/main/res/layout/fragment_search.xml +++ /dev/null @@ -1,35 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> - -<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:orientation="vertical"> - - - <com.moez.QKSMS.ui.view.QKEditText - android:id="@+id/search_query" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:background="@null" - android:hint="@string/hint_search" - android:imeOptions="actionSearch" - android:inputType="text" - android:padding="16dp" /> - - <FrameLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:foreground="@drawable/ab_shadow"> - - <com.moez.QKSMS.ui.view.MessageListRecyclerView - android:id="@+id/search_list" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:cacheColorHint="@color/white_pure" - android:clipToPadding="false" - android:paddingBottom="8dp" - android:paddingTop="8dp" - android:scrollbarStyle="outsideOverlay" /> - </FrameLayout> - -</LinearLayout> \ No newline at end of file diff --git a/QKSMS/src/main/res/layout/fragment_welcome_greeting.xml b/QKSMS/src/main/res/layout/fragment_welcome_greeting.xml deleted file mode 100644 index 6b387492c..000000000 --- a/QKSMS/src/main/res/layout/fragment_welcome_greeting.xml +++ /dev/null @@ -1,46 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - android:orientation="vertical" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:paddingLeft="32dp" - android:paddingRight="32dp" - android:gravity="center"> - - <com.moez.QKSMS.ui.view.RobotoTextView - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:gravity="center" - android:singleLine="true" - android:textSize="54sp" - android:textColor="@color/text_primary_dark" - android:text="@string/app_name" - app:typeface="roboto_thin" /> - - <com.moez.QKSMS.ui.view.RobotoTextView - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:gravity="center" - android:singleLine="true" - android:text="@string/slogan" - android:textSize="18sp" - android:textColor="@color/text_primary_dark" - app:typeface="roboto_light" /> - - <View - android:layout_width="match_parent" - android:layout_height="64sp" /> - - <com.moez.QKSMS.ui.view.QKTextView - android:id="@+id/welcome_start" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:gravity="center" - android:minHeight="36dp" - android:minWidth="88dp" - android:singleLine="true" - android:background="@drawable/button_white" - android:text="@string/welcome_start" - app:type="pref_category" /> -</LinearLayout> \ No newline at end of file diff --git a/QKSMS/src/main/res/layout/fragment_welcome_night.xml b/QKSMS/src/main/res/layout/fragment_welcome_night.xml deleted file mode 100644 index e3904facf..000000000 --- a/QKSMS/src/main/res/layout/fragment_welcome_night.xml +++ /dev/null @@ -1,48 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<LinearLayout - xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:gravity="center" - android:orientation="vertical" - android:paddingLeft="32dp" - android:paddingRight="32dp"> - - <com.moez.QKSMS.ui.view.RobotoTextView - android:id="@+id/welcome_night_title" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:gravity="center" - android:text="@string/pref_night" - android:textColor="@color/theme_dark_text_primary" - android:textSize="54sp" - app:typeface="roboto_thin" /> - - <com.moez.QKSMS.ui.view.RobotoTextView - android:id="@+id/welcome_night_description" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:gravity="center" - android:text="@string/welcome_night_description" - android:textColor="@color/text_primary_dark" - android:textSize="18sp" - app:typeface="roboto_light" /> - - <View - android:layout_width="match_parent" - android:layout_height="64dp" /> - - <com.moez.QKSMS.ui.view.QKTextView - android:id="@+id/welcome_night_hint" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:background="@drawable/button_white" - android:gravity="center" - android:minHeight="36dp" - android:minWidth="88dp" - android:singleLine="true" - android:text="@string/welcome_night_hint" - app:type="pref_category" /> - -</LinearLayout> \ No newline at end of file diff --git a/QKSMS/src/main/res/layout/fragment_welcome_quickreply.xml b/QKSMS/src/main/res/layout/fragment_welcome_quickreply.xml deleted file mode 100644 index a2527579e..000000000 --- a/QKSMS/src/main/res/layout/fragment_welcome_quickreply.xml +++ /dev/null @@ -1,48 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<LinearLayout - xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:paddingLeft="32dp" - android:paddingRight="32dp" - android:gravity="center" - android:orientation="vertical"> - - <com.moez.QKSMS.ui.view.RobotoTextView - android:id="@+id/welcome_quickreply_title" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:gravity="center" - android:text="@string/welcome_quickreply_title" - android:textColor="@color/theme_dark_text_primary" - android:textSize="54sp" - app:typeface="roboto_thin" /> - - <com.moez.QKSMS.ui.view.RobotoTextView - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:gravity="center" - android:text="@string/welcome_quickreply_description" - android:textColor="@color/text_primary_dark" - android:textSize="18sp" - app:typeface="roboto_light" /> - - <View - android:layout_width="match_parent" - android:layout_height="64dp" /> - - <com.moez.QKSMS.ui.view.QKTextView - android:id="@+id/welcome_quickreply_hint" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:background="@drawable/button_white" - android:gravity="center" - android:minHeight="36dp" - android:minWidth="88dp" - android:singleLine="true" - android:text="@string/welcome_quickreply_hint" - android:textColor="@color/theme_dark_text_primary" - app:type="pref_category" /> - -</LinearLayout> \ No newline at end of file diff --git a/QKSMS/src/main/res/layout/fragment_welcome_theme.xml b/QKSMS/src/main/res/layout/fragment_welcome_theme.xml deleted file mode 100644 index e78b2698a..000000000 --- a/QKSMS/src/main/res/layout/fragment_welcome_theme.xml +++ /dev/null @@ -1,50 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:gravity="center" - android:orientation="vertical"> - - <com.moez.QKSMS.ui.view.RobotoTextView - android:id="@+id/welcome_quickreply_title" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginLeft="32dp" - android:layout_marginRight="32dp" - android:gravity="center" - android:text="@string/welcome_theme_title" - android:textColor="@color/theme_dark_text_primary" - android:textSize="54sp" - app:typeface="roboto_thin" /> - - <com.moez.QKSMS.ui.view.RobotoTextView - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginLeft="32dp" - android:layout_marginRight="32dp" - android:gravity="center" - android:text="@string/welcome_theme_description" - android:textColor="@color/text_primary_dark" - android:textSize="18sp" - app:typeface="roboto_light" /> - - <View - android:layout_width="match_parent" - android:layout_height="16dp" /> - - <ScrollView - android:layout_width="match_parent" - android:layout_height="wrap_content"> - - <com.moez.QKSMS.ui.view.colorpicker.ColorPickerPalette - android:id="@+id/welcome_themes" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:background="@color/theme_light_text_secondary" - android:gravity="center" - android:padding="16dp" /> - </ScrollView> - - -</LinearLayout> \ No newline at end of file diff --git a/QKSMS/src/main/res/layout/list_item_contact.xml b/QKSMS/src/main/res/layout/list_item_contact.xml deleted file mode 100644 index 1a34a22cd..000000000 --- a/QKSMS/src/main/res/layout/list_item_contact.xml +++ /dev/null @@ -1,69 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> - -<RelativeLayout - android:id="@+id/contact_list_row" - xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - android:layout_width="wrap_content" - android:layout_height="72dp"> - - <com.moez.QKSMS.ui.view.AvatarView - android:id="@+id/contact_list_contact" - android:layout_width="48dp" - android:layout_height="48dp" - android:layout_alignParentLeft="true" - android:layout_centerVertical="true" - android:layout_margin="12dp" - android:padding="4dp" /> - - <com.moez.QKSMS.ui.view.RobotoTextView - android:id="@+id/contact_list_contact_initial" - android:layout_width="48dp" - android:layout_height="48dp" - android:layout_alignParentLeft="true" - android:layout_centerVertical="true" - android:layout_margin="12dp" - android:gravity="center" - android:padding="4dp" - android:textColor="@color/white_pure" - android:textSize="22dp" - app:typeface="roboto_light" /> - - <RelativeLayout - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_centerVertical="true" - android:layout_toRightOf="@+id/contact_list_contact" - android:paddingRight="16dp"> - - <com.moez.QKSMS.ui.view.QKTextView - android:id="@+id/contact_list_name" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_alignParentLeft="true" - android:layout_toLeftOf="@+id/contact_list_type" - android:singleLine="true" - app:type="primary" /> - - <com.moez.QKSMS.ui.view.QKTextView - android:id="@+id/contact_list_type" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_alignParentRight="true" - android:layout_alignParentTop="true" - android:paddingLeft="16dp" - app:type="tertiary" /> - - <com.moez.QKSMS.ui.view.QKTextView - android:id="@+id/contact_list_number" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_alignParentLeft="true" - android:layout_below="@+id/contact_list_name" - android:lines="1" - android:singleLine="true" - app:type="secondary" /> - - </RelativeLayout> - -</RelativeLayout> \ No newline at end of file diff --git a/QKSMS/src/main/res/layout/list_item_conversation.xml b/QKSMS/src/main/res/layout/list_item_conversation.xml deleted file mode 100644 index 8d99be80c..000000000 --- a/QKSMS/src/main/res/layout/list_item_conversation.xml +++ /dev/null @@ -1,123 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<LinearLayout - android:id="@+id/conversation_list_row" - xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - xmlns:tools="http://schemas.android.com/tools" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:animateLayoutChanges="true" - android:gravity="top" - android:minHeight="72dp" - android:orientation="horizontal" - android:paddingLeft="16dp" - android:paddingRight="16dp"> - - <ImageView - android:id="@+id/selected" - android:layout_width="24dp" - android:layout_height="24dp" - android:layout_marginBottom="24dp" - android:layout_marginRight="16dp" - android:layout_marginTop="24dp" - android:visibility="gone" /> - - <com.moez.QKSMS.ui.view.AvatarView - android:id="@+id/conversation_list_avatar" - android:layout_width="48dp" - android:layout_height="48dp" - android:layout_marginBottom="12dp" - android:layout_marginRight="16dp" - android:layout_marginTop="12dp" - android:src="@drawable/tools_avatar" - app:initialSize="32dp" /> - - <LinearLayout - android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_gravity="center_vertical" - android:layout_marginBottom="12dp" - android:layout_marginTop="12dp" - android:layout_weight="1" - android:animateLayoutChanges="true" - android:orientation="vertical"> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:animateLayoutChanges="true"> - - <com.moez.QKSMS.ui.view.QKTextView - android:id="@+id/conversation_list_name" - style="@style/TextPrimary" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:singleLine="true" - tools:text="Moez Bhatti" /> - - <View - android:layout_width="0dp" - android:layout_height="match_parent" - android:layout_weight="1" - android:minWidth="16dp" /> - - <com.moez.QKSMS.ui.view.QKTextView - android:id="@+id/conversation_list_date" - style="@style/TextTertiary" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - tools:text="4:41PM" /> - - </LinearLayout> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:animateLayoutChanges="true" - android:gravity="top"> - - <com.moez.QKSMS.ui.view.QKTextView - android:id="@+id/conversation_list_snippet" - style="@style/TextSecondary" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_marginRight="8dp" - android:ellipsize="end" - android:layout_weight="1" - android:lines="1" - android:singleLine="false" - tools:text="Hey! This is a test message. I'm just making this longer now" /> - - <LinearLayout - android:id="@+id/conversation_list_badges" - android:layout_width="wrap_content" - android:layout_height="16dp" - android:layout_marginBottom="2dp" - android:layout_marginTop="2dp" - android:orientation="horizontal"> - - <ImageView - android:id="@+id/conversation_list_muted" - android:layout_width="16dp" - android:layout_height="16dp" - android:visibility="gone" /> - - <ImageView - android:id="@+id/conversation_list_error" - android:layout_width="16dp" - android:layout_height="16dp" - android:visibility="gone" /> - - <ImageView - android:id="@+id/conversation_list_unread" - android:layout_width="16dp" - android:layout_height="16dp" - android:visibility="gone" /> - - </LinearLayout> - - </LinearLayout> - - </LinearLayout> - -</LinearLayout> \ No newline at end of file diff --git a/QKSMS/src/main/res/layout/list_item_conversation_widget.xml b/QKSMS/src/main/res/layout/list_item_conversation_widget.xml deleted file mode 100644 index 28f54229d..000000000 --- a/QKSMS/src/main/res/layout/list_item_conversation_widget.xml +++ /dev/null @@ -1,91 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> - -<LinearLayout - android:id="@+id/conversation" - xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="wrap_content" - android:layout_height="72dp" - android:background="?android:attr/selectableItemBackground" - android:gravity="center_vertical|left" - android:minHeight="72dp" - android:orientation="horizontal" - android:paddingLeft="16dp" - android:paddingRight="16dp"> - - <ImageView - android:id="@+id/avatar" - android:layout_width="48dp" - android:layout_height="48dp" - android:layout_alignParentLeft="true" - android:layout_centerVertical="true" - android:layout_marginRight="16dp" /> - - <RelativeLayout - android:id="@+id/conversation_block" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_centerVertical="true"> - - <TextView - android:id="@+id/name" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_alignParentLeft="true" - android:layout_toLeftOf="@+id/date" - android:singleLine="true" - android:textSize="16sp" /> - - <TextView - android:id="@+id/date" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_alignParentRight="true" - android:layout_alignParentTop="true" - android:paddingLeft="16dp" - android:textSize="12sp" /> - - <TextView - android:id="@+id/snippet" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_alignParentLeft="true" - android:layout_below="@+id/name" - android:layout_toLeftOf="@+id/badges" - android:lines="1" - android:singleLine="true" - android:textSize="14sp" /> - - <LinearLayout - android:id="@+id/badges" - android:layout_width="wrap_content" - android:layout_height="16dp" - android:layout_alignParentRight="true" - android:layout_below="@+id/date" - android:layout_marginTop="8dp" - android:orientation="horizontal"> - - <ImageView - android:id="@+id/muted" - android:layout_width="16dp" - android:layout_height="16dp" - android:src="@drawable/ic_notifications_muted" - android:visibility="gone" /> - - <ImageView - android:id="@+id/error" - android:layout_width="16dp" - android:layout_height="16dp" - android:src="@drawable/ic_error" - android:visibility="gone" /> - - <ImageView - android:id="@+id/unread" - android:layout_width="16dp" - android:layout_height="16dp" - android:src="@drawable/ic_unread_indicator" - android:visibility="gone" /> - </LinearLayout> - - </RelativeLayout> - -</LinearLayout> \ No newline at end of file diff --git a/QKSMS/src/main/res/layout/list_item_dual.xml b/QKSMS/src/main/res/layout/list_item_dual.xml deleted file mode 100644 index f48f7829a..000000000 --- a/QKSMS/src/main/res/layout/list_item_dual.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> - -<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="vertical" - android:paddingBottom="16dp" - android:paddingLeft="24dp" - android:paddingRight="24dp"> - - <com.moez.QKSMS.ui.view.QKTextView - android:id="@+id/list_item_title" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:singleLine="true" - app:type="secondary" /> - - <com.moez.QKSMS.ui.view.QKTextView - android:id="@+id/list_item_body" - android:layout_width="match_parent" - android:layout_height="wrap_content" - app:type="primary" /> - -</LinearLayout> - diff --git a/QKSMS/src/main/res/layout/list_item_icon.xml b/QKSMS/src/main/res/layout/list_item_icon.xml deleted file mode 100644 index b42eb8102..000000000 --- a/QKSMS/src/main/res/layout/list_item_icon.xml +++ /dev/null @@ -1,17 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:tools="http://schemas.android.com/tools" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="vertical" - android:paddingBottom="8dp" - android:paddingTop="8dp"> - - <ImageView - android:id="@+id/icon" - android:layout_width="48dp" - android:layout_height="48dp" - android:layout_gravity="center" - tools:src="@mipmap/ic_launcher_blue_grey" /> - -</FrameLayout> \ No newline at end of file diff --git a/QKSMS/src/main/res/layout/list_item_message_in.xml b/QKSMS/src/main/res/layout/list_item_message_in.xml deleted file mode 100644 index 357277128..000000000 --- a/QKSMS/src/main/res/layout/list_item_message_in.xml +++ /dev/null @@ -1,141 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> - -<LinearLayout - android:id="@+id/msg_list_item_recv" - xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="horizontal" - android:paddingTop="2dp"> - - <LinearLayout - android:id="@+id/mms_layout_view_parent" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_weight="1" - android:orientation="vertical"> - - <View - android:id="@+id/space" - android:layout_width="match_parent" - android:layout_height="8dp" /> - - <RelativeLayout - android:layout_width="match_parent" - android:layout_height="wrap_content"> - - <com.moez.QKSMS.ui.view.AvatarView - android:id="@+id/avatar" - android:layout_width="40dp" - android:layout_height="40dp" - android:layout_alignParentLeft="true" - android:layout_alignParentTop="true" - app:initialSize="22dp" /> - - <LinearLayout - android:id="@+id/message_block" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_alignParentLeft="true" - android:layout_marginLeft="44dp" - android:clipChildren="false" - android:clipToPadding="false" - android:gravity="left" - android:orientation="vertical"> - - <com.moez.QKSMS.ui.view.QKTextView - android:id="@+id/text_view" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:autoLink="all" - android:background="@drawable/message_received_2" - android:gravity="center_vertical" - android:linksClickable="true" - app:type="primary" /> - - <FrameLayout - android:id="@+id/mms_view" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginLeft="8dp" - android:layout_marginTop="4dp" - android:layout_marginBottom="8dp" - android:foreground="@drawable/card_mask"> - - <ImageView - android:id="@+id/image_view" - android:layout_width="@dimen/mms_inline_attachment_size" - android:layout_height="wrap_content" - android:adjustViewBounds="true" - android:scaleType="fitXY" - android:visibility="visible" /> - - <ImageButton - android:id="@+id/play_slideshow_button" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center" - android:padding="16dp" - android:src="@drawable/ic_play" - android:visibility="gone" /> - - </FrameLayout> - - </LinearLayout> - - <LinearLayout - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_alignLeft="@+id/message_block" - android:layout_below="@+id/message_block" - android:layout_marginLeft="16dp" - android:layout_marginTop="2dp" - android:gravity="left" - android:orientation="horizontal"> - - <com.moez.QKSMS.ui.view.QKTextView - android:id="@+id/date_view" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:paddingRight="3dip" - android:singleLine="true" - app:type="tertiary" /> - - <ImageView - android:id="@+id/locked_indicator" - android:layout_width="16dp" - android:layout_height="16dp" - android:paddingRight="3dip" - android:src="@drawable/ic_lock" - android:visibility="gone" /> - - <ImageView - android:id="@+id/delivered_indicator" - android:layout_width="16dp" - android:layout_height="16dp" - android:paddingRight="3dip" - android:src="@drawable/ic_accept" - android:visibility="gone" /> - - <ImageView - android:id="@+id/details_indicator" - android:layout_width="16dp" - android:layout_height="16dp" - android:src="@drawable/ic_info" - android:visibility="gone" /> - - </LinearLayout> - - </RelativeLayout> - - </LinearLayout> - - <ViewStub - android:id="@+id/mms_downloading_view_stub" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center_vertical" - android:layout="@layout/view_mms_downloading" /> - -</LinearLayout> diff --git a/QKSMS/src/main/res/layout/list_item_message_out.xml b/QKSMS/src/main/res/layout/list_item_message_out.xml deleted file mode 100644 index 8f13d3217..000000000 --- a/QKSMS/src/main/res/layout/list_item_message_out.xml +++ /dev/null @@ -1,141 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> - -<LinearLayout - android:id="@+id/msg_list_item_send" - xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="horizontal" - android:paddingTop="2dp"> - - <LinearLayout - android:id="@+id/mms_layout_view_parent" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_weight="1" - android:orientation="vertical"> - - <View - android:id="@+id/space" - android:layout_width="match_parent" - android:layout_height="8dp" /> - - <RelativeLayout - android:layout_width="match_parent" - android:layout_height="wrap_content"> - - <com.moez.QKSMS.ui.view.AvatarView - android:id="@+id/avatar" - android:layout_width="40dp" - android:layout_height="40dp" - android:layout_alignParentRight="true" - android:layout_alignParentTop="true" - app:initialSize="22dp" /> - - <LinearLayout - android:id="@+id/message_block" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_alignParentRight="true" - android:layout_marginRight="44dp" - android:clipChildren="false" - android:clipToPadding="false" - android:gravity="right" - android:orientation="vertical"> - - <com.moez.QKSMS.ui.view.QKTextView - android:id="@+id/text_view" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:autoLink="all" - android:background="@drawable/message_sent_2" - android:gravity="center_vertical" - android:linksClickable="true" - app:type="primary" /> - - <FrameLayout - android:id="@+id/mms_view" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginRight="8dp" - android:layout_marginTop="4dp" - android:layout_marginBottom="8dp" - android:foreground="@drawable/card_mask"> - - <ImageView - android:id="@+id/image_view" - android:layout_width="@dimen/mms_inline_attachment_size" - android:layout_height="wrap_content" - android:adjustViewBounds="true" - android:scaleType="fitXY" - android:visibility="visible" /> - - <ImageButton - android:id="@+id/play_slideshow_button" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center" - android:padding="16dp" - android:src="@drawable/ic_play" - android:visibility="gone" /> - - </FrameLayout> - - </LinearLayout> - - <LinearLayout - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_alignRight="@+id/message_block" - android:layout_below="@+id/message_block" - android:layout_marginRight="16dp" - android:layout_marginTop="2dp" - android:gravity="left" - android:orientation="horizontal"> - - <com.moez.QKSMS.ui.view.QKTextView - android:id="@+id/date_view" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:paddingRight="3dip" - android:singleLine="true" - app:type="tertiary" /> - - <ImageView - android:id="@+id/locked_indicator" - android:layout_width="16dp" - android:layout_height="16dp" - android:paddingRight="3dip" - android:src="@drawable/ic_lock" - android:visibility="gone" /> - - <ImageView - android:id="@+id/delivered_indicator" - android:layout_width="16dp" - android:layout_height="16dp" - android:paddingRight="3dip" - android:src="@drawable/ic_accept" - android:visibility="gone" /> - - <ImageView - android:id="@+id/details_indicator" - android:layout_width="16dp" - android:layout_height="16dp" - android:src="@drawable/ic_info" - android:visibility="gone" /> - - </LinearLayout> - - </RelativeLayout> - - </LinearLayout> - - <ViewStub - android:id="@+id/mms_downloading_view_stub" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center_vertical" - android:layout="@layout/view_mms_downloading" /> - -</LinearLayout> diff --git a/QKSMS/src/main/res/layout/list_item_preference.xml b/QKSMS/src/main/res/layout/list_item_preference.xml deleted file mode 100644 index 07cfc315d..000000000 --- a/QKSMS/src/main/res/layout/list_item_preference.xml +++ /dev/null @@ -1,55 +0,0 @@ -<LinearLayout - xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:minHeight="?android:attr/listPreferredItemHeightSmall" - android:gravity="center_vertical" - android:paddingLeft="16dp" - android:paddingRight="16dp" - android:background="?android:attr/activatedBackgroundIndicator"> - - <com.moez.QKSMS.ui.view.QKImageView - android:id="@android:id/icon" - android:layout_width="24dp" - android:layout_height="24dp" - android:scaleType="centerInside" - android:gravity="start|center_vertical" - android:layout_marginRight="16dp" /> - - <RelativeLayout - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_weight="1" - android:paddingTop="16dip" - android:paddingBottom="16dip"> - - <com.moez.QKSMS.ui.view.QKTextView - android:id="@android:id/title" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:singleLine="true" - android:ellipsize="marquee" - app:type="primary" /> - - <com.moez.QKSMS.ui.view.QKTextView - android:id="@android:id/summary" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_below="@android:id/title" - android:layout_alignLeft="@android:id/title" - android:maxLines="10" - app:type="secondary" /> - - </RelativeLayout> - - <!-- Preference should place its actual preference widget here. --> - <LinearLayout - android:id="@android:id/widget_frame" - android:layout_width="wrap_content" - android:layout_height="match_parent" - android:minWidth="58dip" - android:gravity="right|center_vertical" - android:orientation="vertical" /> - -</LinearLayout> diff --git a/QKSMS/src/main/res/layout/list_item_preference_category.xml b/QKSMS/src/main/res/layout/list_item_preference_category.xml deleted file mode 100644 index dde43be14..000000000 --- a/QKSMS/src/main/res/layout/list_item_preference_category.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?><!-- Copyright (C) 2014 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> - -<!-- Layout used for PreferenceCategory in a PreferenceActivity. --> -<com.moez.QKSMS.ui.view.QKTextView - android:id="@+android:id/title" - xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:paddingLeft="16dp" - android:paddingRight="16dp" - android:paddingTop="16dp" - app:type="pref_category" /> diff --git a/QKSMS/src/main/res/layout/list_item_qk_response.xml b/QKSMS/src/main/res/layout/list_item_qk_response.xml deleted file mode 100644 index 851b80491..000000000 --- a/QKSMS/src/main/res/layout/list_item_qk_response.xml +++ /dev/null @@ -1,25 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:gravity="center_vertical" - android:minHeight="48dp" - android:paddingLeft="16dp" - android:paddingRight="16dp"> - - <com.moez.QKSMS.ui.view.QKTextView - android:id="@+id/response_index" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:padding="8dp" - app:type="secondary" /> - - <com.moez.QKSMS.ui.view.QKEditText - android:id="@+id/response" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:background="@null" - android:gravity="center_vertical" - android:padding="8dp" /> -</LinearLayout> \ No newline at end of file diff --git a/QKSMS/src/main/res/layout/list_item_recipient.xml b/QKSMS/src/main/res/layout/list_item_recipient.xml deleted file mode 100644 index ad1d1b690..000000000 --- a/QKSMS/src/main/res/layout/list_item_recipient.xml +++ /dev/null @@ -1,39 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - android:layout_width="match_parent" - android:layout_height="56dp" - android:minHeight="56dp" - android:gravity="center_vertical" - android:orientation="horizontal" - android:paddingLeft="24dp" - android:paddingRight="24dp"> - - <com.moez.QKSMS.ui.view.AvatarView - android:id="@+id/avatar" - android:layout_width="48dp" - android:layout_height="48dp" - android:layout_marginRight="16dp" - app:initialSize="32dp" /> - - <LinearLayout - android:id="@+id/conversation_list_block" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:orientation="vertical"> - - <com.moez.QKSMS.ui.view.QKTextView - android:id="@+id/name" - android:layout_width="match_parent" - android:layout_height="wrap_content" - app:type="primary" /> - - <com.moez.QKSMS.ui.view.QKTextView - android:id="@+id/address" - android:layout_width="match_parent" - android:layout_height="wrap_content" - app:type="secondary" /> - - </LinearLayout> - -</LinearLayout> \ No newline at end of file diff --git a/QKSMS/src/main/res/layout/list_item_search.xml b/QKSMS/src/main/res/layout/list_item_search.xml deleted file mode 100644 index 3c4090e62..000000000 --- a/QKSMS/src/main/res/layout/list_item_search.xml +++ /dev/null @@ -1,60 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> - -<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:gravity="top" - android:orientation="horizontal" - android:paddingBottom="8dp" - android:paddingLeft="16dp" - android:paddingRight="16dp" - android:paddingTop="8dp"> - - <com.moez.QKSMS.ui.view.AvatarView - android:id="@+id/search_avatar" - android:layout_width="40dp" - android:layout_height="40dp" - android:layout_marginRight="16dp" /> - - <LinearLayout - android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_weight="1" - android:orientation="vertical"> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="horizontal"> - - <com.moez.QKSMS.ui.view.QKTextView - android:id="@+id/search_name" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_weight="1" - android:ellipsize="end" - android:maxLines="1" - android:singleLine="true" - app:type="primary" /> - - <com.moez.QKSMS.ui.view.QKTextView - android:id="@+id/search_date" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:maxLines="1" - android:paddingLeft="16dp" - android:singleLine="true" - app:type="tertiary" /> - </LinearLayout> - - <com.moez.QKSMS.ui.view.QKTextView - android:id="@+id/search_snippet" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:textSize="12sp" - app:type="secondary" /> - - </LinearLayout> - -</LinearLayout> diff --git a/QKSMS/src/main/res/layout/list_item_simple.xml b/QKSMS/src/main/res/layout/list_item_simple.xml deleted file mode 100644 index 28a8a7090..000000000 --- a/QKSMS/src/main/res/layout/list_item_simple.xml +++ /dev/null @@ -1,11 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> - -<com.moez.QKSMS.ui.view.QKTextView xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - android:layout_width="match_parent" - android:layout_height="48dp" - android:gravity="center_vertical" - android:paddingLeft="24dp" - android:paddingRight="24dp" - android:singleLine="true" - app:type="primary" /> \ No newline at end of file diff --git a/QKSMS/src/main/res/layout/list_item_triple.xml b/QKSMS/src/main/res/layout/list_item_triple.xml deleted file mode 100644 index 59e6375d4..000000000 --- a/QKSMS/src/main/res/layout/list_item_triple.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> - -<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="vertical" - android:padding="16dp"> - - <com.moez.QKSMS.ui.view.QKTextView - android:id="@+id/list_item_title" - android:layout_width="match_parent" - android:layout_height="wrap_content" - app:type="primary" /> - - <com.moez.QKSMS.ui.view.QKTextView - android:id="@+id/list_item_subtitle" - android:layout_width="match_parent" - android:layout_height="wrap_content" - app:type="secondary" /> - - <com.moez.QKSMS.ui.view.QKTextView - android:id="@+id/list_item_body" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:autoLink="web" - app:type="secondary" /> - -</LinearLayout> \ No newline at end of file diff --git a/QKSMS/src/main/res/layout/menu_frame.xml b/QKSMS/src/main/res/layout/menu_frame.xml deleted file mode 100644 index 62f6877fe..000000000 --- a/QKSMS/src/main/res/layout/menu_frame.xml +++ /dev/null @@ -1,6 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> - -<FrameLayout android:id="@+id/menu_frame" - xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="match_parent" /> \ No newline at end of file diff --git a/QKSMS/src/main/res/layout/toolbar.xml b/QKSMS/src/main/res/layout/toolbar.xml deleted file mode 100644 index 893548ad7..000000000 --- a/QKSMS/src/main/res/layout/toolbar.xml +++ /dev/null @@ -1,6 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android" - android:id="@+id/toolbar" - android:layout_width="match_parent" - android:layout_height="56dp" - android:background="?attr/colorPrimaryDark" /> \ No newline at end of file diff --git a/QKSMS/src/main/res/layout/view_color_picker_swatch.xml b/QKSMS/src/main/res/layout/view_color_picker_swatch.xml deleted file mode 100644 index 72f79763b..000000000 --- a/QKSMS/src/main/res/layout/view_color_picker_swatch.xml +++ /dev/null @@ -1,16 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<merge xmlns:android="http://schemas.android.com/apk/res/android"> - - <ImageView - android:id="@+id/color_picker_swatch" - android:layout_width="match_parent" - android:layout_height="match_parent" /> - - <ImageView - android:id="@+id/color_picker_checkmark" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:scaleType="fitXY" - android:src="@drawable/ic_swatch_selected" - android:visibility="gone" /> -</merge> \ No newline at end of file diff --git a/QKSMS/src/main/res/layout/view_compose.xml b/QKSMS/src/main/res/layout/view_compose.xml deleted file mode 100644 index c3d57bbe6..000000000 --- a/QKSMS/src/main/res/layout/view_compose.xml +++ /dev/null @@ -1,166 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> - -<com.moez.QKSMS.ui.view.ComposeView - android:id="@+id/compose_view" - xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:animateLayoutChanges="true" - android:background="@drawable/compose_background" - android:gravity="center_vertical" - android:orientation="vertical"> - - <FrameLayout - android:id="@+id/attachment" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:visibility="gone"> - - <com.moez.QKSMS.ui.view.AttachmentImageView - android:id="@+id/compose_attachment" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:adjustViewBounds="true" - android:maxHeight="128dp" - android:minHeight="0dp" - android:scaleType="centerCrop" /> - - <View - android:layout_width="56dp" - android:layout_height="56dp" - android:layout_gravity="top|right" - android:background="@drawable/cancel_shadow" /> - - <ImageButton - android:id="@+id/cancel" - android:layout_width="56dp" - android:layout_height="56dp" - android:layout_gravity="top|right" - android:background="@null" - android:padding="16dp" - android:src="@drawable/ic_cancel" /> - - </FrameLayout> - - <RelativeLayout - android:layout_width="match_parent" - android:layout_height="wrap_content"> - - <com.moez.QKSMS.ui.view.QKEditText - android:id="@+id/compose_reply_text" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_alignParentLeft="true" - android:layout_centerVertical="true" - android:layout_marginBottom="16dp" - android:layout_marginLeft="8dp" - android:layout_marginRight="-4dp" - android:layout_marginTop="16dp" - android:layout_toLeftOf="@+id/compose_button" - android:background="@drawable/message_sent" - android:gravity="center_vertical" - android:hint="@string/hint_reply" - android:imeOptions="flagNoExtractUi" - android:inputType="textShortMessage|textMultiLine|textCapSentences" - android:maxLines="3" - android:minHeight="40dp" - android:textColorHint="@color/grey_light" - android:textCursorDrawable="@null" - app:type="primary" /> - - <FrameLayout - android:id="@+id/compose_button" - android:layout_width="56dp" - android:layout_height="72dp" - android:layout_alignBottom="@+id/compose_reply_text" - android:layout_alignParentRight="true" - android:layout_marginBottom="-16dp" - android:animateLayoutChanges="true"> - - <ImageView - android:layout_width="56dp" - android:layout_height="64dp" - android:layout_gravity="center" - android:src="@drawable/fab_shadow_mini" /> - - <ImageView - android:id="@+id/compose_button_background" - android:layout_width="40dp" - android:layout_height="40dp" - android:layout_gravity="center" - android:src="@drawable/send_background" /> - - <ImageView - android:id="@+id/compose_icon" - android:layout_width="24dp" - android:layout_height="24dp" - android:layout_gravity="center" - android:src="@drawable/plus_to_arrow" /> - - <com.github.lzyzsd.circleprogress.DonutProgress - android:id="@+id/progress" - android:layout_width="44dp" - android:layout_height="44dp" - android:layout_gravity="center" - android:padding="0dp" - android:rotation="90" - android:visibility="invisible" - app:donut_finished_color="@color/theme_dark_text_primary" - app:donut_finished_stroke_width="4dp" - app:donut_max="360" - app:donut_text_size="0sp" - app:donut_unfinished_color="@color/theme_dark_text_secondary" - app:donut_unfinished_stroke_width="4dp" /> - - </FrameLayout> - - <com.moez.QKSMS.ui.view.QKTextView - android:id="@+id/compose_letter_count" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_alignParentRight="true" - android:layout_alignTop="@+id/compose_reply_text" - android:layout_toRightOf="@+id/compose_reply_text" - android:gravity="center_horizontal" - android:maxLines="1" - android:paddingTop="16dp" - android:textColor="@color/grey_light" - app:type="tertiary" /> - - </RelativeLayout> - - <LinearLayout - android:id="@+id/attachment_panel" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:gravity="center" - android:orientation="horizontal" - android:visibility="gone"> - - <ImageButton - android:id="@+id/attach" - android:layout_width="56dp" - android:layout_height="56dp" - android:background="@drawable/ripple_light" - android:padding="16dp" - android:src="@drawable/ic_photo" /> - - <ImageButton - android:id="@+id/camera" - android:layout_width="56dp" - android:layout_height="56dp" - android:background="@drawable/ripple_light" - android:padding="16dp" - android:src="@drawable/ic_camera" /> - - <ImageButton - android:id="@+id/delay" - android:layout_width="56dp" - android:layout_height="56dp" - android:background="@drawable/ripple_light" - android:padding="16dp" - android:src="@drawable/ic_timer" /> - </LinearLayout> - -</com.moez.QKSMS.ui.view.ComposeView> diff --git a/QKSMS/src/main/res/layout/view_favorite_contact.xml b/QKSMS/src/main/res/layout/view_favorite_contact.xml deleted file mode 100644 index 17801fa30..000000000 --- a/QKSMS/src/main/res/layout/view_favorite_contact.xml +++ /dev/null @@ -1,27 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:gravity="center_horizontal" - android:orientation="vertical" - android:paddingBottom="8dp" - android:paddingLeft="8dp" - android:paddingRight="8dp"> - - <com.moez.QKSMS.ui.view.AvatarView - android:id="@+id/avatar" - android:layout_width="56dp" - android:layout_height="56dp" - app:initialSize="32sp" /> - - <com.moez.QKSMS.ui.view.QKTextView - android:id="@+id/name" - android:layout_width="64dp" - android:layout_height="wrap_content" - android:gravity="center" - android:maxLines="2" - app:type="tertiary" /> - - -</LinearLayout> \ No newline at end of file diff --git a/QKSMS/src/main/res/layout/view_mms_downloading.xml b/QKSMS/src/main/res/layout/view_mms_downloading.xml deleted file mode 100644 index 758e3cbc2..000000000 --- a/QKSMS/src/main/res/layout/view_mms_downloading.xml +++ /dev/null @@ -1,46 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* - * Copyright (C) 2008 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ ---> - -<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - android:id="@+id/mms_download_controls" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:orientation="horizontal"> - - <Button android:id="@+id/btn_download_msg" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center_vertical" - android:text="@string/download" - android:visibility="gone" /> - - <com.moez.QKSMS.ui.view.QKTextView - android:id="@+id/label_downloading" - android:layout_width="wrap_content" - android:layout_height="match_parent" - android:layout_marginLeft="5dp" - android:layout_marginRight="5dp" - android:gravity="center" - android:text="@string/downloading" - android:visibility="gone" - app:type="primary" /> - -</LinearLayout> - diff --git a/QKSMS/src/main/res/layout/view_playing_audio.xml b/QKSMS/src/main/res/layout/view_playing_audio.xml deleted file mode 100644 index 3b42c5f40..000000000 --- a/QKSMS/src/main/res/layout/view_playing_audio.xml +++ /dev/null @@ -1,43 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?><!-- -/* - * Copyright (C) 2008 Esmertec AG. - * Copyright (C) 2008 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ ---> - -<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - android:id="@+id/playing_audio" - android:layout_width="match_parent" - android:layout_height="82dip" - android:orientation="horizontal" - android:gravity="center" - android:visibility="gone"> - - <ImageView - android:id="@+id/audio_icon" - android:layout_width="wrap_content" - android:layout_height="match_parent" - android:src="@drawable/ic_attach_audio" /> - - <com.moez.QKSMS.ui.view.QKTextView - android:id="@+id/name" - android:layout_width="wrap_content" - android:layout_height="match_parent" - android:singleLine="true" - android:textStyle="bold" - app:type="primary"/> - -</LinearLayout> diff --git a/QKSMS/src/main/res/layout/view_slideshow.xml b/QKSMS/src/main/res/layout/view_slideshow.xml deleted file mode 100644 index e4213509f..000000000 --- a/QKSMS/src/main/res/layout/view_slideshow.xml +++ /dev/null @@ -1,38 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?><!-- -/* - * Copyright (C) 2008 Esmertec AG. - * Copyright (C) 2008 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ ---> - -<merge xmlns:android="http://schemas.android.com/apk/res/android"> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="match_parent" - android:orientation="vertical" - android:paddingTop="@dimen/slideshow_padding_top"> - - <include layout="@layout/view_toolbar" /> - - <com.moez.QKSMS.ui.mms.SlideView - android:id="@+id/slide_view" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:gravity="center" /> - - </LinearLayout> - -</merge> diff --git a/QKSMS/src/main/res/layout/view_starred_contacts.xml b/QKSMS/src/main/res/layout/view_starred_contacts.xml deleted file mode 100644 index 1744f1ef6..000000000 --- a/QKSMS/src/main/res/layout/view_starred_contacts.xml +++ /dev/null @@ -1,53 +0,0 @@ -<com.moez.QKSMS.ui.view.StarredContactsView - android:id="@+id/starred_contacts" - xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:animateLayoutChanges="true" - android:orientation="vertical" - android:visibility="gone"> - - <LinearLayout - android:id="@+id/toggle" - android:layout_width="match_parent" - android:layout_height="36dp" - android:animateLayoutChanges="true" - android:gravity="center_vertical"> - - <com.moez.QKSMS.ui.view.QKTextView - android:id="@+id/title" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:gravity="center_vertical" - android:paddingLeft="16dp" - android:text="@string/favorites" - app:type="dialog_button" /> - - <ImageView - android:id="@+id/indicator" - android:layout_width="36dp" - android:layout_height="36dp" - android:padding="6dp" - android:rotation="0" - android:src="@drawable/ic_drop_down" /> - - </LinearLayout> - - <HorizontalScrollView - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:animateLayoutChanges="true"> - - <LinearLayout - android:id="@+id/favorites" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:clipToPadding="false" - android:orientation="horizontal" - android:paddingLeft="8dp" - android:paddingRight="8dp" /> - - </HorizontalScrollView> - -</com.moez.QKSMS.ui.view.StarredContactsView> diff --git a/QKSMS/src/main/res/layout/view_swipeback.xml b/QKSMS/src/main/res/layout/view_swipeback.xml deleted file mode 100644 index 711f47fc1..000000000 --- a/QKSMS/src/main/res/layout/view_swipeback.xml +++ /dev/null @@ -1,5 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<com.moez.QKSMS.ui.SwipeBackLayout android:id="@+id/swipe" - xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="match_parent" /> diff --git a/QKSMS/src/main/res/layout/view_switch.xml b/QKSMS/src/main/res/layout/view_switch.xml deleted file mode 100644 index 0751571c7..000000000 --- a/QKSMS/src/main/res/layout/view_switch.xml +++ /dev/null @@ -1,7 +0,0 @@ -<com.moez.QKSMS.ui.view.QKSwitch - android:id="@android:id/checkbox" - xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:clickable="false" - android:focusable="false" /> diff --git a/QKSMS/src/main/res/layout/view_toolbar.xml b/QKSMS/src/main/res/layout/view_toolbar.xml deleted file mode 100644 index 0aa97fc83..000000000 --- a/QKSMS/src/main/res/layout/view_toolbar.xml +++ /dev/null @@ -1,21 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<android.support.v7.widget.Toolbar - android:id="@+id/toolbar" - xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - android:layout_width="match_parent" - android:layout_height="56dp" - android:gravity="center_vertical" - android:minHeight="56dp" - app:theme="@style/ActionBarTheme"> - - <com.moez.QKSMS.ui.view.QKTextView - android:id="@+id/toolbar_title" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:gravity="left|center_vertical" - android:maxLines="1" - android:padding="8dp" - android:singleLine="true" - app:type="toolbar" /> -</android.support.v7.widget.Toolbar> \ No newline at end of file diff --git a/QKSMS/src/main/res/layout/widget.xml b/QKSMS/src/main/res/layout/widget.xml deleted file mode 100644 index bbe8731c7..000000000 --- a/QKSMS/src/main/res/layout/widget.xml +++ /dev/null @@ -1,68 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> - -<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:orientation="vertical"> - - <FrameLayout - android:layout_width="match_parent" - android:layout_height="56dp"> - - <ImageView - android:id="@+id/header_background" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:src="@drawable/widget_header" /> - - <LinearLayout - android:id="@+id/widget_header" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:gravity="center_vertical" - android:orientation="horizontal"> - - <TextView - android:id="@+id/widget_label" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_weight="1" - android:freezesText="true" - android:paddingLeft="24dp" - android:paddingRight="24dp" - android:singleLine="true" - android:textSize="20sp" /> - - <ImageButton - android:id="@+id/widget_compose" - android:layout_width="56dp" - android:layout_height="56dp" - android:background="@drawable/ripple" - android:contentDescription="@string/new_message" - android:padding="16dp" - android:src="@drawable/ic_compose" /> - </LinearLayout> - - </FrameLayout> - - <FrameLayout - android:layout_width="match_parent" - android:layout_height="0dp" - android:layout_weight="1"> - - <ImageView - android:id="@+id/conversation_list_background" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:src="@drawable/widget_list_background" /> - - <ListView - android:id="@+id/conversation_list" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:cacheColorHint="#00000000" - android:divider="@null" - android:dividerHeight="0dp" /> - - </FrameLayout> -</LinearLayout> diff --git a/QKSMS/src/main/res/layout/widget_loading.xml b/QKSMS/src/main/res/layout/widget_loading.xml deleted file mode 100644 index 5a50b4711..000000000 --- a/QKSMS/src/main/res/layout/widget_loading.xml +++ /dev/null @@ -1,18 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> - -<FrameLayout - android:id="@+id/widget_loading" - xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="64sp"> - - <TextView - android:id="@+id/loading_text" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:layout_marginLeft="16dip" - android:gravity="center" - android:textColor="@android:color/black" - android:textSize="14sp" - android:textStyle="bold" /> -</FrameLayout> \ No newline at end of file diff --git a/QKSMS/src/main/res/menu/changelog.xml b/QKSMS/src/main/res/menu/changelog.xml deleted file mode 100644 index 6e937ccbb..000000000 --- a/QKSMS/src/main/res/menu/changelog.xml +++ /dev/null @@ -1,5 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> - -<menu> - -</menu> \ No newline at end of file diff --git a/QKSMS/src/main/res/menu/compose.xml b/QKSMS/src/main/res/menu/compose.xml deleted file mode 100644 index 011976500..000000000 --- a/QKSMS/src/main/res/menu/compose.xml +++ /dev/null @@ -1,16 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> - -<menu xmlns:android="http://schemas.android.com/apk/res/android"> - - <item - android:id="@+id/menu_settings" - android:title="@string/menu_settings" /> - - <item - android:id="@+id/menu_changelog" - android:title="@string/menu_changelog" /> - - <item - android:id="@+id/menu_donate" - android:title="@string/menu_billing" /> -</menu> \ No newline at end of file diff --git a/QKSMS/src/main/res/menu/conversations.xml b/QKSMS/src/main/res/menu/conversations.xml deleted file mode 100644 index db9072531..000000000 --- a/QKSMS/src/main/res/menu/conversations.xml +++ /dev/null @@ -1,26 +0,0 @@ -<menu xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto"> - - <item - android:id="@+id/menu_search" - android:icon="@drawable/ic_search" - android:title="@string/menu_search" - app:showAsAction="ifRoom" /> - - <item - android:id="@+id/menu_settings" - android:title="@string/menu_settings" /> - - <item - android:id="@+id/menu_blocked" - android:title="@string/pref_blocked_conversations" - android:visible="false" /> - - <item - android:id="@+id/menu_changelog" - android:title="@string/menu_changelog" /> - - <item - android:id="@+id/menu_donate" - android:title="@string/menu_billing" /> -</menu> diff --git a/QKSMS/src/main/res/menu/conversations_selection.xml b/QKSMS/src/main/res/menu/conversations_selection.xml deleted file mode 100644 index 4244e7844..000000000 --- a/QKSMS/src/main/res/menu/conversations_selection.xml +++ /dev/null @@ -1,29 +0,0 @@ -<menu xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto"> - - <item - android:id="@+id/menu_delete" - android:icon="@drawable/ic_delete" - android:title="@string/menu_delete" - android:visible="true" - app:showAsAction="ifRoom" /> - - <item - android:id="@+id/menu_mark_read" - android:icon="@drawable/ic_accept" - android:title="@string/menu_mark_read" - android:visible="true" - app:showAsAction="ifRoom" /> - - <item - android:id="@+id/menu_block" - android:title="@string/menu_block_conversations" /> - - <item - android:id="@+id/menu_delete_failed" - android:title="@string/menu_delete_failed" /> - - <item - android:id="@+id/menu_done" - android:title="@string/menu_done" /> -</menu> diff --git a/QKSMS/src/main/res/menu/message_list.xml b/QKSMS/src/main/res/menu/message_list.xml deleted file mode 100644 index c6c3eef7e..000000000 --- a/QKSMS/src/main/res/menu/message_list.xml +++ /dev/null @@ -1,33 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> - -<menu xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto"> - - <item - android:id="@+id/menu_call" - android:icon="@drawable/ic_call" - android:title="@string/menu_call" - app:showAsAction="ifRoom" /> - - <item - android:id="@+id/menu_notifications" - android:icon="@drawable/ic_notifications" - android:title="@string/menu_notifications" - app:showAsAction="ifRoom" /> - - <item - android:id="@+id/menu_notification_settings" - android:title="@string/menu_notification_settings" /> - - <item - android:id="@+id/menu_details" - android:title="@string/menu_view_details" /> - - <item - android:id="@+id/menu_delete_conversation" - android:title="@string/delete_conversation" /> - - <item - android:id="@+id/menu_donate" - android:title="@string/menu_billing" /> -</menu> \ No newline at end of file diff --git a/QKSMS/src/main/res/menu/message_picker.xml b/QKSMS/src/main/res/menu/message_picker.xml deleted file mode 100644 index 0e790da3a..000000000 --- a/QKSMS/src/main/res/menu/message_picker.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<menu xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto"> - <item - android:id="@+id/menu_fold" - android:icon="@drawable/ic_unfold" - android:title="@string/menu_show_all" - app:showAsAction="ifRoom" /> -</menu> \ No newline at end of file diff --git a/QKSMS/src/main/res/menu/qkreply.xml b/QKSMS/src/main/res/menu/qkreply.xml deleted file mode 100644 index 88692642a..000000000 --- a/QKSMS/src/main/res/menu/qkreply.xml +++ /dev/null @@ -1,35 +0,0 @@ -<menu xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto"> - - <item - android:id="@+id/menu_fold" - android:icon="@drawable/ic_unfold" - android:title="@string/menu_show_all" - app:showAsAction="ifRoom" /> - - <item - android:id="@+id/menu_open_thread" - android:title="@string/menu_open_thread" /> - - <item - android:id="@+id/menu_call" - android:title="@string/menu_call" /> - - <item - android:id="@+id/menu_mark_read" - android:icon="@drawable/ic_accept" - android:title="@string/menu_read" - app:showAsAction="ifRoom" /> - - <item - android:id="@+id/menu_delete" - android:title="@string/menu_delete" /> - - <item - android:id="@+id/menu_copy" - android:title="@string/menu_copy" /> - - <item - android:id="@+id/menu_forward" - android:title="@string/menu_forward" /> -</menu> diff --git a/QKSMS/src/main/res/menu/search.xml b/QKSMS/src/main/res/menu/search.xml deleted file mode 100644 index 011976500..000000000 --- a/QKSMS/src/main/res/menu/search.xml +++ /dev/null @@ -1,16 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> - -<menu xmlns:android="http://schemas.android.com/apk/res/android"> - - <item - android:id="@+id/menu_settings" - android:title="@string/menu_settings" /> - - <item - android:id="@+id/menu_changelog" - android:title="@string/menu_changelog" /> - - <item - android:id="@+id/menu_donate" - android:title="@string/menu_billing" /> -</menu> \ No newline at end of file diff --git a/QKSMS/src/main/res/menu/settings.xml b/QKSMS/src/main/res/menu/settings.xml deleted file mode 100644 index 199ed8caa..000000000 --- a/QKSMS/src/main/res/menu/settings.xml +++ /dev/null @@ -1,10 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> - -<menu xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto"> - - <item - android:id="@+id/menu_changelog" - android:title="@string/menu_changelog" /> - -</menu> \ No newline at end of file diff --git a/QKSMS/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/QKSMS/src/main/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index 93299a97c8d9231acc0ba460ee301b7be0410769..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20089 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 SJqSDi0000<MNUMnLSTY>Fbo?2 diff --git a/QKSMS/src/main/res/mipmap-xxxhdpi/ic_launcher_amber.png b/QKSMS/src/main/res/mipmap-xxxhdpi/ic_launcher_amber.png deleted file mode 100644 index fdc72101852fa2c161a4504770c3e5e0c3caaf96..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21819 zcmV)(K#RYLP)<h;3K|Lk000e1NJLTq006)M006)U1^@s6Qrv6@00001b5ch_0Itp) z=>Pyg07*naRCodHy$N6(N0~2P-P1FpTb5+WwtU}rocpkIIKhwv$R-ey<^Oh<&B7yp z7DyiO*vIjfjj}8(EJs+f9N`RvB|so235j#ri4(_8Y$v|r+wvt_wq?n>H8b7)zF*IL za;a23(=*oPc*<^7bsb+-ef9gQzB;-_2q8lB<V~IfXCnvl*gqRvJzwWM2l5=qb0E)w zJO}a|$a5gifwP(e##vqaVXVCCiaxwI4B-xAan9PT`!vE?%Y}idcrP#O>XP8zvPBs4 z=O=+pegJq-kQ*`$6i=bUB@RlD<L7OK1HFx=_~&1JI6#Q=cy@OR<cO9I+!SV(ofJ_k zA;LXzQ4kG_h-DQ-EW@>2!!?oKa1AHn8i_=rJLZ@o-rXg-BgG=tS}uAhy@NQa0bK|f z{8>2eA|WG>yilmjO7or<fHcfO5CG3$=N?@JW!)!5$(TsN=+e@}_^L8<VtKJck1@V5 zVvH><Hbz^fTM@R55-TJM!(kCMgb_AK0EoON0AxF)64{hj%&|qh#}=LOxZ9qvjpp_) z_jqTQd!(hqIMmiD4mNi=2b!C$LnJK6@4Q#EqKs@*p@2XjEH4zyq5gJW02H2N0{r*y z5M|}1ktvm>V($2Av8bj(%qOr<FDh_rO~a^A$n|?ApnHaGjzDt&&#=w@K6Xn-w>W&V z!`<C@LTowKA~qd7=59XP8sGn=ABkp81A!1LXr!nXE=Gy`2*I2=W#<Kec)_4&mExg? zJhj7v>Nh_sN^5GubEb|HmrfmLEU7Lx78MqVsgx{wij72rV%wywIC#j7ceW9a0nfIa zR(7)h$hJwXgm>5`jTvmq>B!yF(IfVqXm#J*-Qcb!!FcU(eSF(z?-wnpct+jQ)UN+h z;pBxO$rWPh*=Y!$o@(Q%HOGWew?ZVC6W{%;7(aJhWbyRz#<JQfad~l}m`!25+vWhe zZKnVapwl}8n_hd(KrvTG(-Vl4FoehsQR!ey#%=8sJ7{!xY1aW~)s6%47f59~m<l&; zzg<|(&B8g`M}~oFBZ==L*9p+0be>M1QVpoLCnyU+s?CI1lfzffnqb^8q1w1IY>6@O zhXLRd6blc7ok2O=43x{kLIFXb`G)r-Yv7f=@mRCFYTH3~`IeobXYcs0?!5@BTPiRY z5ofEKG~De6-VeF~@Bw<Yx5wml;rP&13nqtdnO19DN1*8ieJq{?Jiw3M9YD*5S**eg zWaW62$wZUOiZZY;kU)EC6w=y`+qC0=cxuBg=f4~FCRY8^1EPbxy-}fd2UYbfQjxN0 z(@cCHap4SnOaxIlR&##v+31W5=eW1do+$o5n!qkV7{C=LB`6Nnh8}<jCLMzY1LVnE zv;XTS9CAINCShcVNW#$C<-WOXuXu3X4)c$nyr+8)awhdC3_-xC@Q37l=pDO~l&*cV zZ-o((!Vmbr{z~|gi)Wc1pEc3=AT2|BD>feJ3HVTN0G4zN8A*Uo$7(-eKpL(i1OcN0 z9?#zu$G6lwe|&wrxPN~%{(4=VaLxwxC|!FeIdca6m4V+dOBg@-iHK7}nsbG9&64@% z9ph_^_fmB%=<zZ1_Vi$-#*YbS3g9y}k)J?77+6K34LVkl?EQ`IGjD9S?>ltVeugH_ zJs1&?$2)P-?AP|0csioOb-<?r8V}xWU30~J^K;{?J>Ywj*`8SD-u|5ed|e~ygaLv8 zAYfF8Moz6J9cvcLpI>kP$96NZk~)$^-7O*_jtPe+%ortfd7MdpXS4t?@G-fqs1PRg z_|&Hh_t#$vUvkAF<Nr(<XM7Ni0riHCA$YpIU*ik}=m&y^U-@Kz9f;-dpl&}pm@8nO z!0OSVWA0P0Zg&3t*1E(hjHqG@tsIdcyb~tNXRH7K{I}jBOaLDfHcW8u{d~dHs~6gz zpFhR?7=a)P6$h#gCbfR%bU=GLY5mHRtG^$ZgV6I!3qgQtgpq+v_uKX2H><aZZ-4AR zdbWEL<z^Z<&Tv6E;{<?veQ#x_T9|bYiCEq3qUh>{;g4T7&-@bgT4S(u*-fgBAMkSl zZZ2tpfN!wk_<=f8erh_XM-YI5lxjr0ZG3Hu{hjsO6ZhdP(j9k*XitxDFh9VG5djKG z&KPq>34q+|gW=f3df@+Bi{Eo`=$kd8#N}u_03SWS&SVSXY~$<l90`6Zs56zxFFpjJ zkPd)=FHNoP>gDU4fBqkJi5Je~(cp{_0018wS#q!cjoU@}vI`?$xL~&NIcm@-bbM@H z=^8H^AZHUd9gqf!4(Fk(7l&nIXG=$ok9tK&ErM!9Cbns>^MgOX9{<{xe;}I9#L-~H z3xM3~gX37*{LNRaCD&hUez&sBxEShAR}ZN>WUH0Q287wfMLA@1I%#D(*}7G5W|Kaf zv}#;x6L0wxqXCvtPqw>nKDoyE+~53b;ze(z2n9Jq<_0Qevf<&N$Hj_+cYJ~POuBxY zHfBOgZ?-;n)j6TNDDxr!|8&)zY{8pt{6S}ul7R|VC0P3!G>tAER*E19WV+XEb-(`f zhS+zuG>e|GV}*seL2a$D@2VTQAL=CM_gc0LpC@{K1IukIgjrMUfj{=2|4U4|`Nqgk z&!1`DNxglzvpc!GsY);a8U&<4<1rVqjnC<Z+U9Zw;Q^P8)9|~Wt)q#N7t74FVq{IM zF|M9DK6HNPaclM6_u9v9SSTV5okBb?jSkywr9+5*gon{z#m_JnC7HFX^3>8Y8&-LK z`xWb|o30G~yf7lBL)XV<mTGj3lS>><6NDbe&1C1wWT+YgWpur_AMGG<b#X8^z-m!< zkEnlqwf%{|zANzz<^@$pXk}=GszkZAjUVq$%b&qNpE{I=3gJTE|I4?+|NnKQ?-Su7 z`U=YHZPY>s0c(&rD16X(x{9jh(#07lzg&ew2VB201&OQ1!QMe}fk&}t#hcC-RyN1) zZE8v$rKs9ON6$ytNz<WhGe16i{<6Nmh32%E(PG1OH-x`7ce43e46{&qRAvVOYmhi7 zK+t$xi4nuNRDp642$i2)H`UG*PYnkzF)zTf>Gu834}bS`{7VhRqN_GW9a}`$BWcfI zM6{!~y-xamQ=te|T_WP;Eu!p(OCtA8uQhJP(k9mSRg(#@nZlV~(0GVHBACSmPh)2* z3@U(iq%+0Qh2vZimP_j!-N*m<LhR!m+r){J)gs(cArd1+2!?eM43&o`yG;v4=-&Sp zJvT2XnDRf~9eQZOXybaU@<0GolL@pz!VxD^Jmd?|^P`p{mv_!Lot+C^ISrSWZ8=Qm z=CbI**e_EYUAT9|oEn+Fqn<r`a_I8<PV1$OZT7Lz-69+!6?Y^|j=`g0F#!MFb%ZVS z`~W{4yS?W#k+~mzk9er8*qEP-zK=%8WP-#2jR2&ySp}u9O&q{e*V6__=0yoQGGxjl zn{ea_RS5Hf_Aasg!RMV1KU*K)G`~Vb8)y}KxJQCq+c_xDwee)|iz&jYyI*ww=be!S zw_RsET2?Hk6QlZVY-Ix0>4u}A*)k(jp4!R}f@dZ`s#y+&AjoAxe%LT8DWtg^-CXgz z=bR5cy*IvLBnUyaZLab%>vtXa@BM6K;YZ%>fqxoZ{*?7(Hyseug>m7tVL}jkOc!>x z@#VB|%Ro}Ybnn^34<ZPe=%ovn!;lxQb15zIcJ2@SmW1G$z43Jr0=mg4frXFZI82vK z+w1t9m7fm$sh<Ba>iM$<e<pBc3=dfPOmsj-7stCng2G_q%d=BAO1S-ijr4S5oOkaJ z+<f;BY?ZbQtaMcf94{S_R9HG%*@U4kvJf0x8(%MG(T3SDsY6tpp)<VNBS`I`Csy7P znf=jgjmOK1#EfiveiamIEz*Stt#mpX$WIQ(QZ0^OW8#;fOAY~ej>GwJd;lgDoQ#u< z+Dnha8CXaML9jxGr%ywjzy(=sI3B<2>_BmJ2_?UDG_napeV`6?#l*e`pLRa5wmrVN zmcG9kj*)=dMylrEI2rty@M1%xYC*xokG$7;0u$bW1V4k!uNIjqoH2ch0D5zPJ(h4i z8~Jf>jq^$E-J<<On>f*Q(mj5>#ceu%(l~LV)oE$#G}?ROP7gJH58VSw6ud95ELt** z78aO=ql(<pigIHV9q+ChU1p4~DmO-tDiIa5t{w&O`L;Qf6O+qm*zojg2n0Zw4v5Gr zQ@9rge|$`)^nT&0Kgy4hprcFd_|?<yP20A|_Eb%zeS#q#2{PfqhYi_z_W?h)#mhv= zr*4csHo9C~K2+e(RMB+6=P-aC*QWHul07^C57XKqI`<!S_w6{~?%2Fn?AUqGso#6p zIdZf`w47`gG^-I<%=N&I_yG(khb&7(Dv4L)t3=h*ac1qDNyfB!Q;pd(YR&26s>DP( zb`Ziyf^tC^3L-}DXN<^01s(j@qzgkFd4%FLvYjryUzqC8LO|C!uKn>7v73%JC$DkD zKEY5OqRWH}xz0Jc8T^92-V(*aEVf1HgYS*pPZv>r2&+A4JlQbVWIuNMh57j-U8V}A zO`A%L9=)4D4>bq9Fg~+9cvRG{+u>|@ZHu%1_3h5v`wodCT?r5Ds1Xzteozb;#uVF0 z-~NBO$ZUHUr)Z!Hw?!jD>HNu|$%|$fbFMf~T()qkF}JGBsDVIYgun?+2m{IrqXIAK zoBW$D%u6drR@~{*`h}_f7`dPh9X#s(`8O}bKGM`KVkIGAW5;+Xgn*f>RBd2hsV%(k zc5${xRFK|ZE4n{8IsBc4)6CCconQTAF$fsdlBG?fMpoYa(xOoym^gR`;4`rH9v1a0 z-?U$TZoT`;x^2$(mUeNHNCK4DP)xziduOn+jW{r{Ww+;<`Xjdm-0}n3@;j1XL;?Nq zglaMRqPgaRzgl80yKKIBaRsSN5CoLFkS=5AkK0x7fe4$lVH`<gr%lH-Rnn<x`25h; zz0Qw+ye|Hk!VVEBa%j}7r%Mi&()~nrUOg2m1M>=|4vL|=pZaJW6C48nMTOzp-+QU~ zBX5V7dQmxZKQQ|FqtI!?($vZ?9RnXnFM8sx*Mpwy5FM*FIjbIB<vg=;gR_A^kL$+) zNa|-j0}$#SG(Y>p&2W(29s%hOvjjFj$cqJl-Lj2%ph+AR=8Re~;eAW2#W!4PynF5x z<2+K0Oa#(z6?k8Ak<)iXP=SfKvf&EIe(d&38`K{vToG-St=M3H{=uz@?~h7|f-d@z z5I#URSVF)I=Xwm7O$9a^8bqkLSy%^2Yq(*yb=BX!JM?Ed+E7Rnz(C+fVf?`A=kKLS zQwv=>_Dc$8vd3>Y?l%7URp-eEU$FnOWv|#nBmrg>^xO-pHsS&=Y{ShDIeUcxZq+dG z;V%Op{tSE`aq!M=wvlI|FiaN(Txc%(n`Pz)mMk={E{ci>Muj385pZl7zzhmbqStFs z37zqyg}8oUvOnnJC^elOiv9k@#Le5b*vrX_d_-(8_Xq|>004fmf}SbDYHAejwAo_Z z?bk<NAjVIH>LX{$;G>H6Gk#&d{{1MN^3bJWKb$w}B2@=E^MRwH;dd`Me|+HS#8Zb) zh$BP+z{2AJi)<O}=yl=GesIeV+La%2_5$AzM~K7hfh|7_e)uuiSpc|<vW<8sU+AKF zp}Dlt_yHPyucMWhVgRqWFuA0v&cP_YXJl})AKU2)@0Tu!Kj`Af1g)+e_{Ed%wZ}SR z`)HnMv=)lkU>%tNlLplEf*+G!=>25=_Ug!Q>15}Pv|7^7FbLIvto>C2(z}ip{LuIv z-Sl&f<Ze1CT7LVy{rjIiWk1|-)B`^ClO6y8ZU70k>SjL`^ms>m$`8Hv3IN>c47Uqx z`2pbZ&ceU~z%~Q`JjWvo1Ip=KIyW@;Q#Tv8EnQ^3hdLt@`wCDyV1fWN88i9UPYC?z zWRnMNii(5B#PZ)f-}B+-9+8N*iNs*741q}lW{4@q4+;4AjIq5ygm<=!o)2Fb`QPWx zG(LqDAC);eV4^Tt`}@=YbW~dG2R*;5ht}{N;XeA3^Y~})jo<yJm)zxT9fHoFdH@1w zC|2(SfB7A5EN?<M_|XXnguw$K*(@mPJNvWX$nSDocEe^j@<x2wkHeTAgeH9OxO?o8 zmz?Lf)QdM~PBbP~my5BO=!a4pY-;;ZntuF)9}G)n^6k`L=I<$=Q!ceFI7IcwDqHm^ zF+FUAde*PASJ0$B5-Sx>(OMx^-bV9;6@fbv&cfFoPysMV^+_Z|$mteVd#Q-OYm&8? zRwjN*U<+gY986=QRyt>YPN>*A`tU=qPd_~83FF)Q+-+aD&%XPfhwKNAw|Xl&==A{} zfLjN62E7jWG5{HPs?8$;`}2Dco72GNM+Q3lxD4#i@1T!xj1(6Agwp<pUUHWA#EcUQ zrx^=q0$O0xl~!0S^5Yw&8#3cDgZ|LfmY2448Ef_&b@pH}i^}J0IVRj&ZxzNs3BiB~ zKplY}dVj1|gequwEv1dVzkQeW8``OygvsS_gC8qASkFhVPraUf|1<UjpS~yY)lGZc z9n`V_J^;eNSHTa!^TWM8Yz7(w5;lX)Ye#x#KYoXu&dBj}Zj~OF0XE{xWnnkR;c$yO zDtq-7XTwWx+N-A3nza*Z#AM8c!ZaFySE|to2I6Ep68O@Q00JlWTnO;iq_M`i+xOZJ z8{O14Wi-?l3U~khf&0jQKm>re+N=5$wbRV~farPOb&-FWfz2-32bJpP@m0qJou9{G zHL*vbKh2c4Zx05Q2WNEl92WaNb8q6GfAYBVd-4N_(cA!jCh#-x8B7c=wgD~}wv%rI z`xmsCzUoFf;K${GovEzh#%9s<@G9pyy11m{+!@Asl*S6t1_G8PRh7uEjVMi4#*dEd zk7h@QRbFD$l$4l}ZAYEuUCkm~84^xSgK$^gHZZEtfCzxB`gF7ld+vqS5?XQiK7Ge) zVd+gaawRkQ`^J?MN^Uhi-tl0fi%qxZ-f*7(__yL;+OX55l{IgP4FHjWFZcXvkFNuh z3___SL+X^vz;4*GAjobx4DJxr!dEsqZ)~a;8!wn;E~J&B3YUIz8!C}b2vk0!wg4<1 z)#&0PPEdcEqY1ih<-8-u#F|6x?w$mV3a#D3-FuRL!DaxiS~+b2VAZFzR9FRZVO7+M zf?Kb)eo0&LQ_$<mObJ@)v<y-?oO)Mj;~kCHNh%Kw?e32sw}0}v|Fr+3xkI#364YDn z_1P_h9&QG`3L3nRG{a?r%@4{5@Z((;0@)8?Xr}O9nj1X7)_!UBWOLG_F=7h+P<QX1 z0fpym)V5(le*PQ|8yzT(Mj`r*hdEpJ*nbL<>gLeV3DU8h2d16ADs)-`KxOMyeMmzN z(^V!t*Uz;+F@LK0QC0Qvt86y@vM|X^Qfc5Fy&Bf`>9AebKm90i_YWR%9w0BMJ7{pZ z*Vlm`>W&H+WQnwAia}Yqys)`Gs+-?YuW(C;X#evn=lRM}X6eGIVj(8S*f>)Sc&zdr zae}syN>6^5>4F|qp^8#toN0zmZaiSWLT81-rS`z6LZ>AFvg(s45XSVf=;RMvVg8IZ zGKw*Yk&RrbO#ZsKK^cp*06#{bqs{K|JO9)E!egtP<&-Bb@I$W-HHTFlwgGsA!A7so zpnwg-cJl4a`irvjgOa0V_+4j*;<Plpe66#}3L8Ba&NeO~b;#h|V-Uz>g0>at=-OK6 zkC9;F7;$d>A@j-O$DQVQfiQVh=yX(}oCSc&<MsZdMu`xXsEQ4dpbM=2m4>P-gYNd~ zDzEeN7=k~FQRCtrY7f@7_a1f+f9zZF&%E@O`vxV8&?AGNfe$|hzS`>}Hvr_FVo(>Z z4{TWwWH-Wq;n1p$&g;!>?lC$_ak*(2rcMaJbG02Pt?x*HFxBYNt8vhw(lL%g+PEv; zQExwKCxq4E2nV-ItiM6Hxh{+5ECAg5kFkXnrsED1rdk(WcS-2G^npXDm(8hK=qjl5 zLv)?Lu18Vh;hn+1=a75o@4p_q^Q~Qirb!<7<z8Q>@&Ew*pco7kxZi1p>jpdB1Ga~0 z!Qd_Wf$het7MWL?rV-LjjQtoCq}}||!e4G<(8694b+Gdeo-kI`w>bMNXl}q8WG~hW z_wIDWe8O@P0OFdll6nZN`4_bkz^HV8b+z^FQN_l*Zt71_ST=Gc*blbOU+X6)O1ZW1 zC{yep?rCrj-}bfG9b5K^Z4@0nKZBob2!P!40|eXylJgx6e$-Djst_O?er%!}_qdxH zPq@dHo@-u3OQcXew5vm$Ad~Iaewori4Whiw%2K0d<1YJAt4EklLb%7r3Mbc5ASVGp z?@zxi9-_>{k(0uizA&_O>7vkGIJl%%B4}l`@l;}|cQr2Fq4qQ!cbY!(wfLQz_If=( zrfxFmRp4`v4;w~q^rX)_|F2wUcEjd}IS{1{!%eiD+<GOA1O_pjzE%q)1pNTP6g9Tm zu81Q0ffhbPt*J1kA8!r4alFOeY4?Z__6Ee8!d-fs$oiN>)&fAB@p^wzBSH~dgu5z5 z=tGx=zfGqLXP^g`D=Zftm4VUu`T5JVyu_OHpodk0=61L1AMbHKzk0L#Iz>}^ejWJH z$Y(S7!BVhT20Pp^I={%e?e3e!bbaMTbIgmt_n<q*LE15yt^Ti!859hsc4-tCyLq4e zNSxf=G#7|OX<vYjNn|@A#<E~wLz#OYxp<#9cF=*bR*_g(6S`v37-JbOuazq*7dlf0 zy0|hePOrwpJ0?e+-LCWbA0)o|-0Sws6qmtICF(Z<ywfMT%&MR^106Pxh~N>ch&+PA zMkiu@{g?I+>D26>u(60am)a&2C$Q0_)%nQ;feRe1p|9Ysm^m@B)aeolEQ{iE+xf@( zKu}KR>&{95K*h_1GNZ$tp)NY{xnyDJA8A<fzB=;FB^98noYqf6NR5YgEO%l^{I5ss zpZ;;B^9UuwQYRWq20u3@#q4clG&l^~$+xrjFZh5*6#{@>7J@i=IRE#)#J|6?*?9xJ zSK9?F)cPUdG>l9W1;wa;$vorZg$4Bca1JfJphKpU$oT2pY_iEJ^4)bLVL0bcnYpwR zH*2bO{^T*ndx9Qz%cfvK;(`%Rykfub%?IrtkrO>XHyCU@06%Q*`5^?{*s$~F6bG0u z+)>CQ0rM5Y;GFCf9e3Uv|L6K6?hy#VK&wJB*iRMjl#54!iPd81)Cr-B-2@44F$q9w z6rhSAN+1(>4gjJnsn>_@-$lE=MKR&L>oV)hHKUC4F#(lx)Kws`pQhMqS}+{L@8-Sk zfq(dq`2TKg_l`H9_d)~7;D-P(=n)QshRz#*4xlOhc*M;dKG7<g_BXl*uD{g0HewmH zP0*j9&aZ#0;65@v6c8&y1yRG=SZ_aN(Qgm58^X?ZMJVtHfZo4hmN44sS`!qxa%_0| z>`CHAy6iL~_=8ume@wa32*o?Vf3m|(eDTNjzcn_AL#b2@ezpOA^kU!@3xQw5rby(i z6u(4Wl5gObIuh_`5PtGC=eeIfVc(B=nA%Q$oYcsPHf<()paac=P8`2?!f0!@cfgAd zU*bnN#0pO(*JahOSb+q9xM1Md8bLfnnb-w1`JG|hL}&d+sYf3A<v<>~%4q#`i8X%E z{qK9i{>_VT+AAp-%bnco1N;np27SKg*YGfdmkSBF<(6J`Q6~i8x%G8YKVRGGY(l4W zI;v2H@@RvBJvt~?a^4K{CR&nr%tHDQi#lj@)SkMoP1V;kkP2kfCBO74rC$Q1*?+h! zBucMa9Qp>0d({A=Y_!1E$f6og6Q!TvAPt_iZ#z5g{9fYAJ#;dV@&@3!*GHqEvGAZ| zc+iXC$(t-Vuwq5>%d6^YA+};ay{|!Y;R(g#qI=gtWA9%rG2TxnfGxFM`zG^$)1}Mg zhXMe9bbaL5P5Z5f&A1(l(2^*2hxhIkE|oiDy9XKp(ECTD$;odA=~+{!L>AMpe$2y6 zTsD~s%yD(`I4qrwbZs53^RK^hzTMj8U84tpLjVAL?)mfJPshY8!s_aTGk?Bt>y`>} z!37?ez*{`bb96k`>Miz~pFd^)hTQ!+Enhzb41mETytGhEpH=HD?jdZ70%29r<``Bh z3H^|fv?ikffCz|LM}$e=m4s;WYb=~5J`hCpNt?42s4Jx^Bp6<C)7gVBI#0Z?-hPRa zTlBE%g9c#%$oKpbZ%@|=ArMQ2LjoXfp)3B#@Tkk34(!l9f3SbHWv{y*ZK<{$5(P23 zbV2-p#dD?^HyZRk3L(Pkr0>#$E{SFo0O(TCsmieeM5dx9GGXdiV;PPc%O*%c5nmTi zrlWHs4H&zx(QW<i?-N+^#4GngC<*sWXdDPY#-Wem<V`>h+*K!B+{?3UiEyvKzRySi z-s5p;RjBd14<&x+U4DSpQH-wLHPMt*!CtWnIeDzOx~3*PiB2OJbgg0tOQJ}fX%xsP z06h7{#uwC|Ipf{S>6Wp6x__{u_K&4wg32sU04O3RzV(O2t`rpr06!1_fFHnz0Knvh zAjyZ*{!6TP@#`(mkq}%`LP9X3j}V{@AOsd|M*f*L$kyYif^I?_q#$bB2T6l@K-4lu z&8l^;B%REr8KE~BuBgboDVA0MAU)pBZ-nYYGwdoFUS>@&u7}>0i^-*ONCSp$-RB<p z`Je3vDPO2Q41Cxq4Fmwd&x4<sFc=0xfcXG^@qNZjA*M|6cn!XDTiCIf==k0rocq*c zF<hQp+8=3k=~O>pa^^&HS*c4KqETU$&?ta;Yo?vyv;yEQCDG2Wr&Ccu%Em;-PpCGQ z;Lw|F)WRT4=O?G}bF1n2{TEL<zin<44XJd@bd-d_j~<^NKk|A1)8GKl2YMz7=eDJE z9_Li&!|h@HWsSXZ#aqs6xK$#^C_sWWAO>ns?Pzh?s4?M*xPTDzRm@v6O@@610KGpp z6rf8%r|L3=J+a!okiN(ntuB4$T7w{!NAJIFzjN$?<%x$WAD;L!!vTI(^~tq3`E&s| za93S&K0wD|oEb}dRUx@Ox_|b#eZP7EGLz;Gjo)>)E>0#t>_gDLRQcp;aZ$L3E_tC* zAVi-{X4(_*6@cD?k@|zfMn(r+y*<HLnk)Eq73j?)<xu0G2Y~?m?s?~tRPT=-o|z5c z<H@T&DgF(G1yu<10jNStr_d-c!4m?s1GkIy%sS^K`r(kb@ZpTwrn)i)=?Hb{R6m?h zr7It=qA9Q$r4fMDAT^%+?kfO&)E^>PSs^NFtHh-PrTzq|G{E1`<aYk<IU6TEu?od1 z4;Y?TedLxLLN|m!EENuZ#bw#42{E?`<^t{i{jB{EmM3)rpz|Au;$sDBOoeelSy5y( zod@=o?V$#Fnv72dz5;;NAE-Y@8xg=26y?@*x}|Fxq--b*m;^oYnYGT!-G{|a$`dk! zUPcxI^!^wX@@9xRa93SY6{1ZjcSdp)=5|3FS&zTsJiDjCX+#_5Vst{H^OI=<o8`q~ zN_C|@BW4M=fJOmUgFKa9j+}C91ptwG^{22*gu1(gJE>ZnPdzep@T^Uyf`gzM2b*5l zYasRKF$(71g_(?Z20sKKF9gJdp)?o;uqw2GCd4yI0?5d1<Tka6h9_Qep2jFXn3G`@ zH}r0duL|LcN36|;OuDDGw%Pw|kX8VY7?TJ3F(6O>FDMbA3DxFBL3V%D0)bX82KwWc zJ#PIgZ#i@+wkLRb@aMwFK}>^Dpn~=WO3w2-AfAgs5HJcDe|%XyMHiDf=*(0zP&iTP zVmWl`IB}6}im(wD7H^7q8jTv6-n9Y%{U1_8E2?G`J8N!q)aX%Sfx7;mYb7-N=u<S% z#q-o!`-RT9Xre$c7Xkq0;*ooQdd-{R-~cs|yOl-(+Hk@Mj5a~ra66gnci0>0n~m*I zgL1)2E@{w7(=Bqd%Oa6cVOtp9*J6ZYzvWP^0I>c~2aU~ks?q3C_QbLxV{$GlKtU>@ z#zBuk-x;`1trjm(_Vm`vR0e-u0Ej6g!C(|vMxy}E3X$Os3PRw}WVrR2HTLspU$u?B z*vcO?bS9ID4(0)Lx$i`p2TY0MhALXXfhOZ=G#cXl1VGmRAwBrqtZI}ogH)0z)>?<c zpvTz0-`%%qr;S^jF^!UYmOS`}q7ee-L7??U0lFL+=#WPOw3&Erop_mchUtdU{w5Qc z`=`+RsB|z_tt>UCA~u#oJxzvog}s$cg+xCAKsf9Fke&#sK-CpuUJ&rB1yS<yUUiI+ z<ADYyO)qbB*LK9k2?_(?y&fgyW=0Q@ILf8VyLBAEC_vv0F!<44+-9M-cGz3!7isnd z-4oE!&(;rE9Y>g@S+ME-BTc5NE%{NGN~@m$$ofD1DhJL0Md%`;Ik=TeHbKBH$M<uq zbnuP}tlVg?rZiwA538{8j*=*)A)mY%HV&Z4ymLay63A`lw#P&>ZHlc^+c{`qb4iDJ zKux7N8(Ir~?in39{oZqOWmCzxp8z1dX)Nj8BsEAFjz)`VZFN#E`oEG_pjYVsO|5R% z8*e+CC;`gHz|Vs}5C?}RQe9oY5ujHP*1YYkL8)>9b1t<(XI)b0jt>`xOXy^%DLRG8 z`vEA1OtYT=U;>QYGg^c9A{IyND*El#aq0*l6Y+EBQeh00I}eII`y0KF-BAXe0OUsi zKc)|_Kab7;KMR1l?rmo)U7MNEEr+Vb?SoD=F!i1ZSI{5|BVtTZ)U8Ak-Ve}`>n8wM zE-J4eVWlf4;<TGKs@NSzhm6XGY6L(bH|}!r6)F~>z))r+Y-TVy^Jau`0Br-qZNx%g z>^dm+;tCbru5czWCrM`a7g&u(jM7o1#(4TkC6}&EG>UqXOZzlZ^^q}E0KBiiuxteN z2icYvn`3BFs>bVAq97INlXE``r-sP&yS&vO*8OGRGm|x`^Iju}1864}073JBR=Tx& zFEA1WCu%){q*3Eww5cd|$I!1~8uWu7xIEE>YOijH^#L}d0~=tSrBqIu0Mn6IQBq)x z&jehxz`4Go5}3g3*l+A28pxKJm=}UvnL4!Txc8R@0BzT^ey8*H&=!U6%L$t`VTW); zojFu`?_iu#h&}?qVHhru$e^dR*rkgx2FK{6mVS|>W7iS;Amu0vK)&Z6oF*6ysyZPM zI}f=#2O~2-nkYm?sXK<caT7bjQ0bxCduQCFM12GR!vn7X8I;h7&{+x^0n`bw3S5ca zX*r=I(jls2EhoI=4=eyOL-T@gS{xp-#B!Tq1TYRa8Hb>o2f+>+{&Wo{!u0XhI08OF zpN{mz=~lzk?^jSzZx($70GVRL0K)~OCXC<yiW+4gmaPd=QI#gr968}0C7n^80L$u+ znk4@|GC9BkfVRUU_BYx`+q&HDAS*!wQ6*ruxWFinh9h(mi2jinlyoO=IFaf1698-& z6ci>U#4;n%Xw)5*ivY-(WaB>8;vS{=xMhHusM^_(%f}sh4xqhY<aRR-H;WU^ZAJ@@ zN2?~6&QhhJz5}!LqkiS4;YR5Yr-AEIFt=6X^(hW7fzk)YMm!?u%3n831uo(msfh>U zoqpi%7}3RXTA6`ES%kr;*4avv+fdMIOh<dCdjiK?1_JPzXdq)6ZRndd`ZXsK0A31> z9-z@cGQBS(F`jflPlCRLVIxG_$R=q*Qv5-8(y-Mwy2v~Kk2<jWGwAu|GZ=6VF!*7M z?rza@veRuH@LbXmv_eKS5_ZG17vPNm^r60oarsaj?Yo{bI0RQlH(>S9k6z;^V2n~X zI#8!T`;9%Pvh8(Yk~Dd&5x?!mNOfCVtc&jdbm=#TooKDM8*DuEP;b<{V+3=6mea+S zhlKe$o#m}RwUixi?eKobVMt026(}4c{D$e4AX2DlCSc$?b=C9{00d&9Ko^V}U9^LS z#G#NIktWS*`T>9MiMic{Az@V3MnX<^%u3LfTodVTR~!){kN*K@_n;BH;u>L$Jy%4I z9}<!JW)bbc+%iJ9cMhSUl}yrJ+^FqD4cF;0NS86I#`N6`>s5icT$m_e!eHT{U&ExH zyPuG7+<~-Nr=#uPc+54NShwMH(pA?q8*r+QB+r}=WPW*CgU10Jk3K<dRz+FNo+7OG zUK%a>;8l@P)#dcly55@5;N>k-ChUet2=G0Lz^bMk#_oOs-~|*5QBXwR0+0aEyEY*c z7-*X&E;da(T<ZDV2#rDmO+Qa>XgJV-&m`$*v`Be%db)d@M2t51T~C!Av;uG^DrG>Q z$kSYwc7w5~1AnY?O5uHH#NKzn6xv2Ve*OB}qG$Cs(Mm@X5*orXjRA4@F11pTAplmQ z$BofvkxU%D3cK_6nZ*Ix;Pl!Ko2x@va>_KL$n{Zg@crSz<sz~Ap!YMQv9XnjmV_OR z_Ys*vt^pM&L`!CFD3xg^{QxrkCPChup&aO;Q5?TrYm*RIrc2E`cxdYFL{q$?cZWp4 zu`QQmkF*-v-@+ZDvN<IHR4$ri;shp_&?I%lp%DOnLt-$}6c(5Tbfra71u{qtY7?$E zoDN9|@|g?<2NH3>kW>-Vge(l1q4|dGLZv4CpC+?d+V5w2y%_a!jP|%lbjJvby|Lub z!Er|-Zdr&%fWe`jr#c)QfC^;MT71~TWo<)a(3vJ|Bc4bYapY}<dpq_%1voVV^zrsy zj99C{+HH?f(?2j<A5>f?WGbDADN5~-;d)bdH8B5v#&RGOru+KCbgE#8B!K3TqPgAe z{J~?1Lyjd*PO22~S<{45K?|d|5Epq#J*@zAlMwa9-45-qAP+)QfH@__#;B0%hG_fR zj?vJSpk-N}oDV{ld6GlKfr#lA7Dmk>J6DE7cXX<ubN>-RTe>24@Supjx>3aF<9++! zyi=7<Cjf|*h{e5=nWs_=q6?ivS&<kMrJrLZoza{6dfz6He~{5*5Q~;4og)Wuvmo8t z>=qTe1*YkixTKU1#3+!722`L}%<Z6J<4PSU@g9We$iIt+tE1EI5y%k|^o#7RLp2A$ zCP{Ij7)6)6dy^#`VB&(-)tz#)U*0}5IDqeROQQ5YY-r~InZTS&ErHplHgS^DD(gOd zsp$kjj$t1?VVuBllC8<5Qb<z}5tY%fTauuO6LzGt%{L!^WN?5#twkHUv>6tSnpHFz z9<tj7f!U)c+-BkiuVQkiE_d*K7KZu+q}b>lYH}OZjj&w69i&<C<ym3G7*$#9)?n!j z2blamW)4CxA7^+tz^5&tzVawuS}e*iF%4oEsX^lU#Q|mypKuRTc-q4kensjPhJ8nz z1^`|a0>6y2@mB>2?{xY!G`hl=OvQF^sS&<T!&hqA(9OpkIUK+U5T?<*Bx;Nu3=E~K zX?>&Hm<ne+!|r4J1b`!%$J>mCIHnOpXsSw#Daa1zH?VuBp5H)N-i%xh$lsP@6sJkB zQCa4W8>$jR(16*d69z^AV7wpjxhy&Xkfp^q&}bi{4+-o{6JfPC=L}@qw-iz&T#G_K z#<8#<67|02#Mf#3H9w`#j|390MzWJfZ33b}dpqIEaxo2y96@lR)+<OFISvGXuGhEe zJ7hXU->c>`uKSSJ2>>E+<WR#garF2}k<&!DPfh_}aKAhK7{`plVyDtu!KJHN(%tVK zkZeBM5OcsAwb6ED3L}x?QN`v&bZ)AVfvbk)`i{BAiIZ;2!6t$4%TWg8%>6Ih9(kPr za0J-K(H3!Hf1{(l*3P4l=1(q_!$g>_vlv4+Qq#U2-78NQbm1EXtSa#2DovL8pb@}< zKHrwdgj-hV)X<Ms)T-C(=!(kV(}l5LCR{-P8fXGc9XD2iWUZkec~t;70&I479cXmx zgU;Z&kh$8Z9OY$98zau6PnvP5o%c(X-hD;663wR@G7eDldDm<5x8+y@9W&aPLB}8p zGXZy?3W@urb{%x<i5_-=VPrhZ?&J`ajML{YM}lo{+ADTKuaal+163Iv9q5YmZSbX( zUqOUE%*Ur}xYiDnt3IX7zl=Bza0B7j8EGp&M5}sk?Pzfhu%m11Oclr_4f5KuM{FnB zSiX_540j)+jsOVcNSx4oYqz^uJxAS#O6ny@VVSrtJ^SGYkH=QIi$;&K#^ZOM`1fAv z$Jk6t&phVnd3ywL06X?k`Z*%r1E9NkqO_=Su1^0SjA8@)wDc-A?sc~jeP9KUlji_^ zvQ-6u@yRw4hISva>*>zU&Y@C+FaprFdFib2^vm>JbSMs55%nnfc|f1G8<8&<rM(p( zYA+nbDJu_;tsdph)BV7DkPb6QC1pCm=!sUhd)t0{H>Jg)Vqh2snC8dxz#mlr;Kz|z zYRrZP(XjiVy9c^ewni?TUs_!p_|2YZzAI89!jVE!gXkCQb=O<_(aie~4+p%<XR&}y zb2q0)BuM?4Pxs4K1Q`JUyi7)i6*&zsx~D<ZA2}i#$RGFyS;n#))pP3vfFrRW;QPq7 zw|0w-ssLmv3=>lAAQi<hHnGN7GOo;;N<X*h;uq_ydPE2eru2C=NM-5>ct^YN4=j4W z&r4;RF-|PWwP?BE3mAQCx3ih90BTF+%i!<Dvs@mX0B}UMJp!w@+UxN{+0e1lnOq93 zqX#vJCQ!xaOgFD}sVAYs(H8Fq<d;Kr92<T=w2Sxc28{qX23=Yx$|j997OOw7j*<=( zPUKnxn;2<cr61)Zf8drM#xkPA-D`9Lz=4R!1VV4@a5m5vHa(ekggLQn2dS(s4j4CY zinyt)EJ`=Z2wYYds*Q<Iel<wu?#OX_?NUr?2kHN9^!w7a)uGvyCB`hB0H~$zgGx0p z&AW^nV3X#m@z=LIZ&4D~{~5=i(k~l70YF4f2s>1NMC{+T-`zzAn}*EbJV#ZzF>mH1 zXGt540`!xu7Jl?NzZx`TO%OOE0!i}6C#Zd({?OI>_N>~_6(RbOQW>N{3F^}5{A7B- zCSi1U{b8|}{AB?EhWU|`q@4tF0*nG~PmgF_v(;Hm73!k~=?bOu>yvA$G^(HO9kec- zYyKU5B^Ji7es?Bl6rf$<TW`^pT}LACHv}Aj`osD^M(dCzil&bjSL-IfLGY1nk)i%T z|0nflEzKEm2`})=8VuZ8<2M3uWSNNZ{Ccs9e)hhP0C2=ic92Tz;$Z(_@)&W|oXMdJ zd#G12yM;xc`Q#_VnHW9{;aLBNni}gC?zjqT`j|>%QIM0wzUa)N4iEr3v?+j5N`{## zgWv1G>0O(Rp8z1T41N%?)^4%i+}G$HR#$^4EGMHakwPgY6xQMeq5p}V#fS>49K&0+ zF!Q5;!mMF>rFJyLisWuRR_pAjNX(odmXJ!)@A!kRlT(YWi<8L@nB05VIR=apJ$&m< zGe}Pe7|U$;$<9vz5Q!7O1~JjnA&$NDmh%cSlUIW>6%J{G8XYZ+0@KDB*UzmDUFxj} z6;lOivXx&F4a(KQj|cS!zs8PVWv5->=*)@6yRed%$pBoZYgqkxd850!wNvm%Fat6I zpnN=pcm$WPb)KWIwE74@&<g0l9V9InNtFy=waB`&0KfR!Ljur2Pks~#!oER|1N|TB zPYF$avG`t76P`4#%D4!7IkL&M{dMVNKL`Li$){F3&r*JYfY0ShHv%9I3jjs{Jl4uL zoi)1;xebG<2FaB}Az&bMlg5Z;=gbLTNBvBUMu6T?fX<&}sz;JY{_lWufB@pDKi-ck z(jo;`f2NKVm(Xtk<n-f;y0*_$XdHjo-QXO3i6+1lm(?Fufw%+Ll1T>~9-U+%fEsl4 z*>&~{$TSx<D3=PN<Vc5+;F@#IFGfp6C5-_1A#ZOK!1}Y-5ZWr{J%@q=?Y0Qv&|;jP z*%SJ!Ke~2jfSpeHSp9i+t$4AuRp1LS7#aL{M^@VG(g^?(vh*M^+#oC-UnQPw?Qor3 zHpP%$HM)}N7=~f4yhO}hx+wCGL?hN67GbOiVP7D>JFIebXx=@(lPZeCiuh@*s<KGU zxY5SNK{mhC66)GKlOHhH)+xlpFFQ}B=mDd$0QiC*@zV(a<C1~TwzYPny>7!Uck@t> z0w^$+)h?N5e0tJ!>td%sB+4VSKX4%VtpF7m%U^jjgdE`A-y+igyW535X|z~KM<8nD z^?xmh2cV4H`>)&KY<*+1jpGlj{s60Z(t;mFNGAXYX9BQU0O*jPXn*Jh`(ac}R)dfr zSAz^xqhp-cv$&$@hRe*ams^6)iqg50(Za$gfMrn>Nu`s29~=&V*L?bu55G;Vbr<J? z30+%f@<TpQi~qFJevGDwn13@yc?1Bg_|Y;UlK^lcCd_vDu~(gEXx+6b$gOdiD#Dqd zq(KZ+q0ys^ORl{*{CPSW5i6mUA)FCHW8_t#ARHW+IIRBQkRtYIXf!UGG{(3@R)4f@ zKQP(jcYv|>-}3m&&R>XRn4YZE9~2{#0I>AHX7D2u(Re}}czl)f1avT2;&l~9{9KKW z9{lLiUU9)p^NvLmBJU^K-E;$Fq=~*8z=lkIRVY_(XO|A@55CdB?k`f7l!wPvmWkQ2 z`lC|Rb#i`ftfrOUfjO*1KDNqvl75ALe<}<MuiX0sue$7HG8qK`kwF9x2+BfW{(8Cn z(6N?aCq#o*QdeSKS}>W0zwmXJ8Q-m~4$q-w(L@y#BASrpSB0ph2H8+MdFl_o)y6m5 z$>R^kEL?2~wFE}jZpo0`{>t>w@g8k)V-GxQ|B<MnBUgKWWWv~mTWgRoh+#sU2_!A_ z_CB%YFKe9T7>WjS6!0q`R3W-dcl=FP7(Wa<qST95k)IFv@oS*{dG{B~pP)UaO3Y&% z$YAAsgLZDZv`hmw_x`VKao4?FFSd{u^5@=v&_)21UmgLxjDGq=;@2(huFVyvIKD<# zF|D75f-WASVS}u?+_>zPYa-t(s31m=K3d$I6awg|RA>^<ycuW?fVVi6i{(#RdoiQM zA~dE_%tr68Ybzc2vni8I6IesL|MD;P?}!F<gC6)<0Dw_EfwBxb0ua4^Y7jEC-q<eI zKl8ft97X|oUqCJ}5~nk|xVqA7<55J+2WE~pK79RU;X0^7I4p-rG3En#AxOvh(+g{A zr_PwZ)eh6|IFwqVu%c8<O{f2>x%suH8c%(vF9pS0yWCyRt#?*X7%zRYb^;sl;fI|5 zCa3@~G1#0DOI+edkGVgmuf_1*$K+bUK17rk9ZfJD`vd1pGe2|9g^|zFuS)h{mzXET z5CVlv{`E9DfO%Hc7-19^)8)7H`J-h-%1HkotrGx%Mm4&2RO9fw9GBIfCtkImrgQ%- z6bHRMV^Ib_Cr@h!6#x)nAwY)62$^E|vDR+2-+1B`=P49U9t9{&Yvc-X1g#$j2C%X8 zhUbcf#@B9{6aKU~Cb}^xW+BM03<Y3f7E!R|jQc;MbbEK0Zh*E-r<i^Mi3Z=kMhE`B zF;2Z{F`y6tzS=s3^TG!EWl9PB%HRh!@i11&ncie00HDN#Apk4{D1iI@KPB#KY<4?Q z33)!Cs}u<7j4rNHe=nIX9s)25P!D7*yTJU;l{Z><LI|))CJO<Ir^`F<mpun?Yd8H0 zmx&ReFe-{jHHrAOjZ9q^N9QM}VK<gOcQv>NHti8R$Pf5s9A*uE(9A{v82p@(ECeQ2 zgnqN!eh@^1n4lE~t!#t<^8pCK)#r!4bM38>FP6{_fmK3x3N6gf34*jskT~c>umV)v zMV$$4fFVtUe%2~v8WA~tHti;-W48_?`0jTjU3(Ib({jhDMH$8<W0Xl`w6hTaCdQc{ zQ}q7)SU-5w{>9FN-p|qm8U=I})cJA7s_hpyB?RKq`Nmgoy&?SF@@l$M=m^Qt6k*XN zU!nYw36+!Cz4seJP1*~f3yq0NFXnq40Z99`qnea8i??=(O%w+8n|pumj2WAOv(Hul zI0Jy6Glc-4F!ZBj;?TVhC;lsz2%JBX^)ot#_)*lw1wjY_<^*#mo1gl~RgwFPszv3N z4iU%dQ2yLdKbB|hfhAA}8(^gV(AODef^Kf2B~W1EloTjbb#0~d^Jw@qIQD)v?QwUe zNOR8*o3W|nn*KFg0bpvJ87j;p0Ikf5$Zwx_9(i%S`zk8N5{pFHRupMe<HHkQ+L#mI znL5_E`G3AI^3;2#htI9MUvzuthG?l2BSC(0ta3T?JMpY{5Wo^BDM4mex6wgAs!j)! z^~SILb+P^80#98%ZtQTgeTdSb48WfZe#WJatky3V0pLtn`dA1s3M6Q0s^{PTJO1rs zC*4l`AVRJ};Kzh)g#e=fMuUnH<Gg>k)_nS@Z-hT0rid6VmAYfc(i-xLq!6H}S`Ots zeL2v?AtV4j^iwABgwZOuHwXK+rC(!mLdC{jQ%k#X^4JM+A{E3Kl!ZV^mHsss0bq(K zJ{}eTR)s?AcZfIdd))cy>D~zJ%Q!B9V*AC%+BAkv`hH>b^_Q8yx@B7QM>8x@b??2R z2a{u-7vx6+g`ufebPn>vv2X=C+;j(!5$iF!x?=8eRRH|jBx`@l$6EsJa$DNEgWdbd z<xFSiDgX?AmOvH)i~@M9AO0!vi&r)|>(o)euQ0hVL`Tby4z}pAeGXxmH(A_%`}-ry zAO33S{SboYX5r*V1FttT&<V&7cuXjF<%hx@T4HuOqbYUYh??}94hi~6qP^&)Ga0`& z^7T&<#0OZ7C)`%jGU#?HFK@;l;}LdNCO~n0=^-s12oVk=VF?URl%7I*#G+Z^oZo*X z@+-O^sT75mE2#Dqh!2yse==FWzkYNO5oMttZh&#O)Qg|5-ei3J<KOPyd;9J5T>(w* z=ya7mf4*?<s!KM!7xNwV2R%Bfgk5s%>Y~0Lu%&v|-6A5RYecCTDJU;4bV@A4EkH1- zmGSm&qdV3e>!RNPh$lMfYp{f{E}3in_4^iwzK+`<<hGVbX6=u(jOt>_{mIvy6*ql3 z{<q`}@Iw$V_e7@)4FrB!nbQ#fWW)jhA+YFSA%FmYS@DnGVBYp`AG7`?8lkxo#g-Z4 z2hyzlDI=Znql35zi%^L%tWxiFV9i$hd#ko2e)**ziDn1_;$UQWCkX;T&wxk$9(u?F zjEArLsLp0t!Gy|+_`KSR(4w&wVnJD{m{w9~jHR{ra^e@-G}&zs*r*+Q2<Ru<yWGYT zt)hNUgYy=tyzwg+nO`wYqsZ?E@#OYL8QA#xa|E(Ws05F#vY)#7D~XS#yk!A^7BVaX zfU;l&fDnK|JPJSnFd7&?`9IdTKX`@tzHq3&y!nANYk$hf&-l?od}%bG)^yjsyh(g_ z-J#f@>+Th;bxUdAfHr*2WI@n?9zgNTw>}|iCXKVsn>F6NX5tued1a}A<IJNtoNa(p z1t@r`;VTUa!k`g?1%*j?wn~Eoef>E?%7y?uywZO3*1E(eQeG?o=>3O908kE~8V?Hr zj{*<?JXTGmsQTmGkzdnQ=hGvW(TABDCQ_25@eA|y=Y$&DFAbt141$1DhA<~P-1Qr_ zyZ5enJO0QQe<Duaa!YdWpmqnTOx42uL$c>YrM=!WnQG+x^#eWpfB4zx^l9Uq%jxE} z>&K5aE~D=$Cdwtp90~I!^x&{zRDg1&y@sbh%s)@frTAU+(YR_<8XWHDk8sY1<9Y({ zlKsf7cl8PYa>By`peEs@zBcMG5C(KG0^ng)2)#eg2b_y$i}N4&O62FG%S8$O{#P$^ zDUPlufwyP;fa~XvL>E66kpKV`=}AOEROu>}HXS9zSrfkWtFzmEYyA%Qmv7a_AN}-q z#6Hl5FyJ5<1YxA8N7U+Gwd(5n>+|FR#}qj0XHAGj=FA)KzH3UYdHuLbaVb@!_s|*u zkJUN=9$-udNYvjCVVn*HVK?H#sP9Q%e}69xN0Mv^z@snQkA3K061S(kN0b1dOgsv( zDumGhqX6{B#NRA4KlF`HSYI!S8U}h>nK6FA^z$cr=>-Q7d`vo;NP=)#5NJqmJaAO} zdD{W;*slFOuibest$~msaG7ESeS%5CfcK#i2+FMY<9|$GkvHk{y{b*!Cq>D$^6>nb zlZ<7vCK%V!ce)o)lp@3f&ppr+@Zpx*Kz1XpYP?FSo~d`gwAuQDoL@ee1V8nf{q&7r zPW*i;TU7<}OPY$_-}0E(-#aHC(89w)z^V{N0SE!?#9e<M`rIc!5c-5g^MRm3K<RwJ zo({~JDwi%T=P9d3@T2{NJv$FLPjB1jK6d<MV#`0?BM!koWegf2FbaAmwX)I&15~Dr zjYJXp6#eeH<U4~sMK`6O2=NCRm72yEOdM0=oIj)1y=GF4aaDP-F_#K~w(vlX4MAD0 z@d_yY=~GC_AI@|IPMgjrVcIlG-tub^A!zyQ&Z_r+F@6jAL*Ow2U=?WCRUj&ZXV7r6 zD#RlJt3u&OM1;QgY3pk@UuphTgj69<Z<H974wQaje*P#?A0&B2?E5EOT8@c0Si!=N zgP^=@2viM+j=8IkoN!j}J}6#4aWb*1X|y;>BLf;lHJ)$)ybNSD0t-yaU*bxin8rPy z5#^;;WWtzgF=s-RxQKpC@RG_hcY$FTRU8xgyWG>WziOugBjWlM!V60i=ttMjKT}=^ zr}>Ilx7~Sj$*1DD2?W3&kph6S@+d%xPVdqvj{;UvSQPx~pTpn3>RjV;2tm;0Q4mfC z*tB6toW`U}D<|_42E>Wk;&5BL*m1m7yxrLBY-?$A_BOYghnl-XO>SFvYio$st!qV$ z_7`lDr#|q3IyH_?svfpPw36=Cj}}DB3PMg<xWKI#U1E+YETo^@Dl?{)6`RxO)5GZm zh6$7<RLfrD_3{LK*5`WzG>&vYMD#v|%QC$mZ9o5@`C-|5|510>r5}%7d$Qa66&MJ? zh#CP<7j(LKcqG6mfQMBf2!b)LT2%k~i{T%hGu>E_%^m@z%~=S%wD^<81Qi63K-^w| zpxXL;4Hvf^+P#b$C*!tzlI%9xcj!vkF8%ncNKkr^u*{GVrS<lrg0Nc_4jbjsus2Z! zz@bX^GXRskVv`PBa^fKI(t$rydcSZ#e=b{)JTWh$uh5QO`pKSU2OC8LrNu})B36O8 z9&ED^@JJx5LM#YkYOR>~%P&NJG-on;w1FE5Pza#P&!h?JlO!FDJ`qzdi0?i04q<>B zqg%Fgm^MIzhkJDIodVgP;{~yiCX>k&B^`~N!!i^~rt4`6!tGjmM{L=fyT#j-6!W0d z5&!^ns14&U+|njmUfpc3S+X#+m~MTppdG}1y=Xe{qzgl(GKL4Nc_unC88jFk*1@5c z;6ZQAHtXi9&2eGl7&ph~b$O;O=a<ecgC}jgbb+a`bhL5}%am<Dx`Z6sM+*Obg?Ma# zqg$U!4<Uf;@{{roW=T`JU<tB}g~H*%j2*)j&TO#W2FVTWI4E|1>>IH=b{r6U={&gy z6d7>+m_UixAS_cj$JN<EImY><%S%UJ_G20zn294go8t^bK0#;%sXv!Vu8ZtWmruGd z&_MovMwb?Tq#BAjliW#^4!GjZ)Q?O?|G^Xht{(~tH-rEJfQM)Ao)GLjBzE2Q&Df{6 z?-#qeW3Jcx1r-9Kl~D+E%tSgiC>$4-{rqgu;>Rz}Q2TRvGS!pI6|}yY=%ou!7lv{K z<u{jEw&^RsX(<vAfYTC!!4v?Lnd=E5z@rKQ1OSh<=b+g0_x~RI^yWS8W{d>*tWus- zf}!b{nl6m!2LdevgA0vx=?s@iw$sHQh%h-Xb_b=)^~)4L6Wt);et85b1L*r1%!lZw zvL;bD)OQwuoP}UG<^X=xi?p<hmKWDMFD;m6&Zw<2CSi*{OlOBwBaaSh7~W4eT&CGS zcR4hBcc!v|Vmbh1pW~@sC{x-X`DTifDg1QH0RGXJXNjLaVgH_Jp+n`4)el!`vm6cq zK!H$L#+F?0F#XJB=hJJP7ie>5%&dvVY+5p;v-`=lLb)cHfRrhmX$6gk_*`I4J5p_# zp+U+R1hkprWDE~bkW4f{0&(a_M8V@P+YdFhc~_&rn>CDVtDf8{2ZdoUeuWLuaRX=h z8_vpNS_NM?&Abq+As7j;3?`c(;0+Q7G=s+D{FS1x_psT1%uH9HAb>;qOz|>?rz=D% zEE5g693@3Y!82>bU+99YJ>(BH9s&RsWX*=59sw9PY|90f-6pM)7%MiotLfwV!<WrB zFQUrP5xS%xsLToi-XL)(kE{g&Y1nY3_<b;KnOWK7qw+3Y+8}W=#R*c*Of*nNIS$SQ zZQ18;rB7~Or66GVj2r<_FBq9eaPvFx6xp=f-MnF^SbxDR^PI9GQJJesgp7g;LAG%b zKb^@{FqjePXa^0G0hB3Ckhp>3WXg!bgV0gQ;1Fd;m)rb@7oEo_3<7|;0AnXBwhi?N zz;$6vu+4>L8}Zm3IdIf%c=mPsg$XrA&GhlcOx*B*)1)|@rZO-n$b-h~EijjqJ<b4I z<xQp{2Z<jjPNs|~JO~|-(Z-{;pm|~B7f;)NpbNRMiU_Pg2w)gD$+rxDhf4r-#gYro zZrFG*Iqv$)E6$7Eaie9?4C7n^a0Hu4m>cN8tn<@l8Z;iK%{D%#8!B51m<*W*O%o&@ zH(a_bgV0Hr9!sH>Wk&gnZ`e=lKk6MvNB6|@fOJXwg$=g=aKFkn^A9$=QE0eLs$ppD zHfO`@JH+dACmB<#M;YUA)d@xe9F$TSn+;gAiHics=5*4^bh34;_01-IHfe*#l^e{j zEP-idAVyz@nHzVz8`r$;uBE(i>R48T{Ic)oKimQUWE(~u{mjt{A+{!qhpPKMh!LSP z_(vXI<veGZqG#R|6CZL%c%?`OMx9?WtNwqpiQ7N*DW8F&!xV!8hvWO%+0w}-K6){~ z2j$6zmS6eV9~~Zz1YHk4?>tI=z%h>ij2(`e)*f~NxSNXi;tB$Poe(Ql^!EB(3D_{| zyG6R6{qjb4&D!l^E#3V&eq5C?0iyxT>8eFZD%nk%In7A4vjv`Cd<Zojd50eAi1!fu zY)aVsPW~=kr-gT~@#qhy*V)WBzq~nIw&}{2;$J;y|Dn5E&@Z)m*{~4E(bBphup`2x z_`_wv+AcpB-th2|YPNAs9#0}17SWGhZ{GN^_gNnuKU&n{lw}cpb%2lW!BCZ{Xn<@@ zE@`sOV<6+Jbq-2fPAAtHK*r8IebbOUrAlt{>fIca<H~t?{Fgn*jr|;aS;t@4(eDcM z3J2%Uwvx2ZD?XB^59Dur{1y9I3P5L$b7nYn8CVc<fC7;pT*GBz0l+&8fh-6BKMMmY zADdVs#@}&s=<jY=9Qpt;rx?Yg5AbP3fUCbCz|XJY5SGcDPTEYgvkead7(be7TGR^< zI+7kboQRv=u;3v3clU@Mx)iIet;;ys+Tpf!cGJpa%<Umn6ab{3j}&GB{bCG#>{LiQ zw}sSOmlPGaCDa}z^fg-nR2a}h-Vh|%5DfUEy&x3wNTZe!d6ZEL|KJh(p8xgz#Fyw5 z-<f3nbr@wiA`O=dHVXo5767(oA%HNz*mMQU+)sVLy6uWZ=CyPMBGP$+fa?%FhJ)jZ zL1Ub*83-Cd%Af;7kaTJsl@6C5^C`N9-0SH9LRxlq4>yVZ+YdO~x9k<$w(oc94<2=n z9Hs9$+S^1YU5gkal@!4Duq@>Ru7)g2SS1A_LY-1UX|X69S7BC8s1{=;jWH%n8f#3X zkN78!sSveg#YVZem;pjW3FW~r!ayLf(1EgWnPKB-^zH_C<KlmaEo)C6s^k#>6Jm@4 z8O;DRd&WFYCj!cc2Owq};75-Sz{?K{1Hw^x^V0dDMW4LU`0(ZDn9GQXAux@8%L*S= z^fHqfO7VLQ1EJUB9pq5!E7ujLaQRXz#M^bq-TC4MXT^&3;<e57_Fg)y*h;JbxVSC2 zeS&a^D0&8M12+RSRA`B!u{EM{daXH$4nj^pXR4S#ZM->aT$LDK5Ed39qdZWXAPn4o z-iTp|#C!j#=RGUm5^E?L$^#)_0pL8zOK*^1q#G`yECdh$KS5xjKsb6O>)jWG&i~u@ z7=L}~eDf+gUldO6A3zvR-AbVX15A;@f%h}j_|*;dgPMbHFnUONfKJ}tC1P9ly6Yc& z)_(Nqwa)7HZgG<84SwT+@$g7C1DQdl+FoS(!|ex~AB1sx!VQD;050s%s1i{=dtzw9 zIn&(*OBR~v%@}Xauci4NgaGpqlpP<*(^9zj)`RxHefg(}uTnZzgFuIAk<;IB;rwHa zj1Vp-Y-Sv676RA|e74yS4F^F8oi|g=x%HaR4ez<od^g=#J(~4ej0(87lmV{;45jZ4 zhkGQObmd1KQEyCUz3bu$CIEiZN%zFF>%?=vf6jUQ_3ic!svmk%@Dc`K0^sEbK$V36 z?=Wm9-%betw;S3}e%N2Nk)DBURh5g1i|3hh7tc4&y=b<%c*X={4yi{5RHphP?xyQM z6<<oj6UxjZ0GAnbd<_b6CK)cT%q+M8cKJcWu>i0ef&iwtG+7?^{>!YZZ&+-+cg|#E zA?5~H;Q%wEq)0&+RDF}u^)oCm{Q`!;LkD^;AA=scJ$ifC06o4trXMxj`s8Z&nI~2! zUf6R;9HgRy$KVx!41UQE0FQSDKHCg>wkb*<!+?h;+}wWb#=HE;{wNFHVLWgbhDFgO z3qv!nKF_#d@jT<Ixl@cqAN{6%)AF_Ua*Bia=<rZZl*g}36m*KP_i_gP0YjKcY@_1* zF!)(0AOx}?psI0NJ}q86KXlFquQaZ^e4(*~hSM4b3xolJp*x1H0~-j+hQTNMovu4m zzMLm)#D%I5r!VXH2LoBCk2HxRuWoT(ed;ymxtBLP8@sx^Ut9ryz)Jv!0i?QF001f( z{0uU-DY(~wCX8&ujfVw61wYymer$6%-jNP@W9`2?8Wq;kb3^AkF}vm24dS&_7?&UA z(Upn3lZFe$?`M+DWmg#qCIR?tvoPSDg@D7sSTIY_s>HY}&oviavB13S{MqIuV=Kj2 z0EX2hOul+oBPd4(8PdXJ0%tPT!2M;ggCds&fT#P0yq+DsJIaKf9-|xmh<W4so$k67 z^u^svZ#o+qPKcwa(tsBL34=zq*$qL!1K_E^XMn+GH#vKa+)nVsyY4|-z@Nbm8*Rq# zC?~tg>E(s8VCl1s9+VXZhvVRu%L;$3;lgPH&k#?Qnam{E40PE1$btYj$6*kdbe((6 z<qOP(7tb}$y>Pa9@x(F4WIBV630AK_U^0eLf|uv8A^{*W7!g-C*$RjZaHhkwK?{Wi zumO0eG<aYjv@o<TAH&rl>vuZqU)kus{@ONYGyRM$F7*X4P-pNBsrUhC<OlvTknpYp zzYKcWP0@P|@?rxwzq6Zdlpb!_>}DZgo5Ltdui&Db5ConB$mRAc6Vmq<#Cth||ELUQ z=D`Nz<c9@;fv?&~<KYYZC@m0WGbf4Kb7z|8(Bx}AeWp2&CeXE|w9&>Y1%n#^g<!y+ zZIe9V?>!(W8Ti3)`s7<Oa}VTH3WppRg|J$~HpfRkpaDVX=oX!HM(W_s26y|qZO+DZ zJDjcC4~qSy-p~@cXTSsG2oN*q8RQIne&=wG3mXsk!Vft;H*6UA`<YZtdxQC1w&9i^ zv;*E@%MaIsygkEZ<T^kIxV&8ERMh?!7odO0nd!szVaCB`Hy8&-s=|PG7796x<5F-h zXiO4_(y^mO^@1tpl-ZMwnKLIC)95>eiPhzzhITv4Y2IJ~{A?J={GN@?g2QPb0JJHU zXzOxM9&ZuH_BFcu_t0m7Tlc!Vb{};1?LI0R>0Ar|kA~;^B01g})NBJVvYUHN_Tw}R zc)Y{#d-5$k@Hviba~r{r-LkE^8T{~<-5d|);j+qQho4$j^6G1tNMGMG|BdSfn;$R_ zZU%-7cAc9?2BhOOaKkXe;l@TzVO51FA6pTss;zNrYAel}u~lw0O{z!JMYf|zFv>`U zDx`gfqOj$LNp-TQ_olU`Bmk(DT<YO%>d6yycPRbLkV`)~D!SS_-B$Yjt(N1hZqwl= z<5**p(|C~VBggIIP0iwDSHhbJqR~+=1_#O{gM!P-;9y%80Qhk{*!(bn*k;<W2il+x zFtRPXx&7GYFr?w~!sfce4TE=IBNOqBbOr}-{b0)vg9SE&Tef9^KpY5zoJMw2kVl&t zFN4LSPcv^TR3O5|Q4yg@X(*Bs05jwre{l);F7@s<-7cM=4XH#=g66Sww16I7)8@uR z9YB-og1k9D83gQRurt8@dU=iyTUQVG4YffXVPu=@E&Cx3^MKu4kBsGJLP+>dHgY{> z0Ks1dGrMJBfFHlBZjR4%V6z+igj+S~8bueM({m%k<_4B+xbZO9WjFh=&2eR0rq5+$ zo69g<w#*l}`JHVpms|(<Wh}o+fC;^mZLTwH^#P#aCj*{Ap3depOpoc{9ftkc?RlpB z*)2B~yX6Lz-3(m#u{($j0g%%mZ={1^8*aoI$%grwu8e`|5QI>=OwQymx$Xcg3<DK5 zgP4KOe(JmI&*?cW-eK5Zeouz<|H};r+wTEb5hjD4-&I?V>qifzK-gJlxIxakiYpan zKFBuQx<>{#yV=&oXFp^KHw@d!x4wTFhzwSQ!p%K21DeA*jNdt&ZTQ1*dX5J_4ukuw zH0c`RtYipPTILDd{D2?q4r0sk*)7{}>x>La6|DRo#0G7q#qni7UEXJ%9~v@m(sMxO z5xZFckW%&IcMg-|a!zs__G6nti+3Gxv+-jZOgnEY96&>0!iULG-UQ=-3SJf9a=7dU ub@e@6j<O&ip8U>k)mG!Bqn{5W?EgRJKM~G%sTAS>0000<MNUMnLSTZYys>Zq diff --git a/QKSMS/src/main/res/mipmap-xxxhdpi/ic_launcher_blue.png b/QKSMS/src/main/res/mipmap-xxxhdpi/ic_launcher_blue.png deleted file mode 100644 index 966d274bb810d3631560a6905e3c1ca69b797202..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21925 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�kOcsh!vatPzs$#(x^e6f#}AdQs&W*&$WJrE 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� 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 diff --git a/QKSMS/src/main/res/mipmap-xxxhdpi/ic_launcher_blue_grey.png b/QKSMS/src/main/res/mipmap-xxxhdpi/ic_launcher_blue_grey.png deleted file mode 100644 index 1774777eb808e802595a54670425fe5807591581..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21489 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 diff --git a/QKSMS/src/main/res/mipmap-xxxhdpi/ic_launcher_brown.png b/QKSMS/src/main/res/mipmap-xxxhdpi/ic_launcher_brown.png deleted file mode 100644 index ad63f11934f66a7f4cdeb729c289d2e501d0a469..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21331 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 a{{Ii<JA9w>AFI^>0000<MNUMnLSTZBbU{`C diff --git a/QKSMS/src/main/res/mipmap-xxxhdpi/ic_launcher_cyan.png b/QKSMS/src/main/res/mipmap-xxxhdpi/ic_launcher_cyan.png deleted file mode 100644 index 888053d789530bd1bc9545d7db4db894b9ad395d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21380 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 X3E^1g>LQ+300000NkvXXu0mjf0p4h^ diff --git a/QKSMS/src/main/res/mipmap-xxxhdpi/ic_launcher_dark.png b/QKSMS/src/main/res/mipmap-xxxhdpi/ic_launcher_dark.png deleted file mode 100644 index 69f3b35c6b9f39abf5aac03e8b6ed689cc960098..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15066 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 diff --git a/QKSMS/src/main/res/mipmap-xxxhdpi/ic_launcher_deep_orange.png b/QKSMS/src/main/res/mipmap-xxxhdpi/ic_launcher_deep_orange.png deleted file mode 100644 index 314826c9cc245a215c5a805fbf998410c382fd76..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22071 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 diff --git a/QKSMS/src/main/res/mipmap-xxxhdpi/ic_launcher_deep_purple.png b/QKSMS/src/main/res/mipmap-xxxhdpi/ic_launcher_deep_purple.png deleted file mode 100644 index c68eba9a0936ec355613b40d26feb7ffe4ca3c56..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21664 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 diff --git a/QKSMS/src/main/res/mipmap-xxxhdpi/ic_launcher_green.png b/QKSMS/src/main/res/mipmap-xxxhdpi/ic_launcher_green.png deleted file mode 100644 index c36638b35fa8b49c60857e28795cd7537c0e0d23..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22101 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 QZ2$lO07*qoM6N<$f_x_Ay8r+H diff --git a/QKSMS/src/main/res/mipmap-xxxhdpi/ic_launcher_grey.png b/QKSMS/src/main/res/mipmap-xxxhdpi/ic_launcher_grey.png deleted file mode 100644 index 368cfd485062be06634e15affa19c74da9025d1f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18870 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 DNb|eg diff --git a/QKSMS/src/main/res/mipmap-xxxhdpi/ic_launcher_indigo.png b/QKSMS/src/main/res/mipmap-xxxhdpi/ic_launcher_indigo.png deleted file mode 100644 index 54ff1b8c2a8c14c268ad6a69f76012b981749392..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21303 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 diff --git a/QKSMS/src/main/res/mipmap-xxxhdpi/ic_launcher_light_blue.png b/QKSMS/src/main/res/mipmap-xxxhdpi/ic_launcher_light_blue.png deleted file mode 100644 index 87c9546f36e3e4e0c055712f33574e07fefad4bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21905 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 diff --git a/QKSMS/src/main/res/mipmap-xxxhdpi/ic_launcher_light_green.png b/QKSMS/src/main/res/mipmap-xxxhdpi/ic_launcher_light_green.png deleted file mode 100644 index 8271a92d9abf3377598382d962d2980ff8750e14..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22065 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 diff --git a/QKSMS/src/main/res/mipmap-xxxhdpi/ic_launcher_lime.png b/QKSMS/src/main/res/mipmap-xxxhdpi/ic_launcher_lime.png deleted file mode 100644 index ede8e90d5f50a48e5f90ba3a9ee8b1ad26ee399e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22323 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 diff --git a/QKSMS/src/main/res/mipmap-xxxhdpi/ic_launcher_orange.png b/QKSMS/src/main/res/mipmap-xxxhdpi/ic_launcher_orange.png deleted file mode 100644 index 2a991e9e15566e432d96df6f92c41dd0085991c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21298 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 diff --git a/QKSMS/src/main/res/mipmap-xxxhdpi/ic_launcher_pink.png b/QKSMS/src/main/res/mipmap-xxxhdpi/ic_launcher_pink.png deleted file mode 100644 index 4989fd0aa192185bc58a346ba3d14ca5b539421d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21800 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 b5%&Lop`ChT1M~ek00000NkvXXu0mjfhKJ!a diff --git a/QKSMS/src/main/res/mipmap-xxxhdpi/ic_launcher_purple.png b/QKSMS/src/main/res/mipmap-xxxhdpi/ic_launcher_purple.png deleted file mode 100644 index 8888bf490035c682fb9760267215246603ef6cae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21431 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 Wxg_?RkmBzE0000<MNUMnLSTX|PjJcr diff --git a/QKSMS/src/main/res/mipmap-xxxhdpi/ic_launcher_red.png b/QKSMS/src/main/res/mipmap-xxxhdpi/ic_launcher_red.png deleted file mode 100644 index 130bc561e0ee2340fa919068f73308c93fa342ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22009 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 diff --git a/QKSMS/src/main/res/mipmap-xxxhdpi/ic_launcher_teal.png b/QKSMS/src/main/res/mipmap-xxxhdpi/ic_launcher_teal.png deleted file mode 100644 index 1b55617851c3cafbeec585417dd23f9eca4f040c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20274 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 JPDHLkV1n&CFHisg diff --git a/QKSMS/src/main/res/mipmap-xxxhdpi/ic_launcher_yellow.png b/QKSMS/src/main/res/mipmap-xxxhdpi/ic_launcher_yellow.png deleted file mode 100644 index 536839c453e32fc25dda31b71615cf59ab10044c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22210 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 Vr`Wp}%c1}P002ovPDHLkV1n_IB3S?c diff --git a/QKSMS/src/main/res/values-bn/strings.xml b/QKSMS/src/main/res/values-bn/strings.xml deleted file mode 100644 index 6b7136ad7..000000000 --- a/QKSMS/src/main/res/values-bn/strings.xml +++ /dev/null @@ -1,768 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!--Generated by crowdin.com--> -<resources xmlns:xliff="http://schemas.android.com/apk/res-auto"> - <!--Slogan--> - <string name="slogan">বার্তা চালাচালি আবারো ভালোবাসুন।</string> - <!--Text shown when a phone number cannot be found--> - <string name="unknown_number">অপরিচিত নম্বর</string> - <!--Content description for photos--> - <string name="popup_photo_CD">ছবি</string> - <!--Text to be displayed while content is loading--> - <string name="loading">লোড করা হচ্ছে…</string> - <!--Test string--> - <string name="test">পরীক্ষামূলক স্টৃং</string> - <!--Hint for contacts text field--> - <string name="hint_contacts">প্রাপক প্রবেশ করান</string> - <!--Hint for search text field--> - <string name="hint_search">কিছু সন্ধান করুন</string> - <!--Hint for message reply text field--> - <string name="hint_reply">বার্তা লিখুন</string> - <!--Hint for code redemption--> - <string name="hint_redeem">কোড লিখুন</string> - <string name="hint_hex">Hex</string> - <!--Text shown for single new message in notification--> - <string name="new_message">নতুন বার্তা</string> - <!--Text shown after number of unread messages in notification (ex. 3 new messages)--> - <string name="new_messages">নতুন বার্তাসমূহ</string> - <!--Text shown for single failed message in notification--> - <string name="failed_message">বার্তা প্রেরণ করতে ব্যর্থ হয়েছে।</string> - <!--Text shown after number of failed messages in notification (ex. 3 messages failed to send)--> - <string name="failed_messages">বার্তা প্রেরণ করতে ব্যর্থ হয়েছে।</string> - <!--Text shown under failed message count--> - <string name="failed_messages_summary">দেখতে হালকা টোকা দিন</string> - <!--QuickCompose notification title--> - <string name="quickcompose">কিউকে লেখনী</string> - <!--QuickCompose notification text--> - <string name="quickcompose_detail">বার্তা প্রেরণ করতে ক্লিক করুন</string> - <!--Welcome screen intro button--> - <string name="welcome_start">চলুন শুরু করি!</string> - <!--Allows user to skip welcome screen--> - <string name="welcome_skip">এড়িয়ে যান</string> - <!--Allows user to finish the welcome screen--> - <string name="welcome_finish">সমাপ্ত</string> - <!--Indicates to user they can pick a color--> - <string name="welcome_theme_title">রঙ বাছুন</string> - <!--Indicates to user they can pick any colors--> - <string name="welcome_theme_description">যেকোন রঙ।</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_night_description">চোখের জন্য সহজ।</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_night_hint">আমাকে টগল করুন</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_quickreply_title">কিউকে রিপ্লাই</string> - <!--QK Reply explanation--> - <string name="welcome_quickreply_description">আগের যেকোনো সময়ের চেয়ে দ্রুত বার্তাসমূহের জবাব দিন।</string> - <!--Prompts user to try QK Reply--> - <string name="welcome_quickreply_hint">এটা চেষ্টা করুন!</string> - <!--QK Reply demo message--> - <string name="welcome_quickreply_message_1">ওয়াও! এখন ব্যাপারটা কি অসাধারণ হয় নি? আপনি পুরো কথোপকথন এক দৃষ্টিতে দেখতে পারেন।পপআপের বাইরে হালকা টোকা দিন বা চেকমার্কে স্পর্শ করুন এটিকে বাতিল করতে।</string> - <!--QK Reply demo message--> - <string name="welcome_quickreply_message_2">এটি হচ্ছে কিউকে রিপ্লাই । এখন আপনি বার্তাগুলির উত্তর পাঠাতে পারবেন যেকোন জায়গা থেকে। কি ঘটবে দেখার জন্য প্রসারিত করুন বোতামে স্পর্শ করুন :)</string> - <!--Settings option in menu--> - <string name="menu_settings">সেটিংস</string> - <!--Search option in menu--> - <string name="menu_search">সন্ধান করুন</string> - <!--Show full conversation in QuickReply--> - <string name="menu_show_all">সবগুলো বার্তা দেখান</string> - <!--Show only unread messages in QuickReply--> - <string name="menu_show_unread">অপঠিত বার্তা প্রদেখুন করুন</string> - <!--Open conversation option in menu (shown in QuickReply)--> - <string name="menu_open_thread">কথোপকথন খুলুন</string> - <!--Forward message option in menu--> - <string name="menu_forward">বার্তা ফরোয়ার্ড করুন</string> - <!--Call contact option in menu--> - <string name="menu_call">কল করুন</string> - <!--Mark a message/conversation as read option in menu--> - <string name="menu_read">পঠিত হিসাবে চিহ্নিত করুন</string> - <!--Delete a message option in menu--> - <string name="menu_delete">মুছে ফেলুন</string> - <!--Donate option in menu--> - <string name="menu_billing">দান করুন</string> - <!--Copy text option in menu--> - <string name="menu_copy">লেখা কপি করুন</string> - <!--Changelog option in menu--> - <string name="menu_changelog">"নতুন কী।"</string> - <!--Expand settings option in menu--> - <string name="menu_show_all_prefs">সমস্ত দেখান</string> - <!--Show less settings option in menu--> - <string name="menu_show_fewer_prefs">কম দেখান</string> - <!--Title for message details popup--> - <string name="details_title">বিস্তারিত</string> - <!--Title for address that message is being sent to in message details popup--> - <string name="details_to">প্রতি</string> - <!--Title for address that message is sent from in message details popup--> - <string name="details_from">হতে</string> - <!--Title for text of a message in message details popup--> - <string name="details_body">দেহ</string> - <!--Title for date sent of a message in message details popup--> - <string name="details_date_sent">প্রেরণের তারিখ</string> - <!--Title for date received of a message in message details popup--> - <string name="details_date_received">গৃহীত তারিখ</string> - <!--Title for rate snackbar--> - <string name="rate_title">কিউকে এসএমএস পছন্দ করেন?</string> - <!--Title for rate button--> - <string name="rate_action">মূল্যায়ন করুন</string> - <string name="pref_category_appearance">দৃশ্যানুভূতি</string> - <string name="pref_category_summary_appearance">থিম, ফন্ট, রঙ, অবতার এবং আরো</string> - <string name="pref_category_general">সাধারণ</string> - <string name="pref_category_summary_general">ডেলিভারি, বার্তা প্রেরণ, ফরম্যাটিং</string> - <string name="pref_category_blocking">বার্তা ব্লকিং</string> - <string name="pref_category_notifications">নোটিফিকেশন</string> - <string name="pref_category_summary_notifications">ধ্বনি, এলইডি, গোপনীয়তা</string> - <string name="pref_category_mms">এমএমএস</string> - <string name="pref_category_summary_mms">এমএমএস কনফিগারেশন (এপিএন ), সর্বোচ্চ আকার, গোষ্ঠী বার্তা</string> - <string name="pref_category_quickreply">কিউকে রিপ্লাই</string> - <string name="pref_category_summary_quickreply">কিউকে রিপ্লাই, পপআপ বিকল্পসমূহ</string> - <string name="pref_category_quickcompose">কিউকে লেখনী</string> - <string name="pref_category_summary_quickcompose">কিউকে লেখনী, তারকাচিহ্নিত পরিচিতি</string> - <string name="pref_category_about">সম্পর্কে</string> - <string name="pref_category_summary_about">সংস্করণ, পরিবর্তনসূচী, লেখক, ধন্যবাদ</string> - <string name="pref_theme">থিমের রঙ</string> - <string name="pref_theme_summary_alt">থিম পরিবর্তন করতে হালকা টোকা দিন</string> - <string name="pref_icon">Icon color</string> - <string name="pref_icon_summary">Tap to change the QKSMS icon color</string> - <string name="pref_status_tint"> রঞ্জিত স্থিতি দণ্ড</string> - <string name="pref_navigation_tint"> রঞ্জিত নেভিগেশন বার</string> - <string name="pref_background">প্রেক্ষাপট রঙ</string> - <string name="pref_background_summary">পটভূমির রঙ পরিবর্তন করতে হালকা টোকা দিন</string> - <string name="pref_bubbles">বার্তা বাবল</string> - <string name="pref_bubbles_summary">বার্তা বুদবুদ অগ্রাধিকার পরিবর্তন করতে হালকা টোকা দিন</string> - <string name="pref_night">নাইট মোড</string> - <string name="pref_night_summary">ব্যাটারি বাচায় এবং চোখের ক্ষতি কমায়</string> - <string name="pref_night_amoled">খাঁটি কালো পটভূমি</string> - <string name="pref_night_amoled_summary">অ্যামোলেড ডিসপ্লের মাধ্যমে ডিভাইসে অতিরিক্ত ব্যাটারি সংরক্ষণ করুন</string> - <string name="pref_bubble_style_new">নতুন বাবল শৈলী ব্যবহার করুন</string> - <string name="pref_color_sent">প্রেরিত বার্তা রঙ করুন</string> - <string name="pref_color_sent_summary">বহির্গামী বার্তার জন্য পটভূমি বাবল কে রঙ করুন</string> - <string name="pref_color_received">প্রাপ্ত বার্তাসমূহ রঙ করুন</string> - <string name="pref_color_received_summary">অন্তর্গামী বার্তার জন্য পটভূমি বাবল কে রঙ করুন</string> - <string name="pref_hide_avatar_conversations">কথোপকথন অবতার লুকিয়ে রাখুন</string> - <string name="pref_hide_avatar_conversations_summary">কথোপকথন তালিকায় পরিচিতি গুলোর অবতার লুকান</string> - <string name="pref_hide_avatar_sent">প্রেরিত বার্তার অবতার লুকান</string> - <string name="pref_hide_avatar_sent_summary">বহির্গামী বার্তাসমূহের জন্য আপনার অবতার লুকান</string> - <string name="pref_hide_avatar_received">প্রাপ্ত বার্তার অবতার লুকান</string> - <string name="pref_hide_avatar_received_summary">অন্তর্গামী বার্তার পরিচিতি গুলোর অবতার লুকান</string> - <string name="pref_font_family">ফন্ট ফ্যামিলি</string> - <string name="pref_font_size">ফন্ট সাইজ</string> - <string name="pref_font_weight">ফন্ট ওজন</string> - <string name="pref_message_count">বার্তা সংখ্যা</string> - <string name="pref_message_count_summary">প্রতিটি কথোপকথনে বার্তার সংখ্যা দেখান</string> - <string name="pref_sent_timestamps">প্রেরিত সময়সীমা</string> - <string name="pref_sent_timestamps_summary">প্রেরণ নয়, যখন কোন বার্তা গ্রহণ করা হয় তার জন্য সময়কাল দেখান</string> - <string name="pref_force_timestamps">Force timestamps</string> - <string name="pref_force_timestamps_summary">Enable timestamps for all messages</string> - <string name="pref_key_timestamp_delay">New timestamp delay</string> - <string name="pref_key_timestamp_delay_summary">The number of minutes which must elapse between two messages in order for a new timestamp to be shown.</string> - <string name="pref_compose_favorites">তারকাচিহ্নিত পরিচিতি সমূহ</string> - <string name="pref_compose_summary_favorites">কিউকে লেখনী উইন্ডোতে তারকাচিহ্নিত পরিচিতি গুলো দেখান, এটা মাত্র একটা স্পর্শের দেরী</string> - <string name="pref_prox_sensor_call">প্রক্সিমিটি সেন্সর</string> - <string name="pref_prox_sensor_call_summary">কথোপকথন চলা কালে আপনার ফোন টি আপনার কানের কাছে এনে একটি নতুন কল শুরু করতে পারেন</string> - <string name="pref_delivery">ডেলিভারি নিশ্চিতকরণ</string> - <string name="pref_delivery_summary">বার্তা সফলভাবে পাঠানো হয়েছে নিশ্চিত করুন</string> - <string name="pref_delivery_toast">Toast প্রদেখুন করুন</string> - <string name="pref_delivery_toast_summary">ছোট্ট একটি নোটিফিকেশন দিন এটা জানিয়ে যে বার্তা সরবরাহ করা হচ্ছে</string> - <string name="pref_delivery_vibrate">কাঁপান</string> - <string name="pref_delivery_vibrate_summary">বার্তা ডেলিভারিতে কম্পন দিন</string> - <string name="pref_delete_old_messages">Delete old messages</string> - <string name="pref_delete_old_messages_summary">Automatically delete messages once they\'re old enough</string> - <string name="pref_delete_old_messages_unread">অপঠিত বার্তা</string> - <string name="pref_delete_old_messages_unread_summary">Automatically delete unread messages after %s days</string> - <string name="pref_delete_old_messages_read">পঠিত বার্তাসমূহ</string> - <string name="pref_delete_old_messages_read_summary">Automatically delete read messages after %s days</string> - <string name="pref_yappy">ইয়েপ্পি সংযোগ</string> - <string name="pref_endlessjabber_summary">ইয়েপ্পির জন্য পূর্ণ সমর্থন চালু করুন</string> - <string name="pref_blocked_conversations">অবরুদ্ধ কথোপকথন</string> - <string name="pref_blocked_conversations_summary">কথোপকথন দীর্ঘক্ষণ চেপে ধরে এবং ব্লক করে ব্লকড্ ইনবক্সে সরান এবং নোটিফিকেশন পাওয়া বন্ধ করুন</string> - <string name="pref_block_future">ভবিষ্যতের বার্তাগুলো অবরুদ্ধ করুন</string> - <string name="pref_block_future_summary">অবরুদ্ধ করতে অতিরিক্ত ফোন নম্বর যুক্ত করুন</string> - <string name="pref_should_i_answer">উত্তর দেব কী? ইন্টিগ্রেশন</string> - <string name="pref_should_i_answer_summary">উত্তর দেব কি এর মাধ্যমে ব্লক করা নাম্বার গুলো থেকে আসা অন্তর্মুখী বার্তা স্বয়ংক্রিয়ভাবে মুছে ফেলুন?</string> - <string name="pref_mobile_only">মোবাইল নম্বর</string> - <string name="pref_mobile_only_summary">পরিচিতি পরামর্শে শুধুমাত্র মোবাইল নাম্বারই দেখান</string> - <string name="pref_auto_emoji">স্বয়ংক্রিয় ইমোজি</string> - <string name="pref_auto_emoji_summary">চিত্র ইমোজি দ্বারা লেখা প্রতিস্থাপন করুন</string> - <string name="pref_enter_button">এন্টার বোতাম</string> - <string name="pref_enter_button_summary">কীবোর্ড এর এন্টার বাটনের ব্যবহার পরিবর্তন করতে হালকা টোকা দিন</string> - <string name="pref_compose_group">দলীয় বার্তা</string> - <string name="pref_compose_group_summary">একাধিক ব্যক্তির প্রতি বার্তা রচনার সময়, স্বতন্ত্র বার্তার বদলে বার্তা গোষ্ঠী বার্তা প্রেরণ করুন</string> - <string name="pref_auto_download">স্বয়ংক্রিয়ভাবে এমএমএস ডাউনলোড করুন</string> - <string name="pref_auto_download_summary">যখন বিদ্যমান হয় তখন এমএমএস বার্তা স্বয়ংক্রিয়ভাবে ডাউনলোড করুন</string> - <string name="pref_auto_data">স্বয়ংক্রিয় ডাটা</string> - <string name="pref_auto_data_summary">এমএমএস পাঠানো বা গ্রহণের সময় স্বয়ংক্রিয়ভাবে ডাটা চালু করুন</string> - <string name="pref_split">এসএমএস বিভাজন করুন</string> - <string name="pref_split_summary">বড় বার্তাগুলো আলাদা বার্তা হিসেবে বিভক্ত করুন</string> - <string name="pref_split_counter">বিভাজন সংখ্যা</string> - <string name="pref_split_counter_summary">প্রতিটি বিভাজিত বার্তার সম্মুখে গণক যোগ করুন।</string> - <string name="pref_long_as_mms">বড়গুলোকে এমএমএস হিসেবে প্রেরণ করুন</string> - <string name="pref_long_as_mms_summary">বিভাজিত করার বদলে দীর্ঘ বার্তা এমএমএস হিসেবে প্রেরণ করুন</string> - <string name="pref_long_as_mms_after">দীর্ঘ বার্তা এমএমএস হিসেবে প্রেরণ করুন এর পরে</string> - <string name="pref_long_as_mms_after_summary">বার্তা দৈর্ঘ্য অতিক্রম করে গেলে দীর্ঘ বার্তাকে এমএমএস হিসেবে প্রেরণ করুন</string> - <string name="pref_return">প্রত্যাবর্তন বোতাম প্রদেখুন করুন</string> - <string name="pref_return_summary">কীবোর্ডে ইমোজি এর বদলে রিটার্ন কী দেখান</string> - <string name="pref_text">লেখা</string> - <string name="pref_notifications">এস‌এম‌এস নোটিফিকেশন চালু</string> - <string name="pref_led">নোটিফিকেশন এলইডি</string> - <string name="pref_theme_led">নোটিফিকেশন এলইডির রঙ</string> - <string name="pref_wake">ফোন জাগিয়ে তুলুন</string> - <string name="pref_wake_summary">যখন নতুন কোন বার্তা গ্রহণ করা হয় তখন ফোনের পর্দা চালু করুন</string> - <string name="pref_notifications_private">ব্যক্তিগত নোটিফিকেশন</string> - <string name="pref_notifications_private_summary">নোটিফিকেশনে কি লুকানো হবে তা পরিবর্তন করতে হালকা টোকা দিন</string> - <string name="pref_ringtone">নোটিফিকেশন শব্দ</string> - <string name="pref_ringtone_summary">নোটিফিকেশন শব্দ নির্বাচন করুন</string> - <string name="pref_ticker">টিকার প্রদেখুন করুন</string> - <string name="pref_ticker_summary">নোটিফিকেশন বার এএ নতুন বার্তার স্নিপেটস দেখান</string> - <string name="pref_vibration">কম্পন</string> - <string name="pref_vibration_summary">নতুন বার্তা গ্রহণ করা হলে কম্পন দিন</string> - <string name="pref_notification_call">কল বোতাম</string> - <string name="pref_notification_call_summary">নোটিফিকেশন থেকেই প্রেরককে কল করুন</string> - <string name="pref_dimiss_read">পঠিত হিসাবে চিহ্নিত করুন</string> - <string name="pref_dismiss_read_summary">যখন প্রজ্ঞাপন অপসারিত করা হয় তখন বার্তা পঠিত হিসেবে চিহ্নিত করুন</string> - <string name="pref_delayed">বিলম্বিত বার্তা প্রেরণ</string> - <string name="pref_delayed_summary">অপেক্ষা করুন যাতে আপনি পর্যালোচনা করার সুযোগ পান আপনার বার্তা প্রেরণ করার পূর্বে</string> - <string name="pref_delayed_duration">বিলম্ব দৈর্ঘ্য (সেকেন্ড)</string> - <string name="pref_delayed_duration_summary">আপনার বার্তা প্রেরণ করার আগ পর্যন্ত অপেক্ষা করার সময়</string> - <string name="pref_night_auto">স্বয়ংক্রিয় নাইট মোড</string> - <string name="pref_night_auto_summary">স্বয়ংক্রিয়ভাবে সময়ের উপর ভিত্তি করে নাইট মোড চালু করুন</string> - <string name="pref_day_start">দিন শুরু হয়।</string> - <string name="pref_night_start">রাত শুরু হয়।</string> - <string name="pref_qk_responses">কিউকে এর সাড়াসমূহ</string> - <string name="pref_qk_responses_summary">আপনার এন্ড্রয়েড ওয়্যার ডিভাইসের প্রিসেট করা সাড়া গুলো পরিবর্ধন করুন</string> - <string name="pref_quickreply_enabled">কিউকে রিপ্লাই চালু</string> - <string name="pref_quickreply_enabled_summary">নতুন বার্তা যখনই আসবে কিউকে রিপ্লাই উইন্ডো দেখাবেন</string> - <string name="pref_tap_to_quit">বাতিল করতে হালকা টোকা দিন</string> - <string name="pref_tap_to_quit_summary">এটা বন্ধ করার জন্য উইন্ডোটির বাইরে কোথাও হালকা টোকা দিন</string> - <string name="pref_quickcompose">কিউকে লেখনী চালু</string> - <string name="pref_quickcompose_summary">এমন একটি নোটিফিকেশন দেখান যার উপর ক্লিক করে নতুন বার্তা লেখা যাবে</string> - <string name="pref_mms_enabled">এমএমএস চালু</string> - <string name="pref_mms_enabled_summary">এমএমএস বার্তা গ্রহণ এবং প্রেরণ করা চালু করুন</string> - <string name="pref_mmsc_url">MMSC</string> - <string name="pref_mms_proxy">এমএমএস প্রক্সি</string> - <string name="pref_mms_port">এমএমএস পোর্ট</string> - <string name="pref_apn_chooser">পূর্ব-নির্ধারিত এপিএন লোড করুন</string> - <string name="pref_strip_unicode">ইউনিকোড বাদ দিন</string> - <string name="pref_strip_unicode_summary">জিএসএম সমর্থিত নয় এমন পূর্ণ দৈর্ঘ্যের বার্তা গুলোর ক্যারেক্টার অদলবদল করুন</string> - <string name="pref_system_bar_flat">ফ্ল্যাট সিস্টেম বার</string> - <string name="pref_system_bar_flat_summary">বেশির ভাগ কিটক্যাট ডিভাইসের সিস্টেম ইউআই বারে দেখানো আভা থেকে নিষ্কৃতি পান</string> - <string name="pref_status_compat">স্থিতি দণ্ড মেরামতি</string> - <string name="pref_status_compat_summary">ইমার্সিভ মোড, রঞ্জিত স্ট্যাটাস বার (Xposed) বা কাস্টম ডিপিআই সেটিংস দ্বারা ঘটিত বিষয় ঠিক করে</string> - <string name="pref_navigation_compat">নেভিগেশন দণ্ড মেরামতি</string> - <string name="pref_navigation_compat_summary">ইমার্সিভ মোড, রঞ্জিত স্ট্যাটাস বার (Xposed) বা কাস্টম ডিপিআই সেটিংস দ্বারা ঘটিত বিষয় ঠিক করে</string> - <string name="pref_about_version_title">কিউকে এস‌এম‌এস সংস্করণ</string> - <string name="pref_about_authors_title">লেখক</string> - <string name="pref_about_authors_summary">Moez Bhatti</string> - <string name="pref_changelog_summary">পরিবর্তনসূচী দেখতে হালকা টোকা দিন</string> - <string name="pref_about_thanks_title">আপনাকে ধন্যবাদ</string> - <string name="pref_about_thanks_summary">ওপেন-সোর্সে অবদানকারীদেরকে দেখতে হালকা টোকা দিন</string> - <string name="pref_donate_title">দান করুন</string> - <string name="pref_donate_summary">কিউকে এসএমএস বিনামূল্য। আমাদেরকে অনুদানের মাধ্যমে সাহায্য করুন!</string> - <string name="pref_about_gplus_title">গুগল +</string> - <string name="pref_about_gplus_summary">গুগল প্লাস এ বেটা কমিউনিটি তে যোগ দিন</string> - <string name="pref_about_github_title">GitHub</string> - <string name="pref_about_github_summary">কিউকে এস‌এম‌এস ওপেন সোর্স। অবদান রাখতে এবং এ বিষয়ে প্রতিবেদন করতে গিটহাব যান</string> - <string name="pref_about_crowdin_title">Crowdin</string> - <string name="pref_about_crowdin_summary">কিউকে এস‌এম‌এস এর অনুবাদ প্রকল্প Crowdin এ যোগ দিন।</string> - <!--Preference subcategory--> - <string name="pref_subcat_theme">থিম</string> - <!--Preference subcategory--> - <string name="pref_subcat_system_bars">সিস্টেম বার</string> - <!--Preference subcategory--> - <string name="pref_subcat_categories">ক্যাটাগরি</string> - <!--Preference subcategory--> - <string name="pref_subcat_font">ফন্ট</string> - <!--Preference subcategory--> - <string name="pref_subcat_messages">বার্তা</string> - <!--Preference subcategory--> - <string name="pref_subcat_avatars">অবতার</string> - <string name="donate_google">গুগলের দ্বারা দান করুন।</string> - <string name="donate_google_summary">গুগল ৩০ শতাংশ অনুদান নিয়ে নেয়</string> - <string name="donate_paypal">পেপাল দিয়ে দান করুন</string> - <string name="donate_paypal_button">যে কোন পরিমান দান করুন।</string> - <string name="donate_paypal_button_summary">আমাকে যে কোন একটা কিছু কিনে দিন!</string> - <!--Donation product name--> - <string name="product_name_donation">অনুদান</string> - <!--$1 donation product name--> - <string name="product_name_donate_1">১ ডলার দান করুন।</string> - <!--$5 donation product name--> - <string name="product_name_donate_5">৫ ডলার অনুদান দিন</string> - <!--$3 donation product name--> - <string name="product_name_donate_10">১০ ডলার অনুদান দিন</string> - <!--$1 donation product description--> - <string name="product_description_donate_1">আমাকে কোক কিনে দিন</string> - <!--$5 donation product description--> - <string name="product_description_donate_5">আমার জন্য স্যান্ডুইচ কিনুন</string> - <!--$10 donaion product description--> - <string name="product_description_donate_10">আমার জন্য লাঞ্চ কিনুন</string> - <string name="title_settings">সেটিংস</string> - <string name="title_search">সন্ধান করুন</string> - <string name="title_compose">রচনা করুন</string> - <string name="title_conversation_list">কথোপকথন</string> - <string name="title_blocked">অবরুদ্ধ</string> - <string name="title_changelog">পরিবর্তনসূচী</string> - <string name="title_picker">নতুন বার্তাসমূহ</string> - <string name="title_donate">অনুদান দিন</string> - <string name="title_qk_responses">কিউকে এর সাড়াসমূহ</string> - <string name="title_block_address">নাম্বার ব্লক করুন</string> - <string name="title_unblock_address">নাম্বার আনব্লক করুন</string> - <string name="title_conversations_selected">%s নির্বাচিত</string> - <string name="title_palette">প্যালেট</string> - <string name="title_rgb">RGB</string> - <!-- Menu shown in the context menu when long pressing on a message when the message contains - one or more phone numbers and/or email addresses and the number or email is new to - contacts. [CHAR LIMIT=50] --> - <string name="menu_add_address_to_contacts"><xliff:g id="contactEmailOrNumber">%s</xliff:g> কে পরিচিততে যোগ করুন</string> - <!-- Context menu item on an individual message for viewing an attached slideshow --> - <string name="view_slideshow">স্লাইড শো দেখুন</string> - <!-- Context menu item on an individual message for viewing message details such as time and date --> - <string name="view_message_details">বিস্তারিত দেখুন</string> - <!-- Context menu item on an individual message for viewing a delivery report --> - <string name="view_delivery_report">প্রতিবেদন দেখুন</string> - <!-- Context menu item on an individual message for deleting only that message --> - <string name="delete_message">মুছে ফেলুন</string> - <!-- Abbreviation for "kilobyte" --> - <string name="kilobyte">কেবি</string> - <!-- Individual message context menu item --> - <string name="copy_message_text">লেখা কপি করুন</string> - <!-- Header for context menu on an individual message --> - <string name="message_options">বার্তা বিকল্পসমূহ</string> - <!-- Delivery Header View --> - <!-- Title of "Report" window --> - <string name="delivery_header_title">প্রতিবেদন</string> - <!--Text for app restart confirmation dialog--> - <string name="restart_message">এই পরিবর্তন পরবর্তী সময়ে কিউকে এসএমএস খোলা হলে প্রযুক্ত হবে</string> - <!--Dialog title for asking if a user wants to delete a conversation--> - <string name="delete_conversation">কথোপকথন মুছে ফেলুন</string> - <!--Dialog title for asking if a user wants to delete all failed messages--> - <string name="delete_all_failed">ব্যর্থ বার্তাগুলি বিলোপ করুন</string> - <!--CDialog title for asking if a user wants to delete a conversation--> - <string name="delete_confirmation">আপনি কি নিশ্চিত যে আপনি %s টি কথোপকথন মুছে ফেলতে চান?</string> - <!--CDialog title for asking if a user wants to delete all failed messages--> - <string name="delete_all_failed_confirmation">আপনি কি নিশ্চিত যে আপনি ব্যর্থ বার্তা গুলো (%s) কথোপকথন থেকে বিলোপ করতে চান?</string> - <!--(Unused) Dialog title shown if APNs have not been set--> - <string name="apns_not_set">APNs সেট করা নেই</string> - <!--(Unused) Dialog description shown if APNs have not been set--> - <string name="apns_not_set_description">এটা মনে হচ্ছে যে আপনার এপিএন সেট করা হয় নি । এর মানে হল এমএমএস যথাযথভাবে কাজ করবে না। অনুগ্রহ করে ঠিক আছে তে ক্লিক করুন কিউকে এসএমএস আপনার জন্য খুঁজে বের করার জন্য :)</string> - <!--Dialog title show if MMS hasn't been configured--> - <string name="set_up_mms_title">এমএমএস সেট করবেন?</string> - <!--Dialog description shown if MMS hasn't yet been configured--> - <string name="set_up_mms_description">এটি মনে হচ্ছে যে আপনার এমএমএস কিউকে এসএমএস এর মধ্যে এখনও কনফিগার করা হয় নি । স্বয়ংক্রিয়ভাবে এমএমএস সেট আপ করতে ঠিক আছে টিপুন।</string> - <!-- Dialog message text explaining that a draft message will not be saved due to invalid recipients --> - <string name="discard_message_reason">আপনার বার্তা মুছে ফেলা হবে কারণ এটির কোন বৈধ গ্রহীতা নেই।</string> - <string name="invalid_code">অকার্যকর কোড</string> - <!--Button to restart app now instead of manually later--> - <string name="restart">এখন রিস্টার্ট করুন</string> - <!--Notification action to reply to a message--> - <string name="reply">উত্তর দিন</string> - <!--Notification action to reply to a message--> - <string name="reply_qksms">কিউকে এস‌এম‌এস এর মাধ্যমে জবাব দিন</string> - <!--Notification action to mark a message as read--> - <string name="read">পঠিত</string> - <!--Notification action to mark a message as read--> - <string name="mark_read">পঠিত হিসাবে চিহ্নিত করুন</string> - <!--Notification action to call the sender of a message--> - <string name="call">কল করুন</string> - <!-- Notification toast message --> - <string name="notification_mute_on">নোটিফিকেশন চালু</string> - <string name="notification_mute_off">নোটিফিকেশন বন্ধ</string> - <!--Positive action button--> - <string name="yes">\"হ্যাঁ\"</string> - <string name="add">যুক্ত করুন</string> - <!--Positive action button--> - <string name="save">সংরক্ষণ করুন</string> - <!--Positive action button--> - <string name="enable">চালু করুন</string> - <!--Positive action button--> - <string name="upgrade_now">এখনই সেট করুন</string> - <!--Positive action button--> - <string name="okay">ঠিক আছে</string> - <!--Positive action button--> - <string name="redeem">পরিশোধ করুন</string> - <!--Neutral action button--> - <string name="just_once">শুধু একবার</string> - <!--Neutral action button--> - <string name="later">পরে</string> - <!--Neutral action button --> - <string name="cancel">বাতিল করুন</string> - <!-- Name of the local user when displaying sender of an outgoing message (personal pronoun) --> - <string name="messagelist_sender_self">আমি</string> - <!-- Sender to be used if the sender address has been hidden --> - <string name="hidden_sender_address">লুক্কায়িত প্রেরকের ঠিকানা</string> - <!-- Subject to display in the conversation list if there is no subject --> - <string name="no_subject_view">(কোনো বিষয় নেই)</string> - <!-- Time and date a message is due to expire --> - <string name="expire_on">"Expires: <xliff:g id="date">%s</xliff:g>"</string> - <!-- Formatting for subject displayed inline, prepended to MMS message text --> - <string name="inline_subject">"<Subject: <xliff:g id="subject">%s</xliff:g>>"</string> - <!-- Text of a button appearing for MMS messages that have not yet been downloaded, causing the message to be downloaded (imperative verb) --> - <string name="download">ডাউনলোড করুন</string> - <!-- Message displayed in place of the "download message" button once it has been pressed, indicating that the download is in progress --> - <string name="downloading">ডাউনলোড করা হচ্ছে</string> - <!-- Toast message while an image is being resized --> - <string name="compressing">অনেক বড় ছবি। সংকুচিত করা হচ্ছে\u2026</string> - <!-- Header shown above favorite contacts in QKCompose --> - <string name="favorites">তারকাচিহ্নিত পরিচিতিসমূহ</string> - <!-- Word represents 'self' in a conversation --> - <string name="me">আমি</string> - <string name="menu_edit">সম্পাদনা করুন</string> - <string name="menu_delete_messages">আমি</string> - <string name="menu_delete_failed">ব্যর্থ বার্তাগুলি বিলোপ করুন</string> - <string name="menu_lock">লক করুন</string> - <string name="menu_unlock">আনলক করুন</string> - <!-- When the user tries to view message details and some error occurs while - retrieving those details, this message will be shown. --> - <string name="cannot_get_details">বিস্তারিত বিবরণ পাওয়া যায়নি।</string> - <!-- Title of "Message details" dialog --> - <string name="message_details_title">বার্তাটির বিস্তারিত</string> - <!-- Label in "Message details" dialog --> - <string name="message_type_label">ধরণ\u000A</string> - <!-- "Type" value in "Message details" dialog --> - <string name="text_message">লিখিত বার্তা</string> - <!-- "Type" value in "Message details" dialog --> - <string name="multimedia_message">মাল্টিমিডিয়া বার্তা</string> - <!-- "Type" value in "Message details" dialog --> - <string name="multimedia_notification">মাল্টিমিডিয়া বার্তা প্রজ্ঞাপন</string> - <!-- Label in "Message details" dialog showing who sent the message. --> - <string name="from_label">হতে\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="to_address_label">প্রতি\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="bcc_label">Bcc\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="sent_label">প্রেরিত\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="received_label">প্রাপ্ত\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="saved_label">সংরক্ষিত\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="subject_label">বিষয়বস্তু\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="message_size_label">বার্তার আকার\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="priority_label">অগ্রাধিকার\u000A</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_high">উচ্চ</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_normal">স্বাভাবিক</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_low">নিম্ন</string> - <!-- Label in "Message details" dialog --> - <string name="message_class_label">বার্তা ক্লাস\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="error_code_label">ত্রুটি কোড\u000A</string> - <!-- Alert dialog title when creating a slideshow [CHAR LIMIT=none] --> - <string name="building_slideshow_title">স্লাইড শো তৈরি করা হচ্ছে</string> - <!-- Tag appearing on conversations in the conversation list that contain a draft message --> - <string name="has_draft">খসড়া</string> - <!-- In conversation list items, this is the separator between a contact's name and the draft stamp [CHAR LIMIT=5] --> - <string name="draft_separator">,\u0020</string> - <!-- In conversation list items, this comes after the receipient's name and contains the number of messages in the thread [CHAR LIMIT=5] --> - <string name="message_count_format">\u00a0<xliff:g id="number" example="1">%1$s</xliff:g></string> - <!-- For debugging: Dialog box title indicating there's a situation where data has unexpectedly changed --> - <string name="error_state">সঙ্গতিহীন অবস্থা</string> - <!-- For debugging: Dialog box text indicating there's a situation where data has unexpectedly changed --> - <string name="error_state_text">প্রাপক ও থ্রেড অবস্থা অসঙ্গতিপূর্ণ । অনুগ্রহ করে বাগ রিপোর্ট ক্যাপচার ও http://go/droidanizer মাধ্যমে প্রতিবেদন করুন </string> - <!-- This is the dialog title for the "Select link" dialog, shown when the user clicks on a - chat in the chat history view if there are links in the chat message. The dialog displays the - links if there are any --> - <string name="select_link_title">কাজ বাছুন</string> - <!-- In message list items, this string builds the timestamp line when the message is in a group [CHAR LIMIT=NONE] --> - <string name="message_timestamp_format"><xliff:g id="string" example="Fred Flinstone">%1$s</xliff:g>\u0020-\u0020<xliff:g id="string" example="9:39AM">%2$s</xliff:g></string> - <!--Message sending status: sending--> - <string name="status_sending">প্রেরণ করা হচ্ছে…</string> - <!--Message sending status: failed--> - <!--<string name="status_failed">Failed. Tap to retry</string>--> - <!-- Delivery Report Activity --> - <!-- Status in "Report" window --> - <string name="status_none">(কিছুই না)</string> - <!-- Status in "Report" window --> - <string name="status_pending">অনিষ্পন্ন</string> - <!-- Status in "Report" window --> - <string name="status_read">পঠিত</string> - <!-- Status in "Report" window --> - <string name="status_received">প্রাপ্ত</string> - <!-- Status in "Report" window --> - <string name="status_failed">ব্যর্থ হয়েছে। বিকল্পের জন্য হালকা টোকা দিন</string> - <!-- Status in "Report" window --> - <string name="status_unread">অপঠিত</string> - <!-- Status in "Report" window --> - <string name="status_rejected">প্রত্যাখ্যাত</string> - <!-- Label in "Report" window --> - <string name="recipient_label">প্রাপক: \u0020</string> - <!-- Label in "Report" window --> - <string name="status_label">অবস্থা: \u0020</string> - <!-- Label in "Report" window [CHAR LIMIT=50]--> - <string name="delivered_label">সরবরাহ করা হয়েছে: \u0020</string> - <string name="do_something">কিছু একটা করুন</string> - <!-- Confirm Delete --> - <!-- Delete confirmation dialog title --> - <string name="confirm_dialog_title">মুছবেন?</string> - <!-- Delete confirmation dialog title for locked messages --> - <string name="confirm_dialog_locked_title">ব্লক করা বার্তা বিলোপ করবেন?</string> - <!-- This message is displayed in a confirmation dialog when the user selects one or more - conversations and then taps the "Delete" button. --> - <plurals name="confirm_delete_conversation"> - <!-- Case of 1 result. --> - <item quantity="one">একটি কথোপকথন মুছে ফেলা হবে।</item> - <!-- Case of 0 or 2 or more results. --> - <item quantity="other"><xliff:g id="number" example="15">%1$s </xliff:g> টি কথোপকথন মুছে ফেলা হবে।</item> - </plurals> - <string name="confirm_delete_conversation">সম্পূর্ণ থ্রেড মুছে ফেলা হবে।</string> - <!-- Delete all threads confirmation dialog message --> - <string name="confirm_delete_all_conversations">সব থ্রেড মুছে ফেলা হবে।</string> - <!-- Delete message confirmation dialog message --> - <string name="confirm_delete_message">বার্তাটি মুছে ফেলা হবে।</string> - <!-- Delete message confirmation dialog message for a locked message --> - <string name="confirm_delete_locked_message">ব্লক করা বার্তাটি বিলোপ করবেন?</string> - <!-- Delete all the messages on the SIM dialog message --> - <string name="confirm_delete_all_SIM_messages">সিম কার্ডের সমস্ত বার্তা মুছে ফেলা হবে।</string> - <!-- Delete the selected message on the SIM dialog message --> - <string name="confirm_delete_SIM_message">এই সিম কার্ডের বার্তা মুছে ফেলা হবে।</string> - <!-- Delete unlocked checkbox title --> - <string name="delete_unlocked">ব্লক করা বার্তাগুলি বিলোপ করুন</string> - <!-- Delete button title --> - <string name="delete">মুছে ফেলুন</string> - <!-- More button title --> - <string name="more">আরো</string> - <!-- More button summary --> - <string name="more_summary">আরো দেখতে হালকা টোকা দিন</string> - <!-- Action bar mode title when multi-selecting conversations --> - <string name="select_conversations">কথোপকথন বাছুন</string> - <!-- Show this in the middle of the main activity when there are no conversations [CHAR LIMIT=none] --> - <string name="no_conversations">কোন কথোপকথন নেই।</string> - <!-- Show this in the middle of the main activity when loading conversations [CHAR LIMIT=none] --> - <string name="loading_conversations">কথোপকথন লোড করা হচ্ছে।</string> - <!-- Tells the user that QKSMS isn't the default SMS app --> - <string name="not_default">পূর্ব-নির্ধারিত এসএমএস</string> - <!-- Tells the user they need to set QKSMS as the default app in order to use this feature --> - <string name="default_info">কিউকে এসএমএস আপনার সেই এসএমএস অ্যাপ হওয়া প্রয়োজন</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to mark messages as read --> - <string name="not_default_mark_read">কিউকে এসএমএস আপনার বার্তার পঠিত চিহ্নিত করার অ্যাপ হওয়া প্রয়োজন</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to mark messages as unread --> - <string name="not_default_mark_unread">কিউকে এসএমএস আপনার বার্তার অপঠিত চিহ্নিত করার অ্যাপ হওয়া আবশ্যক</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to send messages --> - <string name="not_default_delete">কিউকে এসএমএস আপনার বার্তাগুলি মুছে ফেলার অ্যাপ হওয়া আবশ্যক</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to delete messages --> - <string name="not_default_send">কিউকে এসএমএস আপনার বার্তা প্রেরণের অ্যাপ হওয়া আবশ্যক</string> - <!-- Tells the user they should set QKSMS as the default messaging app --> - <string name="not_default_first">কিছু কিছু জিনিস ততক্ষণ কাজ করবে না যতক্ষণ পর্যন্ত না কিউকে এসএমএস কে পূর্ব-নির্ধারিত এসএমএস অ্যাপ হিসেবে সেট করা হবে।</string> - <string name="delayed_messaging_info">বিলম্বিত বার্তা প্রেরণ করার আগে বার্তা বাতিল করতে আপনাকে সুযোগ করে দেয়। ডিফল্ট আচরণ ও অন্যান্য জিনিস সেটিংসে পরিবর্তন করুন</string> - <string name="delayed_duration_bounds_error">স্থিতিকাল হতে হবে ১ এবং ৩০ সেকেন্ডের মধ্যে</string> - <!-- Dialog title for the Read Report dialog. --> - <string name="confirm">নিশ্চিত করুন</string> - <!-- Dialog text for the Read Report dialog. --> - <string name="message_send_read_report">পঠিত রিপোর্ট পাঠানো হবে।</string> - <!-- Dialog title for updating app icon color --> - <string name="update_icon_title">আইকনের রঙ আধুনিকীকরণ করুন</string> - <!-- Dialog message for updating app icon color --> - <string name="update_icon_message">QKSMS must be restarted when changing the icon color</string> - <string name="dialog_conversation_details_title">কথোপকথন বিস্তারিত</string> - <string name="dialog_conversation_details_last_message_date">সর্বশেষ বার্তার তারিখ</string> - <string name="dialog_conversation_details_message_count">বার্তা সংখ্যা</string> - <string name="dialog_conversation_details_recipients">প্রাপক (%s)</string> - <string name="dialog_should_i_answer_title">উত্তর দেব কী? ইনস্টল করা নেই</string> - <string name="dialog_should_i_answer_message">এখন কী গুগল প্লে থেকে অ্যাপটি ডাউনলোড করতে চান?</string> - <string name="dialog_delete_old_messages">Are you sure you want to automatically delete old messages?</string> - <!-- Title for audio file picker --> - <string name="select_audio">অডিও বাছুন</string> - <!-- Menu title to copy an attachment to the shared storage [CHAR LIMIT=25] --> - <string name="copy_to_sdcard">সংযুক্তি সংরক্ষণ করুন</string> - <!-- Toast message on successful copy to shared storage [CHAR LIMIT=30] --> - <string name="copy_to_sdcard_success">সংযুক্তি সংরক্ষিত।</string> - <!-- Toast message on failed copy to shared storage [CHAR LIMIT=30] --> - <string name="copy_to_sdcard_fail">সংযুক্তি সংরক্ষণ করা যায়নি।</string> - <!-- Menu title to save a sound as a ringtone --> - <string name="save_ringtone">রিংটোন হিসেবে সংরক্ষণ করুন</string> - <!-- Toast message on successful copying ringtone to drm provider --> - <string name="saved_ringtone">রিংটোন সংরক্ষিত।</string> - <!-- Toast message on failed copying ringtone to drm provider --> - <string name="saved_ringtone_fail">রিংটোন সংরক্ষণ করা যায়নি।</string> - <!-- Menu item --> - <!-- Menu item [CHAR LIMIT=40] --> - <string name="menu_group_participants">দলীয় অংশগ্রহণকারী</string> - <!--Toast shown when a draft is saved--> - <string name="toast_draft">সংরক্ষিত খসড়া</string> - <!--Toast shown when a conversation is deleted--> - <string name="toast_conversation_deleted">কথোপকথন মুছে ফেলা হয়েছে</string> - <!--Toast shown when device is low on storage--> - <string name="toast_low_memory">"ফোনের স্মৃতি পূর্ণ। খালি করার জন্য কিছু ফাইল মুছে ফেলুন।"</string> - <!--Toast shown to tell user that forwarding messages doesn't work yet--> - <string name="toast_forward">এই বৈশিষ্ট্যটি এখনো বাস্তবায়িত হয়নি। এখন দয়া করে লেখা কপি অপশন ব্যবহার করুন এবং এটি প্রেরণ করতে চাইলে কথোপকথনে পেস্ট করে দিন।</string> - <!--Toast shown for unimplemented features--> - <string name="toast_unimplemented">এই বৈশিষ্ট্যটি এখনো বাস্তবায়িত হয়নি।</string> - <!--Toast shown when a message fails to send--> - <string name="toast_message_failure">বার্তা প্রেরণ করতে ব্যর্থ হয়েছে।</string> - <!--Toast shown when a message is delivered--> - <string name="toast_message_delivered">বার্তা ডেলিভার করা হয়েছে</string> - <!--Toast shown when a message is not delivered--> - <string name="toast_message_not_delivered">বার্তাটি সরবরাহ করা হয় নি</string> - <!--Toast shown when default APNs are loaded--> - <string name="toast_default_apns_loaded">পূর্ব-নির্ধারিত এপিএন সেটিংস লোড করা হয়েছে</string> - <!--Toast shown when text is copied to the clipboard--> - <string name="toast_copy_text">ক্লিপবোর্ড এ কপি করা হয়েছে</string> - <!--Toast shown when Google Play Services is not available for purchasing a product--> - <string name="toast_billing_not_available">ক্রয় করতে আপনার এন্ড্রয়েড ডিভাইসে গুগল প্লে স্টোর (বিলিং) প্রয়োজন</string> - <!--Toast shown when Google Play Services is not available for purchasing a product--> - <string name="toast_endlessjabber_not_installed">EndlessJabber ইনস্টল করা হয় নি, গুগল প্লে খোলা হচ্ছে</string> - <string name="toast_changelog_error">পরিবর্তনসূচী লোড করতে পারেনি। অনুগ্রহ করে পরে আবার চেষ্টা করুন</string> - <string name="toast_conversation_error">Couldn\'t open conversation</string> - <string name="toast_deleting_old_messages">Your old messages will be deleted shortly</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_1">অনুদানের জন্য ধন্যবাদ! আপনিই আমার নতুন সেরা বন্ধু।</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_2">অনুদানের জন্য ধন্যবাদ! আমি আপনাকে ভালোবাসি।</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_3">অনুদানের জন্য ধন্যবাদ! আপনি কিউকে এসএমএস কে সাহায্য করছেন কারণ এটাই সেরা এসএমএস অ্যাপ</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_4">অনুদানের জন্য ধন্যবাদ! আপনি এক কথায় অসাধারণ।</string> - <!--Menu option to mute conversation--> - <string name="menu_mute_conversation">কথোপকথন মৌন করুন</string> - <!--Menu option to mute conversation--> - <string name="menu_unmute_conversation">কথোপকথন মৌনতাহীন করুন</string> - <string name="menu_block_conversations">কথোপকথন ব্লক করুন</string> - <string name="menu_unblock_conversations">কথোপকথন আনব্লক করুন</string> - <string name="menu_messages">বার্তা</string> - <string name="menu_blocked">অবরুদ্ধ</string> - <string name="menu_blocked_conversations">ব্লক (%s টি নতুন)</string> - <string name="menu_unblocked_conversations">বার্তা (%s নতুন)</string> - <string name="menu_notifications">নোটিফিকেশন</string> - <string name="menu_notifications_off">প্রজ্ঞাপন বন্ধ</string> - <string name="menu_notification_settings">কথোপকথন সেটিংস</string> - <string name="menu_view_details">বিস্তারিত দেখুন</string> - <string name="menu_mark_read">পঠিত চিহ্নিত করুন</string> - <string name="menu_mark_unread">অপঠিত চিহ্নিত করুন</string> - <string name="menu_delete_conversation">কথোপকথন মুছে ফেলুন</string> - <string name="menu_multi_select">কথোপকথন নির্বাচন করুন</string> - <string name="menu_done">সম্পন্ন</string> - <string name="failed_message_title">ব্যর্থ বার্তা বিকল্পসমূহ</string> - <!--Toast shown to tell the user that they don't have a photo attachments app, and suggests that they download one--> - <string name="attachment_app_not_found">সংযুক্তি অ্যাপ খুঁজে পাওয়া যায়নি। ফটো গ্যালারী অ্যাপ ইনস্টল করার চেষ্টা করুন!</string> - <string name="attachment_camera_error">ক্যামেরা খোলা যাবে না</string> - <string name="pref_max_mms_attachment_size">সর্বোচ্চ এমএমএস সংযুক্তির আকার</string> - <string name="error_no_recipients">এই বার্তাটি প্রেরণ করতে কোন একটি পরিচিতি নির্বাচন করুন!</string> - <string name="error_file_not_found">আপনি যে ফাইলটি শেয়ার করার চেষ্টা করছেন কিউকে এসএমএস তা এক্সেস করতে পারছে না!</string> - <string name="sending_blocked_welcome_screen_message">দাঁড়ান! এক মিনিটের মধ্যে আপনি বাস্তব বার্তা প্রেরণ করতে পারবেন!</string> - <string name="notification_colored_icon_ready">আপনার নীড় পর্দা থেকে লঞ্চারে যুক্ত করতে চাইলে স্পর্শ করুন?</string> - <string name="notification_title_colored_icon_ready">কিউকে এস‌এম‌এস এর রঙীন আইকন তৈরি</string> - <string name="icon_ready">আপনার নতুন আইকন তৈরি!</string> - <string name="icon_ready_message">আপনি এখন এটি হালনাগাদকৃত রঙ দিয়ে আবার আপনার নীড় পর্দায় যুক্ত করতে পারেন।</string> - <string name="dont_ask_again">পুনরায় জিজ্ঞাসা করবেন না</string> - <string name="warning">Stagefright সতর্কতা</string> - <string name="stagefright_warning">ভিডিও বার্তায় ক্ষতিকারক ম্যালওয়্যার থাকতে পারে যা আপনার ফোনকে ভাইরাস আক্রমণের জন্য অরক্ষিত করে দিতে পারে। আপনি কি অবিরত রাখতে চান?</string> - <!-- MMS DIALOG SETUP STRINGS --> - <string name="mms_setup_set_up_mms_title">এমএমএস সেট করবেন?</string> - <string name="mms_setup_set_up_mms_body">এমএমএস সার্ভিস কিউকে এসএমএস এ সেট নয় বলে মনে হচ্ছে। এমএমএস স্বয়ংক্রিয়ভাবে কনফিগার করতে ঠিক আছে টিপুন।</string> - <string name="mms_setup_setting_up_later_title">পরে এমএমএস সেট আপ করা হচ্ছে</string> - <string name="mms_setup_setting_up_later_body">স্বয়ংক্রিয় কনফিগারেশনের চেষ্টা করুন, সহায়তার সাথে যোগাযোগ করুন বা আপনার নিজের কনফিগারেশন প্রবেশ করতে সেটিংসের এমএমএস অংশে ভিজিট করুন।</string> - <string name="mms_setup_no_configurations_found_title">কোনো কনফিগারেশন খুঁজে পাওয়া যায়নি</string> - <string name="mms_setup_no_configurations_found_body">আমরা আপনার সেবাদাতার জন্য এমএমএস কনফিগারেশন খুঁজে পাইনি। সাহায্যে যোগাযোগ করতে ঠিক আছে টিপুন। আমরা সেট আপ করতে সাহায্য করবো! </string> - <string name="mms_setup_one_configuration_found_title">একটি কনফিগারেশন খুঁজে পাওয়া গেছে</string> - <string name="mms_setup_one_configuration_found_body">আমরা আপনার সেবাদাতা %s\'র জন্য একটি এমএমএস কনফিগারেশন খুঁজে পেয়েছি। শুনতে ঠিক মনে হচ্ছে?</string> - <string name="mms_setup_multiple_configurations_found_title">একাধিক কনফিগারেশন খুঁজে পাওয়া গেছে</string> - <string name="mms_setup_multiple_configurations_found_body">আমরা একাধিক এমএমএস কনফিগারেশন খুঁজে পেয়েছি। আপনার সেবাদাতার তালিকা থেকে বাছুন বা আপনার সেবাদাতার তালিকায় না থাকলে N/A চাপুন।</string> - <string name="mms_setup_next_steps_title">পরবর্তী পদক্ষেপ</string> - <string name="mms_setup_next_steps_body">আবার স্বয়ংক্রিয় কনফিগারেশনের চেষ্টা করুন, সহায়তার সাথে যোগাযোগ করুন বা আপনার নিজের কনফিগারেশন প্রবেশ করাতে সেটিংসের এমএমএস অংশে ভিজিট করুন।</string> - <string name="mms_setup_success_title">সাফল্য!</string> - <string name="mms_setup_success_body">আপনি যদি কোন সমস্যায় পড়েন, স্বয়ংক্রিয় কনফিগারেশন আবার চেষ্টা করুন, সহায়তার সাথে যোগাযোগ করুন বা আপনার নিজের কনফিগারেশন প্রবেশ করাতে সেটিংস এর এমএমএস অংশে ভিজিট করুন।</string> - <string name="na">N/A</string> - <string name="no">না</string> - <string name="pref_automatically_configure_mms">এমএমএস স্বয়ংক্রিয়ভাবে কনফিগার করুন</string> - <string name="pref_mms_contact_support">যোগাযোগ করুন সহায়তায়</string> - <string name="pref_category_sending_mms">এমএমএস প্রেরণ করা হচ্ছে</string> - <string name="pref_category_mms_configuration">এমএমএস কনফিগারেশন</string> - <string name="pref_mms_contact_support_summary">কিউকে এসএমএস টীমের সাথে যোগাযোগ করুন এমএমএস সেট আপ এ সহায়তার জন্য</string> - <string name="pref_markdown_enabled">টেক্সট ফরম্যাটিং</string> - <string name="pref_markdown_enabled_summary">বোল্ড, আন্ডারলাইন এবং ইটালিক পেতে আপনার বার্তার মার্কডাউন সিনট্যাক্স এ যান</string> - <string name="want_read_indicators">পাঠ নির্দেশক চান?</string> - <string name="color_swatch_description">রঙ %1$d</string> - <string name="color_swatch_description_selected">%1$d রঙ নির্বাচিত</string> - <string name="color_picker_default_title">রঙ নির্বাচন করুন</string> - <string name="message_delivered">বার্তা ডেলিভার করা হয়েছে</string> - <string name="message_not_delivered">বার্তা ডেলিভার করা হয় নি</string> - <string name="error">ত্রুটি</string> - <string name="invalid_destination">অকার্যকর গন্তব্য ঠিকানা।</string> - <string name="service_not_activated">সেবাটি নেট‌ওয়ার্কে সক্রিয় করা হয় নি</string> - <string name="service_message_not_found">বার্তাটির মেয়াদ-উত্তীর্ণ অথবা বিদ্যমান নয়।</string> - <string name="service_network_problem">নেটওয়ার্ক সমস্যার কারণে পাঠানো যায়নি।</string> - <string name="message_queued">বর্তমানে আপনার বার্তা প্রেরণ করতে পারছে না। সেবাটি যখন উপলভ্য হবে তখন এটি প্রেরণ করা হবে।</string> - <string name="download_later">এখনই ডাউনলোড করা যাবে না। কিছুক্ষণ পর আবার চেষ্টা করুন।</string> - <string name="no_apn">এই অ্যাপটির জন্য নির্দিষ্ট কোন এপিএন নেই, আপনার তা সেটিংসে সেট করা প্রয়োজন!</string> - <string name="no_subject">(কোনো বিষয় নেই)</string> - <string name="unknown_sender">অজানা প্রেরক</string> - <string name="dl_failure_notification">বার্তা <xliff:g id="subject">%1$s </xliff:g> <xliff:g id="from">%2$s </xliff:g> ডাউনলোড করা যায়নি।</string> - <string name="auto_select_multiple_apns">একাধিক কনফিগারেশন খুঁজে পাওয়া গিয়েছে। একটি এখনই চেষ্টা করুন। যদি কাজ না করে, তাহলে নতুন একটি চেষ্টা করতে পারেন সেটিংস > উন্নত > লোড করুন ডিফল্ট এপিএন এ গিয়ে।</string> - <string name="auto_select_apn">স্বয়ংক্রিয়ভাবে এপিএন নির্বাচন করুন</string> - <string name="auto_select_failed_title">স্বয়ংক্রিয় কনফিগারেশন ব্যর্থ হয়েছে।</string> - <string name="auto_select_failed">আপনার সেবাদাতার জন্য সেটিংস সন্ধানের চেষ্টা করুন (MMSC, পোর্ট ও প্রক্সি) এবং সেটিংস এ প্রবেশ করার জন্য সেটিংস > উন্নত এ যান।</string> - <string name="date_yesterday">গতকাল</string> - <string name="date_just_now">এই মাত্র</string> - <string name="compose_loading_attachment">সংযুক্তি লোড করা হচ্ছে</string> - <string name="hint_no_messages">এখন পর্যন্ত কোন বার্তা নেই। \n + এ ক্লিক করুন দু একটা প্রেরণ করতে!</string> - <string-array name="resend_menu"> - <item>পুনরায় প্রেরণ করুন</item> - <item>সম্পাদনা করুন</item> - <item>মুছে ফেলুন</item> - </string-array> - <string-array name="message_menu"> - <item>বার্তা ফরোয়ার্ড করুন</item> - <item>পাঠ্য অনুলিপি করুন</item> - <item>বিস্তারিত দেখুন</item> - <item>বার্তা মুছে ফেলুন</item> - </string-array> - <string-array name="background_titles"> - <item>ম্যাটেরিয়াল লাইট</item> - <item>ম্যাটেরিয়াল ডার্ক</item> - <item>কালো</item> - </string-array> - <string-array name="font_sizes"> - <item>ছোট</item> - <item>স্বাভাবিক</item> - <item>বড়</item> - <item>বৃহত্তম</item> - </string-array> - <string-array name="font_families"> - <item>Roboto Regular</item> - <item>Roboto Condensed</item> - <item>সিস্টেম ফন্ট</item> - </string-array> - <string-array name="font_weights"> - <item>হালকা</item> - <item>স্বাভাবিক</item> - </string-array> - <!-- String to match as no subject and filter out as a subject. For example, if the - subject string is "no subject", we won't display that. We'll pretend - no subject string was delivered. --> - <string-array name="empty_subject_strings"> - <item>কোন বিষয় নেই</item> - </string-array> - <string-array name="qk_responses"> - <item>ঠিক আছে</item> - <item>একটু অপেক্ষা করুন</item> - <item>পথেই আছি</item> - <item>ধন্যবাদ</item> - <item>শুনতে ভালো লাগে</item> - <item>কি খবর?</item> - <item>একমত</item> - <item>না</item> - <item>ভালোবাসি তোমাকে</item> - <item>দুঃখিত</item> - <item>হেহে</item> - <item>তা ঠিক।</item> - </string-array> - <string-array name="enter_button_options"> - <item>ইমোজি প্রদেখুন করুন</item> - <item>নতুন লাইন</item> - <item>বার্তা প্রেরণ করুন</item> - </string-array> - <string-array name="notification_private_options"> - <item>সবগুলো দেখান</item> - <item>বার্তা লুকান</item> - <item>প্রেরক এবং বার্তা লুকান</item> - </string-array> - <!-- Max MMS attachment sizes. I.e. will compress pictures that are larger than 300 KB down to - under 300KB. --> - <string-array name="max_mms_attachment_sizes"> - <item>৩০০ কেবি</item> - <item>৬০০ কেবি</item> - <item>এক এমবি</item> - <item>অসংখ্য</item> - </string-array> -</resources> diff --git a/QKSMS/src/main/res/values-cs/strings.xml b/QKSMS/src/main/res/values-cs/strings.xml deleted file mode 100644 index 20e248a75..000000000 --- a/QKSMS/src/main/res/values-cs/strings.xml +++ /dev/null @@ -1,769 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!--Generated by crowdin.com--> -<resources xmlns:xliff="http://schemas.android.com/apk/res-auto"> - <!--Slogan--> - <string name="slogan">Znovu si zamilujte SMS.</string> - <!--Text shown when a phone number cannot be found--> - <string name="unknown_number">Neznámé číslo</string> - <!--Content description for photos--> - <string name="popup_photo_CD">Foto</string> - <!--Text to be displayed while content is loading--> - <string name="loading">Načítání…</string> - <!--Test string--> - <string name="test">Test string</string> - <!--Hint for contacts text field--> - <string name="hint_contacts">Zadejte příjemce</string> - <!--Hint for search text field--> - <string name="hint_search">Napište, co chcete najít</string> - <!--Hint for message reply text field--> - <string name="hint_reply">Zadejte zprávu</string> - <!--Hint for code redemption--> - <string name="hint_redeem">Zadejte kód</string> - <string name="hint_hex">Hex</string> - <!--Text shown for single new message in notification--> - <string name="new_message">Nová zpráva</string> - <!--Text shown after number of unread messages in notification (ex. 3 new messages)--> - <string name="new_messages">nové zprávy</string> - <!--Text shown for single failed message in notification--> - <string name="failed_message">Odeslání zprávy se nezdařilo</string> - <!--Text shown after number of failed messages in notification (ex. 3 messages failed to send)--> - <string name="failed_messages">nezdařených pokusů o odeslání zprávy</string> - <!--Text shown under failed message count--> - <string name="failed_messages_summary">Klepnutím zobrazíte</string> - <!--QuickCompose notification title--> - <string name="quickcompose">QK napsat</string> - <!--QuickCompose notification text--> - <string name="quickcompose_detail">Kliknutím odešlete zprávu</string> - <!--Welcome screen intro button--> - <string name="welcome_start">Začněme!</string> - <!--Allows user to skip welcome screen--> - <string name="welcome_skip">PŘESKOČIT</string> - <!--Allows user to finish the welcome screen--> - <string name="welcome_finish">DOKONČIT</string> - <!--Indicates to user they can pick a color--> - <string name="welcome_theme_title">Vyberte si barvu</string> - <!--Indicates to user they can pick any colors--> - <string name="welcome_theme_description">Jakákoliv barva.</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_night_description">Šetří oči.</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_night_hint">Přepnout</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_quickreply_title">QK odpověď</string> - <!--QK Reply explanation--> - <string name="welcome_quickreply_description">Odpovězte na zprávy rychleji než kdy předtím.</string> - <!--Prompts user to try QK Reply--> - <string name="welcome_quickreply_hint">Vyzkoušet!</string> - <!--QK Reply demo message--> - <string name="welcome_quickreply_message_1">Wow! Now wasn\'t that awesome? You can view your entire conversation at a glance. Tap outside the popup or press the checkmark to dismiss it.</string> - <!--QK Reply demo message--> - <string name="welcome_quickreply_message_2">This is QK Reply. Now you can reply to messages from anywhere. Tap the expand button to see what happens next :)</string> - <!--Settings option in menu--> - <string name="menu_settings">Nastavení</string> - <!--Search option in menu--> - <string name="menu_search">Hledat</string> - <!--Show full conversation in QuickReply--> - <string name="menu_show_all">Zobrazit všechny zprávy</string> - <!--Show only unread messages in QuickReply--> - <string name="menu_show_unread">Zobrazit nepřečtené zprávy</string> - <!--Open conversation option in menu (shown in QuickReply)--> - <string name="menu_open_thread">Otevřít konverzaci</string> - <!--Forward message option in menu--> - <string name="menu_forward">Přeposlat zprávu</string> - <!--Call contact option in menu--> - <string name="menu_call">Volat</string> - <!--Mark a message/conversation as read option in menu--> - <string name="menu_read">Označit jako přečtené</string> - <!--Delete a message option in menu--> - <string name="menu_delete">Smazat</string> - <!--Donate option in menu--> - <string name="menu_billing">Přispět</string> - <!--Copy text option in menu--> - <string name="menu_copy">Kopírovat text</string> - <!--Changelog option in menu--> - <string name="menu_changelog">"Co je nového"</string> - <!--Expand settings option in menu--> - <string name="menu_show_all_prefs">Zobrazit vše</string> - <!--Show less settings option in menu--> - <string name="menu_show_fewer_prefs">Zobrazit méně</string> - <!--Title for message details popup--> - <string name="details_title">Podrobnosti</string> - <!--Title for address that message is being sent to in message details popup--> - <string name="details_to">Komu</string> - <!--Title for address that message is sent from in message details popup--> - <string name="details_from">Od</string> - <!--Title for text of a message in message details popup--> - <string name="details_body">Tělo</string> - <!--Title for date sent of a message in message details popup--> - <string name="details_date_sent">Datum odeslání</string> - <!--Title for date received of a message in message details popup--> - <string name="details_date_received">Datum přijetí</string> - <!--Title for rate snackbar--> - <string name="rate_title">Líbí se vám QKSMS?</string> - <!--Title for rate button--> - <string name="rate_action">Hodnotit</string> - <string name="pref_category_appearance">Vzhled</string> - <string name="pref_category_summary_appearance">Motivy vzhledu, písma, barvy, avatary a další</string> - <string name="pref_category_general">Obecné</string> - <string name="pref_category_summary_general">Doručenky, posílání zpráv, formátování</string> - <string name="pref_category_blocking">Blokování zpráv</string> - <string name="pref_category_notifications">Upozornění</string> - <string name="pref_category_summary_notifications">Zvuky, LED, soukromí</string> - <string name="pref_category_mms">MMS</string> - <string name="pref_category_summary_mms">Konfigurace MMS (APN), maximální velikost, skupinové zprávy</string> - <string name="pref_category_quickreply">QK odpověď</string> - <string name="pref_category_summary_quickreply">QK Odpověď, možnosti vyskakovacího okna</string> - <string name="pref_category_quickcompose">QK napsat</string> - <string name="pref_category_summary_quickcompose">QK Compose, starred contacts</string> - <string name="pref_category_about">O aplikaci</string> - <string name="pref_category_summary_about">Verze, seznam změn, autoři, poděkování</string> - <string name="pref_theme">Barva motivu</string> - <string name="pref_theme_summary_alt">Nastavení hlavní barvy</string> - <string name="pref_icon">Icon color</string> - <string name="pref_icon_summary">Tap to change the QKSMS icon color</string> - <string name="pref_status_tint">Transparentní stavový panel</string> - <string name="pref_navigation_tint">Transparentní navigační panel</string> - <string name="pref_background">Barva pozadí</string> - <string name="pref_background_summary">Klepnutím změníte barvu pozadí</string> - <string name="pref_bubbles">Bubliny zpráv</string> - <string name="pref_bubbles_summary">Nastavení možností bublin zpráv</string> - <string name="pref_night">Noční režim</string> - <string name="pref_night_summary">Úspora energie a snížení namáhání očí</string> - <string name="pref_night_amoled">Čistě černé pozadí</string> - <string name="pref_night_amoled_summary">Výrazně šetří baterii na zařízeních s AMOLED displejem</string> - <string name="pref_bubble_style_new">Používat nový styl bublin</string> - <string name="pref_color_sent">Obarvit odeslané zprávy</string> - <string name="pref_color_sent_summary">Obarvení bublin odchozích zpráv</string> - <string name="pref_color_received">Obarvit přijaté zprávy</string> - <string name="pref_color_received_summary">Obarvení bublin příchozích zpráv</string> - <string name="pref_hide_avatar_conversations">Skrýt avatary v seznamu konverzací</string> - <string name="pref_hide_avatar_conversations_summary">Skrýt obrázky kontaktů v seznamu konverzací</string> - <string name="pref_hide_avatar_sent">Skrýt avatary u odchozích zpráv</string> - <string name="pref_hide_avatar_sent_summary">Skrýt váš avatar u odchozích zpráv</string> - <string name="pref_hide_avatar_received">Skrýt avatary u příchozích zpráv</string> - <string name="pref_hide_avatar_received_summary">Skrýt obrázky kontanktů u příchozích zpráv</string> - <string name="pref_font_family">Rodina písma</string> - <string name="pref_font_size">Velikost písma</string> - <string name="pref_font_weight">Tloušťka písma</string> - <string name="pref_message_count">Počet zpráv</string> - <string name="pref_message_count_summary">Zobrazit počet zpráv u každé konverzace</string> - <string name="pref_sent_timestamps">Časové značky odeslání</string> - <string name="pref_sent_timestamps_summary">Zobrazit časové značky pro odeslané zprávy, ne pro přijaté</string> - <string name="pref_force_timestamps">Vynutit časové značky</string> - <string name="pref_force_timestamps_summary">Povolit časové značky pro všechny zprávy</string> - <string name="pref_key_timestamp_delay">Doba mezi časovými značkami</string> - <string name="pref_key_timestamp_delay_summary">Počet minut, které musí uplynout mezi dvěma zprávami, aby se zobrazilo nové časové razítko.</string> - <string name="pref_compose_favorites">Oblíbené kontakty</string> - <string name="pref_compose_summary_favorites">Zobrazovat vaše oblíbené kontakty při psaní nové zprávy</string> - <string name="pref_prox_sensor_call">Senzor přiblížení</string> - <string name="pref_prox_sensor_call_summary">Když jste v konverzaci, přiložte telefon k uchu pro zahájení hovoru</string> - <string name="pref_delivery">Potvrzení o doručení</string> - <string name="pref_delivery_summary">U každé odeslané SMS požadovat potvrzení o doručení</string> - <string name="pref_delivery_toast">Zobrazit bublinu</string> - <string name="pref_delivery_toast_summary">Zobrazit bublinu s upozorněním, při doručení zprávy</string> - <string name="pref_delivery_vibrate">Vibrace</string> - <string name="pref_delivery_vibrate_summary">Vibrovat při doručení zpráv</string> - <string name="pref_delete_old_messages">Odstranit staré zprávy</string> - <string name="pref_delete_old_messages_summary">Automaticky odstranit staré zprávy</string> - <string name="pref_delete_old_messages_unread">Nepřečtené zprávy</string> - <string name="pref_delete_old_messages_unread_summary">Automaticky odstranit nepřečtené zprávy po %s dnech</string> - <string name="pref_delete_old_messages_read">Přečtené zprávy</string> - <string name="pref_delete_old_messages_read_summary">Automaticky odstranit přečtené zprávy po %s dnech</string> - <string name="pref_yappy">Integrace Yappy</string> - <string name="pref_endlessjabber_summary">Zapnout plnou podporu pro Yappy</string> - <string name="pref_blocked_conversations">Blokované konverzace</string> - <string name="pref_blocked_conversations_summary">Long-press on a conversation and block to move to blocked inbox and stop notifications</string> - <string name="pref_block_future">Blokovat budoucí zprávy</string> - <string name="pref_block_future_summary">Add additional phone numbers to block</string> - <string name="pref_should_i_answer">Integrace Můžu to zvednout?</string> - <string name="pref_should_i_answer_summary">Automaticky mazat příchozí zprávy z čísel blokovaných pomocí aplikace „Můžu to zvednout?“</string> - <string name="pref_mobile_only">Mobilní čísla</string> - <string name="pref_mobile_only_summary">V návrzích kontaktů zobrazovat pouze mobilní čísla</string> - <string name="pref_auto_emoji">Automatické emoji</string> - <string name="pref_auto_emoji_summary">Nahradit text obrázkem emoji</string> - <string name="pref_enter_button">Tlačítko Enter</string> - <string name="pref_enter_button_summary">Klepněte pro změnu chování tlačítka Enter</string> - <string name="pref_compose_group">Skupinové zprávy</string> - <string name="pref_compose_group_summary">Při psaní zprávy více lidem, poslat skupinovou zprávu místo jednotlivých zpráv</string> - <string name="pref_auto_download">Automaticky stahovat MMS</string> - <string name="pref_auto_download_summary">Automaticky stahovat zprávy MMS, jakmile jsou k dispozici</string> - <string name="pref_auto_data">Automatická data</string> - <string name="pref_auto_data_summary">Automatické zapnutí mobilních dat při odesílání nebo přijímání MMS</string> - <string name="pref_split">Rozdělit SMS</string> - <string name="pref_split_summary">Rozdělit dlouhé zprávy do samostatných zpráv</string> - <string name="pref_split_counter">Počítadlo znaků</string> - <string name="pref_split_counter_summary">Zobrazovat počítadlo znaků před každou novou zprávu</string> - <string name="pref_long_as_mms">Dlouhé zprávy jako MMS</string> - <string name="pref_long_as_mms_summary">Dlouhé zprávy budou zaslány jako jedna MMS</string> - <string name="pref_long_as_mms_after">Dlouhé zprávy jako MMS po</string> - <string name="pref_long_as_mms_after_summary">Odesílat dlouhé zprávy jako MMS, když délka překročí počet zpráv</string> - <string name="pref_return">Zobrazit tlačítko zpět</string> - <string name="pref_return_summary">Zobrazí znaménko zpět na klávesnici, místo Emoji tlačítka</string> - <string name="pref_text">Text</string> - <string name="pref_notifications">Upozornění na SMS</string> - <string name="pref_led">LED upozornění</string> - <string name="pref_theme_led">Barva LED upozornění</string> - <string name="pref_wake">Probudit telefon</string> - <string name="pref_wake_summary">Zapnout obrazovku při obdržení nové zprávy</string> - <string name="pref_notifications_private">Soukromé oznámení</string> - <string name="pref_notifications_private_summary">Klepnutím nastavíte, co má být v oznámení skryto</string> - <string name="pref_ringtone">Zvukové upozornění</string> - <string name="pref_ringtone_summary">Vybrat zvuk pro upozornění</string> - <string name="pref_ticker">Zobrazí ticker</string> - <string name="pref_ticker_summary">Zobrazí úryvek nové zprávy v oznamovacím pruhu</string> - <string name="pref_vibration">Vibrace</string> - <string name="pref_vibration_summary">Vibrovat při přijmu nové zprávy</string> - <string name="pref_notification_call">Tlačítko Volat</string> - <string name="pref_notification_call_summary">Zavolat odesílateli zprávy přímo z oznámení</string> - <string name="pref_dimiss_read">Označit jako přečtené</string> - <string name="pref_dismiss_read_summary">Označit zprávu jakou přečtenou při zavření oznámení</string> - <string name="pref_delayed">Zpoždění zasílání zpráv</string> - <string name="pref_delayed_summary">Odeslání zprávy s prodlevou, takže máte šanci ji ještě upravit</string> - <string name="pref_delayed_duration">Délka zpoždění (sekundy)</string> - <string name="pref_delayed_duration_summary">Čas čekání před odesláním zprávy</string> - <string name="pref_night_auto">Automatický noční režim</string> - <string name="pref_night_auto_summary">Zapnout noční režim automaticky podle času</string> - <string name="pref_day_start">Začátek dne</string> - <string name="pref_night_start">Noční čas začíná</string> - <string name="pref_qk_responses">QK odpovědi</string> - <string name="pref_qk_responses_summary">Nastavení předvolených odpovědí pro použití z vašeho Android Wear zařízení</string> - <string name="pref_quickreply_enabled">QK odpověď zapnuta</string> - <string name="pref_quickreply_enabled_summary">Show QK Reply window whenever a new message is received</string> - <string name="pref_tap_to_quit">Klepnutím zavřít</string> - <string name="pref_tap_to_quit_summary">Tap anywhere outside of the window to close it</string> - <string name="pref_quickcompose">QK Compose enabled</string> - <string name="pref_quickcompose_summary">Zobrazí v oznamovacím panelu možnost napsat rychlou zprávu</string> - <string name="pref_mms_enabled">MMS zapnuty</string> - <string name="pref_mms_enabled_summary">Povolení odesílání a přijímání MMS zpráv</string> - <string name="pref_mmsc_url">MMSC</string> - <string name="pref_mms_proxy">MMS proxy</string> - <string name="pref_mms_port">MMS port</string> - <string name="pref_apn_chooser">Načíst výchozí APN</string> - <string name="pref_strip_unicode">Nahradit unicode znaky</string> - <string name="pref_strip_unicode_summary">Odstranit diakritická znaménka, které zvětšují délku zpráv</string> - <string name="pref_system_bar_flat">Ploché systémové panely</string> - <string name="pref_system_bar_flat_summary">Odstranění vizuálního přechodu v systémových lištách na většině KitKat zařízení</string> - <string name="pref_status_compat">Oprava stavového panelu</string> - <string name="pref_status_compat_summary">Řeší problémy způsobené immersive módem, Tinted Status Bar modulem (Xposed), nebo vlastním nastavením DPI</string> - <string name="pref_navigation_compat">Oprava navigačního panelu</string> - <string name="pref_navigation_compat_summary">Řeší problémy způsobené immersive módem, Tinted Status Bar modulem (Xposed), nebo vlastním nastavením DPI</string> - <string name="pref_about_version_title">Verze QKSMS</string> - <string name="pref_about_authors_title">Autoři</string> - <string name="pref_about_authors_summary">Moez Bhatti</string> - <string name="pref_changelog_summary">Klepnutím zobrazíte seznam změn</string> - <string name="pref_about_thanks_title">Poděkování</string> - <string name="pref_about_thanks_summary">Klepnutím zobrazíte open source přispěvatele</string> - <string name="pref_donate_title">Přispět</string> - <string name="pref_donate_summary">QKSMS je zdarma. Podpořte nás a přispějte na vývoj.</string> - <string name="pref_about_gplus_title">Google+</string> - <string name="pref_about_gplus_summary">Přidejte se do skupiny beta testerů QKSMS na Google+</string> - <string name="pref_about_github_title">GitHub</string> - <string name="pref_about_github_summary">QKSMS je open source. Zapojte se a hlašte chyby na GitHub.</string> - <string name="pref_about_crowdin_title">Crowdin</string> - <string name="pref_about_crowdin_summary">Zapojte se do překladatelského projektu na Crowdinu</string> - <!--Preference subcategory--> - <string name="pref_subcat_theme">Téma</string> - <!--Preference subcategory--> - <string name="pref_subcat_system_bars">Systémové panely</string> - <!--Preference subcategory--> - <string name="pref_subcat_categories">Kategorie</string> - <!--Preference subcategory--> - <string name="pref_subcat_font">Písmo</string> - <!--Preference subcategory--> - <string name="pref_subcat_messages">Zprávy</string> - <!--Preference subcategory--> - <string name="pref_subcat_avatars">Avatary</string> - <string name="donate_google">Přispět pomocí Google</string> - <string name="donate_google_summary">Google si bere 30 % z částky daru</string> - <string name="donate_paypal">Přispět pomocí PayPal</string> - <string name="donate_paypal_button">Přispět libovolnou částkou</string> - <string name="donate_paypal_button_summary">Kup mi cokoliv chceš!</string> - <!--Donation product name--> - <string name="product_name_donation">Podpora vývoje</string> - <!--$1 donation product name--> - <string name="product_name_donate_1">Darovat $1 USD</string> - <!--$5 donation product name--> - <string name="product_name_donate_5">Darovat $5 USD</string> - <!--$3 donation product name--> - <string name="product_name_donate_10">Darovat $10 USD</string> - <!--$1 donation product description--> - <string name="product_description_donate_1">Kup mi kolu</string> - <!--$5 donation product description--> - <string name="product_description_donate_5">Kup mi sendvič</string> - <!--$10 donaion product description--> - <string name="product_description_donate_10">Kup mi oběd</string> - <string name="title_settings">Nastavení</string> - <string name="title_search">Hledat</string> - <string name="title_compose">Nová zpráva</string> - <string name="title_conversation_list">Konverzace</string> - <string name="title_blocked">Blocked</string> - <string name="title_changelog">Seznam změn</string> - <string name="title_picker">Nové zprávy</string> - <string name="title_donate">Přispět</string> - <string name="title_qk_responses">QK odpovědi</string> - <string name="title_block_address">Blokovat číslo</string> - <string name="title_unblock_address">Odblokovat číslo</string> - <string name="title_conversations_selected">Vybráno: %s</string> - <string name="title_palette">Paleta</string> - <string name="title_rgb">RGB</string> - <!-- Menu shown in the context menu when long pressing on a message when the message contains - one or more phone numbers and/or email addresses and the number or email is new to - contacts. [CHAR LIMIT=50] --> - <string name="menu_add_address_to_contacts">Add <xliff:g id="contactEmailOrNumber">%s</xliff:g> to People</string> - <!-- Context menu item on an individual message for viewing an attached slideshow --> - <string name="view_slideshow">Zobrazit prezentaci</string> - <!-- Context menu item on an individual message for viewing message details such as time and date --> - <string name="view_message_details">Zobrazit podrobnosti</string> - <!-- Context menu item on an individual message for viewing a delivery report --> - <string name="view_delivery_report">Zobrazit hlášení</string> - <!-- Context menu item on an individual message for deleting only that message --> - <string name="delete_message">Smazat</string> - <!-- Abbreviation for "kilobyte" --> - <string name="kilobyte">KB</string> - <!-- Individual message context menu item --> - <string name="copy_message_text">Kopírovat text</string> - <!-- Header for context menu on an individual message --> - <string name="message_options">Možnosti zprávy</string> - <!-- Delivery Header View --> - <!-- Title of "Report" window --> - <string name="delivery_header_title">Zpráva</string> - <!--Text for app restart confirmation dialog--> - <string name="restart_message">Změny se projeví až při dalším otevření QKSMS</string> - <!--Dialog title for asking if a user wants to delete a conversation--> - <string name="delete_conversation">Odstranit konverzace</string> - <!--Dialog title for asking if a user wants to delete all failed messages--> - <string name="delete_all_failed">Odstranit chybné zprávy</string> - <!--CDialog title for asking if a user wants to delete a conversation--> - <string name="delete_confirmation">Opravdu chcete smazat vybrané konverzace (%s)?</string> - <!--CDialog title for asking if a user wants to delete all failed messages--> - <string name="delete_all_failed_confirmation">Jste si jisti, že chcete odstranit chybné zprávy z konverzace (%s)?</string> - <!--(Unused) Dialog title shown if APNs have not been set--> - <string name="apns_not_set">Přístupové body APN nenastaveny</string> - <!--(Unused) Dialog description shown if APNs have not been set--> - <string name="apns_not_set_description">Zdá se, že názvy přístupových bodů (APN) ještě nebyly nastaveny. To znamená, že MMS zprávy nebudou správně fungovat. Klepnutím na tlačítko OK provede QKSMS automatickou konfiguraci.</string> - <!--Dialog title show if MMS hasn't been configured--> - <string name="set_up_mms_title">Nastavit MMS?</string> - <!--Dialog description shown if MMS hasn't yet been configured--> - <string name="set_up_mms_description">Zdá se, že MMS ještě nebyly v QKSMS nastaveny. Stiskněte tlačítko OK pro automatickou konfiguraci MMS.</string> - <!-- Dialog message text explaining that a draft message will not be saved due to invalid recipients --> - <string name="discard_message_reason">Zpráva bude zahozena, protože nemá žádné platné příjemce.</string> - <string name="invalid_code">Neplatný kód</string> - <!--Button to restart app now instead of manually later--> - <string name="restart">Restartovat nyní</string> - <!--Notification action to reply to a message--> - <string name="reply">Odpovědět</string> - <!--Notification action to reply to a message--> - <string name="reply_qksms">Odpovědět pomocí QKSMS</string> - <!--Notification action to mark a message as read--> - <string name="read">Přečteno</string> - <!--Notification action to mark a message as read--> - <string name="mark_read">Označit jako přečtené</string> - <!--Notification action to call the sender of a message--> - <string name="call">Volat</string> - <!-- Notification toast message --> - <string name="notification_mute_on">Upozornění zapnuta</string> - <string name="notification_mute_off">Upozornění vypnuta</string> - <!--Positive action button--> - <string name="yes">Ano</string> - <string name="add">Přidat</string> - <!--Positive action button--> - <string name="save">Uložit</string> - <!--Positive action button--> - <string name="enable">Povolit</string> - <!--Positive action button--> - <string name="upgrade_now">Nastavit nyní</string> - <!--Positive action button--> - <string name="okay">OK</string> - <!--Positive action button--> - <string name="redeem">Uplatnit</string> - <!--Neutral action button--> - <string name="just_once">Pouze jednou</string> - <!--Neutral action button--> - <string name="later">Později</string> - <!--Neutral action button --> - <string name="cancel">Storno</string> - <!-- Name of the local user when displaying sender of an outgoing message (personal pronoun) --> - <string name="messagelist_sender_self">Já</string> - <!-- Sender to be used if the sender address has been hidden --> - <string name="hidden_sender_address">Skrytá adresa odesílatele</string> - <!-- Subject to display in the conversation list if there is no subject --> - <string name="no_subject_view">(Žádný předmět)</string> - <!-- Time and date a message is due to expire --> - <string name="expire_on">"Expires: <xliff:g id="date">%s</xliff:g>"</string> - <!-- Formatting for subject displayed inline, prepended to MMS message text --> - <string name="inline_subject">"<Subject: <xliff:g id="subject">%s</xliff:g>>"</string> - <!-- Text of a button appearing for MMS messages that have not yet been downloaded, causing the message to be downloaded (imperative verb) --> - <string name="download">Stáhnout</string> - <!-- Message displayed in place of the "download message" button once it has been pressed, indicating that the download is in progress --> - <string name="downloading">Stahování</string> - <!-- Toast message while an image is being resized --> - <string name="compressing">Obrázek je příliš velký. Komprimování\u2026</string> - <!-- Header shown above favorite contacts in QKCompose --> - <string name="favorites">Oblíbené kontakty</string> - <!-- Word represents 'self' in a conversation --> - <string name="me">Já</string> - <string name="menu_edit">Upravit</string> - <string name="menu_delete_messages">Smazat zprávy</string> - <string name="menu_delete_failed">Odstranit chybné zprávy</string> - <string name="menu_lock">Uzamknout</string> - <string name="menu_unlock">Odemknout</string> - <!-- When the user tries to view message details and some error occurs while - retrieving those details, this message will be shown. --> - <string name="cannot_get_details">Podrobnosti nelze zobrazit.</string> - <!-- Title of "Message details" dialog --> - <string name="message_details_title">Podrobnosti zprávy</string> - <!-- Label in "Message details" dialog --> - <string name="message_type_label">Type\u000A</string> - <!-- "Type" value in "Message details" dialog --> - <string name="text_message">Textová zpráva</string> - <!-- "Type" value in "Message details" dialog --> - <string name="multimedia_message">Multimediální zpráva</string> - <!-- "Type" value in "Message details" dialog --> - <string name="multimedia_notification">Upozornění na multimediální zprávu</string> - <!-- Label in "Message details" dialog showing who sent the message. --> - <string name="from_label">Od\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="to_address_label">Pro\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="bcc_label">Bcc\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="sent_label">Odesláno\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="received_label">Přijato\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="saved_label">Uloženo\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="subject_label">Předmět\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="message_size_label">Velikost zprávy\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="priority_label">Priorita\u000A</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_high">Vysoká</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_normal">Normální</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_low">Nízká</string> - <!-- Label in "Message details" dialog --> - <string name="message_class_label">Typ zprávy\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="error_code_label">Kód chyby\u000A</string> - <!-- Alert dialog title when creating a slideshow [CHAR LIMIT=none] --> - <string name="building_slideshow_title">Vytváření prezentace</string> - <!-- Tag appearing on conversations in the conversation list that contain a draft message --> - <string name="has_draft">Koncept</string> - <!-- In conversation list items, this is the separator between a contact's name and the draft stamp [CHAR LIMIT=5] --> - <string name="draft_separator">,\u0020</string> - <!-- In conversation list items, this comes after the receipient's name and contains the number of messages in the thread [CHAR LIMIT=5] --> - <string name="message_count_format">\u00a0<xliff:g id="number" example="1">%1$s</xliff:g></string> - <!-- For debugging: Dialog box title indicating there's a situation where data has unexpectedly changed --> - <string name="error_state">Nekonzistentní stav</string> - <!-- For debugging: Dialog box text indicating there's a situation where data has unexpectedly changed --> - <string name="error_state_text">Stav vlákna a příjemců je nekonzistentní. Zachyťte chybové hlášení a nahlaste jej prostřednictvím http://go/droidanizer </string> - <!-- This is the dialog title for the "Select link" dialog, shown when the user clicks on a - chat in the chat history view if there are links in the chat message. The dialog displays the - links if there are any --> - <string name="select_link_title">Vyberte akci</string> - <!-- In message list items, this string builds the timestamp line when the message is in a group [CHAR LIMIT=NONE] --> - <string name="message_timestamp_format"><xliff:g id="string" example="Fred Flinstone">%1$s</xliff:g>\u0020-\u0020<xliff:g id="string" example="9:39AM">%2$s</xliff:g></string> - <!--Message sending status: sending--> - <string name="status_sending">Odesílání…</string> - <!--Message sending status: failed--> - <!--<string name="status_failed">Failed. Tap to retry</string>--> - <!-- Delivery Report Activity --> - <!-- Status in "Report" window --> - <string name="status_none">(Žádný)</string> - <!-- Status in "Report" window --> - <string name="status_pending">Čekající</string> - <!-- Status in "Report" window --> - <string name="status_read">Přečteno</string> - <!-- Status in "Report" window --> - <string name="status_received">Přijaté</string> - <!-- Status in "Report" window --> - <string name="status_failed">Chyba. Klepněte pro možnosti</string> - <!-- Status in "Report" window --> - <string name="status_unread">Nepřečtené</string> - <!-- Status in "Report" window --> - <string name="status_rejected">Odmítnuto</string> - <!-- Label in "Report" window --> - <string name="recipient_label">Příjemce:\u0020</string> - <!-- Label in "Report" window --> - <string name="status_label">Stav:\u0020</string> - <!-- Label in "Report" window [CHAR LIMIT=50]--> - <string name="delivered_label">Doručeno:\u0020</string> - <string name="do_something">Udělejte něco</string> - <!-- Confirm Delete --> - <!-- Delete confirmation dialog title --> - <string name="confirm_dialog_title">Smazat?</string> - <!-- Delete confirmation dialog title for locked messages --> - <string name="confirm_dialog_locked_title">Smazat uzamčené zprávy?</string> - <!-- This message is displayed in a confirmation dialog when the user selects one or more - conversations and then taps the "Delete" button. --> - <plurals name="confirm_delete_conversation"> - <!-- Case of 1 result. --> - <item quantity="one">Konverzace bude odstraněna.</item> - <item quantity="few">Budou odstraněny <xliff:g id="number" example="15">%1$s</xliff:g> konverzace.</item> - <!-- Case of 0 or 2 or more results. --> - <item quantity="other">Bude odstraněno <xliff:g id="number" example="15">%1$s</xliff:g> konverzací.</item> - </plurals> - <string name="confirm_delete_conversation">Celá konverzace bude odstraněna.</string> - <!-- Delete all threads confirmation dialog message --> - <string name="confirm_delete_all_conversations">Všechny konverzace budou odstraněny.</string> - <!-- Delete message confirmation dialog message --> - <string name="confirm_delete_message">Zpráva bude odstraněna.</string> - <!-- Delete message confirmation dialog message for a locked message --> - <string name="confirm_delete_locked_message">Odstranit tuto uzamčenou zprávu?</string> - <!-- Delete all the messages on the SIM dialog message --> - <string name="confirm_delete_all_SIM_messages">Všechny zprávy na SIM kartě budou odstraněny.</string> - <!-- Delete the selected message on the SIM dialog message --> - <string name="confirm_delete_SIM_message">Tato zpráva na SIM kartě bude odstraněna.</string> - <!-- Delete unlocked checkbox title --> - <string name="delete_unlocked">Odstranit uzamknuté zprávy</string> - <!-- Delete button title --> - <string name="delete">Odstranit</string> - <!-- More button title --> - <string name="more">Více</string> - <!-- More button summary --> - <string name="more_summary">Klepnutím zobrazíte více</string> - <!-- Action bar mode title when multi-selecting conversations --> - <string name="select_conversations">Zvolit konverzaci</string> - <!-- Show this in the middle of the main activity when there are no conversations [CHAR LIMIT=none] --> - <string name="no_conversations">Žádné konverzace.</string> - <!-- Show this in the middle of the main activity when loading conversations [CHAR LIMIT=none] --> - <string name="loading_conversations">Načítání konverzací…</string> - <!-- Tells the user that QKSMS isn't the default SMS app --> - <string name="not_default">Výchozí SMS aplikace</string> - <!-- Tells the user they need to set QKSMS as the default app in order to use this feature --> - <string name="default_info">Pro vykonání této akce musí být aplikace QKSMS nastavena jako výchozí</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to mark messages as read --> - <string name="not_default_mark_read">Pro označení zpráv jako přečtené musí být QKSMS výchozí SMS aplikací</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to mark messages as unread --> - <string name="not_default_mark_unread">Pro označení zpráv jako nepřečtené musí být QKSMS výchozí SMS aplikací</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to send messages --> - <string name="not_default_delete">Pro možnost mazat zprávy musí být aplikace QKSMS nastavena jako výchozí SMS aplikace</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to delete messages --> - <string name="not_default_send">Pro možnost odesílat zprávy musí být aplikace QKSMS nastavena jako výchozí SMS aplikace</string> - <!-- Tells the user they should set QKSMS as the default messaging app --> - <string name="not_default_first">Některé funkce nebudou dostupné, dokud nebude QKSMS výchozí SMS aplikací</string> - <string name="delayed_messaging_info">Zpožděné odesílání zpráv umožňuje zrušit odesílání zpráv před jejich odesláním. Výchozí chování a další volby lze upravit v nastavení aplikace.</string> - <string name="delayed_duration_bounds_error">Prodleva musí být mezi 1 a 30 sekundami</string> - <!-- Dialog title for the Read Report dialog. --> - <string name="confirm">Potvrdit</string> - <!-- Dialog text for the Read Report dialog. --> - <string name="message_send_read_report">Bude odesláno potvrzení o přečtení.</string> - <!-- Dialog title for updating app icon color --> - <string name="update_icon_title">Aktualizovat barvu ikony</string> - <!-- Dialog message for updating app icon color --> - <string name="update_icon_message">Pro změnu barvy ikony je třeba QKSMS restartovat</string> - <string name="dialog_conversation_details_title">Podrobnosti konverzace</string> - <string name="dialog_conversation_details_last_message_date">Datum poslední zprávy</string> - <string name="dialog_conversation_details_message_count">Počet zpráv</string> - <string name="dialog_conversation_details_recipients">Příjemci (%s)</string> - <string name="dialog_should_i_answer_title">Aplikace „Můžu to zvednout?“ není nainstalována</string> - <string name="dialog_should_i_answer_message">Chcete aplikaci stáhnout z obchodu Google Play?</string> - <string name="dialog_delete_old_messages">Opravdu chcete automaticky odstraňovat všechny staré zprávy?</string> - <!-- Title for audio file picker --> - <string name="select_audio">Vyberte zvuk</string> - <!-- Menu title to copy an attachment to the shared storage [CHAR LIMIT=25] --> - <string name="copy_to_sdcard">Uložit přílohu</string> - <!-- Toast message on successful copy to shared storage [CHAR LIMIT=30] --> - <string name="copy_to_sdcard_success">Příloha uložena.</string> - <!-- Toast message on failed copy to shared storage [CHAR LIMIT=30] --> - <string name="copy_to_sdcard_fail">Přílohu nelze uložit.</string> - <!-- Menu title to save a sound as a ringtone --> - <string name="save_ringtone">Uložit jako vyzvánění</string> - <!-- Toast message on successful copying ringtone to drm provider --> - <string name="saved_ringtone">Vyzvánění uloženo.</string> - <!-- Toast message on failed copying ringtone to drm provider --> - <string name="saved_ringtone_fail">Nelze uložit vyzváněcí tón.</string> - <!-- Menu item --> - <!-- Menu item [CHAR LIMIT=40] --> - <string name="menu_group_participants">Skupinoví příjemci</string> - <!--Toast shown when a draft is saved--> - <string name="toast_draft">Uložit koncept</string> - <!--Toast shown when a conversation is deleted--> - <string name="toast_conversation_deleted">Konverzace odstraněna</string> - <!--Toast shown when device is low on storage--> - <string name="toast_low_memory">"Úložiště telefonu je plné. Odstraňte některé soubory k uvolnění místa."</string> - <!--Toast shown to tell user that forwarding messages doesn't work yet--> - <string name="toast_forward">Tato funkce nebyla doposud implementována. Prozatím prosím použijte možnost text kopírovat a vložit do příslušné konverzace</string> - <!--Toast shown for unimplemented features--> - <string name="toast_unimplemented">Tato funkce ještě nebyla implementována</string> - <!--Toast shown when a message fails to send--> - <string name="toast_message_failure">Odeslání zprávy se nezdařilo</string> - <!--Toast shown when a message is delivered--> - <string name="toast_message_delivered">Zpráva doručena</string> - <!--Toast shown when a message is not delivered--> - <string name="toast_message_not_delivered">Zpráva nebyla doručena</string> - <!--Toast shown when default APNs are loaded--> - <string name="toast_default_apns_loaded">Načteno výchozí nastavení APN</string> - <!--Toast shown when text is copied to the clipboard--> - <string name="toast_copy_text">Text zkopírován do schránky</string> - <!--Toast shown when Google Play Services is not available for purchasing a product--> - <string name="toast_billing_not_available">Nákupy vyžadují Google Play Store (fakturace)</string> - <!--Toast shown when Google Play Services is not available for purchasing a product--> - <string name="toast_endlessjabber_not_installed">Aplikace EndlessJabber není nainstalována, otevírání Google Play</string> - <string name="toast_changelog_error">Nelze načíst seznam změn. Opakujte akci později</string> - <string name="toast_conversation_error">Nelze otevřít konverzaci</string> - <string name="toast_deleting_old_messages">Your old messages will be deleted shortly</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_1">Děkuji za přispění! Jsi mým novým nejlepším přítelem.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_2">Děkuji za dar! Miluji tě.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_3">Děkuji za přispění. Pomáháte QKSMS stát se tou nejlepší SMS aplikací, která kdy byla.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_4">Děkuji za přispění! Jsi vskutku boží!</string> - <!--Menu option to mute conversation--> - <string name="menu_mute_conversation">Ztlumit konverzaci</string> - <!--Menu option to mute conversation--> - <string name="menu_unmute_conversation">Odtlumit konverzaci</string> - <string name="menu_block_conversations">Blokovat konverzace</string> - <string name="menu_unblock_conversations">Odblokovat konverzace</string> - <string name="menu_messages">Zprávy</string> - <string name="menu_blocked">Blokováno</string> - <string name="menu_blocked_conversations">Blokované (%s nových)</string> - <string name="menu_unblocked_conversations">Zprávy (%s nových)</string> - <string name="menu_notifications">Oznámení</string> - <string name="menu_notifications_off">Upozornění vypnuta</string> - <string name="menu_notification_settings">Nastavení konverzace</string> - <string name="menu_view_details">Zobrazit podrobnosti</string> - <string name="menu_mark_read">Označit jako přečtené</string> - <string name="menu_mark_unread">Označit jako nepřečtené</string> - <string name="menu_delete_conversation">Odstranit konverzaci</string> - <string name="menu_multi_select">Vyberte konverzace</string> - <string name="menu_done">Hotovo</string> - <string name="failed_message_title">Možnosti selhaného odeslání</string> - <!--Toast shown to tell the user that they don't have a photo attachments app, and suggests that they download one--> - <string name="attachment_app_not_found">Prohlížeč obrázků nebyl nalezen. Zkuste nainstalovat aplikaci galerie.</string> - <string name="attachment_camera_error">Nelze otevřít fotoaparát</string> - <string name="pref_max_mms_attachment_size">Maximální velikost přílohy MMS</string> - <string name="error_no_recipients">Zvolte kontakty, kterým bude zpráva zaslána.</string> - <string name="error_file_not_found">QKSMS nemá přístup k souboru, kterou chcete sdílet!</string> - <string name="sending_blocked_welcome_screen_message">Hold up! You\'ll get to send real messages in a minute!</string> - <string name="notification_colored_icon_ready">Touch to add to your launcher from home screen.</string> - <string name="notification_title_colored_icon_ready">Obarvená ikona QKSMS je připravena</string> - <string name="icon_ready">Vaše nová ikona je připravena!</string> - <string name="icon_ready_message">Nyní si ji můžete přidat na svou domovskou obrazovku.</string> - <string name="dont_ask_again">Dotaz již nezobrazovat</string> - <string name="warning">Stagefright varování</string> - <string name="stagefright_warning">Video zprávy mohou obsahovat škodlivý kód, který může zanechat telefon náchylný k útokům. Chcete pokračovat?</string> - <!-- MMS DIALOG SETUP STRINGS --> - <string name="mms_setup_set_up_mms_title">Nastavit MMS?</string> - <string name="mms_setup_set_up_mms_body">Zdá se, že MMS nejsou v QKSMS nastaveny. Pro automatické nastavení MMS stiskněte OK.</string> - <string name="mms_setup_setting_up_later_title">Nastavit MMS později</string> - <string name="mms_setup_setting_up_later_body">Navštivte sekci MMS v Nastavení pro automatickou konfiguraci, obraťte se na podporu, nebo zadejte konfiguraci ručně.</string> - <string name="mms_setup_no_configurations_found_title">Konfigurace nebyla nalezena</string> - <string name="mms_setup_no_configurations_found_body">Automatické nastavení MMS pro vašeho operátora se nezdařilo. Stiskem OK nás můžete kontaktovat. Pomůžeme vám! </string> - <string name="mms_setup_one_configuration_found_title">Nalezena jedna konfigurace</string> - <string name="mms_setup_one_configuration_found_body">Našli jsme MMS konfiguraci pro operátora %s. Zní to rozumně?</string> - <string name="mms_setup_multiple_configurations_found_title">Nalezeno více konfigurací</string> - <string name="mms_setup_multiple_configurations_found_body">Našli jsme více konfigurací MMS. Vyberte vašeho operátora ze seznamu, nebo stiskněte N/A, pokud tam váš operátor není.</string> - <string name="mms_setup_next_steps_title">Další kroky</string> - <string name="mms_setup_next_steps_body">Navštivte sekci MMS v Nastavení pro opětovnou automatickou konfiguraci, obraťte se na podporu, nebo zadejte konfiguraci ručně.</string> - <string name="mms_setup_success_title">Úspěch!</string> - <string name="mms_setup_success_body">Pokud narazíte na nějaké problémy, navštivte sekci MMS v Nastavení pro opětovnou automatickou konfiguraci, obraťte se na podporu, nebo zadejte konfiguraci ručně.</string> - <string name="na">NENÍ K DISPOZICI</string> - <string name="no">Ne</string> - <string name="pref_automatically_configure_mms">Automaticky konfigurovat MMS</string> - <string name="pref_mms_contact_support">Kontaktovat podporu</string> - <string name="pref_category_sending_mms">Odesílání MMS</string> - <string name="pref_category_mms_configuration">Nastavení MMS</string> - <string name="pref_mms_contact_support_summary">Obraťte se na tým QKSMS pro nápovědu k nastavení MMS</string> - <string name="pref_markdown_enabled">Formátování textu</string> - <string name="pref_markdown_enabled_summary">Použít markdown syntaxi pro tučné a podtržené písmo nebo kurzívu ve zprávách</string> - <string name="want_read_indicators">Chcete oznámení o přečtení?</string> - <string name="color_swatch_description">Barva %1$d</string> - <string name="color_swatch_description_selected">Barva %1$d vybrána</string> - <string name="color_picker_default_title">Vybrat barvu</string> - <string name="message_delivered">Zpráva doručena</string> - <string name="message_not_delivered">Zpráva nebyla doručena</string> - <string name="error">Chyba</string> - <string name="invalid_destination">Neplatná cílová adresa.</string> - <string name="service_not_activated">Služba není v síti aktivována.</string> - <string name="service_message_not_found">Platnost zprávy vypršela nebo zpráva není dostupná.</string> - <string name="service_network_problem">Zprávu nelze odeslat z důvodu chyby sítě.</string> - <string name="message_queued">Vaši zprávu nyní nelze odeslat. Bude odeslána, jakmile bude služba opět k dispozici.</string> - <string name="download_later">Nyní nelze stáhnout. Zkuste to později.</string> - <string name="no_apn">Přístupový bod (APN) není nastaven. Nastavte jej v nastavení systému.</string> - <string name="no_subject">(Žádný předmět)</string> - <string name="unknown_sender">Neznámý odesílatel</string> - <string name="dl_failure_notification">Nelze stáhnout zprávu <xliff:g id="subject">%1$s </xliff:g> z <xliff:g id="from">%2$s </xliff:g>.</string> - <string name="auto_select_multiple_apns">Bylo nalezeno více konfigurací MMS. Zkuste nějakou. Pokud nebude fungovat, můžete zkusit další když vyberete Nastavení > Pokročilé > Načíst výchozí APN.</string> - <string name="auto_select_apn">Automaticky vybrat APN</string> - <string name="auto_select_failed_title">Automatická konfigurace selhala</string> - <string name="auto_select_failed">Try searching for your carrier\'s APN settings (MMSC, Port, and Proxy) and entering them in Settings > Advanced.</string> - <string name="date_yesterday">Včera</string> - <string name="date_just_now">Právě teď</string> - <string name="compose_loading_attachment">Načítání přílohy</string> - <string name="hint_no_messages">Zatím žádné zprávy. \nKlepněte + a nějakou pošlete!</string> - <string-array name="resend_menu"> - <item>Znovu odeslat</item> - <item>Upravit</item> - <item>Smazat</item> - </string-array> - <string-array name="message_menu"> - <item>Přeposlat zprávu</item> - <item>Kopírovat text</item> - <item>Zobrazit podrobnosti</item> - <item>Odstranit zprávu</item> - </string-array> - <string-array name="background_titles"> - <item>Světlý material design</item> - <item>Tmavý material design</item> - <item>Černá</item> - </string-array> - <string-array name="font_sizes"> - <item>Malé</item> - <item>Normální</item> - <item>Velké</item> - <item>Největší</item> - </string-array> - <string-array name="font_families"> - <item>Roboto Regular</item> - <item>Roboto Condensed</item> - <item>Systémové písmo</item> - </string-array> - <string-array name="font_weights"> - <item>Tenký</item> - <item>Normální</item> - </string-array> - <!-- String to match as no subject and filter out as a subject. For example, if the - subject string is "no subject", we won't display that. We'll pretend - no subject string was delivered. --> - <string-array name="empty_subject_strings"> - <item>žádný předmět</item> - </string-array> - <string-array name="qk_responses"> - <item>OK</item> - <item>Dej mi chvíli</item> - <item>Jsem na cestě</item> - <item>Díky</item> - <item>To zní dobře</item> - <item>Co je?</item> - <item>Souhlas</item> - <item>Ne</item> - <item>Miluji tě</item> - <item>Omlouvám se</item> - <item>LOL</item> - <item>To je v pořádku</item> - </string-array> - <string-array name="enter_button_options"> - <item>Zobrazit emoji</item> - <item>Nový řádek</item> - <item>Odeslat zprávu</item> - </string-array> - <string-array name="notification_private_options"> - <item>Zobrazit vše</item> - <item>Skrýt zprávu</item> - <item>Skrýt zprávu a odesílatele</item> - </string-array> - <!-- Max MMS attachment sizes. I.e. will compress pictures that are larger than 300 KB down to - under 300KB. --> - <string-array name="max_mms_attachment_sizes"> - <item>300 KB</item> - <item>600 KB</item> - <item>1 MB</item> - <item>Neomezeno</item> - </string-array> -</resources> diff --git a/QKSMS/src/main/res/values-da/strings.xml b/QKSMS/src/main/res/values-da/strings.xml deleted file mode 100644 index f613eafde..000000000 --- a/QKSMS/src/main/res/values-da/strings.xml +++ /dev/null @@ -1,768 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!--Generated by crowdin.com--> -<resources xmlns:xliff="http://schemas.android.com/apk/res-auto"> - <!--Slogan--> - <string name="slogan">Elsk at SMS\'e igen.</string> - <!--Text shown when a phone number cannot be found--> - <string name="unknown_number">Ukendt Nummer</string> - <!--Content description for photos--> - <string name="popup_photo_CD">Foto</string> - <!--Text to be displayed while content is loading--> - <string name="loading">Indlæser...</string> - <!--Test string--> - <string name="test">Test</string> - <!--Hint for contacts text field--> - <string name="hint_contacts">Angiv modtager(e)</string> - <!--Hint for search text field--> - <string name="hint_search">Søg</string> - <!--Hint for message reply text field--> - <string name="hint_reply">Skriv en besked</string> - <!--Hint for code redemption--> - <string name="hint_redeem">Indtast kode</string> - <string name="hint_hex">Hex</string> - <!--Text shown for single new message in notification--> - <string name="new_message">Ny besked</string> - <!--Text shown after number of unread messages in notification (ex. 3 new messages)--> - <string name="new_messages">Nye beskeder</string> - <!--Text shown for single failed message in notification--> - <string name="failed_message">Beskeden kunne ikke sendes</string> - <!--Text shown after number of failed messages in notification (ex. 3 messages failed to send)--> - <string name="failed_messages">beskederne kunne ikke sendes</string> - <!--Text shown under failed message count--> - <string name="failed_messages_summary">Tryk for at vise</string> - <!--QuickCompose notification title--> - <string name="quickcompose">QK Compose</string> - <!--QuickCompose notification text--> - <string name="quickcompose_detail">Tryk for at sende en besked</string> - <!--Welcome screen intro button--> - <string name="welcome_start">Lad os komme igang!</string> - <!--Allows user to skip welcome screen--> - <string name="welcome_skip">SPRING OVER</string> - <!--Allows user to finish the welcome screen--> - <string name="welcome_finish">FÆRDIGGØR</string> - <!--Indicates to user they can pick a color--> - <string name="welcome_theme_title">Vælg en farve</string> - <!--Indicates to user they can pick any colors--> - <string name="welcome_theme_description">Enhver farve.</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_night_description">Behageligt for øjnene.</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_night_hint">Slå til eller fra</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_quickreply_title">QK Reply</string> - <!--QK Reply explanation--> - <string name="welcome_quickreply_description">Besvar beskeder hurtigere end nogensinde.</string> - <!--Prompts user to try QK Reply--> - <string name="welcome_quickreply_hint">Prøv det!</string> - <!--QK Reply demo message--> - <string name="welcome_quickreply_message_1">Wow! Var det ikke sejt? Du kan se hele samtalen på et øjeblik. Tryk udenfor popup-boksen eller tryk på fluebenet for at afvise den.</string> - <!--QK Reply demo message--> - <string name="welcome_quickreply_message_2">Dette er QK Reply. Nu kan du besvare beskeder hvor som helst fra. Tryk på udvidelses-knappen for at se hvad der sker bagefter :)</string> - <!--Settings option in menu--> - <string name="menu_settings">Indstillinger</string> - <!--Search option in menu--> - <string name="menu_search">Søg</string> - <!--Show full conversation in QuickReply--> - <string name="menu_show_all">Vis alle beskeder</string> - <!--Show only unread messages in QuickReply--> - <string name="menu_show_unread">Vis ulæste beskeder</string> - <!--Open conversation option in menu (shown in QuickReply)--> - <string name="menu_open_thread">Åbn samtale</string> - <!--Forward message option in menu--> - <string name="menu_forward">Videresend besked</string> - <!--Call contact option in menu--> - <string name="menu_call">Ring op</string> - <!--Mark a message/conversation as read option in menu--> - <string name="menu_read">Markér som læst</string> - <!--Delete a message option in menu--> - <string name="menu_delete">Slet</string> - <!--Donate option in menu--> - <string name="menu_billing">Donér</string> - <!--Copy text option in menu--> - <string name="menu_copy">Kopier tekst</string> - <!--Changelog option in menu--> - <string name="menu_changelog">"Ændringslog"</string> - <!--Expand settings option in menu--> - <string name="menu_show_all_prefs">Vis alle</string> - <!--Show less settings option in menu--> - <string name="menu_show_fewer_prefs">Vis færre</string> - <!--Title for message details popup--> - <string name="details_title">Detaljer</string> - <!--Title for address that message is being sent to in message details popup--> - <string name="details_to">Til</string> - <!--Title for address that message is sent from in message details popup--> - <string name="details_from">Fra</string> - <!--Title for text of a message in message details popup--> - <string name="details_body">Brødtekst</string> - <!--Title for date sent of a message in message details popup--> - <string name="details_date_sent">Dato sendt</string> - <!--Title for date received of a message in message details popup--> - <string name="details_date_received">Dato modtaget</string> - <!--Title for rate snackbar--> - <string name="rate_title">Kan du lide QKSMS?</string> - <!--Title for rate button--> - <string name="rate_action">Bedøm</string> - <string name="pref_category_appearance">Udseende</string> - <string name="pref_category_summary_appearance">Temaer, skrifttyper, farver, avatars og mere</string> - <string name="pref_category_general">Generelt</string> - <string name="pref_category_summary_general">Levering, beskedafsendelse, formatering</string> - <string name="pref_category_blocking">Blokering af beskeder</string> - <string name="pref_category_notifications">Notifikationer</string> - <string name="pref_category_summary_notifications">Lyde, LED, privatliv</string> - <string name="pref_category_mms">MMS</string> - <string name="pref_category_summary_mms">Konfigurer MMS (APN), max størrelse, gruppebeskeder</string> - <string name="pref_category_quickreply">QK Reply</string> - <string name="pref_category_summary_quickreply">QK Reply, popup-indstillinger</string> - <string name="pref_category_quickcompose">QK Compose</string> - <string name="pref_category_summary_quickcompose">QK Compose, stjernemarkerede kontakter</string> - <string name="pref_category_about">Om</string> - <string name="pref_category_summary_about">Version, ændringslog, forfattere, tak</string> - <string name="pref_theme">Temafarve</string> - <string name="pref_theme_summary_alt">Tryk for at ændre tema</string> - <string name="pref_icon">Icon color</string> - <string name="pref_icon_summary">Tap to change the QKSMS icon color</string> - <string name="pref_status_tint">Tonet statusbjælke</string> - <string name="pref_navigation_tint">Tonet navigationslinje</string> - <string name="pref_background">Baggrundsfarve</string> - <string name="pref_background_summary">Tryk for at ændre baggrundsfarven</string> - <string name="pref_bubbles">Besked bobler</string> - <string name="pref_bubbles_summary">Tryk for at ændre besked boble indstillingerne</string> - <string name="pref_night">Nattilstand</string> - <string name="pref_night_summary">Spar på batteriet og reducer anstrengelsen af øjnene</string> - <string name="pref_night_amoled">Sort baggrund</string> - <string name="pref_night_amoled_summary">Spar ekstra batteri på enheder med AMOLED skærme</string> - <string name="pref_bubble_style_new">Brug ny boble stil</string> - <string name="pref_color_sent">Farv sendte beskeder</string> - <string name="pref_color_sent_summary">Farv baggrunds-boblerne for udgående beskeder</string> - <string name="pref_color_received">Farv modtagede beskeder</string> - <string name="pref_color_received_summary">Farv baggrunds-boblerne for indgående beskeder</string> - <string name="pref_hide_avatar_conversations">Skjul profilbilleder</string> - <string name="pref_hide_avatar_conversations_summary">Skjuler profilbilleder i samtalelisten</string> - <string name="pref_hide_avatar_sent">Skjul profilbilleder for sendte beskeder</string> - <string name="pref_hide_avatar_sent_summary">Skjuler dit profilbillede for udgående beskeder</string> - <string name="pref_hide_avatar_received">Skjul profilbilleder for modtagede beskeder</string> - <string name="pref_hide_avatar_received_summary">Skjuler profilbilleder for indgående beskeder</string> - <string name="pref_font_family">Skrifttype</string> - <string name="pref_font_size">Skriftstørrelse</string> - <string name="pref_font_weight">Typografi</string> - <string name="pref_message_count">Beskedtæller</string> - <string name="pref_message_count_summary">Vis antallet af beskeder for hver samtale</string> - <string name="pref_sent_timestamps">Sent timestamps</string> - <string name="pref_sent_timestamps_summary">Show the timestamp for when a message was sent, not received</string> - <string name="pref_force_timestamps">Force timestamps</string> - <string name="pref_force_timestamps_summary">Enable timestamps for all messages</string> - <string name="pref_key_timestamp_delay">New timestamp delay</string> - <string name="pref_key_timestamp_delay_summary">The number of minutes which must elapse between two messages in order for a new timestamp to be shown.</string> - <string name="pref_compose_favorites">Stjernemarkerede kontakter</string> - <string name="pref_compose_summary_favorites">Vis dine stjernemarkerede kontakter i QK Compose vinduet, så de kun er et klik væk</string> - <string name="pref_prox_sensor_call">Nærhedssensor</string> - <string name="pref_prox_sensor_call_summary">While in a conversation, bring your phone to your ear to start a call</string> - <string name="pref_delivery">Leveringsrapporter</string> - <string name="pref_delivery_summary">Bekræft at sms-beskeder blev sendt</string> - <string name="pref_delivery_toast">Vis toast</string> - <string name="pref_delivery_toast_summary">Vis en kort toast for at indikere at beskeden bliver leveret</string> - <string name="pref_delivery_vibrate">Vibrer</string> - <string name="pref_delivery_vibrate_summary">Vibrer ved beskedlevering</string> - <string name="pref_delete_old_messages">Delete old messages</string> - <string name="pref_delete_old_messages_summary">Automatically delete messages once they\'re old enough</string> - <string name="pref_delete_old_messages_unread">Unread messages</string> - <string name="pref_delete_old_messages_unread_summary">Automatically delete unread messages after %s days</string> - <string name="pref_delete_old_messages_read">Read messages</string> - <string name="pref_delete_old_messages_read_summary">Automatically delete read messages after %s days</string> - <string name="pref_yappy">Yappy integration</string> - <string name="pref_endlessjabber_summary">Aktiver fuld understøttelse af Yappy</string> - <string name="pref_blocked_conversations">Blokerede samtaler</string> - <string name="pref_blocked_conversations_summary">Long-press on a conversation and block to move to blocked inbox and stop notifications</string> - <string name="pref_block_future">Blokér fremtidige beskeder</string> - <string name="pref_block_future_summary">Blokér yderligere telefonnumre</string> - <string name="pref_should_i_answer">Should I Answer? Integration</string> - <string name="pref_should_i_answer_summary">Automatically delete incoming messages from numbers which are blocked through Should I Answer?</string> - <string name="pref_mobile_only">Mobilnumre</string> - <string name="pref_mobile_only_summary">Vis kun mobilnumre i kontakt forslag</string> - <string name="pref_auto_emoji">Automatisk emoji</string> - <string name="pref_auto_emoji_summary">Erstat tekst med billede emoji</string> - <string name="pref_enter_button">Enter-tast</string> - <string name="pref_enter_button_summary">Tryk for at ændre enter-tastens standard adfærd</string> - <string name="pref_compose_group">Gruppe beskeder</string> - <string name="pref_compose_group_summary">Når du skriver beskeden til flere personer, send en gruppebesked istedet for individuelle beskeder</string> - <string name="pref_auto_download">Automatisk download MMS</string> - <string name="pref_auto_download_summary">Automatisk download MMS-beskeder når disse bliver tilgængelige</string> - <string name="pref_auto_data">Automatisk data</string> - <string name="pref_auto_data_summary">Slå automatisk data til ved afsendelse og modtagelse af MMS</string> - <string name="pref_split">Opdel sms-beskeder</string> - <string name="pref_split_summary">Opdel lange sms-beskeder til seperate beskeder</string> - <string name="pref_split_counter">Opdelingstæller</string> - <string name="pref_split_counter_summary">Tilføjer en tæller foran hver opdelt besked</string> - <string name="pref_long_as_mms">Send lang besked som MMS</string> - <string name="pref_long_as_mms_summary">Send lange beskeder som MMS\'er i stedet for at opdele dem</string> - <string name="pref_long_as_mms_after">Send lang besked som MMS efter</string> - <string name="pref_long_as_mms_after_summary">Send lange beskeder som MMS når de overskrider længden af et antal beskeder</string> - <string name="pref_return">Vis tilbageknap</string> - <string name="pref_return_summary">Vis retur-tasten på tastaturet, i stedet for Emoji knap</string> - <string name="pref_text">Tekst</string> - <string name="pref_notifications">SMS-notifikationer aktiveret</string> - <string name="pref_led">Notifikations-LED</string> - <string name="pref_theme_led">Notifikations-LED farve</string> - <string name="pref_wake">Væk telefonen</string> - <string name="pref_wake_summary">Tænd skærmen når du modtager en ny besked</string> - <string name="pref_notifications_private">Private notifikationer</string> - <string name="pref_notifications_private_summary">Tryk for at ændre hvad der skal skjules i notifikationer</string> - <string name="pref_ringtone">Notifikations-lyd</string> - <string name="pref_ringtone_summary">Vælg en notifikations-lyd</string> - <string name="pref_ticker">Vis uddrag af besked</string> - <string name="pref_ticker_summary">Viser et lille uddrag af en ny besked i statuslinjen</string> - <string name="pref_vibration">Vibration</string> - <string name="pref_vibration_summary">Vibrer når der modtages ny besked</string> - <string name="pref_notification_call">Opkaldsknap</string> - <string name="pref_notification_call_summary">Ring op til afsenderen af en besked direkte fra notifikationen</string> - <string name="pref_dimiss_read">Marker som læst</string> - <string name="pref_dismiss_read_summary">Marker besked som læst når notifikationen er fjernet</string> - <string name="pref_delayed">Forsinkede beskeder</string> - <string name="pref_delayed_summary">Vent med at sende dine beskeder, så du har en chance for at gennemgå dem</string> - <string name="pref_delayed_duration">Forsinkelse (sekunder)</string> - <string name="pref_delayed_duration_summary">Forsinkelse inden afsendelsen af din besked</string> - <string name="pref_night_auto">Automatisk nattilstand</string> - <string name="pref_night_auto_summary">Aktiver nattilstand automatisk baseret på tiden</string> - <string name="pref_day_start">Morgengry</string> - <string name="pref_night_start">Nattilstand begynder</string> - <string name="pref_qk_responses">QK Responses</string> - <string name="pref_qk_responses_summary">Ændr dine forudindstillede svar til brug fra din Android Wear enhed</string> - <string name="pref_quickreply_enabled">QK Reply aktiveret</string> - <string name="pref_quickreply_enabled_summary">Vis QK Reply vinduet hver gang en ny besked modtages</string> - <string name="pref_tap_to_quit">Tryk for at afvise</string> - <string name="pref_tap_to_quit_summary">Tryk et vilkårligt sted udenfor vinduet for at lukke dette</string> - <string name="pref_quickcompose">QK Compose aktiveret</string> - <string name="pref_quickcompose_summary">Viser en notifikation som tillader dig med et enkelt tryk at skrive en ny besked</string> - <string name="pref_mms_enabled">MMS aktiveret</string> - <string name="pref_mms_enabled_summary">Aktiver afsendelse of modtagelse af MMS beskeder</string> - <string name="pref_mmsc_url">MMSC</string> - <string name="pref_mms_proxy">MMS proxy</string> - <string name="pref_mms_port">MMS port</string> - <string name="pref_apn_chooser">Indlæs standard APN\'er</string> - <string name="pref_strip_unicode">Forenkel unicode</string> - <string name="pref_strip_unicode_summary">Udskift tegn der ikke er understøttet i beskeder for GSM kompatible tegn</string> - <string name="pref_system_bar_flat">Flade systembjælker</string> - <string name="pref_system_bar_flat_summary">Slip af med hældningen vist på systemets UI bjælker på de fleste KitKat enheder</string> - <string name="pref_status_compat">Statusbjælke fix</string> - <string name="pref_status_compat_summary">Fixer problemer forårsaget af Immersive mode, Tinted Status Bar (Xposed) eller brugerdefinerede DPI indstillinger</string> - <string name="pref_navigation_compat">Navigationslinje fix</string> - <string name="pref_navigation_compat_summary">Fixer problemer forårsaget af Immersive mode, Tinted Status Bar (Xposed) eller brugerdefinerede DPI indstillinger</string> - <string name="pref_about_version_title">QKSMS version</string> - <string name="pref_about_authors_title">Forfattere</string> - <string name="pref_about_authors_summary">Moez Bhatti</string> - <string name="pref_changelog_summary">Tryk for at se changelog</string> - <string name="pref_about_thanks_title">Tak</string> - <string name="pref_about_thanks_summary">Tryk for at se open source bidragydere</string> - <string name="pref_donate_title">Donér</string> - <string name="pref_donate_summary">QKSMS er gratis. Støt os ved at donere!</string> - <string name="pref_about_gplus_title">Google+</string> - <string name="pref_about_gplus_summary">Join the QKSMS Beta Testing community on Google+</string> - <string name="pref_about_github_title">GitHub</string> - <string name="pref_about_github_summary">QKSMS is open source. Contribute and report issues on GitHub</string> - <string name="pref_about_crowdin_title">Crowdin</string> - <string name="pref_about_crowdin_summary">Join the QKSMS translation project on Crowdin</string> - <!--Preference subcategory--> - <string name="pref_subcat_theme">Tema</string> - <!--Preference subcategory--> - <string name="pref_subcat_system_bars">Systembjælker</string> - <!--Preference subcategory--> - <string name="pref_subcat_categories">Kategorier</string> - <!--Preference subcategory--> - <string name="pref_subcat_font">Skrifttype</string> - <!--Preference subcategory--> - <string name="pref_subcat_messages">Beskeder</string> - <!--Preference subcategory--> - <string name="pref_subcat_avatars">Avatars</string> - <string name="donate_google">Donér med Google</string> - <string name="donate_google_summary">Google tager 30% af donationer</string> - <string name="donate_paypal">Donér med Paypal</string> - <string name="donate_paypal_button">Donér et hvilket som helst beløb</string> - <string name="donate_paypal_button_summary">Køb mig lige hvad du ønsker!</string> - <!--Donation product name--> - <string name="product_name_donation">Donation</string> - <!--$1 donation product name--> - <string name="product_name_donate_1">Donér $1 USD</string> - <!--$5 donation product name--> - <string name="product_name_donate_5">Donér $5 USD</string> - <!--$3 donation product name--> - <string name="product_name_donate_10">Donér $100 USD</string> - <!--$1 donation product description--> - <string name="product_description_donate_1">Gi\' en Cola</string> - <!--$5 donation product description--> - <string name="product_description_donate_5">Gi\' en sandwich</string> - <!--$10 donaion product description--> - <string name="product_description_donate_10">Gi\' en frokost</string> - <string name="title_settings">Indstillinger</string> - <string name="title_search">Søg</string> - <string name="title_compose">Skriv</string> - <string name="title_conversation_list">Samtaler</string> - <string name="title_blocked">Blokeret</string> - <string name="title_changelog">Ændringslog</string> - <string name="title_picker">Nye beskeder</string> - <string name="title_donate">Donér</string> - <string name="title_qk_responses">QK Responses</string> - <string name="title_block_address">Blokér nummer</string> - <string name="title_unblock_address">Fjern blokering af nummer</string> - <string name="title_conversations_selected">%s valgt</string> - <string name="title_palette">Palette</string> - <string name="title_rgb">RGB</string> - <!-- Menu shown in the context menu when long pressing on a message when the message contains - one or more phone numbers and/or email addresses and the number or email is new to - contacts. [CHAR LIMIT=50] --> - <string name="menu_add_address_to_contacts">Tilføj <xliff:g id="contactEmailOrNumber">%s</xliff:g> til Personer</string> - <!-- Context menu item on an individual message for viewing an attached slideshow --> - <string name="view_slideshow">Vis slideshow</string> - <!-- Context menu item on an individual message for viewing message details such as time and date --> - <string name="view_message_details">Vis detaljer</string> - <!-- Context menu item on an individual message for viewing a delivery report --> - <string name="view_delivery_report">Vis rapport</string> - <!-- Context menu item on an individual message for deleting only that message --> - <string name="delete_message">Slet</string> - <!-- Abbreviation for "kilobyte" --> - <string name="kilobyte">KB</string> - <!-- Individual message context menu item --> - <string name="copy_message_text">Kopier tekst</string> - <!-- Header for context menu on an individual message --> - <string name="message_options">Besked indstillinger</string> - <!-- Delivery Header View --> - <!-- Title of "Report" window --> - <string name="delivery_header_title">Rapporter</string> - <!--Text for app restart confirmation dialog--> - <string name="restart_message">Disse indstillinger vil træde i kraft næste gang QKSMS bliver åbnet</string> - <!--Dialog title for asking if a user wants to delete a conversation--> - <string name="delete_conversation">Slet samtaler</string> - <!--Dialog title for asking if a user wants to delete all failed messages--> - <string name="delete_all_failed">Slet mislykkede beskeder</string> - <!--CDialog title for asking if a user wants to delete a conversation--> - <string name="delete_confirmation">Er du sikker på du vil slette (%s) samtaler?</string> - <!--CDialog title for asking if a user wants to delete all failed messages--> - <string name="delete_all_failed_confirmation">Er du sikker på du vil slette fejlede beskeder fra (%s) samtaler?</string> - <!--(Unused) Dialog title shown if APNs have not been set--> - <string name="apns_not_set">APN\'er er ikke valgt</string> - <!--(Unused) Dialog description shown if APNs have not been set--> - <string name="apns_not_set_description">Det ser ud til, at dine APN\'er ikke er blevet valgt. Dette betyder, at MMS ikke vil virke optimalt. Tryk venligst \"Okay\" og lad QKSMS finde dem for dig. :)</string> - <!--Dialog title show if MMS hasn't been configured--> - <string name="set_up_mms_title">Konfigurer MMS?</string> - <!--Dialog description shown if MMS hasn't yet been configured--> - <string name="set_up_mms_description">Det ser ud til at MMS ikke er konfigureret i QKSMS endnu. Tryk på okay for automatisk at konfigurere MMS.</string> - <!-- Dialog message text explaining that a draft message will not be saved due to invalid recipients --> - <string name="discard_message_reason">Din besked vil blive kasseret, fordi den ikke har nogen gyldig modtager.</string> - <string name="invalid_code">Ugyldig kode</string> - <!--Button to restart app now instead of manually later--> - <string name="restart">Genstart nu</string> - <!--Notification action to reply to a message--> - <string name="reply">Svar</string> - <!--Notification action to reply to a message--> - <string name="reply_qksms">Svar via QKSMS</string> - <!--Notification action to mark a message as read--> - <string name="read">Læst</string> - <!--Notification action to mark a message as read--> - <string name="mark_read">Marker som læst</string> - <!--Notification action to call the sender of a message--> - <string name="call">Ring op</string> - <!-- Notification toast message --> - <string name="notification_mute_on">Notifikationer er aktiveret</string> - <string name="notification_mute_off">Notifikationer er deaktiveret</string> - <!--Positive action button--> - <string name="yes">Ja</string> - <string name="add">Tilføj</string> - <!--Positive action button--> - <string name="save">Gem</string> - <!--Positive action button--> - <string name="enable">Aktiver</string> - <!--Positive action button--> - <string name="upgrade_now">Indstil nu</string> - <!--Positive action button--> - <string name="okay">Okay</string> - <!--Positive action button--> - <string name="redeem">Indløs</string> - <!--Neutral action button--> - <string name="just_once">Bare én gang</string> - <!--Neutral action button--> - <string name="later">Senere</string> - <!--Neutral action button --> - <string name="cancel">Annullér</string> - <!-- Name of the local user when displaying sender of an outgoing message (personal pronoun) --> - <string name="messagelist_sender_self">Mig</string> - <!-- Sender to be used if the sender address has been hidden --> - <string name="hidden_sender_address">Skjult afsenderadresse</string> - <!-- Subject to display in the conversation list if there is no subject --> - <string name="no_subject_view">(Intet emne)</string> - <!-- Time and date a message is due to expire --> - <string name="expire_on">"Expires: <xliff:g id="date">%s</xliff:g>"</string> - <!-- Formatting for subject displayed inline, prepended to MMS message text --> - <string name="inline_subject">"<Subject: <xliff:g id="subject">%s</xliff:g>>"</string> - <!-- Text of a button appearing for MMS messages that have not yet been downloaded, causing the message to be downloaded (imperative verb) --> - <string name="download">Download</string> - <!-- Message displayed in place of the "download message" button once it has been pressed, indicating that the download is in progress --> - <string name="downloading">Downloader</string> - <!-- Toast message while an image is being resized --> - <string name="compressing">Billedet er for stort. Komprimerer\u2026</string> - <!-- Header shown above favorite contacts in QKCompose --> - <string name="favorites">Stjernemarkerede kontakter</string> - <!-- Word represents 'self' in a conversation --> - <string name="me">Mig</string> - <string name="menu_edit">Rediger</string> - <string name="menu_delete_messages">Slet beskeder</string> - <string name="menu_delete_failed">Slet fejlede beskeder</string> - <string name="menu_lock">Lås</string> - <string name="menu_unlock">Lås op</string> - <!-- When the user tries to view message details and some error occurs while - retrieving those details, this message will be shown. --> - <string name="cannot_get_details">Fejl under indhentning af detaljer.</string> - <!-- Title of "Message details" dialog --> - <string name="message_details_title">Besked detaljer</string> - <!-- Label in "Message details" dialog --> - <string name="message_type_label">Type\u000A</string> - <!-- "Type" value in "Message details" dialog --> - <string name="text_message">SMS-besked</string> - <!-- "Type" value in "Message details" dialog --> - <string name="multimedia_message">MMS-besked</string> - <!-- "Type" value in "Message details" dialog --> - <string name="multimedia_notification">Multimediebesked notifikation</string> - <!-- Label in "Message details" dialog showing who sent the message. --> - <string name="from_label">Fra\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="to_address_label">Til\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="bcc_label">Bcc\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="sent_label">Sendt\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="received_label">Modtaget\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="saved_label">Gemt\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="subject_label">Emne\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="message_size_label">Besked størrelse\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="priority_label">Prioritet\u000A</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_high">Høj</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_normal">Normal</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_low">Lav</string> - <!-- Label in "Message details" dialog --> - <string name="message_class_label">Besked klasse\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="error_code_label">Fejlkode\u000A</string> - <!-- Alert dialog title when creating a slideshow [CHAR LIMIT=none] --> - <string name="building_slideshow_title">Sammensætter slideshow</string> - <!-- Tag appearing on conversations in the conversation list that contain a draft message --> - <string name="has_draft">Kladde</string> - <!-- In conversation list items, this is the separator between a contact's name and the draft stamp [CHAR LIMIT=5] --> - <string name="draft_separator">,\u0020</string> - <!-- In conversation list items, this comes after the receipient's name and contains the number of messages in the thread [CHAR LIMIT=5] --> - <string name="message_count_format">\u00a0<xliff:g id="number" example="1">%1$s</xliff:g></string> - <!-- For debugging: Dialog box title indicating there's a situation where data has unexpectedly changed --> - <string name="error_state">Ustadig tilstand</string> - <!-- For debugging: Dialog box text indicating there's a situation where data has unexpectedly changed --> - <string name="error_state_text">Tilstanden af samtaler og modtagere er ustadig. Lav venligst en fejlrapport og send den via http://go/droidanizer </string> - <!-- This is the dialog title for the "Select link" dialog, shown when the user clicks on a - chat in the chat history view if there are links in the chat message. The dialog displays the - links if there are any --> - <string name="select_link_title">Vælg handling</string> - <!-- In message list items, this string builds the timestamp line when the message is in a group [CHAR LIMIT=NONE] --> - <string name="message_timestamp_format"><xliff:g id="string" example="Fred Flinstone">%1$s</xliff:g>\u0020-\u0020<xliff:g id="string" example="9:39AM">%2$s</xliff:g></string> - <!--Message sending status: sending--> - <string name="status_sending">Sender...</string> - <!--Message sending status: failed--> - <!--<string name="status_failed">Failed. Tap to retry</string>--> - <!-- Delivery Report Activity --> - <!-- Status in "Report" window --> - <string name="status_none">(Intet)</string> - <!-- Status in "Report" window --> - <string name="status_pending">Under behandling</string> - <!-- Status in "Report" window --> - <string name="status_read">Læst</string> - <!-- Status in "Report" window --> - <string name="status_received">Modtaget</string> - <!-- Status in "Report" window --> - <string name="status_failed">Mislykkedes. Tryk for indstillinger</string> - <!-- Status in "Report" window --> - <string name="status_unread">Ulæst</string> - <!-- Status in "Report" window --> - <string name="status_rejected">Afvist</string> - <!-- Label in "Report" window --> - <string name="recipient_label">Modtager:\u0020</string> - <!-- Label in "Report" window --> - <string name="status_label">Status:\u0020</string> - <!-- Label in "Report" window [CHAR LIMIT=50]--> - <string name="delivered_label">Leveret:\u0020</string> - <string name="do_something">Gør noget</string> - <!-- Confirm Delete --> - <!-- Delete confirmation dialog title --> - <string name="confirm_dialog_title">Slet?</string> - <!-- Delete confirmation dialog title for locked messages --> - <string name="confirm_dialog_locked_title">Slet låst besked?</string> - <!-- This message is displayed in a confirmation dialog when the user selects one or more - conversations and then taps the "Delete" button. --> - <plurals name="confirm_delete_conversation"> - <!-- Case of 1 result. --> - <item quantity="one">Én samtale vil blive slettet.</item> - <!-- Case of 0 or 2 or more results. --> - <item quantity="other"><xliff:g id="number" example="15">%1$s</xliff:g> samtaler vil blive slettet.</item> - </plurals> - <string name="confirm_delete_conversation">Hele samtalen vil blive slettet.</string> - <!-- Delete all threads confirmation dialog message --> - <string name="confirm_delete_all_conversations">Alle samtaler vil blive slettet.</string> - <!-- Delete message confirmation dialog message --> - <string name="confirm_delete_message">Beskeden vil blive slettet.</string> - <!-- Delete message confirmation dialog message for a locked message --> - <string name="confirm_delete_locked_message">Slet denne låste besked?</string> - <!-- Delete all the messages on the SIM dialog message --> - <string name="confirm_delete_all_SIM_messages">Alle beskeder på SIM-kortet vil blive slettet.</string> - <!-- Delete the selected message on the SIM dialog message --> - <string name="confirm_delete_SIM_message">Denne besked på SIM-kortet vil blive slettet.</string> - <!-- Delete unlocked checkbox title --> - <string name="delete_unlocked">Slet låste beskeder</string> - <!-- Delete button title --> - <string name="delete">Slet</string> - <!-- More button title --> - <string name="more">Mere</string> - <!-- More button summary --> - <string name="more_summary">Tryk her for at se mere</string> - <!-- Action bar mode title when multi-selecting conversations --> - <string name="select_conversations">Vælg samtaler</string> - <!-- Show this in the middle of the main activity when there are no conversations [CHAR LIMIT=none] --> - <string name="no_conversations">Ingen samtaler.</string> - <!-- Show this in the middle of the main activity when loading conversations [CHAR LIMIT=none] --> - <string name="loading_conversations">Indlæser samtaler.</string> - <!-- Tells the user that QKSMS isn't the default SMS app --> - <string name="not_default">Standard SMS</string> - <!-- Tells the user they need to set QKSMS as the default app in order to use this feature --> - <string name="default_info">QKSMS skal være din SMS app for at gøre det</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to mark messages as read --> - <string name="not_default_mark_read">QKSMS skal være din SMS app for at markere beskeder som læst</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to mark messages as unread --> - <string name="not_default_mark_unread">QKSMS skal være din SMS app for at markere beskeder som ulæst</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to send messages --> - <string name="not_default_delete">QKSMS skal være din SMS app for at slette beskeder</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to delete messages --> - <string name="not_default_send">QKSMS skal være din SMS app for at sende beskeder</string> - <!-- Tells the user they should set QKSMS as the default messaging app --> - <string name="not_default_first">Nogle ting vil ikke virke før QKSMS er standard SMS-app</string> - <string name="delayed_messaging_info">Forsinket messaging giver dig mulighed at slette beskeder, før disse sendes. Ændr funktionsmåden og mere i Indstillinger</string> - <string name="delayed_duration_bounds_error">Varighed skal være mellem 1 og 30 sekunder</string> - <!-- Dialog title for the Read Report dialog. --> - <string name="confirm">Bekræft</string> - <!-- Dialog text for the Read Report dialog. --> - <string name="message_send_read_report">En \"læst\" melding vil blive sendt.</string> - <!-- Dialog title for updating app icon color --> - <string name="update_icon_title">Opdater ikonets farve</string> - <!-- Dialog message for updating app icon color --> - <string name="update_icon_message">QKSMS must be restarted when changing the icon color</string> - <string name="dialog_conversation_details_title">Samtale informationer</string> - <string name="dialog_conversation_details_last_message_date">Sidste besked modtaget</string> - <string name="dialog_conversation_details_message_count">Beskedtæller</string> - <string name="dialog_conversation_details_recipients">Modtagere (%s)</string> - <string name="dialog_should_i_answer_title">Should I Answer? not installed</string> - <string name="dialog_should_i_answer_message">Ønsker du at downloade app\'en fra Google Play nu?</string> - <string name="dialog_delete_old_messages">Are you sure you want to automatically delete old messages?</string> - <!-- Title for audio file picker --> - <string name="select_audio">Vælg lydside</string> - <!-- Menu title to copy an attachment to the shared storage [CHAR LIMIT=25] --> - <string name="copy_to_sdcard">Gem vedhæftet fil</string> - <!-- Toast message on successful copy to shared storage [CHAR LIMIT=30] --> - <string name="copy_to_sdcard_success">Vedhæftede fil gemt.</string> - <!-- Toast message on failed copy to shared storage [CHAR LIMIT=30] --> - <string name="copy_to_sdcard_fail">Kunne ikke gemme vedhæftede fil.</string> - <!-- Menu title to save a sound as a ringtone --> - <string name="save_ringtone">Gem som ringetone</string> - <!-- Toast message on successful copying ringtone to drm provider --> - <string name="saved_ringtone">Ringetone gemt.</string> - <!-- Toast message on failed copying ringtone to drm provider --> - <string name="saved_ringtone_fail">Kunne ikke gemme ringetone.</string> - <!-- Menu item --> - <!-- Menu item [CHAR LIMIT=40] --> - <string name="menu_group_participants">Gruppedeltagere</string> - <!--Toast shown when a draft is saved--> - <string name="toast_draft">Gemt som kladde</string> - <!--Toast shown when a conversation is deleted--> - <string name="toast_conversation_deleted">Samtale slettet</string> - <!--Toast shown when device is low on storage--> - <string name="toast_low_memory">"Telefonens lagerplads er opbrugt. Slet nogle filer eller apps for at frigøre plads."</string> - <!--Toast shown to tell user that forwarding messages doesn't work yet--> - <string name="toast_forward">Denne funktion er ikke blevet implementeret endnu. På nuværende tidspunkt henvises til brug af \"Kopier tekst\" og derefter \"Indsæt\" i samtalen som De ønsker at sende teksten i.</string> - <!--Toast shown for unimplemented features--> - <string name="toast_unimplemented">Denne funktion er endnu ikke blevet implementeret.</string> - <!--Toast shown when a message fails to send--> - <string name="toast_message_failure">Beskeden kunne ikke sendes</string> - <!--Toast shown when a message is delivered--> - <string name="toast_message_delivered">Beskeden blev leveret</string> - <!--Toast shown when a message is not delivered--> - <string name="toast_message_not_delivered">Beskeden blev ikke leveret</string> - <!--Toast shown when default APNs are loaded--> - <string name="toast_default_apns_loaded">Indlæst standard APN indstillinger</string> - <!--Toast shown when text is copied to the clipboard--> - <string name="toast_copy_text">Kopieret til udklipsholderen</string> - <!--Toast shown when Google Play Services is not available for purchasing a product--> - <string name="toast_billing_not_available">Køb kræver Google Play Butik (betaling) på din Android</string> - <!--Toast shown when Google Play Services is not available for purchasing a product--> - <string name="toast_endlessjabber_not_installed">EndlessJabber er ikke installeret. Åbner Google Play</string> - <string name="toast_changelog_error">Kunne ikke indlæse ændringsloggen. Prøv igen senere</string> - <string name="toast_conversation_error">Couldn\'t open conversation</string> - <string name="toast_deleting_old_messages">Your old messages will be deleted shortly</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_1">Tak for din donering! Du er min nye bedste ven.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_2">Tak for donationen! Jeg elsker dig.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_3">Tak for din donering. Du hjælper QKSMS med at blive den bedste SMS app nogensinde.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_4">Tak for din donation! Du er awesome.</string> - <!--Menu option to mute conversation--> - <string name="menu_mute_conversation">Dæmp samtale</string> - <!--Menu option to mute conversation--> - <string name="menu_unmute_conversation">Unmute conversation</string> - <string name="menu_block_conversations">Blokér samtaler</string> - <string name="menu_unblock_conversations">Fjern blokering af samtaler</string> - <string name="menu_messages">Beskeder</string> - <string name="menu_blocked">Blokeret</string> - <string name="menu_blocked_conversations">Blokerede (%s nye)</string> - <string name="menu_unblocked_conversations">Beskeder (%s nye)</string> - <string name="menu_notifications">Notifikationer</string> - <string name="menu_notifications_off">Notifikationer fra</string> - <string name="menu_notification_settings">Conversation settings</string> - <string name="menu_view_details">Vis detaljer</string> - <string name="menu_mark_read">Markér som læst</string> - <string name="menu_mark_unread">Markér som ulæst</string> - <string name="menu_delete_conversation">Slet samtale</string> - <string name="menu_multi_select">Vælg samtale</string> - <string name="menu_done">Udført</string> - <string name="failed_message_title">Indstillinger for fejlede beskeder</string> - <!--Toast shown to tell the user that they don't have a photo attachments app, and suggests that they download one--> - <string name="attachment_app_not_found">Attachments app not found. Try installing a photo gallery app!</string> - <string name="attachment_camera_error">Kameraet kunne ikke åbnes</string> - <string name="pref_max_mms_attachment_size">Maksimumstørrelsen for MMS vedhæftninger</string> - <string name="error_no_recipients">Vælg nogle kontakter at sende denne besked til!</string> - <string name="error_file_not_found">QKSMS kan ikke få adgang til filen du forsøger at dele!</string> - <string name="sending_blocked_welcome_screen_message">Øjeblik! Du vil kunne sende rigtige beskeder om et minut!</string> - <string name="notification_colored_icon_ready">Touch to add to your launcher from home screen.</string> - <string name="notification_title_colored_icon_ready">Det farvede QKSMS ikon er klar</string> - <string name="icon_ready">Dit nye ikon er klar!</string> - <string name="icon_ready_message">Du kan nu tilføje den til din hjemmeskærm igen med den opdaterede farve.</string> - <string name="dont_ask_again">Spørg ikke igen</string> - <string name="warning">Stagefright advarsel</string> - <string name="stagefright_warning">Video messages may contain a harmful exploit that can leave your phone vulnerable to attacks. Would you like to continue?</string> - <!-- MMS DIALOG SETUP STRINGS --> - <string name="mms_setup_set_up_mms_title">Konfigurer MMS?</string> - <string name="mms_setup_set_up_mms_body">Det lader til at MMS ikke er opsat i QKSMS. Tryk på okay for automatisk at konfigurere MMS.</string> - <string name="mms_setup_setting_up_later_title">Opsætter MMS senere</string> - <string name="mms_setup_setting_up_later_body">Besøg afsnittet MMS i Indstillinger for at forsøge automatisk konfiguration, kontakt supporten eller indtast din egen konfiguration.</string> - <string name="mms_setup_no_configurations_found_title">Ingen konfigurationer fundet</string> - <string name="mms_setup_no_configurations_found_body">Vi kunne ikke finde en MMS konfiguration for din udbyder automatisk. Tryk på okay for at kontakte supporten. Vi hjælper dig med at få konfigurationen opsat! </string> - <string name="mms_setup_one_configuration_found_title">Én konfiguration fundet</string> - <string name="mms_setup_one_configuration_found_body">Vi har fundet en MMS konfiguration for udbyderen %s. Lyder det korrekt?</string> - <string name="mms_setup_multiple_configurations_found_title">Flere konfigurationer fundet</string> - <string name="mms_setup_multiple_configurations_found_body">Vi har fundet flere MMS konfigurationer. Vælg din udbyder på listen, eller tryk på N/A hvis din udbyder ikke er på listen.</string> - <string name="mms_setup_next_steps_title">Næste trin</string> - <string name="mms_setup_next_steps_body">Besøg afsnittet MMS i Indstillinger for at forsøge automatisk konfiguration igen, kontakt supporten eller indtast din egen konfiguration.</string> - <string name="mms_setup_success_title">Succes!</string> - <string name="mms_setup_success_body">Hvis du støder på nogle problemer, gå til MMS sektionen af indstillingerne for at prøve at konfigurere automatisk igen, kontakt supporten, eller indtast din egen konfiguration.</string> - <string name="na">N/A</string> - <string name="no">Nej</string> - <string name="pref_automatically_configure_mms">Konfigurér MMS automatisk</string> - <string name="pref_mms_contact_support">Kontakt support</string> - <string name="pref_category_sending_mms">Sender MMS</string> - <string name="pref_category_mms_configuration">MMS Konfiguration</string> - <string name="pref_mms_contact_support_summary">Kontakt QKSMS teamet for at få hjælp til opsætning af MMS</string> - <string name="pref_markdown_enabled">Tekstformatering</string> - <string name="pref_markdown_enabled_summary">Brug markdown syntaks til at få fed skrift, understregning og kursiv i dine beskeder</string> - <string name="want_read_indicators">Want read indicators?</string> - <string name="color_swatch_description">Farve %1$d</string> - <string name="color_swatch_description_selected">Farven %1$d valgt</string> - <string name="color_picker_default_title">Vælg en farve</string> - <string name="message_delivered">Beskeden blev leveret</string> - <string name="message_not_delivered">Beskeden blev ikke leveret</string> - <string name="error">Fejl</string> - <string name="invalid_destination">Ugyldig destinationsadresse.</string> - <string name="service_not_activated">Service ikke aktiveret på netværket.</string> - <string name="service_message_not_found">Besked udløbet eller ikke tilgængelig.</string> - <string name="service_network_problem">Kunne ikke sende på grund af netværksproblem.</string> - <string name="message_queued">Kan i øjeblikket ikke sende din besked. Denne vil blive sendt når tjenesten bliver tilgængelig.</string> - <string name="download_later">Kan ikke hente lige nu. Prøv igen senere.</string> - <string name="no_apn">Ingen APN angivet for app\'en, du skal sørge for at opsætte dette i Indstillinger!</string> - <string name="no_subject">(Intet emne)</string> - <string name="unknown_sender">Ukendt afsender</string> - <string name="dl_failure_notification">Kunne ikke hente beskeden <xliff:g id="subject">%1$s</xliff:g> fra <xliff:g id="from">%2$s</xliff:g>.</string> - <string name="auto_select_multiple_apns">Multiple different configurations have been found. Try one now. If it doesn\'t work, you can try a new one by going to Settings > Advanced > Load default APNs.</string> - <string name="auto_select_apn">Vælg automatisk APN\'er</string> - <string name="auto_select_failed_title">Automatisk konfiguration mislykkedes</string> - <string name="auto_select_failed">Prøv at søge efter din udbyder\'s APN indstillinger (MMSC, Port og Proxy) og indtast dem i Indstillinger > Avanceret.</string> - <string name="date_yesterday">Igår</string> - <string name="date_just_now">Lige nu</string> - <string name="compose_loading_attachment">Indlæser vedhæftet fil</string> - <string name="hint_no_messages">Ingen beskeder endnu.\nKlik på + for at sende en!</string> - <string-array name="resend_menu"> - <item>Gensend</item> - <item>Rediger</item> - <item>Slet</item> - </string-array> - <string-array name="message_menu"> - <item>Videresend besked</item> - <item>Kopiér tekst</item> - <item>Vis detaljer</item> - <item>Slet besked</item> - </string-array> - <string-array name="background_titles"> - <item>Material Lys</item> - <item>Material Mørk</item> - <item>Sort</item> - </string-array> - <string-array name="font_sizes"> - <item>Lille</item> - <item>Normal</item> - <item>Stor</item> - <item>Størst</item> - </string-array> - <string-array name="font_families"> - <item>Roboto Regular</item> - <item>Roboto Condensed</item> - <item>System font</item> - </string-array> - <string-array name="font_weights"> - <item>Tynd</item> - <item>Normal</item> - </string-array> - <!-- String to match as no subject and filter out as a subject. For example, if the - subject string is "no subject", we won't display that. We'll pretend - no subject string was delivered. --> - <string-array name="empty_subject_strings"> - <item>intet emne</item> - </string-array> - <string-array name="qk_responses"> - <item>Okay</item> - <item>Giv mig et øjeblik</item> - <item>Jeg er på vej</item> - <item>Tak</item> - <item>Det lyder godt</item> - <item>Hvad så?</item> - <item>Enig</item> - <item>Nej</item> - <item>Elsker dig</item> - <item>Beklager</item> - <item>LOL</item> - <item>Det er okay</item> - </string-array> - <string-array name="enter_button_options"> - <item>Vis emoji</item> - <item>Ny linie</item> - <item>Send besked</item> - </string-array> - <string-array name="notification_private_options"> - <item>Vis alle</item> - <item>Skjul besked</item> - <item>Skjul besked og afsender</item> - </string-array> - <!-- Max MMS attachment sizes. I.e. will compress pictures that are larger than 300 KB down to - under 300KB. --> - <string-array name="max_mms_attachment_sizes"> - <item>300 KB</item> - <item>600 KB</item> - <item>1 MB</item> - <item>Ubegrænset</item> - </string-array> -</resources> diff --git a/QKSMS/src/main/res/values-de/strings.xml b/QKSMS/src/main/res/values-de/strings.xml deleted file mode 100644 index 64add2abf..000000000 --- a/QKSMS/src/main/res/values-de/strings.xml +++ /dev/null @@ -1,768 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!--Generated by crowdin.com--> -<resources xmlns:xliff="http://schemas.android.com/apk/res-auto"> - <!--Slogan--> - <string name="slogan">Hab wieder Spaß, SMS zu schreiben.</string> - <!--Text shown when a phone number cannot be found--> - <string name="unknown_number">Unbekannte Nummer</string> - <!--Content description for photos--> - <string name="popup_photo_CD">Foto</string> - <!--Text to be displayed while content is loading--> - <string name="loading">Lade…</string> - <!--Test string--> - <string name="test">Test string</string> - <!--Hint for contacts text field--> - <string name="hint_contacts">Empfänger eingeben</string> - <!--Hint for search text field--> - <string name="hint_search">Suche etwas</string> - <!--Hint for message reply text field--> - <string name="hint_reply">Nachricht eingeben</string> - <!--Hint for code redemption--> - <string name="hint_redeem">Code eingeben</string> - <string name="hint_hex">Hex</string> - <!--Text shown for single new message in notification--> - <string name="new_message">Neue Nachricht</string> - <!--Text shown after number of unread messages in notification (ex. 3 new messages)--> - <string name="new_messages">Neue Nachrichten</string> - <!--Text shown for single failed message in notification--> - <string name="failed_message">Nachricht konnte nicht gesendet werden</string> - <!--Text shown after number of failed messages in notification (ex. 3 messages failed to send)--> - <string name="failed_messages">Nachrichten konnten nicht gesendet werden</string> - <!--Text shown under failed message count--> - <string name="failed_messages_summary">Berühre zum Ansehen</string> - <!--QuickCompose notification title--> - <string name="quickcompose">QK Compose</string> - <!--QuickCompose notification text--> - <string name="quickcompose_detail">Klicken, um eine Nachricht zu senden</string> - <!--Welcome screen intro button--> - <string name="welcome_start">Los geht\'s!</string> - <!--Allows user to skip welcome screen--> - <string name="welcome_skip">ÜBERSPRINGEN</string> - <!--Allows user to finish the welcome screen--> - <string name="welcome_finish">FERTIG</string> - <!--Indicates to user they can pick a color--> - <string name="welcome_theme_title">Wähle eine Farbe</string> - <!--Indicates to user they can pick any colors--> - <string name="welcome_theme_description">Jede Farbe.</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_night_description">Angenehm für die Augen.</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_night_hint">Schalte mich ein</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_quickreply_title">QK-Antwort</string> - <!--QK Reply explanation--> - <string name="welcome_quickreply_description">Antworte auf Nachrichten schneller als je zuvor.</string> - <!--Prompts user to try QK Reply--> - <string name="welcome_quickreply_hint">Probier es!</string> - <!--QK Reply demo message--> - <string name="welcome_quickreply_message_1">Wow! War das nicht genial? Du kannst die gesamte Unterhaltung auf einen Blick sehen. Tippe außerhalb des Popups oder setze den Haken, um es auszublenden.</string> - <!--QK Reply demo message--> - <string name="welcome_quickreply_message_2">Das ist QK Reply. Du kannst jetzt von überall auf deine Nachrichten antworten. Tippe auf Erweitern, um zu sehen, was dann passiert :)</string> - <!--Settings option in menu--> - <string name="menu_settings">Einstellungen</string> - <!--Search option in menu--> - <string name="menu_search">Suche</string> - <!--Show full conversation in QuickReply--> - <string name="menu_show_all">Zeige alle Nachrichten</string> - <!--Show only unread messages in QuickReply--> - <string name="menu_show_unread">Zeige ungelesene Nachrichten</string> - <!--Open conversation option in menu (shown in QuickReply)--> - <string name="menu_open_thread">Öffne Unterhaltung</string> - <!--Forward message option in menu--> - <string name="menu_forward">Nachricht weiterleiten</string> - <!--Call contact option in menu--> - <string name="menu_call">Anrufen</string> - <!--Mark a message/conversation as read option in menu--> - <string name="menu_read">Als gelesen markieren</string> - <!--Delete a message option in menu--> - <string name="menu_delete">Löschen</string> - <!--Donate option in menu--> - <string name="menu_billing">Spenden</string> - <!--Copy text option in menu--> - <string name="menu_copy">Text kopieren</string> - <!--Changelog option in menu--> - <string name="menu_changelog">"Was gibt's Neues?"</string> - <!--Expand settings option in menu--> - <string name="menu_show_all_prefs">Zeige alle</string> - <!--Show less settings option in menu--> - <string name="menu_show_fewer_prefs">Zeige weniger</string> - <!--Title for message details popup--> - <string name="details_title">Details</string> - <!--Title for address that message is being sent to in message details popup--> - <string name="details_to">An</string> - <!--Title for address that message is sent from in message details popup--> - <string name="details_from">Von</string> - <!--Title for text of a message in message details popup--> - <string name="details_body">Inhalt</string> - <!--Title for date sent of a message in message details popup--> - <string name="details_date_sent">Gesendet</string> - <!--Title for date received of a message in message details popup--> - <string name="details_date_received">Empfangen</string> - <!--Title for rate snackbar--> - <string name="rate_title">Gefällt dir QKSMS?</string> - <!--Title for rate button--> - <string name="rate_action">Bewerten</string> - <string name="pref_category_appearance">Erscheinungsbild</string> - <string name="pref_category_summary_appearance">Themen, Schriften, Farben, Avatare und mehr</string> - <string name="pref_category_general">Allgemein</string> - <string name="pref_category_summary_general">Zustellung, Nachrichtenversand, Formatierung</string> - <string name="pref_category_blocking">Nachrichtenblockierung</string> - <string name="pref_category_notifications">Benachrichtigungen</string> - <string name="pref_category_summary_notifications">Töne, LED, Privatsphäre</string> - <string name="pref_category_mms">MMS</string> - <string name="pref_category_summary_mms">Konfiguriere MMS (APN), max. Größe, Gruppennachrichten</string> - <string name="pref_category_quickreply">QK Reply</string> - <string name="pref_category_summary_quickreply">QK Reply, Popup-Einstellungen</string> - <string name="pref_category_quickcompose">QK Compose</string> - <string name="pref_category_summary_quickcompose">QK Compose, Favoriten</string> - <string name="pref_category_about">Über</string> - <string name="pref_category_summary_about">Version, letzte Änderungen, Autoren, Danke</string> - <string name="pref_theme">Farbschema</string> - <string name="pref_theme_summary_alt">Tippen um das Schema zu wechseln</string> - <string name="pref_icon">Icon color</string> - <string name="pref_icon_summary">Tap to change the QKSMS icon color</string> - <string name="pref_status_tint">Getönte Statusleiste</string> - <string name="pref_navigation_tint">Getönte Navigationsleiste</string> - <string name="pref_background">Hintergrundfarbe</string> - <string name="pref_background_summary">Tippen um Hintergrundfarbe zu wählen</string> - <string name="pref_bubbles">Nachrichtenblasen</string> - <string name="pref_bubbles_summary">Ändere die Nachrichten-Bubbles</string> - <string name="pref_night">Nachtmodus</string> - <string name="pref_night_summary">Spare Batterie und verringere die Augenbelastung</string> - <string name="pref_night_amoled">Reiner schwarzer Hintergrund</string> - <string name="pref_night_amoled_summary">Spare Akkuverbrauch auf Geräten mit AMOLED</string> - <string name="pref_bubble_style_new">Neue Nachrichtenblasen benutzen</string> - <string name="pref_color_sent">Färbe gesendete Nachrichten ein</string> - <string name="pref_color_sent_summary">Färbe die Hintergrundblasen für ausgehende Nachrichten ein</string> - <string name="pref_color_received">Färbe empfangene Nachrichten ein</string> - <string name="pref_color_received_summary">Färbe die Hintergrundblasen für eingehende Nachrichten ein</string> - <string name="pref_hide_avatar_conversations">Verstecke Avatare in den Unterhaltungen</string> - <string name="pref_hide_avatar_conversations_summary">Verstecke Kontaktavatare in der Liste der Unterhaltungen</string> - <string name="pref_hide_avatar_sent">Verstecke Avatar für gesendete Nachrichten</string> - <string name="pref_hide_avatar_sent_summary">Verstecke den eigenen Avatar für ausgehende Nachrichten</string> - <string name="pref_hide_avatar_received">Verstecke Avatar für empfangene Nachrichten</string> - <string name="pref_hide_avatar_received_summary">Verstecke Avatar für eingehende Nachrichten</string> - <string name="pref_font_family">Schriftart</string> - <string name="pref_font_size">Schriftgröße</string> - <string name="pref_font_weight">Schriftstärke</string> - <string name="pref_message_count">Nachrichtenzähler</string> - <string name="pref_message_count_summary">Zeige die Anzahl der Nachrichten für jede Unterhaltung</string> - <string name="pref_sent_timestamps">Sent timestamps</string> - <string name="pref_sent_timestamps_summary">Show the timestamp for when a message was sent, not received</string> - <string name="pref_force_timestamps">Force timestamps</string> - <string name="pref_force_timestamps_summary">Enable timestamps for all messages</string> - <string name="pref_key_timestamp_delay">New timestamp delay</string> - <string name="pref_key_timestamp_delay_summary">The number of minutes which must elapse between two messages in order for a new timestamp to be shown.</string> - <string name="pref_compose_favorites">Favoriten</string> - <string name="pref_compose_summary_favorites">Zeige deine Favoriten im QK Compose-Fenster, so dass sie nur einen Klick entfernt sind</string> - <string name="pref_prox_sensor_call">Näherungssensor</string> - <string name="pref_prox_sensor_call_summary">Hebe das Telefon an dein Ohr, um in einer Unterhaltung deinen Gesprächspartner anzurufen</string> - <string name="pref_delivery">Zustellbestätigungen</string> - <string name="pref_delivery_summary">Bestätige, dass die Nachrichten erfolgreich versendet wurden</string> - <string name="pref_delivery_toast">Zeige kleine Meldung</string> - <string name="pref_delivery_toast_summary">Zeige eine kleine Meldung, dass die Nachricht zugestellt wurde</string> - <string name="pref_delivery_vibrate">Vibrieren</string> - <string name="pref_delivery_vibrate_summary">Vibriere bei Nachrichtenzustellung</string> - <string name="pref_delete_old_messages">Delete old messages</string> - <string name="pref_delete_old_messages_summary">Automatically delete messages once they\'re old enough</string> - <string name="pref_delete_old_messages_unread">Unread messages</string> - <string name="pref_delete_old_messages_unread_summary">Automatically delete unread messages after %s days</string> - <string name="pref_delete_old_messages_read">Read messages</string> - <string name="pref_delete_old_messages_read_summary">Automatically delete read messages after %s days</string> - <string name="pref_yappy">Integration von Yappy</string> - <string name="pref_endlessjabber_summary">Volle Unterstützung für Yappy aktivieren</string> - <string name="pref_blocked_conversations">Blockierte Unterhaltungen</string> - <string name="pref_blocked_conversations_summary">Unterhaltung gedrückt halten, um sie zur Blockliste hinzuzufügen und keine Nachrichten mehr zu bekommen</string> - <string name="pref_block_future">Zukünftige Nachrichten blockieren</string> - <string name="pref_block_future_summary">Weitere Telefonnummern hinzufügen, die geblockt werden</string> - <string name="pref_should_i_answer">\"Should I Answer?\"-Integration</string> - <string name="pref_should_i_answer_summary">Eingehende Nachrichten automatisch löschen, wenn die entsprechende Nummer in \"Should I Answer?\" blockiert wurde</string> - <string name="pref_mobile_only">Mobilfunknummern</string> - <string name="pref_mobile_only_summary">Zeige nur Mobilfunknummern in den Kontaktvorschlägen</string> - <string name="pref_auto_emoji">Automatische Emojis</string> - <string name="pref_auto_emoji_summary">Ersetze Text durch das passende Emoji</string> - <string name="pref_enter_button">Eingabetaste</string> - <string name="pref_enter_button_summary">Stelle hier das Verhalten der Eingabetaste ein</string> - <string name="pref_compose_group">Gruppennachrichten</string> - <string name="pref_compose_group_summary">Beim Erstellen einer Nachricht an mehrere Personen sende eine Gruppennachricht anstelle einzelner Nachrichten</string> - <string name="pref_auto_download">MMS automatisch herunterladen</string> - <string name="pref_auto_download_summary">MMS-Nachrichten automatisch herunterladen, wenn sie verfügbar sind</string> - <string name="pref_auto_data">Automatisches Datennetz</string> - <string name="pref_auto_data_summary">Datennetz automatisch einschalten um MMS zu senden oder zu empfangen</string> - <string name="pref_split">Teile SMS</string> - <string name="pref_split_summary">Teile lange Nachrichten in einzelne Nachrichten</string> - <string name="pref_split_counter">Geteilte SMS nummerieren</string> - <string name="pref_split_counter_summary">Fügt einen Zähler vor jede Teilnachricht hinzu</string> - <string name="pref_long_as_mms">Sende lange SMS als MMS</string> - <string name="pref_long_as_mms_summary">Sende lange Nachrichten als MMS anstatt sie aufzuteilen</string> - <string name="pref_long_as_mms_after">Sende lange SMS als MMS nach</string> - <string name="pref_long_as_mms_after_summary">Sende lange Nachrichten als MMS, wenn sie die maximale Nachrichtenlänge überschreiten</string> - <string name="pref_return">Zeige Zurück-Taste</string> - <string name="pref_return_summary">Zeige statt der Emoji-Taste eine Eingabetaste</string> - <string name="pref_text">Text</string> - <string name="pref_notifications">SMS-Benachrichtigungen aktiviert</string> - <string name="pref_led">Benachrichtigungs-LED</string> - <string name="pref_theme_led">Farbe der Benachrichtigungs-LED</string> - <string name="pref_wake">Telefon aufwecken</string> - <string name="pref_wake_summary">Das Display anschalten, wenn eine neue Nachricht empfangen wird</string> - <string name="pref_notifications_private">Private Benachrichtigungen</string> - <string name="pref_notifications_private_summary">Ändern, was in der Benachrichtigung ausgeblendet werden soll</string> - <string name="pref_ringtone">Benachrichtigungston</string> - <string name="pref_ringtone_summary">Wählen Sie einen Benachrichtigungston</string> - <string name="pref_ticker">Ausschnitt anzeigen</string> - <string name="pref_ticker_summary">Zeigt einen Ausschnitt der neuen Nachricht in der Benachrichtigungsleiste</string> - <string name="pref_vibration">Vibration</string> - <string name="pref_vibration_summary">Vibrieren, wenn neue Nachrichten empfangen werden</string> - <string name="pref_notification_call">Anruftaste</string> - <string name="pref_notification_call_summary">Rufe den Absender der Nachricht direkt von der Benachrichtigung an</string> - <string name="pref_dimiss_read">Als gelesen markieren</string> - <string name="pref_dismiss_read_summary">Nachricht als gelesen makieren, wenn Benachrichtigung gelöscht wird</string> - <string name="pref_delayed">Verzögerte Nachrichten</string> - <string name="pref_delayed_summary">Warte vor dem Versenden deiner Nachrichten, so dass du sie überprüfen kannst</string> - <string name="pref_delayed_duration">Verzögerungszeit (Sekunden)</string> - <string name="pref_delayed_duration_summary">Wartezeit, bevor deine Nachrichten versendet werden</string> - <string name="pref_night_auto">Automatischer Nachtmodus</string> - <string name="pref_night_auto_summary">Aktiviere den Nachtmodus automtisch, abhängig von der Uhrzeit</string> - <string name="pref_day_start">Tageszeit beginnt</string> - <string name="pref_night_start">Nachtzeit beginnt</string> - <string name="pref_qk_responses">QK Reply</string> - <string name="pref_qk_responses_summary">Ändere deine vordefinierten Antworten, die von deinem Android Wear-Gerät verwendet werden</string> - <string name="pref_quickreply_enabled">QK Reply aktiviert</string> - <string name="pref_quickreply_enabled_summary">Zeige QK Reply immer, wenn eine neue Nachricht empfangen wurde</string> - <string name="pref_tap_to_quit">Tippen zum Verwerfen</string> - <string name="pref_tap_to_quit_summary">Tippe außerhalb des Fensters, um es zu schließen</string> - <string name="pref_quickcompose">QK Compose aktiviert</string> - <string name="pref_quickcompose_summary">Zeigt eine Benachrichtigung, die es dir erlaubt, eine neue Nachricht zu verfassen</string> - <string name="pref_mms_enabled">MMS aktiviert</string> - <string name="pref_mms_enabled_summary">Aktiviere das Senden und Empfangen von MMS-Nachrichten</string> - <string name="pref_mmsc_url">MMSC</string> - <string name="pref_mms_proxy">MMS-Proxy</string> - <string name="pref_mms_port">MMS-Port</string> - <string name="pref_apn_chooser">Lade Standard-APN</string> - <string name="pref_strip_unicode">Unicode-Zeichen entfernen</string> - <string name="pref_strip_unicode_summary">Ersetze nicht unterstütze Zeichen mit GSM-kompatiblen Zeichen bei durchgehenden Nachrichten</string> - <string name="pref_system_bar_flat">Flache Systemleisten</string> - <string name="pref_system_bar_flat_summary">Blende den Farbverlauf auf den Systemleisten bei den meisten KitKat-Geräten aus</string> - <string name="pref_status_compat">Behebe Probleme mit der Statusleiste</string> - <string name="pref_status_compat_summary">Behebt Probleme, die durch den Nachtmodus, die getönte Statusleiste (Xposed) oder benutzerdefinierte DPI-Einstellungen verursacht werden</string> - <string name="pref_navigation_compat">Behebe Probleme mit der Navigationsleiste</string> - <string name="pref_navigation_compat_summary">Behebt Probleme, die durch den Nachtmodus, die getönte Statusleiste (Xposed) oder benutzerdefinierte DPI-Einstellungen verursacht werden</string> - <string name="pref_about_version_title">QKSMS-Version</string> - <string name="pref_about_authors_title">Mitwirkende</string> - <string name="pref_about_authors_summary">Moez Bhatti</string> - <string name="pref_changelog_summary">Tippe um den Changelog zu sehen</string> - <string name="pref_about_thanks_title">Vielen Dank</string> - <string name="pref_about_thanks_summary">Tippe um die Open-Source-Beteiligten zu sehen</string> - <string name="pref_donate_title">Spenden</string> - <string name="pref_donate_summary">QKSMS ist kostenlos. Unterstütze uns durch eine Spende!</string> - <string name="pref_about_gplus_title">Google+</string> - <string name="pref_about_gplus_summary">Werde Teil der QKSMS Betatest-Community auf Google+</string> - <string name="pref_about_github_title">GitHub</string> - <string name="pref_about_github_summary">QKSMS is open source. Contribute and report issues on GitHub</string> - <string name="pref_about_crowdin_title">Crowdin</string> - <string name="pref_about_crowdin_summary">Join the QKSMS translation project on Crowdin</string> - <!--Preference subcategory--> - <string name="pref_subcat_theme">Thema</string> - <!--Preference subcategory--> - <string name="pref_subcat_system_bars">Systemleisten</string> - <!--Preference subcategory--> - <string name="pref_subcat_categories">Kategorien</string> - <!--Preference subcategory--> - <string name="pref_subcat_font">Schrift</string> - <!--Preference subcategory--> - <string name="pref_subcat_messages">Nachrichten</string> - <!--Preference subcategory--> - <string name="pref_subcat_avatars">Avatare</string> - <string name="donate_google">Über Google spenden</string> - <string name="donate_google_summary">Google behält 30% der Spenden</string> - <string name="donate_paypal">Über PayPal spenden</string> - <string name="donate_paypal_button">Spende einen beliebigen Betrag</string> - <string name="donate_paypal_button_summary">Kauf mir irgendetwas!</string> - <!--Donation product name--> - <string name="product_name_donation">Spende</string> - <!--$1 donation product name--> - <string name="product_name_donate_1">Spende 1$</string> - <!--$5 donation product name--> - <string name="product_name_donate_5">Spende 5$</string> - <!--$3 donation product name--> - <string name="product_name_donate_10">Spende 10$</string> - <!--$1 donation product description--> - <string name="product_description_donate_1">Kauf mir eine Coke</string> - <!--$5 donation product description--> - <string name="product_description_donate_5">Kauf mir ein Sandwich</string> - <!--$10 donaion product description--> - <string name="product_description_donate_10">Kauf mir ein Mittagessen</string> - <string name="title_settings">Einstellungen</string> - <string name="title_search">Suche</string> - <string name="title_compose">Verfassen</string> - <string name="title_conversation_list">Unterhaltungen</string> - <string name="title_blocked">Blockiert</string> - <string name="title_changelog">Changelog</string> - <string name="title_picker">Neue Nachrichten</string> - <string name="title_donate">Spenden</string> - <string name="title_qk_responses">QK Reply</string> - <string name="title_block_address">Nummer blockieren</string> - <string name="title_unblock_address">Nummer freigeben</string> - <string name="title_conversations_selected">%s ausgewählt</string> - <string name="title_palette">Palette</string> - <string name="title_rgb">RGB</string> - <!-- Menu shown in the context menu when long pressing on a message when the message contains - one or more phone numbers and/or email addresses and the number or email is new to - contacts. [CHAR LIMIT=50] --> - <string name="menu_add_address_to_contacts"><xliff:g id="contactEmailOrNumber"> %s </xliff:g> zu Kontakten hinzufügen</string> - <!-- Context menu item on an individual message for viewing an attached slideshow --> - <string name="view_slideshow">Diashow ansehen</string> - <!-- Context menu item on an individual message for viewing message details such as time and date --> - <string name="view_message_details">Details anzeigen</string> - <!-- Context menu item on an individual message for viewing a delivery report --> - <string name="view_delivery_report">Bericht ansehen</string> - <!-- Context menu item on an individual message for deleting only that message --> - <string name="delete_message">Löschen</string> - <!-- Abbreviation for "kilobyte" --> - <string name="kilobyte">KB</string> - <!-- Individual message context menu item --> - <string name="copy_message_text">Text kopieren</string> - <!-- Header for context menu on an individual message --> - <string name="message_options">Nachrichtenoptionen</string> - <!-- Delivery Header View --> - <!-- Title of "Report" window --> - <string name="delivery_header_title">Bericht</string> - <!--Text for app restart confirmation dialog--> - <string name="restart_message">Diese Änderungen werden erst beim nächsten Neustart von QKSMS wirksam</string> - <!--Dialog title for asking if a user wants to delete a conversation--> - <string name="delete_conversation">Konversationen löschen</string> - <!--Dialog title for asking if a user wants to delete all failed messages--> - <string name="delete_all_failed">Alle fehlgeschlagenen Nachrichten löschen</string> - <!--CDialog title for asking if a user wants to delete a conversation--> - <string name="delete_confirmation">Bist du sicher, dass du (%s) Konversationen löschen möchtest?</string> - <!--CDialog title for asking if a user wants to delete all failed messages--> - <string name="delete_all_failed_confirmation">Bist du sicher, dass du fehlgeschlagene Nachrichten aus (%s) Konversationen löschen möchtest?</string> - <!--(Unused) Dialog title shown if APNs have not been set--> - <string name="apns_not_set">APNs sind nicht festgelegt</string> - <!--(Unused) Dialog description shown if APNs have not been set--> - <string name="apns_not_set_description">Deine APNs scheinen nicht festgelegt zu sein. Dies bedeutet, dass MMS nicht ordnungsgemäß funktioniert. Drücke okay, damit QKSMS sie für dich festlegt :)</string> - <!--Dialog title show if MMS hasn't been configured--> - <string name="set_up_mms_title">MMS einrichten?</string> - <!--Dialog description shown if MMS hasn't yet been configured--> - <string name="set_up_mms_description">Es scheint, dass MMS noch nicht in QKSMS eingerichtet ist. Drücke okay, um MMS automatisch zu konfigurieren.</string> - <!-- Dialog message text explaining that a draft message will not be saved due to invalid recipients --> - <string name="discard_message_reason">Deine Nachricht wird verworfen, da keine gültigen Empfänger angegeben sind.</string> - <string name="invalid_code">Unzulässiger Code</string> - <!--Button to restart app now instead of manually later--> - <string name="restart">Jetzt neustarten</string> - <!--Notification action to reply to a message--> - <string name="reply">Antwort</string> - <!--Notification action to reply to a message--> - <string name="reply_qksms">Antworte via QKSMS</string> - <!--Notification action to mark a message as read--> - <string name="read">Gelesen</string> - <!--Notification action to mark a message as read--> - <string name="mark_read">Als gelesen markieren</string> - <!--Notification action to call the sender of a message--> - <string name="call">Anrufen</string> - <!-- Notification toast message --> - <string name="notification_mute_on">Benachrichtigungen aktiviert</string> - <string name="notification_mute_off">Benachrichtigungen deaktiviert</string> - <!--Positive action button--> - <string name="yes">Ja</string> - <string name="add">Hinzufügen</string> - <!--Positive action button--> - <string name="save">Speichern</string> - <!--Positive action button--> - <string name="enable">Aktivieren</string> - <!--Positive action button--> - <string name="upgrade_now">Jetzt setzen</string> - <!--Positive action button--> - <string name="okay">Okay</string> - <!--Positive action button--> - <string name="redeem">Umtauschen</string> - <!--Neutral action button--> - <string name="just_once">Nur einmal</string> - <!--Neutral action button--> - <string name="later">Später</string> - <!--Neutral action button --> - <string name="cancel">Abbrechen</string> - <!-- Name of the local user when displaying sender of an outgoing message (personal pronoun) --> - <string name="messagelist_sender_self">Ich</string> - <!-- Sender to be used if the sender address has been hidden --> - <string name="hidden_sender_address">Versteckte Absenderadresse</string> - <!-- Subject to display in the conversation list if there is no subject --> - <string name="no_subject_view">(Kein Betreff)</string> - <!-- Time and date a message is due to expire --> - <string name="expire_on">"Ablaufdatum: <xliff:g id="date">%s</xliff:g>"</string> - <!-- Formatting for subject displayed inline, prepended to MMS message text --> - <string name="inline_subject">"< Betreff: <xliff:g id="subject"> %s </xliff:g> >"</string> - <!-- Text of a button appearing for MMS messages that have not yet been downloaded, causing the message to be downloaded (imperative verb) --> - <string name="download">Herunterladen</string> - <!-- Message displayed in place of the "download message" button once it has been pressed, indicating that the download is in progress --> - <string name="downloading">wird heruntergeladen</string> - <!-- Toast message while an image is being resized --> - <string name="compressing">Das Bild ist zu groß. Komprimiere\u2026</string> - <!-- Header shown above favorite contacts in QKCompose --> - <string name="favorites">Favoriten</string> - <!-- Word represents 'self' in a conversation --> - <string name="me">Ich</string> - <string name="menu_edit">Bearbeiten</string> - <string name="menu_delete_messages">Nachrichten löschen</string> - <string name="menu_delete_failed">Fehlgeschlagene Nachrichten löschen</string> - <string name="menu_lock">Sperren</string> - <string name="menu_unlock">Entsperren</string> - <!-- When the user tries to view message details and some error occurs while - retrieving those details, this message will be shown. --> - <string name="cannot_get_details">Kann Details nicht bekommen.</string> - <!-- Title of "Message details" dialog --> - <string name="message_details_title">Nachrichtendetails</string> - <!-- Label in "Message details" dialog --> - <string name="message_type_label">Nachrichtenart\u000A</string> - <!-- "Type" value in "Message details" dialog --> - <string name="text_message">Textnachricht</string> - <!-- "Type" value in "Message details" dialog --> - <string name="multimedia_message">Multimedianachricht</string> - <!-- "Type" value in "Message details" dialog --> - <string name="multimedia_notification">Benachrichtigung für Multimedianachricht</string> - <!-- Label in "Message details" dialog showing who sent the message. --> - <string name="from_label">Von\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="to_address_label">An\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="bcc_label">Bcc\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="sent_label">Gesendet\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="received_label">Empfangen\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="saved_label">Gespeichert\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="subject_label">Betreff\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="message_size_label">Nachrichtengröße\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="priority_label">Priorität\u000A</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_high">Hoch</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_normal">Normal</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_low">Niedrig</string> - <!-- Label in "Message details" dialog --> - <string name="message_class_label">Nachrichtenklasse\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="error_code_label">Fehlercode\u000A</string> - <!-- Alert dialog title when creating a slideshow [CHAR LIMIT=none] --> - <string name="building_slideshow_title">Erstelle Diashow</string> - <!-- Tag appearing on conversations in the conversation list that contain a draft message --> - <string name="has_draft">Entwurf</string> - <!-- In conversation list items, this is the separator between a contact's name and the draft stamp [CHAR LIMIT=5] --> - <string name="draft_separator">, \u0020</string> - <!-- In conversation list items, this comes after the receipient's name and contains the number of messages in the thread [CHAR LIMIT=5] --> - <string name="message_count_format">\u00a0 <xliff:g id="number" example="1"> %1$s </xliff:g></string> - <!-- For debugging: Dialog box title indicating there's a situation where data has unexpectedly changed --> - <string name="error_state">Inkonsistenter Zustand</string> - <!-- For debugging: Dialog box text indicating there's a situation where data has unexpectedly changed --> - <string name="error_state_text">Inkonsistenter Zustand der Unterhaltungen und Empfänger. Bitte melde einen Fehlerbericht über http://go/droidanizer</string> - <!-- This is the dialog title for the "Select link" dialog, shown when the user clicks on a - chat in the chat history view if there are links in the chat message. The dialog displays the - links if there are any --> - <string name="select_link_title">Wähle eine Aktion</string> - <!-- In message list items, this string builds the timestamp line when the message is in a group [CHAR LIMIT=NONE] --> - <string name="message_timestamp_format"><xliff:g id="string" example="Fred Flinstone"> %1$s </xliff:g> \u0020-\u0020 <xliff:g id="string" example="9:39AM"> %2$s </xliff:g></string> - <!--Message sending status: sending--> - <string name="status_sending">Sende…</string> - <!--Message sending status: failed--> - <!--<string name="status_failed">Failed. Tap to retry</string>--> - <!-- Delivery Report Activity --> - <!-- Status in "Report" window --> - <string name="status_none">(Nichts)</string> - <!-- Status in "Report" window --> - <string name="status_pending">Ausstehend</string> - <!-- Status in "Report" window --> - <string name="status_read">Gelesen</string> - <!-- Status in "Report" window --> - <string name="status_received">Empfangen</string> - <!-- Status in "Report" window --> - <string name="status_failed">Fehlgeschlagen. Tippen für Optionen</string> - <!-- Status in "Report" window --> - <string name="status_unread">Ungelesen</string> - <!-- Status in "Report" window --> - <string name="status_rejected">Abgewiesen</string> - <!-- Label in "Report" window --> - <string name="recipient_label">Empfänger:\u0020</string> - <!-- Label in "Report" window --> - <string name="status_label">Status:\u0020</string> - <!-- Label in "Report" window [CHAR LIMIT=50]--> - <string name="delivered_label">Zugestellt:\u0020</string> - <string name="do_something">Tu etwas</string> - <!-- Confirm Delete --> - <!-- Delete confirmation dialog title --> - <string name="confirm_dialog_title">Löschen?</string> - <!-- Delete confirmation dialog title for locked messages --> - <string name="confirm_dialog_locked_title">Gesperrte Nachricht löschen?</string> - <!-- This message is displayed in a confirmation dialog when the user selects one or more - conversations and then taps the "Delete" button. --> - <plurals name="confirm_delete_conversation"> - <!-- Case of 1 result. --> - <item quantity="one"><xliff:g id="number" example="15">%1$s</xliff:g> Unterhaltung wird gelöscht.</item> - <!-- Case of 0 or 2 or more results. --> - <item quantity="other"><xliff:g id="number" example="15">%1$s</xliff:g> Unterhaltungen werden gelöscht.</item> - </plurals> - <string name="confirm_delete_conversation">Die gesamte Unterhaltung wird gelöscht.</string> - <!-- Delete all threads confirmation dialog message --> - <string name="confirm_delete_all_conversations">Alle Unterhaltungen werden gelöscht.</string> - <!-- Delete message confirmation dialog message --> - <string name="confirm_delete_message">Die Nachricht wird gelöscht.</string> - <!-- Delete message confirmation dialog message for a locked message --> - <string name="confirm_delete_locked_message">Diese gesperrte Nachricht löschen?</string> - <!-- Delete all the messages on the SIM dialog message --> - <string name="confirm_delete_all_SIM_messages">Alle Nachrichten auf der SIM-Karte werden gelöscht.</string> - <!-- Delete the selected message on the SIM dialog message --> - <string name="confirm_delete_SIM_message">Diese Nachricht auf der SIM-Karte wird gelöscht.</string> - <!-- Delete unlocked checkbox title --> - <string name="delete_unlocked">Lösche gesperrte Nachrichten</string> - <!-- Delete button title --> - <string name="delete">Löschen</string> - <!-- More button title --> - <string name="more">Mehr</string> - <!-- More button summary --> - <string name="more_summary">Berühren um mehr zu sehen</string> - <!-- Action bar mode title when multi-selecting conversations --> - <string name="select_conversations">Wähle Unterhaltungen</string> - <!-- Show this in the middle of the main activity when there are no conversations [CHAR LIMIT=none] --> - <string name="no_conversations">Keine Unterhaltungen.</string> - <!-- Show this in the middle of the main activity when loading conversations [CHAR LIMIT=none] --> - <string name="loading_conversations">Lade Unterhaltungen.</string> - <!-- Tells the user that QKSMS isn't the default SMS app --> - <string name="not_default">Standard-SMS</string> - <!-- Tells the user they need to set QKSMS as the default app in order to use this feature --> - <string name="default_info">QKSMS muss deine Standard SMS App sein, um dies tun zu können</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to mark messages as read --> - <string name="not_default_mark_read">QKSMS muss deine Standard-SMS-App sein, um Nachrichten als gelesen markieren zu können</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to mark messages as unread --> - <string name="not_default_mark_unread">QKSMS muss deine Standard-SMS-App sein, um Nachrichten als ungelesen markieren zu können</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to send messages --> - <string name="not_default_delete">QKSMS muss deine Standard-SMS-App sein, um Nachrichten löschen zu können</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to delete messages --> - <string name="not_default_send">QKSMS muss deine Standard-SMS-App sein, um Nachrichten verschicken zu können</string> - <!-- Tells the user they should set QKSMS as the default messaging app --> - <string name="not_default_first">Einige Sachen werden nicht funktionieren, wenn QKSMS nicht die Standard-SMS-App ist</string> - <string name="delayed_messaging_info">Verzögerte Nachrichten erlauben es dir das Senden von Nachrichten abzubrechen. Finde mehr in den Einstellungen heraus</string> - <string name="delayed_duration_bounds_error">Die Dauer muss zwischen 1 und 30 Sekunden liegen</string> - <!-- Dialog title for the Read Report dialog. --> - <string name="confirm">Bestätigen</string> - <!-- Dialog text for the Read Report dialog. --> - <string name="message_send_read_report">Eine Lesebestätigung wird gesendet.</string> - <!-- Dialog title for updating app icon color --> - <string name="update_icon_title">Aktualisiere die Symbolfarbe</string> - <!-- Dialog message for updating app icon color --> - <string name="update_icon_message">QKSMS must be restarted when changing the icon color</string> - <string name="dialog_conversation_details_title">Unterhaltungsdetails</string> - <string name="dialog_conversation_details_last_message_date">Datum der letzten Nachricht</string> - <string name="dialog_conversation_details_message_count">Anzahl der Nachrichten</string> - <string name="dialog_conversation_details_recipients">Empfänger (%s)</string> - <string name="dialog_should_i_answer_title">\"Should I Answer?\" nicht installiert</string> - <string name="dialog_should_i_answer_message">Möchtest du die App jetzt über Google Play herunterladen?</string> - <string name="dialog_delete_old_messages">Are you sure you want to automatically delete old messages?</string> - <!-- Title for audio file picker --> - <string name="select_audio">Wähle eine Audiodatei</string> - <!-- Menu title to copy an attachment to the shared storage [CHAR LIMIT=25] --> - <string name="copy_to_sdcard">Anhang speichern</string> - <!-- Toast message on successful copy to shared storage [CHAR LIMIT=30] --> - <string name="copy_to_sdcard_success">Anhang gespeichert.</string> - <!-- Toast message on failed copy to shared storage [CHAR LIMIT=30] --> - <string name="copy_to_sdcard_fail">Konnte Anhang nicht speichern.</string> - <!-- Menu title to save a sound as a ringtone --> - <string name="save_ringtone">Als Klingelton speichern</string> - <!-- Toast message on successful copying ringtone to drm provider --> - <string name="saved_ringtone">Klingelton gespeichert.</string> - <!-- Toast message on failed copying ringtone to drm provider --> - <string name="saved_ringtone_fail">Kann Klingelton nicht speichern.</string> - <!-- Menu item --> - <!-- Menu item [CHAR LIMIT=40] --> - <string name="menu_group_participants">Teilnehmer der Gruppe</string> - <!--Toast shown when a draft is saved--> - <string name="toast_draft">Entwurf gespeichert</string> - <!--Toast shown when a conversation is deleted--> - <string name="toast_conversation_deleted">Unterhaltung gelöscht</string> - <!--Toast shown when device is low on storage--> - <string name="toast_low_memory">"Telefon-Speicher ist voll. Löschen Sie einige Dateien, um Speicherplatz freizugeben."</string> - <!--Toast shown to tell user that forwarding messages doesn't work yet--> - <string name="toast_forward">Diese Funktion wurde noch nicht implementiert. Benutze bitte vorerst die Text-kopieren-Option und füge es danach in die gewünschte Unterhaltung ein</string> - <!--Toast shown for unimplemented features--> - <string name="toast_unimplemented">Diese Funktion wurde noch nicht umgesetzt</string> - <!--Toast shown when a message fails to send--> - <string name="toast_message_failure">Nachricht konnte nicht gesendet werden</string> - <!--Toast shown when a message is delivered--> - <string name="toast_message_delivered">Nachricht zugestellt</string> - <!--Toast shown when a message is not delivered--> - <string name="toast_message_not_delivered">Nachricht nicht zugestellt</string> - <!--Toast shown when default APNs are loaded--> - <string name="toast_default_apns_loaded">Standard-APN-Einstellungen geladen</string> - <!--Toast shown when text is copied to the clipboard--> - <string name="toast_copy_text">Text in Zwischenablage kopiert</string> - <!--Toast shown when Google Play Services is not available for purchasing a product--> - <string name="toast_billing_not_available">Kauf erfordert Google Play Store (Abrechnung) auf Ihrem Android</string> - <!--Toast shown when Google Play Services is not available for purchasing a product--> - <string name="toast_endlessjabber_not_installed">EndlessJabber ist nicht installiert, Google Play wird geöffnet</string> - <string name="toast_changelog_error">Die Änderungshistorie konnte nicht geladen werden. Bitte versuche es später nochmal.</string> - <string name="toast_conversation_error">Couldn\'t open conversation</string> - <string name="toast_deleting_old_messages">Your old messages will be deleted shortly</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_1">Vielen Dank für Ihre Spende! Du bist mein neuer bester Freund.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_2">Vielen Dank für die Spende! Ich liebe dich.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_3">Vielen Dank für Ihre Spende! Du hilfst QKSMS die beste SMS App aller Zeiten zu werden.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_4">Vielen Dank für die Spende! Du bist großartig.</string> - <!--Menu option to mute conversation--> - <string name="menu_mute_conversation">Unterhaltung stummschalten</string> - <!--Menu option to mute conversation--> - <string name="menu_unmute_conversation">Unterhaltungen nicht mehr stummschalten</string> - <string name="menu_block_conversations">Konversationen blockieren</string> - <string name="menu_unblock_conversations">Konversationen nicht mehr blockieren</string> - <string name="menu_messages">Nachrichten</string> - <string name="menu_blocked">Blockiert</string> - <string name="menu_blocked_conversations">Blockiert (%s neu)</string> - <string name="menu_unblocked_conversations">Nachrichten (%s neu)</string> - <string name="menu_notifications">Benachrichtigungen</string> - <string name="menu_notifications_off">Benachrichtigungen aus</string> - <string name="menu_notification_settings">Konversations-Einstellungen</string> - <string name="menu_view_details">Details anzeigen</string> - <string name="menu_mark_read">Als gelesen markieren</string> - <string name="menu_mark_unread">Als ungelesen markieren</string> - <string name="menu_delete_conversation">Unterhaltung löschen</string> - <string name="menu_multi_select">Unterhaltung auswählen</string> - <string name="menu_done">Fertig</string> - <string name="failed_message_title">Fehlerhafte Nachrichtenoptionen</string> - <!--Toast shown to tell the user that they don't have a photo attachments app, and suggests that they download one--> - <string name="attachment_app_not_found">Keine App zum Hinzufügen des Anhangs gefunden. Versuche bitte, eine Fotogalerie-App zu installieren!</string> - <string name="attachment_camera_error">Die Kamera konnte nicht geöffnet werden</string> - <string name="pref_max_mms_attachment_size">Maximale MMS-Anhanggröße</string> - <string name="error_no_recipients">Wähle die Kontakte, an die diese Nachricht gesendet wird!</string> - <string name="error_file_not_found">QKSMS kann nicht auf die Datei zugreifen, die du versuchst zu teilen!</string> - <string name="sending_blocked_welcome_screen_message">Warte kurz! Du kannst in einem Moment richtige Nachrichten senden!</string> - <string name="notification_colored_icon_ready">Tippen Sie hier, um es zu ihrem Launcher über den Startbildschirm hinzuzufügen.</string> - <string name="notification_title_colored_icon_ready">Das farbige QKSMS-Symbol ist bereit</string> - <string name="icon_ready">Dein neues Icon ist fertig!</string> - <string name="icon_ready_message">Du kannst es jetzt mit der veränderten Farbe erneut zu deinem Startbildschirm hinzufügen.</string> - <string name="dont_ask_again">Nicht wieder fragen</string> - <string name="warning">Lampenfieber-Warnung</string> - <string name="stagefright_warning">Videonachrichten könnten eine Sicherheitslücke enthalten, durch die dein Telefon für Angriffe verwundbar wird. Möchtest du fortfahren?</string> - <!-- MMS DIALOG SETUP STRINGS --> - <string name="mms_setup_set_up_mms_title">MMS einrichten?</string> - <string name="mms_setup_set_up_mms_body">Es scheint, als ob MMS noch nicht in QKSMS eingerichtet ist. Drücke Okay, um MMS automatisch zu konfigurieren.</string> - <string name="mms_setup_setting_up_later_title">MMS später einrichten</string> - <string name="mms_setup_setting_up_later_body">Gehe zum MMS-Abschnitt in den Einstellungen, um eine automatische Konfiguration zu versuchen, den Support zu kontaktieren oder eine eigene Konfiguration zu erstellen.</string> - <string name="mms_setup_no_configurations_found_title">Keine Konfigurationen gefunden</string> - <string name="mms_setup_no_configurations_found_body">Wir konnten keine MMS-Einstellungen für deinen Provider automatisch ermitteln. Drücke okay um den Support zu kontaktieren. Wir werden dir beim Einrichten helfen! </string> - <string name="mms_setup_one_configuration_found_title">Eine Konfiguration gefunden</string> - <string name="mms_setup_one_configuration_found_body">Wir haben eine MMS-Konfiguration für %s Provider gefunden. Ist diese richtig?</string> - <string name="mms_setup_multiple_configurations_found_title">Mehrere Konfigurationen gefunden</string> - <string name="mms_setup_multiple_configurations_found_body">Wir haben mehrere MMS-Konfigurationen gefunden. Wähle deinen Provider aus der Liste oder wähle Nicht verfügbar, wenn dein Provider nicht in der Liste steht.</string> - <string name="mms_setup_next_steps_title">Nächste Schritte</string> - <string name="mms_setup_next_steps_body">Gehe zum MMS-Abschnitt in den Einstellungen, um eine automatische Konfiguration zu versuchen, den Support zu kontaktieren oder eine eigene Konfiguration zu erstellen.</string> - <string name="mms_setup_success_title">Erfolgreich!</string> - <string name="mms_setup_success_body">Wenn du auf irgendwelche Probleme stößt, gehe zum MMS-Abschnitt in den Einstellungen, um die automatische Konfiguration erneut zu versuchen, den Support zu kontaktieren oder eine eigene Konfiguration zu erstellen.</string> - <string name="na">Nicht verfügbar</string> - <string name="no">Nein</string> - <string name="pref_automatically_configure_mms">MMS automatisch konfigurieren</string> - <string name="pref_mms_contact_support">Support kontaktieren</string> - <string name="pref_category_sending_mms">Sende MMS</string> - <string name="pref_category_mms_configuration">MMS-Einstellungen</string> - <string name="pref_mms_contact_support_summary">Für Hilfe bei den MMS-Einstellungen kontaktiere das QKSMS-Team</string> - <string name="pref_markdown_enabled">Textformatierung</string> - <string name="pref_markdown_enabled_summary">Benutze Markdown-Syntax um fett, unterstrichen und kursiv in deinen Nachrichten zu verwenden</string> - <string name="want_read_indicators">Möchtest du einen Hinweis bei bereits gelesenen Nachrichten?</string> - <string name="color_swatch_description">Farbe %1$d</string> - <string name="color_swatch_description_selected">Farbe %1$d ausgewählt</string> - <string name="color_picker_default_title">Wähle eine Farbe</string> - <string name="message_delivered">Nachricht zugestellt</string> - <string name="message_not_delivered">Nachricht nicht zugestellt</string> - <string name="error">Fehler</string> - <string name="invalid_destination">Unzulässige Zieladresse.</string> - <string name="service_not_activated">Dieser Dienst ist im Netzwerk nicht aktiviert.</string> - <string name="service_message_not_found">Die Nachricht ist abgelaufen oder nicht verfügbar.</string> - <string name="service_network_problem">Konnte auf Grund eines Netzwerkproblems nicht senden.</string> - <string name="message_queued">Deine Nachricht kann gerade nicht gesendet werden. Sie wird gesendet, sobald der Dienst wieder verfügbar ist.</string> - <string name="download_later">Kann im Moment nicht herunterladen. Versuche es später erneut.</string> - <string name="no_apn">Keine APN für die App eingestellt. Du musst die Einrichtung bei den Einstellungen vornehmen!</string> - <string name="no_subject">(Kein Betreff)</string> - <string name="unknown_sender">Unbekannter Absender</string> - <string name="dl_failure_notification">Nachricht <xliff:g id="subject">%1$s</xliff:g> von <xliff:g id="from">%2$s</xliff:g> konnte nicht heruntergeladen werden.</string> - <string name="auto_select_multiple_apns">Mehrere Konfigurationen wurden gefunden. Versuche jetzt eine davon. Wenn es nicht funktioniert, kannst du eine neue ausprobieren, indem du zu Einstellungen > Erweitert > Standard-APNs laden gehst.</string> - <string name="auto_select_apn">APNs automatisch auswählen</string> - <string name="auto_select_failed_title">Automatische Konfiguration fehlgeschlagen</string> - <string name="auto_select_failed">Versuche nach den APN-Einstellungen deines Providers (MMSC, Port und Proxy) zu suchen und sie unter Einstellungen > Erweitert einzugeben.</string> - <string name="date_yesterday">Gestern</string> - <string name="date_just_now">Gerade eben</string> - <string name="compose_loading_attachment">Lade Anhang</string> - <string name="hint_no_messages">Keine Nachrichten.\nDrücke auf das + um eine Nachricht zu schicken!</string> - <string-array name="resend_menu"> - <item>Nochmal senden</item> - <item>Bearbeiten</item> - <item>Löschen</item> - </string-array> - <string-array name="message_menu"> - <item>Nachricht weiterleiten</item> - <item>Text kopieren</item> - <item>Details anzeigen</item> - <item>Nachricht löschen</item> - </string-array> - <string-array name="background_titles"> - <item>Material Hell</item> - <item>Material Dunkel</item> - <item>Schwarz</item> - </string-array> - <string-array name="font_sizes"> - <item>Klein</item> - <item>Normal</item> - <item>Groß</item> - <item>Größte</item> - </string-array> - <string-array name="font_families"> - <item>Roboto Regular</item> - <item>Roboto Condensed</item> - <item>Systemschriftart</item> - </string-array> - <string-array name="font_weights"> - <item>Dünn</item> - <item>Normal</item> - </string-array> - <!-- String to match as no subject and filter out as a subject. For example, if the - subject string is "no subject", we won't display that. We'll pretend - no subject string was delivered. --> - <string-array name="empty_subject_strings"> - <item>kein Betreff</item> - </string-array> - <string-array name="qk_responses"> - <item>Okay</item> - <item>Gib mir einen Moment</item> - <item>Ich bin auf dem Weg</item> - <item>Danke</item> - <item>Klingt gut</item> - <item>Wie geht\'s?</item> - <item>Abgemacht</item> - <item>Nein</item> - <item>Ich liebe dich</item> - <item>Tut mir leid</item> - <item>LOL</item> - <item>Das ist OK</item> - </string-array> - <string-array name="enter_button_options"> - <item>Smiley anzeigen</item> - <item>Neue Zeile</item> - <item>Nachricht senden</item> - </string-array> - <string-array name="notification_private_options"> - <item>Alles zeigen</item> - <item>Nachricht ausblenden</item> - <item>Nachricht und Sender ausblenden</item> - </string-array> - <!-- Max MMS attachment sizes. I.e. will compress pictures that are larger than 300 KB down to - under 300KB. --> - <string-array name="max_mms_attachment_sizes"> - <item>300 KB</item> - <item>600 KB</item> - <item>1 MB</item> - <item>Unbegrenzt</item> - </string-array> -</resources> diff --git a/QKSMS/src/main/res/values-es/strings.xml b/QKSMS/src/main/res/values-es/strings.xml deleted file mode 100644 index ccb844e2f..000000000 --- a/QKSMS/src/main/res/values-es/strings.xml +++ /dev/null @@ -1,768 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!--Generated by crowdin.com--> -<resources xmlns:xliff="http://schemas.android.com/apk/res-auto"> - <!--Slogan--> - <string name="slogan">Ama los mensajes de texto otra vez.</string> - <!--Text shown when a phone number cannot be found--> - <string name="unknown_number">Número desconocido</string> - <!--Content description for photos--> - <string name="popup_photo_CD">Foto</string> - <!--Text to be displayed while content is loading--> - <string name="loading">Cargando…</string> - <!--Test string--> - <string name="test">Cadena de prueba</string> - <!--Hint for contacts text field--> - <string name="hint_contacts">Ingresar destinatarios</string> - <!--Hint for search text field--> - <string name="hint_search">Buscar algo</string> - <!--Hint for message reply text field--> - <string name="hint_reply">Escribe un mensaje</string> - <!--Hint for code redemption--> - <string name="hint_redeem">Ingrese código</string> - <string name="hint_hex">Hex</string> - <!--Text shown for single new message in notification--> - <string name="new_message">Nuevo mensaje</string> - <!--Text shown after number of unread messages in notification (ex. 3 new messages)--> - <string name="new_messages">Mensajes nuevos</string> - <!--Text shown for single failed message in notification--> - <string name="failed_message">Error al enviar mensaje</string> - <!--Text shown after number of failed messages in notification (ex. 3 messages failed to send)--> - <string name="failed_messages">Falló el envío de los mensajes</string> - <!--Text shown under failed message count--> - <string name="failed_messages_summary">Toque para ver</string> - <!--QuickCompose notification title--> - <string name="quickcompose">QK Compose</string> - <!--QuickCompose notification text--> - <string name="quickcompose_detail">Toque para enviar un mensaje</string> - <!--Welcome screen intro button--> - <string name="welcome_start">Vamos a empezar!</string> - <!--Allows user to skip welcome screen--> - <string name="welcome_skip">PASAR</string> - <!--Allows user to finish the welcome screen--> - <string name="welcome_finish">FINALIZAR</string> - <!--Indicates to user they can pick a color--> - <string name="welcome_theme_title">Elige un color</string> - <!--Indicates to user they can pick any colors--> - <string name="welcome_theme_description">Cualquier color.</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_night_description">Cuidado con tus ojos.</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_night_hint">Activame</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_quickreply_title">Responder vía QKSMS</string> - <!--QK Reply explanation--> - <string name="welcome_quickreply_description">Responde a mensajes de texto rapido que nunca.</string> - <!--Prompts user to try QK Reply--> - <string name="welcome_quickreply_hint">¡Pruébalo!</string> - <!--QK Reply demo message--> - <string name="welcome_quickreply_message_1">¡Wow! ¿No te parece impresionante? Puede ver la conversación de un vistazo. Puntee fuera de la ventana o pulse la marca de verificación para descartarlo.</string> - <!--QK Reply demo message--> - <string name="welcome_quickreply_message_2">Esto es \"QK Reply\". Ahora tu puedes responder a mensajes desde cualquier lugar. Presiona el botón de expansión para ver que pasa a continuación :)</string> - <!--Settings option in menu--> - <string name="menu_settings">Configuración</string> - <!--Search option in menu--> - <string name="menu_search">Buscar</string> - <!--Show full conversation in QuickReply--> - <string name="menu_show_all">Mostrar todos los mensajes</string> - <!--Show only unread messages in QuickReply--> - <string name="menu_show_unread">Mostrar mensajes no leídos</string> - <!--Open conversation option in menu (shown in QuickReply)--> - <string name="menu_open_thread">Abrir conversación</string> - <!--Forward message option in menu--> - <string name="menu_forward">Reenviar mensaje</string> - <!--Call contact option in menu--> - <string name="menu_call">Llamar</string> - <!--Mark a message/conversation as read option in menu--> - <string name="menu_read">Marcar como leído</string> - <!--Delete a message option in menu--> - <string name="menu_delete">Eliminar</string> - <!--Donate option in menu--> - <string name="menu_billing">Donar</string> - <!--Copy text option in menu--> - <string name="menu_copy">Copiar texto</string> - <!--Changelog option in menu--> - <string name="menu_changelog">"Qué hay de nuevo"</string> - <!--Expand settings option in menu--> - <string name="menu_show_all_prefs">Mostrar todo</string> - <!--Show less settings option in menu--> - <string name="menu_show_fewer_prefs">Mostrar menos</string> - <!--Title for message details popup--> - <string name="details_title">Detalles</string> - <!--Title for address that message is being sent to in message details popup--> - <string name="details_to">Para</string> - <!--Title for address that message is sent from in message details popup--> - <string name="details_from">De</string> - <!--Title for text of a message in message details popup--> - <string name="details_body">Cuerpo</string> - <!--Title for date sent of a message in message details popup--> - <string name="details_date_sent">Fecha de envío</string> - <!--Title for date received of a message in message details popup--> - <string name="details_date_received">Fecha de recepción</string> - <!--Title for rate snackbar--> - <string name="rate_title">¿Le gusta QKSMS?</string> - <!--Title for rate button--> - <string name="rate_action">Calificar</string> - <string name="pref_category_appearance">Apariencia</string> - <string name="pref_category_summary_appearance">Temas, fuentes, colores, avatares y más</string> - <string name="pref_category_general">General</string> - <string name="pref_category_summary_general">Entrega, envío de mensajes, formatos</string> - <string name="pref_category_blocking">Bloqueo de mensajes</string> - <string name="pref_category_notifications">Notificaciones</string> - <string name="pref_category_summary_notifications">Sonidos, LED, privacidad</string> - <string name="pref_category_mms">MMS</string> - <string name="pref_category_summary_mms">Configurar MMS (APN), tamaño máximo, mensajes de grupo</string> - <string name="pref_category_quickreply">QK Reply</string> - <string name="pref_category_summary_quickreply">QK Reply, popup options</string> - <string name="pref_category_quickcompose">QK Compose</string> - <string name="pref_category_summary_quickcompose">QK Compose, contactos favoritos</string> - <string name="pref_category_about">Acerca de</string> - <string name="pref_category_summary_about">Versión, registro de cambios, autores, gracias</string> - <string name="pref_theme">Color del tema</string> - <string name="pref_theme_summary_alt">Toque para cambiar el tema</string> - <string name="pref_icon">Icon color</string> - <string name="pref_icon_summary">Tap to change the QKSMS icon color</string> - <string name="pref_status_tint">Barra de estado coloreada</string> - <string name="pref_navigation_tint">Barra de navegación coloreada</string> - <string name="pref_background">Color de fondo</string> - <string name="pref_background_summary">Toque para cambiar el color de fondo</string> - <string name="pref_bubbles">Burbujas de mensajes</string> - <string name="pref_bubbles_summary">Toque para cambiar las preferencias de las burbujas de mensaje</string> - <string name="pref_night">Modo nocturno</string> - <string name="pref_night_summary">Ahorrar batería y reducir la fatiga visual</string> - <string name="pref_night_amoled">Fondo completamente negro</string> - <string name="pref_night_amoled_summary">Ahorra batería en dispositivos con paneles AMOLED</string> - <string name="pref_bubble_style_new">Usar nuevo estilo de burbuja</string> - <string name="pref_color_sent">Colorear mensajes enviados</string> - <string name="pref_color_sent_summary">Colorear las burbujas de fondo para los mensajes salientes</string> - <string name="pref_color_received">Colorear mensajes recibidos</string> - <string name="pref_color_received_summary">Colorear las burbujas de fondo para los mensajes entrantes</string> - <string name="pref_hide_avatar_conversations">Ocultar avatares de conversación</string> - <string name="pref_hide_avatar_conversations_summary">Ocultar avatares para los contactos en la lista de conversaciones</string> - <string name="pref_hide_avatar_sent">Ocultar avatares de mensaje enviado</string> - <string name="pref_hide_avatar_sent_summary">Ocultar tu avatar para mensajes salientes</string> - <string name="pref_hide_avatar_received">Ocultar avatares para mensaje recibido</string> - <string name="pref_hide_avatar_received_summary">Ocultar avatar de contacto para mensajes entrantes</string> - <string name="pref_font_family">Tipo de fuente</string> - <string name="pref_font_size">Tamaño de fuente</string> - <string name="pref_font_weight">Grosor de fuente</string> - <string name="pref_message_count">Contador de mensaje</string> - <string name="pref_message_count_summary">Mostrar el número de mensajes para cada conversación</string> - <string name="pref_sent_timestamps">Sent timestamps</string> - <string name="pref_sent_timestamps_summary">Show the timestamp for when a message was sent, not received</string> - <string name="pref_force_timestamps">Force timestamps</string> - <string name="pref_force_timestamps_summary">Enable timestamps for all messages</string> - <string name="pref_key_timestamp_delay">New timestamp delay</string> - <string name="pref_key_timestamp_delay_summary">The number of minutes which must elapse between two messages in order for a new timestamp to be shown.</string> - <string name="pref_compose_favorites">Contactos favoritos</string> - <string name="pref_compose_summary_favorites">Muestra tus contactos favoritos en la ventana de composición de QK, disponibles en una pulsación</string> - <string name="pref_prox_sensor_call">Sensor de proximidad</string> - <string name="pref_prox_sensor_call_summary">En una conversación, lleve su teléfono a su oreja para iniciar una llamada</string> - <string name="pref_delivery">Confirmaciones de entrega</string> - <string name="pref_delivery_summary">Confirmar que los mensajes fueron enviados con éxito</string> - <string name="pref_delivery_toast">Mostrar notificación</string> - <string name="pref_delivery_toast_summary">Mostrar una notificación corta para indicar que el mensaje fue entregado</string> - <string name="pref_delivery_vibrate">Vibrar</string> - <string name="pref_delivery_vibrate_summary">Vibrar al entregar mensaje</string> - <string name="pref_delete_old_messages">Borrar mensajes antiguos</string> - <string name="pref_delete_old_messages_summary">Borrar automáticamente los mensajes considerados antiguos</string> - <string name="pref_delete_old_messages_unread">Mensajes no leídos</string> - <string name="pref_delete_old_messages_unread_summary">Borrar automáticamente los mensajes no leídos al cabo de %s días</string> - <string name="pref_delete_old_messages_read">Mensajes leídos</string> - <string name="pref_delete_old_messages_read_summary">Borrar automáticamente los mensajes leídos al cabo de %s días</string> - <string name="pref_yappy">Integración con Yappy</string> - <string name="pref_endlessjabber_summary">Habilitar el soporte completo para Yappy</string> - <string name="pref_blocked_conversations">Conversaciones bloqueadas</string> - <string name="pref_blocked_conversations_summary">Long-press on a conversation and block to move to blocked inbox and stop notifications</string> - <string name="pref_block_future">Bloquear mensajes futuros</string> - <string name="pref_block_future_summary">Agregar números adicionales de teléfono para bloquear</string> - <string name="pref_should_i_answer">Integración con «¿Debería responder?»</string> - <string name="pref_should_i_answer_summary">Eliminar automáticamente los mensajes entrantes de los números bloqueados por la aplicación «¿Debería responder?»</string> - <string name="pref_mobile_only">Números móviles</string> - <string name="pref_mobile_only_summary">Solo mostrar números móviles en las sugerencias de contactos</string> - <string name="pref_auto_emoji">Emoji\'s automáticos</string> - <string name="pref_auto_emoji_summary">Reemplazar texto por imagen de emoji</string> - <string name="pref_enter_button">Botón Enter</string> - <string name="pref_enter_button_summary">Pulse para cambiar el comportamiento del botón Enter</string> - <string name="pref_compose_group">Mensajes de grupo</string> - <string name="pref_compose_group_summary">Al componer un mensaje a varios destinatarios, enviar un mensaje de grupo en lugar de mensajes individuales</string> - <string name="pref_auto_download">Descargar MMS automáticamente</string> - <string name="pref_auto_download_summary">Descargar mensajes MMS automáticamente cuando se encuentren disonibles</string> - <string name="pref_auto_data">Uso automático de datos</string> - <string name="pref_auto_data_summary">Activar automáticamente el uso de datos al enviar o recibir MMS</string> - <string name="pref_split">Dividir SMS</string> - <string name="pref_split_summary">Dividir mensajes largos en mensajes separados</string> - <string name="pref_split_counter">Contador de división</string> - <string name="pref_split_counter_summary">Agrega un contador delante de cada mensaje dividido</string> - <string name="pref_long_as_mms">Enviar mensaje largo como MMS</string> - <string name="pref_long_as_mms_summary">Enviar mensajes largos como MMS en vez de separarlos</string> - <string name="pref_long_as_mms_after">Enviar mensaje largo como MMS después</string> - <string name="pref_long_as_mms_after_summary">Enviar mensajes largos como MMS cuando excedan la longitud de un número de mensajes</string> - <string name="pref_return">Mostrar botón de retorno</string> - <string name="pref_return_summary">Mostrar tecla intro en el teclado en lugar de un botón emoji</string> - <string name="pref_text">Texto</string> - <string name="pref_notifications">Notificaciones de SMS</string> - <string name="pref_led">Notificación LED</string> - <string name="pref_theme_led">Color del LED de notificación</string> - <string name="pref_wake">Despertar el teléfono</string> - <string name="pref_wake_summary">Encender la pantalla cuando reciba un nuevo mensaje</string> - <string name="pref_notifications_private">Notificaciones privadas</string> - <string name="pref_notifications_private_summary">Toque para seleccionar lo que debe ocultarse en la notificación</string> - <string name="pref_ringtone">Sonido de notificación</string> - <string name="pref_ringtone_summary">Seleccionar un sonido de notificación</string> - <string name="pref_ticker">Mostrar en notificación</string> - <string name="pref_ticker_summary">Mostrar un fragmento del nuevo mensaje en la barra de notificaciones</string> - <string name="pref_vibration">Vibración</string> - <string name="pref_vibration_summary">Vibrar cuando se reciben nuevos mensajes</string> - <string name="pref_notification_call">Botón de llamada</string> - <string name="pref_notification_call_summary">Llamar al remitente de un mensaje desde la notificación</string> - <string name="pref_dimiss_read">Marcar como leído</string> - <string name="pref_dismiss_read_summary">Marca los mensajes como leídos cuando la notificación es descartada</string> - <string name="pref_delayed">Delayed messaging</string> - <string name="pref_delayed_summary">Esperar antes de enviar sus mensajes para que tengas oportunidad de revisar</string> - <string name="pref_delayed_duration">Retardo largo (segundos)</string> - <string name="pref_delayed_duration_summary">Tiempo de espera antes de enviar tu mensaje</string> - <string name="pref_night_auto">Modo nocturno automático</string> - <string name="pref_night_auto_summary">Activar modo nocturno automáticamente basado en la hora</string> - <string name="pref_day_start">Día comienza</string> - <string name="pref_night_start">Noche comienza</string> - <string name="pref_qk_responses">Respuestas rápidas</string> - <string name="pref_qk_responses_summary">Modificar sus respuestas preestablecidas para ser utilizado desde tu dispositivo Android Wear</string> - <string name="pref_quickreply_enabled">QK Reply enabled</string> - <string name="pref_quickreply_enabled_summary">Show QK Reply window whenever a new message is received</string> - <string name="pref_tap_to_quit">Tocar para descartar</string> - <string name="pref_tap_to_quit_summary">Toque fuera de la ventana para cerrarla</string> - <string name="pref_quickcompose">QK Compose enabled</string> - <string name="pref_quickcompose_summary">Mostrar una notificación que pueda tocar para redactar un nuevo mensaje</string> - <string name="pref_mms_enabled">MMS activado</string> - <string name="pref_mms_enabled_summary">Permitir el envío y recepción de mensajes MMS</string> - <string name="pref_mmsc_url">MMSC</string> - <string name="pref_mms_proxy">Proxy MMS</string> - <string name="pref_mms_port">Puerto MMS</string> - <string name="pref_apn_chooser">Cargar APNs predefinidas</string> - <string name="pref_strip_unicode">Eliminar caracteres unicode</string> - <string name="pref_strip_unicode_summary">Reemplazar caracteres no soportados en mensajes largos por caracteres GSM compatibles</string> - <string name="pref_system_bar_flat">Colores planos en barras del sistema</string> - <string name="pref_system_bar_flat_summary">Get rid of the gradient shown on the system UI bars on most KitKat devices</string> - <string name="pref_status_compat">Arreglo de la barra de estado</string> - <string name="pref_status_compat_summary">Corrige problemas causados por habilitar modo imersivo, Tinted Status Bar Xposed, o configuraciones personalizadas de PPP (DPI)</string> - <string name="pref_navigation_compat">Arreglo de la barra de navegación</string> - <string name="pref_navigation_compat_summary">Corrige problemas causados por habilitar modo inmersivo, Tinted Status Bar Xposed, o configuraciones personalizadas de PPP (DPI)</string> - <string name="pref_about_version_title">Versión de QKSMS</string> - <string name="pref_about_authors_title">Autores</string> - <string name="pref_about_authors_summary">Moez Bhatti</string> - <string name="pref_changelog_summary">Toque para ver el registro de cambios</string> - <string name="pref_about_thanks_title">Gracias</string> - <string name="pref_about_thanks_summary">Toque para ver los contribuyentes</string> - <string name="pref_donate_title">Donar</string> - <string name="pref_donate_summary">QKSMS es gratuito. ¡Apóyenos con una donación!</string> - <string name="pref_about_gplus_title">Google+</string> - <string name="pref_about_gplus_summary">Únase a la comunidad de QKSMS Beta en Google+</string> - <string name="pref_about_github_title">GitHub</string> - <string name="pref_about_github_summary">QKSMS es de código abierto. Contribuya e informe de errores en GitHub</string> - <string name="pref_about_crowdin_title">Crowdin</string> - <string name="pref_about_crowdin_summary">Únase al equipo que traduce QKSMS en Crowdin</string> - <!--Preference subcategory--> - <string name="pref_subcat_theme">Tema</string> - <!--Preference subcategory--> - <string name="pref_subcat_system_bars">Barras del sistema</string> - <!--Preference subcategory--> - <string name="pref_subcat_categories">Categorías</string> - <!--Preference subcategory--> - <string name="pref_subcat_font">Fuente</string> - <!--Preference subcategory--> - <string name="pref_subcat_messages">Mensajes</string> - <!--Preference subcategory--> - <string name="pref_subcat_avatars">Avatares</string> - <string name="donate_google">Donar con Google</string> - <string name="donate_google_summary">Google toma el 30% de las donaciones</string> - <string name="donate_paypal">Donar con PayPal</string> - <string name="donate_paypal_button">Donar cualquier cantidad</string> - <string name="donate_paypal_button_summary">¡Cómprame lo que quieras!</string> - <!--Donation product name--> - <string name="product_name_donation">Donación</string> - <!--$1 donation product name--> - <string name="product_name_donate_1">Donar $1 USD</string> - <!--$5 donation product name--> - <string name="product_name_donate_5">Donar $5 USD</string> - <!--$3 donation product name--> - <string name="product_name_donate_10">Donar $10 USD</string> - <!--$1 donation product description--> - <string name="product_description_donate_1">Cómprame una coca-cola</string> - <!--$5 donation product description--> - <string name="product_description_donate_5">Cómprame un sándwich</string> - <!--$10 donaion product description--> - <string name="product_description_donate_10">Cómprame un almuerzo</string> - <string name="title_settings">Configuración</string> - <string name="title_search">Buscar</string> - <string name="title_compose">Redactar</string> - <string name="title_conversation_list">Conversaciones</string> - <string name="title_blocked">Blocked</string> - <string name="title_changelog">Registro de cambios</string> - <string name="title_picker">Nuevos mensajes</string> - <string name="title_donate">Donar</string> - <string name="title_qk_responses">Respuestas rápidas</string> - <string name="title_block_address">Block number</string> - <string name="title_unblock_address">Unblock number</string> - <string name="title_conversations_selected">%s seleccionado(s)</string> - <string name="title_palette">Paleta</string> - <string name="title_rgb">RGB</string> - <!-- Menu shown in the context menu when long pressing on a message when the message contains - one or more phone numbers and/or email addresses and the number or email is new to - contacts. [CHAR LIMIT=50] --> - <string name="menu_add_address_to_contacts">Agregar <xliff:g id="contactEmailOrNumber"> %s </xliff:g> a los contactos</string> - <!-- Context menu item on an individual message for viewing an attached slideshow --> - <string name="view_slideshow">Ver presentación</string> - <!-- Context menu item on an individual message for viewing message details such as time and date --> - <string name="view_message_details">Ver detalles</string> - <!-- Context menu item on an individual message for viewing a delivery report --> - <string name="view_delivery_report">Ver informe</string> - <!-- Context menu item on an individual message for deleting only that message --> - <string name="delete_message">Borrar</string> - <!-- Abbreviation for "kilobyte" --> - <string name="kilobyte">KB</string> - <!-- Individual message context menu item --> - <string name="copy_message_text">Copiar texto</string> - <!-- Header for context menu on an individual message --> - <string name="message_options">Opciones de mensaje</string> - <!-- Delivery Header View --> - <!-- Title of "Report" window --> - <string name="delivery_header_title">Informe</string> - <!--Text for app restart confirmation dialog--> - <string name="restart_message">Estos cambios se aplicarán la próxima vez que se abra QKSMS</string> - <!--Dialog title for asking if a user wants to delete a conversation--> - <string name="delete_conversation">Borrar conversaciones</string> - <!--Dialog title for asking if a user wants to delete all failed messages--> - <string name="delete_all_failed">Borrar mensajes fallidos</string> - <!--CDialog title for asking if a user wants to delete a conversation--> - <string name="delete_confirmation">¿Está seguro de querer borrar las (%s) conversaciones?</string> - <!--CDialog title for asking if a user wants to delete all failed messages--> - <string name="delete_all_failed_confirmation">¿Está seguro de querer borrar los mensajes fallidos en (%s) conversaciones?</string> - <!--(Unused) Dialog title shown if APNs have not been set--> - <string name="apns_not_set">APNs no definidas</string> - <!--(Unused) Dialog description shown if APNs have not been set--> - <string name="apns_not_set_description">Al parecer tus APNs no han sido definidas. Esto significa que los MMS no funcionarán correctamente. Por favor presiona \'okay\' para que QKSMS las encuentre para ti :)</string> - <!--Dialog title show if MMS hasn't been configured--> - <string name="set_up_mms_title">¿Configurar MMS?</string> - <!--Dialog description shown if MMS hasn't yet been configured--> - <string name="set_up_mms_description">Parece que MMS no ha sido configurado aún en QKSMS. ¿Desea que se configure automáticamente?</string> - <!-- Dialog message text explaining that a draft message will not be saved due to invalid recipients --> - <string name="discard_message_reason">Su mensaje será descartado porque no tiene ningún destinatario válido.</string> - <string name="invalid_code">Código no válido</string> - <!--Button to restart app now instead of manually later--> - <string name="restart">Reiniciar ahora</string> - <!--Notification action to reply to a message--> - <string name="reply">Responder</string> - <!--Notification action to reply to a message--> - <string name="reply_qksms">Responder vía QKSMS</string> - <!--Notification action to mark a message as read--> - <string name="read">Leído</string> - <!--Notification action to mark a message as read--> - <string name="mark_read">Marcar como leído</string> - <!--Notification action to call the sender of a message--> - <string name="call">Llamar</string> - <!-- Notification toast message --> - <string name="notification_mute_on">Notifications enabled</string> - <string name="notification_mute_off">Notifications disabled</string> - <!--Positive action button--> - <string name="yes">Sí</string> - <string name="add">Añadir</string> - <!--Positive action button--> - <string name="save">Salvar</string> - <!--Positive action button--> - <string name="enable">Enable</string> - <!--Positive action button--> - <string name="upgrade_now">Establezca ahora</string> - <!--Positive action button--> - <string name="okay">Sí</string> - <!--Positive action button--> - <string name="redeem">Redeem</string> - <!--Neutral action button--> - <string name="just_once">Sólo una vez</string> - <!--Neutral action button--> - <string name="later">Más tarde</string> - <!--Neutral action button --> - <string name="cancel">Cancelar</string> - <!-- Name of the local user when displaying sender of an outgoing message (personal pronoun) --> - <string name="messagelist_sender_self">Yo</string> - <!-- Sender to be used if the sender address has been hidden --> - <string name="hidden_sender_address">Dirección del remitente oculta</string> - <!-- Subject to display in the conversation list if there is no subject --> - <string name="no_subject_view">(Sin asunto)</string> - <!-- Time and date a message is due to expire --> - <string name="expire_on">"Caduca el: <xliff:g id="date"> %s </xliff:g>"</string> - <!-- Formatting for subject displayed inline, prepended to MMS message text --> - <string name="inline_subject">"<Asunto: <xliff:g id="subject">%s</xliff:g>>"</string> - <!-- Text of a button appearing for MMS messages that have not yet been downloaded, causing the message to be downloaded (imperative verb) --> - <string name="download">Descargar</string> - <!-- Message displayed in place of the "download message" button once it has been pressed, indicating that the download is in progress --> - <string name="downloading">Descargando</string> - <!-- Toast message while an image is being resized --> - <string name="compressing">Foto demasiado grande. Comprimiendo\u2026</string> - <!-- Header shown above favorite contacts in QKCompose --> - <string name="favorites">Contactos favoritos</string> - <!-- Word represents 'self' in a conversation --> - <string name="me">Yo</string> - <string name="menu_edit">Editar</string> - <string name="menu_delete_messages">Borrar mensajes</string> - <string name="menu_delete_failed">Delete failed messages</string> - <string name="menu_lock">Bloquear</string> - <string name="menu_unlock">Desbloquear</string> - <!-- When the user tries to view message details and some error occurs while - retrieving those details, this message will be shown. --> - <string name="cannot_get_details">No se pueden obtener detalles.</string> - <!-- Title of "Message details" dialog --> - <string name="message_details_title">Detalles del mensaje</string> - <!-- Label in "Message details" dialog --> - <string name="message_type_label">Tipo\u000A</string> - <!-- "Type" value in "Message details" dialog --> - <string name="text_message">Mensaje de texto</string> - <!-- "Type" value in "Message details" dialog --> - <string name="multimedia_message">Mensaje multimedia</string> - <!-- "Type" value in "Message details" dialog --> - <string name="multimedia_notification">Notificación de mensaje multimedia</string> - <!-- Label in "Message details" dialog showing who sent the message. --> - <string name="from_label">De\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="to_address_label">Para\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="bcc_label">Bcc\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="sent_label">Enviado\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="received_label">Recibido\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="saved_label">Guardado\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="subject_label">Asunto\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="message_size_label">Tamaño del mensaje\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="priority_label">Prioridad\u000A</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_high">Alta</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_normal">Normal</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_low">Baja</string> - <!-- Label in "Message details" dialog --> - <string name="message_class_label">Clase del mensaje\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="error_code_label">Error codigo\u000A</string> - <!-- Alert dialog title when creating a slideshow [CHAR LIMIT=none] --> - <string name="building_slideshow_title">Creando presentación</string> - <!-- Tag appearing on conversations in the conversation list that contain a draft message --> - <string name="has_draft">Borrador</string> - <!-- In conversation list items, this is the separator between a contact's name and the draft stamp [CHAR LIMIT=5] --> - <string name="draft_separator">,\u0020</string> - <!-- In conversation list items, this comes after the receipient's name and contains the number of messages in the thread [CHAR LIMIT=5] --> - <string name="message_count_format">\u00a0<xliff:g id="number" example="1">%1$s</xliff:g></string> - <!-- For debugging: Dialog box title indicating there's a situation where data has unexpectedly changed --> - <string name="error_state">Estado inconsistente</string> - <!-- For debugging: Dialog box text indicating there's a situation where data has unexpectedly changed --> - <string name="error_state_text">El estado de hilos y destinatarios es inconsistente. Por favor capture un informe de errores y repórtelo vía http://go/droidanizer </string> - <!-- This is the dialog title for the "Select link" dialog, shown when the user clicks on a - chat in the chat history view if there are links in the chat message. The dialog displays the - links if there are any --> - <string name="select_link_title">Elegir acción</string> - <!-- In message list items, this string builds the timestamp line when the message is in a group [CHAR LIMIT=NONE] --> - <string name="message_timestamp_format"><xliff:g id="string" example="Fred Flinstone">%1$s</xliff:g>\u0020-\u0020<xliff:g id="string" example="9:39AM">%2$s</xliff:g></string> - <!--Message sending status: sending--> - <string name="status_sending">Enviando…</string> - <!--Message sending status: failed--> - <!--<string name="status_failed">Failed. Tap to retry</string>--> - <!-- Delivery Report Activity --> - <!-- Status in "Report" window --> - <string name="status_none">(Ninguno)</string> - <!-- Status in "Report" window --> - <string name="status_pending">Pendiente</string> - <!-- Status in "Report" window --> - <string name="status_read">Leído</string> - <!-- Status in "Report" window --> - <string name="status_received">Recibido</string> - <!-- Status in "Report" window --> - <string name="status_failed">Falló. Toque para ver las opciones</string> - <!-- Status in "Report" window --> - <string name="status_unread">No leído</string> - <!-- Status in "Report" window --> - <string name="status_rejected">Rechazado</string> - <!-- Label in "Report" window --> - <string name="recipient_label">Destinatario:\u0020</string> - <!-- Label in "Report" window --> - <string name="status_label">Estado:\u0020</string> - <!-- Label in "Report" window [CHAR LIMIT=50]--> - <string name="delivered_label">Entregado:\u0020</string> - <string name="do_something">Hacer algo</string> - <!-- Confirm Delete --> - <!-- Delete confirmation dialog title --> - <string name="confirm_dialog_title">¿Borrar?</string> - <!-- Delete confirmation dialog title for locked messages --> - <string name="confirm_dialog_locked_title">¿Borrar mensaje bloqueado?</string> - <!-- This message is displayed in a confirmation dialog when the user selects one or more - conversations and then taps the "Delete" button. --> - <plurals name="confirm_delete_conversation"> - <!-- Case of 1 result. --> - <item quantity="one">Una conversación será borrada.</item> - <!-- Case of 0 or 2 or more results. --> - <item quantity="other"><xliff:g id="number" example="15"> %1$s </xliff:g>conversaciones serán borradas.</item> - </plurals> - <string name="confirm_delete_conversation">El hilo entero será borrado.</string> - <!-- Delete all threads confirmation dialog message --> - <string name="confirm_delete_all_conversations">Todos los hilos serán borrados.</string> - <!-- Delete message confirmation dialog message --> - <string name="confirm_delete_message">El mensaje será borrado.</string> - <!-- Delete message confirmation dialog message for a locked message --> - <string name="confirm_delete_locked_message">¿Borrar este mensaje bloqueado?</string> - <!-- Delete all the messages on the SIM dialog message --> - <string name="confirm_delete_all_SIM_messages">Todos los mensajes en la tarjeta SIM serán borrados.</string> - <!-- Delete the selected message on the SIM dialog message --> - <string name="confirm_delete_SIM_message">Este mensaje en la tarjeta SIM será borrado.</string> - <!-- Delete unlocked checkbox title --> - <string name="delete_unlocked">Borrar mensajes bloqueados</string> - <!-- Delete button title --> - <string name="delete">Borrar</string> - <!-- More button title --> - <string name="more">Más</string> - <!-- More button summary --> - <string name="more_summary">Pulse para ver más</string> - <!-- Action bar mode title when multi-selecting conversations --> - <string name="select_conversations">Elegir conversaciones</string> - <!-- Show this in the middle of the main activity when there are no conversations [CHAR LIMIT=none] --> - <string name="no_conversations">No hay conversaciones.</string> - <!-- Show this in the middle of the main activity when loading conversations [CHAR LIMIT=none] --> - <string name="loading_conversations">Cargando las conversaciones.</string> - <!-- Tells the user that QKSMS isn't the default SMS app --> - <string name="not_default">SMS por defecto</string> - <!-- Tells the user they need to set QKSMS as the default app in order to use this feature --> - <string name="default_info">QKSMS needs to be your SMS app to do that</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to mark messages as read --> - <string name="not_default_mark_read">QKSMS must be your SMS app to mark messages read</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to mark messages as unread --> - <string name="not_default_mark_unread">QKSMS must be your SMS app to mark messages unread</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to send messages --> - <string name="not_default_delete">QKSMS must be your SMS app to delete messages</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to delete messages --> - <string name="not_default_send">QKSMS must be your SMS app to send messages</string> - <!-- Tells the user they should set QKSMS as the default messaging app --> - <string name="not_default_first">Some things won\'t work until QKSMS is the default SMS app</string> - <string name="delayed_messaging_info">Delayed messaging allows you to cancel messages before they send. Change the default behavior and more in Settings</string> - <string name="delayed_duration_bounds_error">Duration must be between 1 and 30 seconds</string> - <!-- Dialog title for the Read Report dialog. --> - <string name="confirm">Confirmar</string> - <!-- Dialog text for the Read Report dialog. --> - <string name="message_send_read_report">Se enviará un informe de lectura.</string> - <!-- Dialog title for updating app icon color --> - <string name="update_icon_title">Actualizar color del icono</string> - <!-- Dialog message for updating app icon color --> - <string name="update_icon_message">QKSMS must be restarted when changing the icon color</string> - <string name="dialog_conversation_details_title">Conversation details</string> - <string name="dialog_conversation_details_last_message_date">Last message date</string> - <string name="dialog_conversation_details_message_count">Contador de mensaje</string> - <string name="dialog_conversation_details_recipients">Recipients (%s)</string> - <string name="dialog_should_i_answer_title">«¿Debería responder?» no está disponible</string> - <string name="dialog_should_i_answer_message">¿Desea descargar la aplicación a través de Google Play?</string> - <string name="dialog_delete_old_messages">¿Está seguro que quiere borrar automáticamente los mensajes antiguos?</string> - <!-- Title for audio file picker --> - <string name="select_audio">Seleccionar audio</string> - <!-- Menu title to copy an attachment to the shared storage [CHAR LIMIT=25] --> - <string name="copy_to_sdcard">Guardar el archivo adjunto</string> - <!-- Toast message on successful copy to shared storage [CHAR LIMIT=30] --> - <string name="copy_to_sdcard_success">Archivo adjunto guardado.</string> - <!-- Toast message on failed copy to shared storage [CHAR LIMIT=30] --> - <string name="copy_to_sdcard_fail">No se pudo guardar el archivo adjunto.</string> - <!-- Menu title to save a sound as a ringtone --> - <string name="save_ringtone">Guardar como tono de llamada</string> - <!-- Toast message on successful copying ringtone to drm provider --> - <string name="saved_ringtone">Tono de llamada salvado.</string> - <!-- Toast message on failed copying ringtone to drm provider --> - <string name="saved_ringtone_fail">No se pudo guardar el tono de llamada.</string> - <!-- Menu item --> - <!-- Menu item [CHAR LIMIT=40] --> - <string name="menu_group_participants">Participantes del grupo</string> - <!--Toast shown when a draft is saved--> - <string name="toast_draft">Borrador guardado</string> - <!--Toast shown when a conversation is deleted--> - <string name="toast_conversation_deleted">Conversación eliminada</string> - <!--Toast shown when device is low on storage--> - <string name="toast_low_memory">"El almacenamiento del teléfono está lleno. Borre algunos archivos para liberar espacio."</string> - <!--Toast shown to tell user that forwarding messages doesn't work yet--> - <string name="toast_forward">Esta función aún no ha sido implementada. Por ahora, por favor utilice la opción \'Copiar texto\' y pegue en la conversación que desea enviar</string> - <!--Toast shown for unimplemented features--> - <string name="toast_unimplemented">Esta función aún no ha sido implementada</string> - <!--Toast shown when a message fails to send--> - <string name="toast_message_failure">Falló envío del mensaje</string> - <!--Toast shown when a message is delivered--> - <string name="toast_message_delivered">Mensaje entregado</string> - <!--Toast shown when a message is not delivered--> - <string name="toast_message_not_delivered">Mensaje no entregado</string> - <!--Toast shown when default APNs are loaded--> - <string name="toast_default_apns_loaded">Configuraciones APN predefinidas cargadas</string> - <!--Toast shown when text is copied to the clipboard--> - <string name="toast_copy_text">Texto copiado en el portapapeles</string> - <!--Toast shown when Google Play Services is not available for purchasing a product--> - <string name="toast_billing_not_available">La compra requiere de Google Play Store (facturación) en tu Android</string> - <!--Toast shown when Google Play Services is not available for purchasing a product--> - <string name="toast_endlessjabber_not_installed">EndlessJabber no está instalado, abriendo Google Play</string> - <string name="toast_changelog_error">No se pudo abrir el registro de cambios. Inténtelo más tarde</string> - <string name="toast_conversation_error">No se pudo abrir la conversación</string> - <string name="toast_deleting_old_messages">Los mensajes antiguos serán borrados en breve</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_1">¡Gracias por donar! Eres mi nuevo mejor amigo.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_2">¡Gracias por la donación! Te quiero.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_3">¡Gracias por donar! Estás ayudando a QKSMS para convertirse en la mejor aplicación de mensajes jamás creada.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_4">¡Gracias por la donación! Eres asombroso.</string> - <!--Menu option to mute conversation--> - <string name="menu_mute_conversation">Silenciar conversación</string> - <!--Menu option to mute conversation--> - <string name="menu_unmute_conversation">Activar la conversación</string> - <string name="menu_block_conversations">Block conversations</string> - <string name="menu_unblock_conversations">Unblock conversations</string> - <string name="menu_messages">Messages</string> - <string name="menu_blocked">Blocked</string> - <string name="menu_blocked_conversations">Blocked (%s new)</string> - <string name="menu_unblocked_conversations">Messages (%s new)</string> - <string name="menu_notifications">Notificaciones</string> - <string name="menu_notifications_off">Apagar notificaciones</string> - <string name="menu_notification_settings">Configuración de la conversación</string> - <string name="menu_view_details">Ver detalles</string> - <string name="menu_mark_read">Marcar como leído</string> - <string name="menu_mark_unread">Marcar como no leído</string> - <string name="menu_delete_conversation">Borrar conversación</string> - <string name="menu_multi_select">Seleccionar conversación</string> - <string name="menu_done">Listo</string> - <string name="failed_message_title">Opciones de mensajes fallidos</string> - <!--Toast shown to tell the user that they don't have a photo attachments app, and suggests that they download one--> - <string name="attachment_app_not_found">Aplicación de adjuntos no encontrado. ¡Intenta instalar una aplicación de galería de fotos!</string> - <string name="attachment_camera_error">La cámara no se puede abrir</string> - <string name="pref_max_mms_attachment_size">Tamaño máximo de archivos adjuntos en MMS</string> - <string name="error_no_recipients">¡Seleccione algunos contactos para enviarles este mensaje!</string> - <string name="error_file_not_found">¡QKSMS no puede acceder al archivo que intentas compartir!</string> - <string name="sending_blocked_welcome_screen_message">¡Espera! ¡Podrás enviar mensajes reales en un minuto!</string> - <string name="notification_colored_icon_ready">Pulse para agregar a la pantalla de inicio de su lanzador.</string> - <string name="notification_title_colored_icon_ready">El icono de color de QKSMS esta listo</string> - <string name="icon_ready">¡Su nuevo icono está listo!</string> - <string name="icon_ready_message">Ahora puede añadir a su pantalla de inicio otra vez con el color actualizado.</string> - <string name="dont_ask_again">No volver a preguntar</string> - <string name="warning">ADVERTENCIA de Stagefright</string> - <string name="stagefright_warning">Video messages may contain a harmful exploit that can leave your phone vulnerable to attacks. Would you like to continue?</string> - <!-- MMS DIALOG SETUP STRINGS --> - <string name="mms_setup_set_up_mms_title">¿Configurar MMS?</string> - <string name="mms_setup_set_up_mms_body">Parece que MMS no está establecido en QKSMS. Presione okay para configurar automáticamente MMS.</string> - <string name="mms_setup_setting_up_later_title">Configurar MMS más tarde</string> - <string name="mms_setup_setting_up_later_body">Visita la sección MMS de ajustes para configurarlo automáticamente, póngase en contacto, o introduzca su propia configuración.</string> - <string name="mms_setup_no_configurations_found_title">Configuraciones no encontradas</string> - <string name="mms_setup_no_configurations_found_body">No pudimos encontrar automáticamente una configuración de MMS para su operador. Presione okay para contactarnos. ¡Nosotros le ayudaremos a conseguir configurarlo! </string> - <string name="mms_setup_one_configuration_found_title">Una configuración encontrada</string> - <string name="mms_setup_one_configuration_found_body">Hemos encontrado una configuración de MMS para el operador %s. ¿Le parece correcto?</string> - <string name="mms_setup_multiple_configurations_found_title">Multiples configuraciones encontradas</string> - <string name="mms_setup_multiple_configurations_found_body">Se encontraron múltiples configuraciones de MMS. Elija su operador de la lista o pulse N/A si su operadora no está en la lista.</string> - <string name="mms_setup_next_steps_title">Pasos a seguir</string> - <string name="mms_setup_next_steps_body">Visit the MMS section of Settings to try automatic configuration again, contact support, or enter your own configuration.</string> - <string name="mms_setup_success_title">¡Fue un éxito!</string> - <string name="mms_setup_success_body">If you encounter any issues, visit the MMS section of Settings to try automatic configuration again, contact support, or enter your own configuration.</string> - <string name="na">N/A</string> - <string name="no">No</string> - <string name="pref_automatically_configure_mms">Configurar MMS automáticamente</string> - <string name="pref_mms_contact_support">Contactar con el soporte</string> - <string name="pref_category_sending_mms">Envío de MMS</string> - <string name="pref_category_mms_configuration">Configuración de MMS</string> - <string name="pref_mms_contact_support_summary">Contact the QKSMS team for help setting up MMS</string> - <string name="pref_markdown_enabled">Formato de texto</string> - <string name="pref_markdown_enabled_summary">Usar el lenguage de marcado Markdown para obtener negrita, subrayado y cursiva en los mensajes</string> - <string name="want_read_indicators">Want read indicators?</string> - <string name="color_swatch_description">Color %1$d</string> - <string name="color_swatch_description_selected">Color %1$d selected</string> - <string name="color_picker_default_title">Seleccione un Color</string> - <string name="message_delivered">Mensaje entregado</string> - <string name="message_not_delivered">Mensaje no entregado</string> - <string name="error">Error</string> - <string name="invalid_destination">Dirección de destino no válida.</string> - <string name="service_not_activated">Service not activated on network.</string> - <string name="service_message_not_found">Message expired or not available.</string> - <string name="service_network_problem">Couldn\'t send due to network problem.</string> - <string name="message_queued">Currently can\'t send your message. It will be sent when the service becomes available.</string> - <string name="download_later">Can\'t download right now. Try again later.</string> - <string name="no_apn">No APN specified for the app, you need to set it up in settings!</string> - <string name="no_subject">(Sin asunto)</string> - <string name="unknown_sender">Origen desconocido</string> - <string name="dl_failure_notification">No se pudo descargar el mensaje <xliff:g id="subject">%1$s</xliff:g> de <xliff:g id="from">%2$s</xliff:g>.</string> - <string name="auto_select_multiple_apns">Multiple different configurations have been found. Try one now. If it doesn\'t work, you can try a new one by going to Settings > Advanced > Load default APNs.</string> - <string name="auto_select_apn">Automatically Select APNs</string> - <string name="auto_select_failed_title">Automatic configuration failed</string> - <string name="auto_select_failed">Try searching for your carrier\'s APN settings (MMSC, Port, and Proxy) and entering them in Settings > Advanced.</string> - <string name="date_yesterday">Ayer</string> - <string name="date_just_now">Ahora</string> - <string name="compose_loading_attachment">Loading attachment</string> - <string name="hint_no_messages">No messages yet.\nClick the + to send one!</string> - <string-array name="resend_menu"> - <item>Reenviar</item> - <item>Editar</item> - <item>Borrar</item> - </string-array> - <string-array name="message_menu"> - <item>Reenviar mensaje</item> - <item>Copiar texto</item> - <item>Ver detalles</item> - <item>Eliminar mensaje</item> - </string-array> - <string-array name="background_titles"> - <item>Material claro</item> - <item>Material oscuro</item> - <item>Negro</item> - </string-array> - <string-array name="font_sizes"> - <item>Pequeño</item> - <item>Normal</item> - <item>Grande</item> - <item>Más grande</item> - </string-array> - <string-array name="font_families"> - <item>Roboto Regular</item> - <item>Roboto Condensed</item> - <item>System font</item> - </string-array> - <string-array name="font_weights"> - <item>Ligera</item> - <item>Normal</item> - </string-array> - <!-- String to match as no subject and filter out as a subject. For example, if the - subject string is "no subject", we won't display that. We'll pretend - no subject string was delivered. --> - <string-array name="empty_subject_strings"> - <item>Ningún tema</item> - </string-array> - <string-array name="qk_responses"> - <item>Ok</item> - <item>Dame un momento</item> - <item>En mi camino</item> - <item>Gracias</item> - <item>Suena bien</item> - <item>¿Qué hay de nuevo?</item> - <item>De acuerdo</item> - <item>No</item> - <item>Te quiero</item> - <item>Lo siento</item> - <item>LOL</item> - <item>Está bien</item> - </string-array> - <string-array name="enter_button_options"> - <item>Show emoji</item> - <item>Linea nueva</item> - <item>Enviar mensaje</item> - </string-array> - <string-array name="notification_private_options"> - <item>Mostrar todo</item> - <item>Ocultar mensaje</item> - <item>Ocultar el mensaje y remitente</item> - </string-array> - <!-- Max MMS attachment sizes. I.e. will compress pictures that are larger than 300 KB down to - under 300KB. --> - <string-array name="max_mms_attachment_sizes"> - <item>300 KB</item> - <item>600 KB</item> - <item>1 MB</item> - <item>Ilimitado</item> - </string-array> -</resources> diff --git a/QKSMS/src/main/res/values-fa/strings.xml b/QKSMS/src/main/res/values-fa/strings.xml deleted file mode 100644 index 4ff28c3bb..000000000 --- a/QKSMS/src/main/res/values-fa/strings.xml +++ /dev/null @@ -1,768 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!--Generated by crowdin.com--> -<resources xmlns:xliff="http://schemas.android.com/apk/res-auto"> - <!--Slogan--> - <string name="slogan">عشق دوباره به پیام کوتاه.</string> - <!--Text shown when a phone number cannot be found--> - <string name="unknown_number">شماره نامعلوم</string> - <!--Content description for photos--> - <string name="popup_photo_CD">عکس</string> - <!--Text to be displayed while content is loading--> - <string name="loading">در حال بارگذاری…</string> - <!--Test string--> - <string name="test">رشته آزمون</string> - <!--Hint for contacts text field--> - <string name="hint_contacts">گیرندگان را وارد کنید</string> - <!--Hint for search text field--> - <string name="hint_search">چیزی جستجو کنید</string> - <!--Hint for message reply text field--> - <string name="hint_reply">پیامی را وارد کنید</string> - <!--Hint for code redemption--> - <string name="hint_redeem">کد را وارد کنید</string> - <string name="hint_hex">Hex</string> - <!--Text shown for single new message in notification--> - <string name="new_message">پیام جدید</string> - <!--Text shown after number of unread messages in notification (ex. 3 new messages)--> - <string name="new_messages">پیام های جدید</string> - <!--Text shown for single failed message in notification--> - <string name="failed_message">پیام ارسال نشده</string> - <!--Text shown after number of failed messages in notification (ex. 3 messages failed to send)--> - <string name="failed_messages">پیام های ارسال نشده</string> - <!--Text shown under failed message count--> - <string name="failed_messages_summary">برای مشاهده ضربه بزنید</string> - <!--QuickCompose notification title--> - <string name="quickcompose">QK ارسال</string> - <!--QuickCompose notification text--> - <string name="quickcompose_detail">برای ارسال پیام کلیک کنید</string> - <!--Welcome screen intro button--> - <string name="welcome_start">بیایید شروع کنیم!</string> - <!--Allows user to skip welcome screen--> - <string name="welcome_skip">رد شدن</string> - <!--Allows user to finish the welcome screen--> - <string name="welcome_finish">پایان</string> - <!--Indicates to user they can pick a color--> - <string name="welcome_theme_title">انتخاب رنگ</string> - <!--Indicates to user they can pick any colors--> - <string name="welcome_theme_description">هر رنگی.</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_night_description">راحت برای چشمان.</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_night_hint">تغییر وضعیت</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_quickreply_title">QK پاسخ</string> - <!--QK Reply explanation--> - <string name="welcome_quickreply_description">پاسخ به پیام های سریع تر از همیشه.</string> - <!--Prompts user to try QK Reply--> - <string name="welcome_quickreply_hint">امتحان کنید!</string> - <!--QK Reply demo message--> - <string name="welcome_quickreply_message_1">واو! عالیه! می توانید تمام مکالمه خود را در یک نگاه ببنید. برای بستن پنجره، بیرون کادر را لمس کرده و یا ضربدر را لمس کنید.</string> - <!--QK Reply demo message--> - <string name="welcome_quickreply_message_2">این پاسخ QK است. هم اکنون می توانید از هر جایی به پیام ها پاسخ دهید. دکمه باز شدن را لمس کنید تا ببینید چه اتفاقی خواهد افتاد:)</string> - <!--Settings option in menu--> - <string name="menu_settings">تنظیمات</string> - <!--Search option in menu--> - <string name="menu_search">جستجو</string> - <!--Show full conversation in QuickReply--> - <string name="menu_show_all">نمایش همه پیام ها</string> - <!--Show only unread messages in QuickReply--> - <string name="menu_show_unread">نمایش پیام های خوانده نشده</string> - <!--Open conversation option in menu (shown in QuickReply)--> - <string name="menu_open_thread">باز کردن مکالمه</string> - <!--Forward message option in menu--> - <string name="menu_forward">هدایت پیام</string> - <!--Call contact option in menu--> - <string name="menu_call">تماس</string> - <!--Mark a message/conversation as read option in menu--> - <string name="menu_read">علامت گذاری به عنوان خوانده شده</string> - <!--Delete a message option in menu--> - <string name="menu_delete">حذف</string> - <!--Donate option in menu--> - <string name="menu_billing">کمک مالی</string> - <!--Copy text option in menu--> - <string name="menu_copy">کپی کردن متن</string> - <!--Changelog option in menu--> - <string name="menu_changelog">"تغییرات اخیر"</string> - <!--Expand settings option in menu--> - <string name="menu_show_all_prefs">نمایش همه</string> - <!--Show less settings option in menu--> - <string name="menu_show_fewer_prefs">نمایش کمتر</string> - <!--Title for message details popup--> - <string name="details_title">جزئیات</string> - <!--Title for address that message is being sent to in message details popup--> - <string name="details_to">به</string> - <!--Title for address that message is sent from in message details popup--> - <string name="details_from">از</string> - <!--Title for text of a message in message details popup--> - <string name="details_body">بدنه</string> - <!--Title for date sent of a message in message details popup--> - <string name="details_date_sent">تاریخ ارسال</string> - <!--Title for date received of a message in message details popup--> - <string name="details_date_received">تاریخ دریافت</string> - <!--Title for rate snackbar--> - <string name="rate_title">QKSMS را دوست دارید؟</string> - <!--Title for rate button--> - <string name="rate_action">ثبت امتیاز</string> - <string name="pref_category_appearance">ظاهر</string> - <string name="pref_category_summary_appearance">تم ها، فونت، رنگ، آواتار، و بیشتر</string> - <string name="pref_category_general">عمومی</string> - <string name="pref_category_summary_general">تحویل، در حال ارسال پیام، قالب بندی</string> - <string name="pref_category_blocking">Message blocking</string> - <string name="pref_category_notifications">اعلان‌ها</string> - <string name="pref_category_summary_notifications">صداها، نورها، حریم خصوصی</string> - <string name="pref_category_mms">پیام چندرسانه ای</string> - <string name="pref_category_summary_mms">تنظیمات MMS، اندازه بیشینه، پیام های گروهی</string> - <string name="pref_category_quickreply">QK پاسخ</string> - <string name="pref_category_summary_quickreply">پاسخ QK، تنظیمات پاپ آپ</string> - <string name="pref_category_quickcompose">QK ارسال</string> - <string name="pref_category_summary_quickcompose">ارسال QK، مخاطبین مورد علاقه</string> - <string name="pref_category_about">درباره</string> - <string name="pref_category_summary_about">نسخه، تغییرات، نویسندگان، تشکرها</string> - <string name="pref_theme">Theme color</string> - <string name="pref_theme_summary_alt">برای تغییر تم لمس کنید</string> - <string name="pref_icon">Icon color</string> - <string name="pref_icon_summary">Tap to change the QKSMS icon color</string> - <string name="pref_status_tint">نوار وضعیت رنگی</string> - <string name="pref_navigation_tint">نوار راهبری رنگی</string> - <string name="pref_background">رنگ پس زمینه</string> - <string name="pref_background_summary">برای تغییر رنگ پس زمینه لمس کنید</string> - <string name="pref_bubbles">حباب های پیام</string> - <string name="pref_bubbles_summary">برای تنظیمات مربوط به حباب پیام ها لمس کنید</string> - <string name="pref_night">حالت شب</string> - <string name="pref_night_summary">صرفه جویی در باتری و کاهش فشار چشم</string> - <string name="pref_night_amoled">پس زمینه سیاه خالص</string> - <string name="pref_night_amoled_summary">ذخیره باتری اضافی در دستگاه با استفاده از نمایشگرهای AMOLED</string> - <string name="pref_bubble_style_new">استفاده از سبک های جدید حباب</string> - <string name="pref_color_sent">رنگ دهی به پیام های ارسال شده</string> - <string name="pref_color_sent_summary">رنگ پس زمینه حباب پیام های ارسالی</string> - <string name="pref_color_received">رنگ دهی به پیام های دریافتی</string> - <string name="pref_color_received_summary">رنگ پس زمینه حباب پیام های دریافتی</string> - <string name="pref_hide_avatar_conversations">پنهان کردن تصاویر گفتگو</string> - <string name="pref_hide_avatar_conversations_summary">پنهان کردن تصویر مخاطبین در فهرست گفتگو</string> - <string name="pref_hide_avatar_sent">پنهان کردن تصویر پیام ارسالی</string> - <string name="pref_hide_avatar_sent_summary">پنهان کردن تصویر شما برای پیام های ارسالی</string> - <string name="pref_hide_avatar_received">پنهان کردن تصویر پیام های دریافتی</string> - <string name="pref_hide_avatar_received_summary">پنهان کردن تصویر مخاطب برای پیام های دریافتی</string> - <string name="pref_font_family">قلم نوشته ها</string> - <string name="pref_font_size">اندازه نوشته ها</string> - <string name="pref_font_weight">وزن نوشته ها</string> - <string name="pref_message_count">تعداد پیام</string> - <string name="pref_message_count_summary">نمایش تعداد پیام ها برای هر گفتگو</string> - <string name="pref_sent_timestamps">Sent timestamps</string> - <string name="pref_sent_timestamps_summary">Show the timestamp for when a message was sent, not received</string> - <string name="pref_force_timestamps">Force timestamps</string> - <string name="pref_force_timestamps_summary">Enable timestamps for all messages</string> - <string name="pref_key_timestamp_delay">New timestamp delay</string> - <string name="pref_key_timestamp_delay_summary">The number of minutes which must elapse between two messages in order for a new timestamp to be shown.</string> - <string name="pref_compose_favorites">مخاطبین مورد علاقه</string> - <string name="pref_compose_summary_favorites">نمایش مخاطبین مورد علاقه در پنجره ارسال QK. تنها با یک لمس می توانید آن ها را انتخاب کنید</string> - <string name="pref_prox_sensor_call">حسگر مجاورتی</string> - <string name="pref_prox_sensor_call_summary">در صفحه گفتگو، با نزدیک کردن گوشی به گوش خود، با مخاطب مورد نظر تماس بگیرید</string> - <string name="pref_delivery">تاییدیه تحویل</string> - <string name="pref_delivery_summary">تایید می کنند که پیام با موفقیت ارسال شد</string> - <string name="pref_delivery_toast">نمایش پیام های تست (Toast)</string> - <string name="pref_delivery_toast_summary">Show a short toast to indicate a message being delivered</string> - <string name="pref_delivery_vibrate">Vibrate</string> - <string name="pref_delivery_vibrate_summary">Vibrate on message delivery</string> - <string name="pref_delete_old_messages">Delete old messages</string> - <string name="pref_delete_old_messages_summary">Automatically delete messages once they\'re old enough</string> - <string name="pref_delete_old_messages_unread">Unread messages</string> - <string name="pref_delete_old_messages_unread_summary">Automatically delete unread messages after %s days</string> - <string name="pref_delete_old_messages_read">Read messages</string> - <string name="pref_delete_old_messages_read_summary">Automatically delete read messages after %s days</string> - <string name="pref_yappy">Yappy integration</string> - <string name="pref_endlessjabber_summary">Enable full support for Yappy</string> - <string name="pref_blocked_conversations">Blocked conversations</string> - <string name="pref_blocked_conversations_summary">Long-press on a conversation and block to move to blocked inbox and stop notifications</string> - <string name="pref_block_future">Block future messages</string> - <string name="pref_block_future_summary">Add additional phone numbers to block</string> - <string name="pref_should_i_answer">Should I Answer? Integration</string> - <string name="pref_should_i_answer_summary">Automatically delete incoming messages from numbers which are blocked through Should I Answer?</string> - <string name="pref_mobile_only">Mobile numbers</string> - <string name="pref_mobile_only_summary">Only show mobile numbers in contact suggestions</string> - <string name="pref_auto_emoji">Automatic emoji</string> - <string name="pref_auto_emoji_summary">Replace text with image emoji</string> - <string name="pref_enter_button">Enter button</string> - <string name="pref_enter_button_summary">Tap to change keyboard enter button behavior</string> - <string name="pref_compose_group">پیام گروهی</string> - <string name="pref_compose_group_summary">When composing message to multiple people, send a group message instead of individual messages</string> - <string name="pref_auto_download">Auto download MMS</string> - <string name="pref_auto_download_summary">Automatically download MMS messages when they become available</string> - <string name="pref_auto_data">Automatic data</string> - <string name="pref_auto_data_summary">Turn on data automatically when sending or receiving MMS</string> - <string name="pref_split">Split SMS</string> - <string name="pref_split_summary">Split long messages into separate messages</string> - <string name="pref_split_counter">Split counter</string> - <string name="pref_split_counter_summary">Adds a counter to the front of each split message</string> - <string name="pref_long_as_mms">Send long as MMS</string> - <string name="pref_long_as_mms_summary">Send long messages as MMS instead of splitting them</string> - <string name="pref_long_as_mms_after">Send long as MMS after</string> - <string name="pref_long_as_mms_after_summary">Send long messages as MMS when they exceed the length of a number of messages</string> - <string name="pref_return">Show return button</string> - <string name="pref_return_summary">نمایش کلید بازگشت روی صفحه کلید به جای دکمه ایموجی</string> - <string name="pref_text">متن</string> - <string name="pref_notifications">SMS notifications enabled</string> - <string name="pref_led">Notification LED</string> - <string name="pref_theme_led">رنگ LED اعلانات</string> - <string name="pref_wake">روشن کردن صفحه نمایش</string> - <string name="pref_wake_summary">روشن کردن صفحه نمایش</string> - <string name="pref_notifications_private">نوتفیکشن های خصوصی</string> - <string name="pref_notifications_private_summary">برای تغییر دادن آنچه باید در اعلانات پنهان شود کیلیک کنید</string> - <string name="pref_ringtone">صدای اعلان</string> - <string name="pref_ringtone_summary">انتخاب صدای اعلان</string> - <string name="pref_ticker">Show ticker</string> - <string name="pref_ticker_summary">Shows snippet of new message in notification bar</string> - <string name="pref_vibration">ویبره</string> - <string name="pref_vibration_summary">لرزش هنگام دریافت پیام جدید</string> - <string name="pref_notification_call">دکمه تماس</string> - <string name="pref_notification_call_summary">Call the sender of a message right from the notification</string> - <string name="pref_dimiss_read">Mark as read</string> - <string name="pref_dismiss_read_summary">Mark message as read when notification is cleared</string> - <string name="pref_delayed">Delayed messaging</string> - <string name="pref_delayed_summary">Wait before sending your messages, so you have a chance to review them</string> - <string name="pref_delayed_duration">Delay length (seconds)</string> - <string name="pref_delayed_duration_summary">Time to wait before sending your message</string> - <string name="pref_night_auto">Automatic night mode</string> - <string name="pref_night_auto_summary">Enable night mode automatically based on the time</string> - <string name="pref_day_start">زمان آغاز روز</string> - <string name="pref_night_start">زمان آغاز شب</string> - <string name="pref_qk_responses">پاسخ QK</string> - <string name="pref_qk_responses_summary">Modify your preset responses to be used from your Android Wear device</string> - <string name="pref_quickreply_enabled">QK Reply enabled</string> - <string name="pref_quickreply_enabled_summary">Show QK Reply window whenever a new message is received</string> - <string name="pref_tap_to_quit">برای بستن کیلیک کنید</string> - <string name="pref_tap_to_quit_summary">برای بستن پنجره خارج از محدوده آن کیلیک کنید</string> - <string name="pref_quickcompose">QK Compose enabled</string> - <string name="pref_quickcompose_summary">Display a notification that allows you to click on to compose a new message</string> - <string name="pref_mms_enabled">MMS فعال است</string> - <string name="pref_mms_enabled_summary">فعال کردن ارسال و دریافت MMS</string> - <string name="pref_mmsc_url">MMSC</string> - <string name="pref_mms_proxy">MMS proxy</string> - <string name="pref_mms_port">MMS port</string> - <string name="pref_apn_chooser">Load default APNs</string> - <string name="pref_strip_unicode">Strip unicode</string> - <string name="pref_strip_unicode_summary">Swap characters that are not supported in full-length messages for GSM compatible characters</string> - <string name="pref_system_bar_flat">Flat system bars</string> - <string name="pref_system_bar_flat_summary">Get rid of the gradient shown on the system UI bars on most KitKat devices</string> - <string name="pref_status_compat">Status bar fix</string> - <string name="pref_status_compat_summary">Fixes issues caused by immersive mode, Tinted Status Bar (Xposed), or custom DPI settings</string> - <string name="pref_navigation_compat">Navigation bar fix</string> - <string name="pref_navigation_compat_summary">Fixes issues caused by immersive mode, Tinted Status Bar (Xposed), or custom DPI settings</string> - <string name="pref_about_version_title">QKSMS version</string> - <string name="pref_about_authors_title">Authors</string> - <string name="pref_about_authors_summary">Moez Bhatti</string> - <string name="pref_changelog_summary">Tap to view changelog</string> - <string name="pref_about_thanks_title">از شما ممنونم</string> - <string name="pref_about_thanks_summary">Tap to view open-source contributors</string> - <string name="pref_donate_title">Donate</string> - <string name="pref_donate_summary">QKSMS is free. Help support us by donating!</string> - <string name="pref_about_gplus_title">Google+</string> - <string name="pref_about_gplus_summary">Join the QKSMS Beta Testing community on Google+</string> - <string name="pref_about_github_title">GitHub</string> - <string name="pref_about_github_summary">QKSMS is open source. Contribute and report issues on GitHub</string> - <string name="pref_about_crowdin_title">Crowdin</string> - <string name="pref_about_crowdin_summary">Join the QKSMS translation project on Crowdin</string> - <!--Preference subcategory--> - <string name="pref_subcat_theme">Theme</string> - <!--Preference subcategory--> - <string name="pref_subcat_system_bars">System bars</string> - <!--Preference subcategory--> - <string name="pref_subcat_categories">Categories</string> - <!--Preference subcategory--> - <string name="pref_subcat_font">Font</string> - <!--Preference subcategory--> - <string name="pref_subcat_messages">Messages</string> - <!--Preference subcategory--> - <string name="pref_subcat_avatars">Avatars</string> - <string name="donate_google">Donate with Google</string> - <string name="donate_google_summary">Google takes 30% of donations</string> - <string name="donate_paypal">Donate with PayPal</string> - <string name="donate_paypal_button">Donate any amount</string> - <string name="donate_paypal_button_summary">Buy me anything you want!</string> - <!--Donation product name--> - <string name="product_name_donation">Donation</string> - <!--$1 donation product name--> - <string name="product_name_donate_1">Donate $1 USD</string> - <!--$5 donation product name--> - <string name="product_name_donate_5">Donate $5 USD</string> - <!--$3 donation product name--> - <string name="product_name_donate_10">Donate $10 USD</string> - <!--$1 donation product description--> - <string name="product_description_donate_1">Buy me a Coke</string> - <!--$5 donation product description--> - <string name="product_description_donate_5">Buy me a sandwich</string> - <!--$10 donaion product description--> - <string name="product_description_donate_10">Buy me lunch</string> - <string name="title_settings">Settings</string> - <string name="title_search">Search</string> - <string name="title_compose">Compose</string> - <string name="title_conversation_list">Conversations</string> - <string name="title_blocked">Blocked</string> - <string name="title_changelog">Changelog</string> - <string name="title_picker">New messages</string> - <string name="title_donate">Donate</string> - <string name="title_qk_responses">QK Responses</string> - <string name="title_block_address">Block number</string> - <string name="title_unblock_address">Unblock number</string> - <string name="title_conversations_selected">%s selected</string> - <string name="title_palette">Palette</string> - <string name="title_rgb">RGB</string> - <!-- Menu shown in the context menu when long pressing on a message when the message contains - one or more phone numbers and/or email addresses and the number or email is new to - contacts. [CHAR LIMIT=50] --> - <string name="menu_add_address_to_contacts">Add <xliff:g id="contactEmailOrNumber">%s</xliff:g> to People</string> - <!-- Context menu item on an individual message for viewing an attached slideshow --> - <string name="view_slideshow">نمایش اسلاید</string> - <!-- Context menu item on an individual message for viewing message details such as time and date --> - <string name="view_message_details">مشاهده جزئیات</string> - <!-- Context menu item on an individual message for viewing a delivery report --> - <string name="view_delivery_report">مشاهده گزارش</string> - <!-- Context menu item on an individual message for deleting only that message --> - <string name="delete_message">حذف</string> - <!-- Abbreviation for "kilobyte" --> - <string name="kilobyte">کیلوبایت</string> - <!-- Individual message context menu item --> - <string name="copy_message_text">کپی کردن متن</string> - <!-- Header for context menu on an individual message --> - <string name="message_options">گزینه های پیام</string> - <!-- Delivery Header View --> - <!-- Title of "Report" window --> - <string name="delivery_header_title">گزارش</string> - <!--Text for app restart confirmation dialog--> - <string name="restart_message">این تغییرات دفعه بعدی که برنامه را باز میکنید اعمال خواهند شد</string> - <!--Dialog title for asking if a user wants to delete a conversation--> - <string name="delete_conversation">Delete conversations</string> - <!--Dialog title for asking if a user wants to delete all failed messages--> - <string name="delete_all_failed">حذف پیام های شکست خورده</string> - <!--CDialog title for asking if a user wants to delete a conversation--> - <string name="delete_confirmation">Are you sure you would like to delete (%s) conversations?</string> - <!--CDialog title for asking if a user wants to delete all failed messages--> - <string name="delete_all_failed_confirmation">Are you sure you would like to delete failed messages from (%s) conversations?</string> - <!--(Unused) Dialog title shown if APNs have not been set--> - <string name="apns_not_set">APNs not set</string> - <!--(Unused) Dialog description shown if APNs have not been set--> - <string name="apns_not_set_description">It appears that your APNs have not been set. This means that MMS will not work properly. Please press okay to have QKSMS find them for you :)</string> - <!--Dialog title show if MMS hasn't been configured--> - <string name="set_up_mms_title">Set up MMS?</string> - <!--Dialog description shown if MMS hasn't yet been configured--> - <string name="set_up_mms_description">It appears that MMS hasn\'t been configured in QKSMS yet. Press okay automatically configure MMS.</string> - <!-- Dialog message text explaining that a draft message will not be saved due to invalid recipients --> - <string name="discard_message_reason">Your message will be discarded because it has no valid recipients.</string> - <string name="invalid_code">کد نامعتبر است</string> - <!--Button to restart app now instead of manually later--> - <string name="restart">راه اندازی مجدد</string> - <!--Notification action to reply to a message--> - <string name="reply">پاسخ</string> - <!--Notification action to reply to a message--> - <string name="reply_qksms">پاسخ توسط QKSMS</string> - <!--Notification action to mark a message as read--> - <string name="read">خوانده شده</string> - <!--Notification action to mark a message as read--> - <string name="mark_read">علامت گذاری به عنوان خوانده شده</string> - <!--Notification action to call the sender of a message--> - <string name="call">تماس</string> - <!-- Notification toast message --> - <string name="notification_mute_on">Notifications enabled</string> - <string name="notification_mute_off">Notifications disabled</string> - <!--Positive action button--> - <string name="yes">بله</string> - <string name="add">Add</string> - <!--Positive action button--> - <string name="save">ذخيره</string> - <!--Positive action button--> - <string name="enable">فعال کردن</string> - <!--Positive action button--> - <string name="upgrade_now">اعمال</string> - <!--Positive action button--> - <string name="okay">باشه</string> - <!--Positive action button--> - <string name="redeem">Redeem</string> - <!--Neutral action button--> - <string name="just_once">فقط یک بار</string> - <!--Neutral action button--> - <string name="later">بعدا</string> - <!--Neutral action button --> - <string name="cancel">بی خیال</string> - <!-- Name of the local user when displaying sender of an outgoing message (personal pronoun) --> - <string name="messagelist_sender_self">من</string> - <!-- Sender to be used if the sender address has been hidden --> - <string name="hidden_sender_address">آدرس فرستنده پنهان</string> - <!-- Subject to display in the conversation list if there is no subject --> - <string name="no_subject_view">(بدون موضوع)</string> - <!-- Time and date a message is due to expire --> - <string name="expire_on">"Expires: <xliff:g id="date">%s</xliff:g>"</string> - <!-- Formatting for subject displayed inline, prepended to MMS message text --> - <string name="inline_subject">"<Subject: <xliff:g id="subject">%s</xliff:g>>"</string> - <!-- Text of a button appearing for MMS messages that have not yet been downloaded, causing the message to be downloaded (imperative verb) --> - <string name="download">دانلود</string> - <!-- Message displayed in place of the "download message" button once it has been pressed, indicating that the download is in progress --> - <string name="downloading">در حال دانلود</string> - <!-- Toast message while an image is being resized --> - <string name="compressing">Picture too large. Compressing\u2026</string> - <!-- Header shown above favorite contacts in QKCompose --> - <string name="favorites">مخاطب های ستاره دار</string> - <!-- Word represents 'self' in a conversation --> - <string name="me">من</string> - <string name="menu_edit">ويرايش</string> - <string name="menu_delete_messages">حذف پیام ها</string> - <string name="menu_delete_failed">Delete failed messages</string> - <string name="menu_lock">قفل</string> - <string name="menu_unlock">باز کردن قفل</string> - <!-- When the user tries to view message details and some error occurs while - retrieving those details, this message will be shown. --> - <string name="cannot_get_details">Can\'t get details.</string> - <!-- Title of "Message details" dialog --> - <string name="message_details_title">جزئیات پیام</string> - <!-- Label in "Message details" dialog --> - <string name="message_type_label">Type\u000A</string> - <!-- "Type" value in "Message details" dialog --> - <string name="text_message">متن پیام</string> - <!-- "Type" value in "Message details" dialog --> - <string name="multimedia_message">Multimedia message</string> - <!-- "Type" value in "Message details" dialog --> - <string name="multimedia_notification">Multimedia message notification</string> - <!-- Label in "Message details" dialog showing who sent the message. --> - <string name="from_label">From\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="to_address_label">To\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="bcc_label">Bcc\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="sent_label">Sent\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="received_label">Received\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="saved_label">Saved\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="subject_label">Subject\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="message_size_label">Message size\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="priority_label">Priority\u000A</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_high">High</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_normal">معمولی</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_low">Low</string> - <!-- Label in "Message details" dialog --> - <string name="message_class_label">Message class\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="error_code_label">Error code\u000A</string> - <!-- Alert dialog title when creating a slideshow [CHAR LIMIT=none] --> - <string name="building_slideshow_title">Building slideshow</string> - <!-- Tag appearing on conversations in the conversation list that contain a draft message --> - <string name="has_draft">Draft</string> - <!-- In conversation list items, this is the separator between a contact's name and the draft stamp [CHAR LIMIT=5] --> - <string name="draft_separator">,\u0020</string> - <!-- In conversation list items, this comes after the receipient's name and contains the number of messages in the thread [CHAR LIMIT=5] --> - <string name="message_count_format">\u00a0<xliff:g id="number" example="1">%1$s</xliff:g></string> - <!-- For debugging: Dialog box title indicating there's a situation where data has unexpectedly changed --> - <string name="error_state">Inconsistent state</string> - <!-- For debugging: Dialog box text indicating there's a situation where data has unexpectedly changed --> - <string name="error_state_text">The state of threads and recipients is inconsistent. Please capture a bug report and report it via http://go/droidanizer </string> - <!-- This is the dialog title for the "Select link" dialog, shown when the user clicks on a - chat in the chat history view if there are links in the chat message. The dialog displays the - links if there are any --> - <string name="select_link_title">Choose action</string> - <!-- In message list items, this string builds the timestamp line when the message is in a group [CHAR LIMIT=NONE] --> - <string name="message_timestamp_format"><xliff:g id="string" example="Fred Flinstone">%1$s</xliff:g>\u0020-\u0020<xliff:g id="string" example="9:39AM">%2$s</xliff:g></string> - <!--Message sending status: sending--> - <string name="status_sending">در حال ارسال…</string> - <!--Message sending status: failed--> - <!--<string name="status_failed">Failed. Tap to retry</string>--> - <!-- Delivery Report Activity --> - <!-- Status in "Report" window --> - <string name="status_none">(None)</string> - <!-- Status in "Report" window --> - <string name="status_pending">Pending</string> - <!-- Status in "Report" window --> - <string name="status_read">Read</string> - <!-- Status in "Report" window --> - <string name="status_received">موارد دریافتی</string> - <!-- Status in "Report" window --> - <string name="status_failed">Failed. Tap for options</string> - <!-- Status in "Report" window --> - <string name="status_unread">Unread</string> - <!-- Status in "Report" window --> - <string name="status_rejected">Rejected</string> - <!-- Label in "Report" window --> - <string name="recipient_label">Recipient:\u0020</string> - <!-- Label in "Report" window --> - <string name="status_label">Status:\u0020</string> - <!-- Label in "Report" window [CHAR LIMIT=50]--> - <string name="delivered_label">Delivered:\u0020</string> - <string name="do_something">Do something</string> - <!-- Confirm Delete --> - <!-- Delete confirmation dialog title --> - <string name="confirm_dialog_title">Delete?</string> - <!-- Delete confirmation dialog title for locked messages --> - <string name="confirm_dialog_locked_title">Delete locked message?</string> - <!-- This message is displayed in a confirmation dialog when the user selects one or more - conversations and then taps the "Delete" button. --> - <plurals name="confirm_delete_conversation"> - <!-- Case of 1 result. --> - <item quantity="one">One conversation will be deleted.</item> - <!-- Case of 0 or 2 or more results. --> - <item quantity="other"><xliff:g id="number" example="15">%1$s</xliff:g> conversations will be deleted.</item> - </plurals> - <string name="confirm_delete_conversation">The entire thread will be deleted.</string> - <!-- Delete all threads confirmation dialog message --> - <string name="confirm_delete_all_conversations">All threads will be deleted.</string> - <!-- Delete message confirmation dialog message --> - <string name="confirm_delete_message">The message will be deleted.</string> - <!-- Delete message confirmation dialog message for a locked message --> - <string name="confirm_delete_locked_message">این پیام قفل شده را حذف کنید؟</string> - <!-- Delete all the messages on the SIM dialog message --> - <string name="confirm_delete_all_SIM_messages">All messages on the SIM card will be deleted.</string> - <!-- Delete the selected message on the SIM dialog message --> - <string name="confirm_delete_SIM_message">This message on the SIM card will be deleted.</string> - <!-- Delete unlocked checkbox title --> - <string name="delete_unlocked">Delete locked messages</string> - <!-- Delete button title --> - <string name="delete">Delete</string> - <!-- More button title --> - <string name="more">More</string> - <!-- More button summary --> - <string name="more_summary">Tap to see more</string> - <!-- Action bar mode title when multi-selecting conversations --> - <string name="select_conversations">Choose conversations</string> - <!-- Show this in the middle of the main activity when there are no conversations [CHAR LIMIT=none] --> - <string name="no_conversations">No conversations.</string> - <!-- Show this in the middle of the main activity when loading conversations [CHAR LIMIT=none] --> - <string name="loading_conversations">Loading conversations.</string> - <!-- Tells the user that QKSMS isn't the default SMS app --> - <string name="not_default">Default SMS</string> - <!-- Tells the user they need to set QKSMS as the default app in order to use this feature --> - <string name="default_info">QKSMS needs to be your SMS app to do that</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to mark messages as read --> - <string name="not_default_mark_read">QKSMS must be your SMS app to mark messages read</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to mark messages as unread --> - <string name="not_default_mark_unread">QKSMS must be your SMS app to mark messages unread</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to send messages --> - <string name="not_default_delete">QKSMS must be your SMS app to delete messages</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to delete messages --> - <string name="not_default_send">QKSMS must be your SMS app to send messages</string> - <!-- Tells the user they should set QKSMS as the default messaging app --> - <string name="not_default_first">Some things won\'t work until QKSMS is the default SMS app</string> - <string name="delayed_messaging_info">Delayed messaging allows you to cancel messages before they send. Change the default behavior and more in Settings</string> - <string name="delayed_duration_bounds_error">Duration must be between 1 and 30 seconds</string> - <!-- Dialog title for the Read Report dialog. --> - <string name="confirm">Confirm</string> - <!-- Dialog text for the Read Report dialog. --> - <string name="message_send_read_report">A read report will be sent.</string> - <!-- Dialog title for updating app icon color --> - <string name="update_icon_title">Update icon color</string> - <!-- Dialog message for updating app icon color --> - <string name="update_icon_message">QKSMS must be restarted when changing the icon color</string> - <string name="dialog_conversation_details_title">Conversation details</string> - <string name="dialog_conversation_details_last_message_date">Last message date</string> - <string name="dialog_conversation_details_message_count">Message count</string> - <string name="dialog_conversation_details_recipients">Recipients (%s)</string> - <string name="dialog_should_i_answer_title">Should I Answer? not installed</string> - <string name="dialog_should_i_answer_message">Would you like to download the app from Google Play now?</string> - <string name="dialog_delete_old_messages">Are you sure you want to automatically delete old messages?</string> - <!-- Title for audio file picker --> - <string name="select_audio">Choose audio</string> - <!-- Menu title to copy an attachment to the shared storage [CHAR LIMIT=25] --> - <string name="copy_to_sdcard">Save attachment</string> - <!-- Toast message on successful copy to shared storage [CHAR LIMIT=30] --> - <string name="copy_to_sdcard_success">Attachment saved.</string> - <!-- Toast message on failed copy to shared storage [CHAR LIMIT=30] --> - <string name="copy_to_sdcard_fail">Couldn\'t save attachment.</string> - <!-- Menu title to save a sound as a ringtone --> - <string name="save_ringtone">Save as ringtone</string> - <!-- Toast message on successful copying ringtone to drm provider --> - <string name="saved_ringtone">Ringtone saved.</string> - <!-- Toast message on failed copying ringtone to drm provider --> - <string name="saved_ringtone_fail">Couldn\'t save ringtone.</string> - <!-- Menu item --> - <!-- Menu item [CHAR LIMIT=40] --> - <string name="menu_group_participants">Group participants</string> - <!--Toast shown when a draft is saved--> - <string name="toast_draft">Saved draft</string> - <!--Toast shown when a conversation is deleted--> - <string name="toast_conversation_deleted">Conversation deleted</string> - <!--Toast shown when device is low on storage--> - <string name="toast_low_memory">"Phone storage is full. Delete some files to free space."</string> - <!--Toast shown to tell user that forwarding messages doesn't work yet--> - <string name="toast_forward">This feature has not yet been implemented. For now please use the Copy text option and paste that in the conversation you would like to send it</string> - <!--Toast shown for unimplemented features--> - <string name="toast_unimplemented">This feature has not yet been implemented</string> - <!--Toast shown when a message fails to send--> - <string name="toast_message_failure">Message failed to send</string> - <!--Toast shown when a message is delivered--> - <string name="toast_message_delivered">Message delivered</string> - <!--Toast shown when a message is not delivered--> - <string name="toast_message_not_delivered">Message not delivered</string> - <!--Toast shown when default APNs are loaded--> - <string name="toast_default_apns_loaded">Loaded default APN settings</string> - <!--Toast shown when text is copied to the clipboard--> - <string name="toast_copy_text">Copied text to clipboard</string> - <!--Toast shown when Google Play Services is not available for purchasing a product--> - <string name="toast_billing_not_available">Purchase requires Google Play Store (billing) on your Android</string> - <!--Toast shown when Google Play Services is not available for purchasing a product--> - <string name="toast_endlessjabber_not_installed">EndlessJabber is not installed, opening Google Play</string> - <string name="toast_changelog_error">Couldn\'t load the changelog. Please try again later</string> - <string name="toast_conversation_error">Couldn\'t open conversation</string> - <string name="toast_deleting_old_messages">Your old messages will be deleted shortly</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_1">Thank you for donating! You\'re my new best friend.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_2">Thanks for the donation! I love you.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_3">Thanks for donating! You\'re helping QKSMS become the best texting app ever made.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_4">Thanks for the donation! You\'re awesome.</string> - <!--Menu option to mute conversation--> - <string name="menu_mute_conversation">Mute conversation</string> - <!--Menu option to mute conversation--> - <string name="menu_unmute_conversation">Unmute conversation</string> - <string name="menu_block_conversations">Block conversations</string> - <string name="menu_unblock_conversations">Unblock conversations</string> - <string name="menu_messages">Messages</string> - <string name="menu_blocked">Blocked</string> - <string name="menu_blocked_conversations">Blocked (%s new)</string> - <string name="menu_unblocked_conversations">Messages (%s new)</string> - <string name="menu_notifications">Notifications</string> - <string name="menu_notifications_off">Notifications off</string> - <string name="menu_notification_settings">Conversation settings</string> - <string name="menu_view_details">View details</string> - <string name="menu_mark_read">Mark read</string> - <string name="menu_mark_unread">Mark unread</string> - <string name="menu_delete_conversation">Delete conversation</string> - <string name="menu_multi_select">Select conversation</string> - <string name="menu_done">Done</string> - <string name="failed_message_title">Failed message options</string> - <!--Toast shown to tell the user that they don't have a photo attachments app, and suggests that they download one--> - <string name="attachment_app_not_found">Attachments app not found. Try installing a photo gallery app!</string> - <string name="attachment_camera_error">The camera could not be opened</string> - <string name="pref_max_mms_attachment_size">Maximum MMS attachment size</string> - <string name="error_no_recipients">Select some contacts to send this message to!</string> - <string name="error_file_not_found">QKSMS can\'t access the file you\'re trying to share!</string> - <string name="sending_blocked_welcome_screen_message">Hold up! You\'ll get to send real messages in a minute!</string> - <string name="notification_colored_icon_ready">Touch to add to your launcher from home screen.</string> - <string name="notification_title_colored_icon_ready">QKSMS colored icon is ready</string> - <string name="icon_ready">Your new icon is ready!</string> - <string name="icon_ready_message">You can now add it to your home screen again with the updated color.</string> - <string name="dont_ask_again">Don\'t ask again</string> - <string name="warning">Stagefright warning</string> - <string name="stagefright_warning">Video messages may contain a harmful exploit that can leave your phone vulnerable to attacks. Would you like to continue?</string> - <!-- MMS DIALOG SETUP STRINGS --> - <string name="mms_setup_set_up_mms_title">Set up MMS?</string> - <string name="mms_setup_set_up_mms_body">It appears that MMS isn\'t set up in QKSMS. Press okay to automatically configure MMS.</string> - <string name="mms_setup_setting_up_later_title">Setting up MMS later</string> - <string name="mms_setup_setting_up_later_body">Visit the MMS section of Settings to try automatic configuration, contact support, or enter your own configuration.</string> - <string name="mms_setup_no_configurations_found_title">No configurations found</string> - <string name="mms_setup_no_configurations_found_body">We couldn\'t find an MMS configuration for your carrier automatically. Press okay to contact support. We\'ll help you get set up! </string> - <string name="mms_setup_one_configuration_found_title">One configuration found</string> - <string name="mms_setup_one_configuration_found_body">We have found an MMS configuration for the %s carrier. Does that sound right?</string> - <string name="mms_setup_multiple_configurations_found_title">Multiple configuration found</string> - <string name="mms_setup_multiple_configurations_found_body">We have found multiple MMS configurations. Choose your carrier from the list, or press N/A if your carrier isn\'t on the list.</string> - <string name="mms_setup_next_steps_title">Next steps</string> - <string name="mms_setup_next_steps_body">Visit the MMS section of Settings to try automatic configuration again, contact support, or enter your own configuration.</string> - <string name="mms_setup_success_title">Success!</string> - <string name="mms_setup_success_body">If you encounter any issues, visit the MMS section of Settings to try automatic configuration again, contact support, or enter your own configuration.</string> - <string name="na">N/A</string> - <string name="no">No</string> - <string name="pref_automatically_configure_mms">Automatically Configure MMS</string> - <string name="pref_mms_contact_support">Contact Support</string> - <string name="pref_category_sending_mms">Sending MMS</string> - <string name="pref_category_mms_configuration">MMS Configuration</string> - <string name="pref_mms_contact_support_summary">Contact the QKSMS team for help setting up MMS</string> - <string name="pref_markdown_enabled">Text formatting</string> - <string name="pref_markdown_enabled_summary">Use markdown syntax to get bold, underline, and italics in your messages</string> - <string name="want_read_indicators">Want read indicators?</string> - <string name="color_swatch_description">Color %1$d</string> - <string name="color_swatch_description_selected">Color %1$d selected</string> - <string name="color_picker_default_title">Select a Color</string> - <string name="message_delivered">Message Delivered</string> - <string name="message_not_delivered">Message Not Delivered</string> - <string name="error">Error</string> - <string name="invalid_destination">Invalid destination address.</string> - <string name="service_not_activated">Service not activated on network.</string> - <string name="service_message_not_found">Message expired or not available.</string> - <string name="service_network_problem">Couldn\'t send due to network problem.</string> - <string name="message_queued">Currently can\'t send your message. It will be sent when the service becomes available.</string> - <string name="download_later">Can\'t download right now. Try again later.</string> - <string name="no_apn">No APN specified for the app, you need to set it up in settings!</string> - <string name="no_subject">(No subject)</string> - <string name="unknown_sender">Unknown sender</string> - <string name="dl_failure_notification">Couldn\'t download message <xliff:g id="subject">%1$s</xliff:g> from <xliff:g id="from">%2$s</xliff:g>.</string> - <string name="auto_select_multiple_apns">Multiple different configurations have been found. Try one now. If it doesn\'t work, you can try a new one by going to Settings > Advanced > Load default APNs.</string> - <string name="auto_select_apn">Automatically Select APNs</string> - <string name="auto_select_failed_title">Automatic configuration failed</string> - <string name="auto_select_failed">Try searching for your carrier\'s APN settings (MMSC, Port, and Proxy) and entering them in Settings > Advanced.</string> - <string name="date_yesterday">Yesterday</string> - <string name="date_just_now">Just now</string> - <string name="compose_loading_attachment">Loading attachment</string> - <string name="hint_no_messages">No messages yet.\nClick the + to send one!</string> - <string-array name="resend_menu"> - <item>Resend</item> - <item>Edit</item> - <item>Delete</item> - </string-array> - <string-array name="message_menu"> - <item>Forward message</item> - <item>Copy text</item> - <item>View details</item> - <item>Delete message</item> - </string-array> - <string-array name="background_titles"> - <item>Material Light</item> - <item>Material Dark</item> - <item>Black</item> - </string-array> - <string-array name="font_sizes"> - <item>Small</item> - <item>Normal</item> - <item>Large</item> - <item>Largest</item> - </string-array> - <string-array name="font_families"> - <item>Roboto Regular</item> - <item>Roboto Condensed</item> - <item>System font</item> - </string-array> - <string-array name="font_weights"> - <item>Light</item> - <item>Normal</item> - </string-array> - <!-- String to match as no subject and filter out as a subject. For example, if the - subject string is "no subject", we won't display that. We'll pretend - no subject string was delivered. --> - <string-array name="empty_subject_strings"> - <item>no subject</item> - </string-array> - <string-array name="qk_responses"> - <item>Okay</item> - <item>Give me a moment</item> - <item>On my way</item> - <item>Thanks</item> - <item>Sounds good</item> - <item>What\'s up?</item> - <item>Agreed</item> - <item>No</item> - <item>Love you</item> - <item>Sorry</item> - <item>LOL</item> - <item>That\'s okay</item> - </string-array> - <string-array name="enter_button_options"> - <item>Show emoji</item> - <item>New line</item> - <item>Send message</item> - </string-array> - <string-array name="notification_private_options"> - <item>Show all</item> - <item>Hide message</item> - <item>Hide message and sender</item> - </string-array> - <!-- Max MMS attachment sizes. I.e. will compress pictures that are larger than 300 KB down to - under 300KB. --> - <string-array name="max_mms_attachment_sizes"> - <item>300 KB</item> - <item>600 KB</item> - <item>1 MB</item> - <item>Unlimited</item> - </string-array> -</resources> diff --git a/QKSMS/src/main/res/values-fi/strings.xml b/QKSMS/src/main/res/values-fi/strings.xml deleted file mode 100644 index 446f44f30..000000000 --- a/QKSMS/src/main/res/values-fi/strings.xml +++ /dev/null @@ -1,768 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!--Generated by crowdin.com--> -<resources xmlns:xliff="http://schemas.android.com/apk/res-auto"> - <!--Slogan--> - <string name="slogan">Rakastu tekstaukseen uudelleen.</string> - <!--Text shown when a phone number cannot be found--> - <string name="unknown_number">Tuntematon Numero</string> - <!--Content description for photos--> - <string name="popup_photo_CD">Kuva</string> - <!--Text to be displayed while content is loading--> - <string name="loading">Ladataan…</string> - <!--Test string--> - <string name="test">Test string</string> - <!--Hint for contacts text field--> - <string name="hint_contacts">Lisää vastaanottaja</string> - <!--Hint for search text field--> - <string name="hint_search">Etsi jotain</string> - <!--Hint for message reply text field--> - <string name="hint_reply">Kirjoita viesti</string> - <!--Hint for code redemption--> - <string name="hint_redeem">Syötä koodi</string> - <string name="hint_hex">Hex</string> - <!--Text shown for single new message in notification--> - <string name="new_message">Uusi viesti</string> - <!--Text shown after number of unread messages in notification (ex. 3 new messages)--> - <string name="new_messages">uutta viestiä</string> - <!--Text shown for single failed message in notification--> - <string name="failed_message">Viestin lähettäminen epäonnistui</string> - <!--Text shown after number of failed messages in notification (ex. 3 messages failed to send)--> - <string name="failed_messages">viestin lähettäminen epäonnistui</string> - <!--Text shown under failed message count--> - <string name="failed_messages_summary">Napauta nähdäksesi</string> - <!--QuickCompose notification title--> - <string name="quickcompose">QK Compose</string> - <!--QuickCompose notification text--> - <string name="quickcompose_detail">Lähetä viesti napauttamalla</string> - <!--Welcome screen intro button--> - <string name="welcome_start">Aloitetaan!</string> - <!--Allows user to skip welcome screen--> - <string name="welcome_skip">OHITA</string> - <!--Allows user to finish the welcome screen--> - <string name="welcome_finish">VALMIS</string> - <!--Indicates to user they can pick a color--> - <string name="welcome_theme_title">Valitse väri</string> - <!--Indicates to user they can pick any colors--> - <string name="welcome_theme_description">Mikä tahansa väri.</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_night_description">Mukavampi silmille.</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_night_hint">Napauta minua</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_quickreply_title">QK Reply</string> - <!--QK Reply explanation--> - <string name="welcome_quickreply_description">Vastaa viesteihin nopeammin kuin koskaan ennen.</string> - <!--Prompts user to try QK Reply--> - <string name="welcome_quickreply_hint">Kokeile!</string> - <!--QK Reply demo message--> - <string name="welcome_quickreply_message_1">Vau! Eikö tuo ollutkin mahtavaa? Voit nähdä koko keskustelun yhdellä silmäyksellä. Napauta ponnahdusikkunan ulkopuolelle tai paina valintamerkkiä sulkeaksesi se.</string> - <!--QK Reply demo message--> - <string name="welcome_quickreply_message_2">Tämä on QK Reply. Nyt voit vastata viesteihin mistä tahansa. Napauta laajennuspainiketta nähdäksesi mitä tapahtuu seuraavaksi. :)</string> - <!--Settings option in menu--> - <string name="menu_settings">Asetukset</string> - <!--Search option in menu--> - <string name="menu_search">Etsi</string> - <!--Show full conversation in QuickReply--> - <string name="menu_show_all">Näytä kaikki viestit</string> - <!--Show only unread messages in QuickReply--> - <string name="menu_show_unread">Näytä lukemattomat viestit</string> - <!--Open conversation option in menu (shown in QuickReply)--> - <string name="menu_open_thread">Avaa keskustelu</string> - <!--Forward message option in menu--> - <string name="menu_forward">Välitä viesti</string> - <!--Call contact option in menu--> - <string name="menu_call">Soita</string> - <!--Mark a message/conversation as read option in menu--> - <string name="menu_read">Merkitse luetuksi</string> - <!--Delete a message option in menu--> - <string name="menu_delete">Poista</string> - <!--Donate option in menu--> - <string name="menu_billing">Lahjoita</string> - <!--Copy text option in menu--> - <string name="menu_copy">Kopioi teksti</string> - <!--Changelog option in menu--> - <string name="menu_changelog">"Uutuudet"</string> - <!--Expand settings option in menu--> - <string name="menu_show_all_prefs">Näytä kaikki</string> - <!--Show less settings option in menu--> - <string name="menu_show_fewer_prefs">Näytä vähemmän</string> - <!--Title for message details popup--> - <string name="details_title">Tiedot</string> - <!--Title for address that message is being sent to in message details popup--> - <string name="details_to">Vastaanottaja</string> - <!--Title for address that message is sent from in message details popup--> - <string name="details_from">Lähettäjä</string> - <!--Title for text of a message in message details popup--> - <string name="details_body">Runko</string> - <!--Title for date sent of a message in message details popup--> - <string name="details_date_sent">Lähetetty</string> - <!--Title for date received of a message in message details popup--> - <string name="details_date_received">Vastaanotettu</string> - <!--Title for rate snackbar--> - <string name="rate_title">Like QKSMS?</string> - <!--Title for rate button--> - <string name="rate_action">Rate</string> - <string name="pref_category_appearance">Ulkonäkö</string> - <string name="pref_category_summary_appearance">Teemat, fontit, värit, ja paljon muuta</string> - <string name="pref_category_general">Yleiset</string> - <string name="pref_category_summary_general">Toimitus, viestien lähetys, muotoilu</string> - <string name="pref_category_blocking">Message blocking</string> - <string name="pref_category_notifications">Ilmoitukset</string> - <string name="pref_category_summary_notifications">Äänet, LED, yksityisyys</string> - <string name="pref_category_mms">MMS</string> - <string name="pref_category_summary_mms">Määritä MMS (APN), max koko, ryhmäviestintä</string> - <string name="pref_category_quickreply">QK Reply</string> - <string name="pref_category_summary_quickreply">QK Reply, ponnahdusikkunan asetukset</string> - <string name="pref_category_quickcompose">QK Compose</string> - <string name="pref_category_summary_quickcompose">QK Compose, tähdelliset yhteystiedot</string> - <string name="pref_category_about">Tietoja</string> - <string name="pref_category_summary_about">Versio, muutosloki, tekijät, kiitokset</string> - <string name="pref_theme">Theme color</string> - <string name="pref_theme_summary_alt">Napauta teeman vaihtamiseksi</string> - <string name="pref_icon">Icon color</string> - <string name="pref_icon_summary">Tap to change the QKSMS icon color</string> - <string name="pref_status_tint">Sävytetty tilapalkki</string> - <string name="pref_navigation_tint">Sävytetty navigointipalkki</string> - <string name="pref_background">Taustaväri</string> - <string name="pref_background_summary">Napauta taustavärin muuttamiseksi</string> - <string name="pref_bubbles">Message bubbles</string> - <string name="pref_bubbles_summary">Tap to change message bubble preferences</string> - <string name="pref_night">Yötila</string> - <string name="pref_night_summary">Säästää akkua ja vähentää silmien rasitusta</string> - <string name="pref_night_amoled">Puhdas musta tausta</string> - <string name="pref_night_amoled_summary">Säästä lisää akkua AMOLED-näytöllisillä laitteilla</string> - <string name="pref_bubble_style_new">Use new bubble style</string> - <string name="pref_color_sent">Väritä lähetetyt viestit</string> - <string name="pref_color_sent_summary">Väritä lähtevien viestien taustakuplat</string> - <string name="pref_color_received">Väritä vastaanotetut viestit</string> - <string name="pref_color_received_summary">Väritä saapuvien viestien taustakuplat</string> - <string name="pref_hide_avatar_conversations">Piilota keskustelujen profiilikuvat</string> - <string name="pref_hide_avatar_conversations_summary">Piilota yhteystietojen profiilikuvat keskustelulistassa</string> - <string name="pref_hide_avatar_sent">Piilota lähtevien viestien profiilikuvat</string> - <string name="pref_hide_avatar_sent_summary">Piilota oma profiilikuva lähtevissä viesteissä</string> - <string name="pref_hide_avatar_received">Piilota saapuvien viestien profiilikuvat</string> - <string name="pref_hide_avatar_received_summary">Piilota profiilikuvat saapuvissa viesteissä</string> - <string name="pref_font_family">Fonttiperhe</string> - <string name="pref_font_size">Fonttikoko</string> - <string name="pref_font_weight">Fontin painotus</string> - <string name="pref_message_count">Viestien määrä</string> - <string name="pref_message_count_summary">Näytä kunkin keskustelun viestit</string> - <string name="pref_sent_timestamps">Sent timestamps</string> - <string name="pref_sent_timestamps_summary">Show the timestamp for when a message was sent, not received</string> - <string name="pref_force_timestamps">Force timestamps</string> - <string name="pref_force_timestamps_summary">Enable timestamps for all messages</string> - <string name="pref_key_timestamp_delay">New timestamp delay</string> - <string name="pref_key_timestamp_delay_summary">The number of minutes which must elapse between two messages in order for a new timestamp to be shown.</string> - <string name="pref_compose_favorites">Starred contacts</string> - <string name="pref_compose_summary_favorites">Show your starred contacts in the QK Compose window, making them only a tap away</string> - <string name="pref_prox_sensor_call">Proximity sensor</string> - <string name="pref_prox_sensor_call_summary">While in a conversation, bring your phone to your ear to start a call</string> - <string name="pref_delivery">Toimitusvahvistukset</string> - <string name="pref_delivery_summary">Vahvistaa viestien onnistuneen lähetyksen</string> - <string name="pref_delivery_toast">Näytä ponnahdusviesti</string> - <string name="pref_delivery_toast_summary">Näytä lyhyt ponnahdusviesti kun viestiä toimitetaan</string> - <string name="pref_delivery_vibrate">Värinä</string> - <string name="pref_delivery_vibrate_summary">Värisee kun viesti on toimitettu</string> - <string name="pref_delete_old_messages">Delete old messages</string> - <string name="pref_delete_old_messages_summary">Automatically delete messages once they\'re old enough</string> - <string name="pref_delete_old_messages_unread">Unread messages</string> - <string name="pref_delete_old_messages_unread_summary">Automatically delete unread messages after %s days</string> - <string name="pref_delete_old_messages_read">Read messages</string> - <string name="pref_delete_old_messages_read_summary">Automatically delete read messages after %s days</string> - <string name="pref_yappy">Yappy-integraatio</string> - <string name="pref_endlessjabber_summary">Mahdollistaa täyden Yappy-tuen</string> - <string name="pref_blocked_conversations">Blocked conversations</string> - <string name="pref_blocked_conversations_summary">Long-press on a conversation and block to move to blocked inbox and stop notifications</string> - <string name="pref_block_future">Block future messages</string> - <string name="pref_block_future_summary">Add additional phone numbers to block</string> - <string name="pref_should_i_answer">Should I Answer? Integration</string> - <string name="pref_should_i_answer_summary">Automatically delete incoming messages from numbers which are blocked through Should I Answer?</string> - <string name="pref_mobile_only">Matkapuhelinnumerot</string> - <string name="pref_mobile_only_summary">Näytä vain matkapuhelinnumerot yhteystietoehdotuksissa</string> - <string name="pref_auto_emoji">Automaattinen emoji</string> - <string name="pref_auto_emoji_summary">Korvaa teksti emojilla</string> - <string name="pref_enter_button">Enter button</string> - <string name="pref_enter_button_summary">Tap to change keyboard enter button behavior</string> - <string name="pref_compose_group">Ryhmäviestintä</string> - <string name="pref_compose_group_summary">Kun kirjoitat viestiä usealle henkilölle, lähetä ryhmäviesti yksittäisten viestien sijaan</string> - <string name="pref_auto_download">Auto download MMS</string> - <string name="pref_auto_download_summary">Automatically download MMS messages when they become available</string> - <string name="pref_auto_data">Automatic data</string> - <string name="pref_auto_data_summary">Turn on data automatically when sending or receiving MMS</string> - <string name="pref_split">Jaa SMS</string> - <string name="pref_split_summary">Jaa pitkät viestit useaan osaan</string> - <string name="pref_split_counter">Jakolaskuri</string> - <string name="pref_split_counter_summary">Lisää laskurin jokaisen viestin osan alkuun</string> - <string name="pref_long_as_mms">Lähetä pitkät viestit MMS:inä</string> - <string name="pref_long_as_mms_summary">Lähettää pitkät viestit multimediaviesteinä niiden osiin jakamisen sijasta</string> - <string name="pref_long_as_mms_after">Osia ennen MMS-muutosta</string> - <string name="pref_long_as_mms_after_summary">Send long messages as MMS when they exceed the length of a number of messages</string> - <string name="pref_return">Näytä syöttönäppäin</string> - <string name="pref_return_summary">Näppäimistössä näkyy syöttönäppäin Emoji-näppäimen sijasta</string> - <string name="pref_text">Text</string> - <string name="pref_notifications">SMS-ilmoitukset käytössä</string> - <string name="pref_led">Ilmoitusvalo</string> - <string name="pref_theme_led">Ilmoitusvalon väri</string> - <string name="pref_wake">Herätä puhelin</string> - <string name="pref_wake_summary">Kytke näyttö päälle kun saat uuden viestin</string> - <string name="pref_notifications_private">Yksityiset ilmoitukset</string> - <string name="pref_notifications_private_summary">Tap to change what should be hidden in notfication</string> - <string name="pref_ringtone">Ilmoitusääni</string> - <string name="pref_ringtone_summary">Valitse ilmoitusääni</string> - <string name="pref_ticker">Näytä viestin pätkä</string> - <string name="pref_ticker_summary">Näytä pätkä uudesta viestistä ilmoituspalkissa</string> - <string name="pref_vibration">Värinä</string> - <string name="pref_vibration_summary">Värinä uusien viestien saapuessa</string> - <string name="pref_notification_call">Soitto-painike</string> - <string name="pref_notification_call_summary">Soita viestin lähettäjälle suoraan ilmoituksesta</string> - <string name="pref_dimiss_read">Mark as read</string> - <string name="pref_dismiss_read_summary">Mark message as read when notification is cleared</string> - <string name="pref_delayed">Lykätty viestintä</string> - <string name="pref_delayed_summary">Odota ennen viestien lähetystä, jotta voit tarkistaa ne</string> - <string name="pref_delayed_duration">Viiveen pituus (sekuntia)</string> - <string name="pref_delayed_duration_summary">Odotusaika ennen viestien lähetystä</string> - <string name="pref_night_auto">Automaattinen yötila</string> - <string name="pref_night_auto_summary">Kytke yötila automaattisesti ajan perusteella</string> - <string name="pref_day_start">Päivä alkaa</string> - <string name="pref_night_start">Yö alkaa</string> - <string name="pref_qk_responses">QK Vastaukset</string> - <string name="pref_qk_responses_summary">Muokkaa valmiita vastauksia, joita käytetään Android Wear -laitteellasi</string> - <string name="pref_quickreply_enabled">QK Reply käytössä</string> - <string name="pref_quickreply_enabled_summary">Näytä QK Reply -ikkuna aina, kun uusi viesti vastaanotetaan</string> - <string name="pref_tap_to_quit">Napauta sulkeaksesi</string> - <string name="pref_tap_to_quit_summary">Kosketa ikkunan ulkopuolelle sulkeaksesi se</string> - <string name="pref_quickcompose">QK Compose käytössä</string> - <string name="pref_quickcompose_summary">Näytä ilmoitus jota napauttamalla voit kirjoittaa uuden viestin</string> - <string name="pref_mms_enabled">MMS käytössä</string> - <string name="pref_mms_enabled_summary">Mahdollistaa multimediaviestien lähettämisen ja vastaanottamisen</string> - <string name="pref_mmsc_url">MMSC</string> - <string name="pref_mms_proxy">MMS-välityspalvelin</string> - <string name="pref_mms_port">MMS-portti</string> - <string name="pref_apn_chooser">Palauta oletus APN</string> - <string name="pref_strip_unicode">Poista unicode-merkit</string> - <string name="pref_strip_unicode_summary">Merkit joita ei tueta täyspitkissä viesteissä korvataan GSM-yhteensopivilla merkeillä</string> - <string name="pref_system_bar_flat">Tasaiset järjestelmäpalkit</string> - <string name="pref_system_bar_flat_summary">Get rid of the gradient shown on the system UI bars on most KitKat devices</string> - <string name="pref_status_compat">Tilapalkin korjaus</string> - <string name="pref_status_compat_summary">Korjaa laajennetun työpöydän, Tinted Status Bar (Xposed), tai mukautettujen DPI-asetusten aiheuttamat ongelmat</string> - <string name="pref_navigation_compat">Navigaatiopalkin korjaus</string> - <string name="pref_navigation_compat_summary">Korjaa laajennetun työpöydän, Tinted Status Bar (Xposed), tai mukautettujen DPI-asetusten aiheuttamat ongelmat</string> - <string name="pref_about_version_title">QKSMS versio</string> - <string name="pref_about_authors_title">Tekijät</string> - <string name="pref_about_authors_summary">Moez Bhatti</string> - <string name="pref_changelog_summary">Napauta nähdäksesi muutosloki</string> - <string name="pref_about_thanks_title">Kiitos</string> - <string name="pref_about_thanks_summary">Napauta nähdäksesi avoimen lähdekoodin kirjoittajat</string> - <string name="pref_donate_title">Donate</string> - <string name="pref_donate_summary">QKSMS is free. Help support us by donating!</string> - <string name="pref_about_gplus_title">Google+</string> - <string name="pref_about_gplus_summary">Join the QKSMS Beta Testing community on Google+</string> - <string name="pref_about_github_title">GitHub</string> - <string name="pref_about_github_summary">QKSMS is open source. Contribute and report issues on GitHub</string> - <string name="pref_about_crowdin_title">Crowdin</string> - <string name="pref_about_crowdin_summary">Join the QKSMS translation project on Crowdin</string> - <!--Preference subcategory--> - <string name="pref_subcat_theme">Teema</string> - <!--Preference subcategory--> - <string name="pref_subcat_system_bars">Järjestelmäpalkit</string> - <!--Preference subcategory--> - <string name="pref_subcat_categories">Luokat</string> - <!--Preference subcategory--> - <string name="pref_subcat_font">Fontti</string> - <!--Preference subcategory--> - <string name="pref_subcat_messages">Viestit</string> - <!--Preference subcategory--> - <string name="pref_subcat_avatars">Hahmot</string> - <string name="donate_google">Donate with Google</string> - <string name="donate_google_summary">Google takes 30% of donations</string> - <string name="donate_paypal">Donate with PayPal</string> - <string name="donate_paypal_button">Donate any amount</string> - <string name="donate_paypal_button_summary">Buy me anything you want!</string> - <!--Donation product name--> - <string name="product_name_donation">Donation</string> - <!--$1 donation product name--> - <string name="product_name_donate_1">Donate $1 USD</string> - <!--$5 donation product name--> - <string name="product_name_donate_5">Donate $5 USD</string> - <!--$3 donation product name--> - <string name="product_name_donate_10">Donate $10 USD</string> - <!--$1 donation product description--> - <string name="product_description_donate_1">Tarjoa minulle kokis</string> - <!--$5 donation product description--> - <string name="product_description_donate_5">Tarjoa minulle voileipä</string> - <!--$10 donaion product description--> - <string name="product_description_donate_10">Tarjoa minulle lounas</string> - <string name="title_settings">Asetukset</string> - <string name="title_search">Etsi</string> - <string name="title_compose">Kirjoita</string> - <string name="title_conversation_list">Keskustelut</string> - <string name="title_blocked">Blocked</string> - <string name="title_changelog">Muutosloki</string> - <string name="title_picker">Uudet viestit</string> - <string name="title_donate">Lahjoita</string> - <string name="title_qk_responses">QK Vastaukset</string> - <string name="title_block_address">Block number</string> - <string name="title_unblock_address">Unblock number</string> - <string name="title_conversations_selected">%s selected</string> - <string name="title_palette">Palette</string> - <string name="title_rgb">RGB</string> - <!-- Menu shown in the context menu when long pressing on a message when the message contains - one or more phone numbers and/or email addresses and the number or email is new to - contacts. [CHAR LIMIT=50] --> - <string name="menu_add_address_to_contacts">Lisää <xliff:g id="contactEmailOrNumber">%s</xliff:g> Yhteystietoihin</string> - <!-- Context menu item on an individual message for viewing an attached slideshow --> - <string name="view_slideshow">Näytä diaesitys</string> - <!-- Context menu item on an individual message for viewing message details such as time and date --> - <string name="view_message_details">Näytä tiedot</string> - <!-- Context menu item on an individual message for viewing a delivery report --> - <string name="view_delivery_report">Näytä raportti</string> - <!-- Context menu item on an individual message for deleting only that message --> - <string name="delete_message">Poista</string> - <!-- Abbreviation for "kilobyte" --> - <string name="kilobyte">KB</string> - <!-- Individual message context menu item --> - <string name="copy_message_text">Kopioi teksti</string> - <!-- Header for context menu on an individual message --> - <string name="message_options">Viestiasetukset</string> - <!-- Delivery Header View --> - <!-- Title of "Report" window --> - <string name="delivery_header_title">Raportti</string> - <!--Text for app restart confirmation dialog--> - <string name="restart_message">Muutokset tulevat voimaan seuraavan kerran kun QKSMS avataan</string> - <!--Dialog title for asking if a user wants to delete a conversation--> - <string name="delete_conversation">Delete conversations</string> - <!--Dialog title for asking if a user wants to delete all failed messages--> - <string name="delete_all_failed">Delete failed messages</string> - <!--CDialog title for asking if a user wants to delete a conversation--> - <string name="delete_confirmation">Are you sure you would like to delete (%s) conversations?</string> - <!--CDialog title for asking if a user wants to delete all failed messages--> - <string name="delete_all_failed_confirmation">Are you sure you would like to delete failed messages from (%s) conversations?</string> - <!--(Unused) Dialog title shown if APNs have not been set--> - <string name="apns_not_set">APN-asetuksia ei määritetty</string> - <!--(Unused) Dialog description shown if APNs have not been set--> - <string name="apns_not_set_description">Näyttää siltä, että APN-asetuksiasi ei ole määritetty. Tämä tarkoittaa sitä, että MMS ei toimi kunnolla. Paina kyllä ja QKSMS löytää ne sinulle :)</string> - <!--Dialog title show if MMS hasn't been configured--> - <string name="set_up_mms_title">Aseta multimediaviestit?</string> - <!--Dialog description shown if MMS hasn't yet been configured--> - <string name="set_up_mms_description">It appears that MMS hasn\'t been configured in QKSMS yet. Press okay automatically configure MMS.</string> - <!-- Dialog message text explaining that a draft message will not be saved due to invalid recipients --> - <string name="discard_message_reason">Viestisi hylätään, koska sillä ei ole kelvollisia vastaanottajia.</string> - <string name="invalid_code">Virheellinen koodi</string> - <!--Button to restart app now instead of manually later--> - <string name="restart">Käynnistä uudelleen nyt</string> - <!--Notification action to reply to a message--> - <string name="reply">Vastaa</string> - <!--Notification action to reply to a message--> - <string name="reply_qksms">Vastaa QKSMS:llä</string> - <!--Notification action to mark a message as read--> - <string name="read">Luettu</string> - <!--Notification action to mark a message as read--> - <string name="mark_read">Merkitse luetuksi</string> - <!--Notification action to call the sender of a message--> - <string name="call">Soita</string> - <!-- Notification toast message --> - <string name="notification_mute_on">Notifications enabled</string> - <string name="notification_mute_off">Notifications disabled</string> - <!--Positive action button--> - <string name="yes">Kyllä</string> - <string name="add">Add</string> - <!--Positive action button--> - <string name="save">Tallenna</string> - <!--Positive action button--> - <string name="enable">Ota käyttöön</string> - <!--Positive action button--> - <string name="upgrade_now">Aseta nyt</string> - <!--Positive action button--> - <string name="okay">Kyllä</string> - <!--Positive action button--> - <string name="redeem">Lunasta</string> - <!--Neutral action button--> - <string name="just_once">Vain kerran</string> - <!--Neutral action button--> - <string name="later">Myöhemmin</string> - <!--Neutral action button --> - <string name="cancel">Peruuta</string> - <!-- Name of the local user when displaying sender of an outgoing message (personal pronoun) --> - <string name="messagelist_sender_self">Minä</string> - <!-- Sender to be used if the sender address has been hidden --> - <string name="hidden_sender_address">Piilotettu numero</string> - <!-- Subject to display in the conversation list if there is no subject --> - <string name="no_subject_view">(Ei aihetta)</string> - <!-- Time and date a message is due to expire --> - <string name="expire_on">"Expires: <xliff:g id="date">%s</xliff:g>"</string> - <!-- Formatting for subject displayed inline, prepended to MMS message text --> - <string name="inline_subject">"<Subject: <xliff:g id="subject">%s</xliff:g>>"</string> - <!-- Text of a button appearing for MMS messages that have not yet been downloaded, causing the message to be downloaded (imperative verb) --> - <string name="download">Lataa</string> - <!-- Message displayed in place of the "download message" button once it has been pressed, indicating that the download is in progress --> - <string name="downloading">Ladataan</string> - <!-- Toast message while an image is being resized --> - <string name="compressing">Kuva on liian suuri. Pakataan\u2026</string> - <!-- Header shown above favorite contacts in QKCompose --> - <string name="favorites">Tähdelliset yhteystiedot</string> - <!-- Word represents 'self' in a conversation --> - <string name="me">Minä</string> - <string name="menu_edit">Muokkaa</string> - <string name="menu_delete_messages">Poista viestit</string> - <string name="menu_delete_failed">Delete failed messages</string> - <string name="menu_lock">Lukitse</string> - <string name="menu_unlock">Poista lukitus</string> - <!-- When the user tries to view message details and some error occurs while - retrieving those details, this message will be shown. --> - <string name="cannot_get_details">Tietojen saanti ei onnistu.</string> - <!-- Title of "Message details" dialog --> - <string name="message_details_title">Viestin tiedot</string> - <!-- Label in "Message details" dialog --> - <string name="message_type_label">Kirjoita\u000A</string> - <!-- "Type" value in "Message details" dialog --> - <string name="text_message">Tekstiviesti</string> - <!-- "Type" value in "Message details" dialog --> - <string name="multimedia_message">Multimediaviesti</string> - <!-- "Type" value in "Message details" dialog --> - <string name="multimedia_notification">Multimediaviesti-ilmoitus</string> - <!-- Label in "Message details" dialog showing who sent the message. --> - <string name="from_label">Lähettäjä\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="to_address_label">Vastaanottaja\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="bcc_label">Bcc\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="sent_label">Lähetetty\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="received_label">Vastaanotettu\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="saved_label">Tallennettu\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="subject_label">Aihe\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="message_size_label">Viestin koko\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="priority_label">Prioriteetti\u000A</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_high">Korkea</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_normal">Normaali</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_low">Matala</string> - <!-- Label in "Message details" dialog --> - <string name="message_class_label">Viestin luokka\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="error_code_label">Virhekoodi\u000A</string> - <!-- Alert dialog title when creating a slideshow [CHAR LIMIT=none] --> - <string name="building_slideshow_title">Diaesitystä muodostetaan</string> - <!-- Tag appearing on conversations in the conversation list that contain a draft message --> - <string name="has_draft">Luonnos</string> - <!-- In conversation list items, this is the separator between a contact's name and the draft stamp [CHAR LIMIT=5] --> - <string name="draft_separator">,\u0020</string> - <!-- In conversation list items, this comes after the receipient's name and contains the number of messages in the thread [CHAR LIMIT=5] --> - <string name="message_count_format">\u00a0<xliff:g id="number" example="1">%1$s</xliff:g></string> - <!-- For debugging: Dialog box title indicating there's a situation where data has unexpectedly changed --> - <string name="error_state">Epäyhtenäinen tila</string> - <!-- For debugging: Dialog box text indicating there's a situation where data has unexpectedly changed --> - <string name="error_state_text">Viestiketjujen ja vastaanottajien tila on epäyhtenäinen. Ole hyvä ja luo vikailmoitus ja raportoi se täällä: http://go/droidanizer </string> - <!-- This is the dialog title for the "Select link" dialog, shown when the user clicks on a - chat in the chat history view if there are links in the chat message. The dialog displays the - links if there are any --> - <string name="select_link_title">Valitse toiminto</string> - <!-- In message list items, this string builds the timestamp line when the message is in a group [CHAR LIMIT=NONE] --> - <string name="message_timestamp_format"><xliff:g id="string" example="Fred Flinstone">%1$s</xliff:g>\u0020-\u0020<xliff:g id="string" example="9:39AM">%2$s</xliff:g></string> - <!--Message sending status: sending--> - <string name="status_sending">Lähetetään…</string> - <!--Message sending status: failed--> - <!--<string name="status_failed">Failed. Tap to retry</string>--> - <!-- Delivery Report Activity --> - <!-- Status in "Report" window --> - <string name="status_none">(Ei mitään)</string> - <!-- Status in "Report" window --> - <string name="status_pending">Odottaa</string> - <!-- Status in "Report" window --> - <string name="status_read">Luettu</string> - <!-- Status in "Report" window --> - <string name="status_received">Vastaanotettu</string> - <!-- Status in "Report" window --> - <string name="status_failed">Epäonnistui. Napauta asetukset</string> - <!-- Status in "Report" window --> - <string name="status_unread">Lukematon</string> - <!-- Status in "Report" window --> - <string name="status_rejected">Hylätty</string> - <!-- Label in "Report" window --> - <string name="recipient_label">Vastaanottaja:\u0020</string> - <!-- Label in "Report" window --> - <string name="status_label">Tila:\u0020</string> - <!-- Label in "Report" window [CHAR LIMIT=50]--> - <string name="delivered_label">Lähetetty:\u0020</string> - <string name="do_something">Tee jotain</string> - <!-- Confirm Delete --> - <!-- Delete confirmation dialog title --> - <string name="confirm_dialog_title">Poista?</string> - <!-- Delete confirmation dialog title for locked messages --> - <string name="confirm_dialog_locked_title">Poista lukittu viesti?</string> - <!-- This message is displayed in a confirmation dialog when the user selects one or more - conversations and then taps the "Delete" button. --> - <plurals name="confirm_delete_conversation"> - <!-- Case of 1 result. --> - <item quantity="one">Yksi keskustelu poistetaan.</item> - <!-- Case of 0 or 2 or more results. --> - <item quantity="other"><xliff:g id="number" example="15">%1$s</xliff:g> keskustelua poistetaan.</item> - </plurals> - <string name="confirm_delete_conversation">Koko viestiketju poistetaan.</string> - <!-- Delete all threads confirmation dialog message --> - <string name="confirm_delete_all_conversations">Kaikki viestiketjut poistetaan.</string> - <!-- Delete message confirmation dialog message --> - <string name="confirm_delete_message">Viesti poistetaan.</string> - <!-- Delete message confirmation dialog message for a locked message --> - <string name="confirm_delete_locked_message">Poista tämä lukittu viesti?</string> - <!-- Delete all the messages on the SIM dialog message --> - <string name="confirm_delete_all_SIM_messages">Kaikki SIM-kortilla olevat viestit poistetaan.</string> - <!-- Delete the selected message on the SIM dialog message --> - <string name="confirm_delete_SIM_message">Tämä SIM-kortilla oleva viesti poistetaan.</string> - <!-- Delete unlocked checkbox title --> - <string name="delete_unlocked">Poista lukitut viestit</string> - <!-- Delete button title --> - <string name="delete">Poista</string> - <!-- More button title --> - <string name="more">Lisää</string> - <!-- More button summary --> - <string name="more_summary">Napauta nähdäksesi lisää</string> - <!-- Action bar mode title when multi-selecting conversations --> - <string name="select_conversations">Valitse keskustelut</string> - <!-- Show this in the middle of the main activity when there are no conversations [CHAR LIMIT=none] --> - <string name="no_conversations">Ei keskusteluja.</string> - <!-- Show this in the middle of the main activity when loading conversations [CHAR LIMIT=none] --> - <string name="loading_conversations">Ladataan keskusteluja.</string> - <!-- Tells the user that QKSMS isn't the default SMS app --> - <string name="not_default">Oletus SMS</string> - <!-- Tells the user they need to set QKSMS as the default app in order to use this feature --> - <string name="default_info">QKSMS:n on oltava SMS-sovelluksesi tuon tekemiseksi</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to mark messages as read --> - <string name="not_default_mark_read">QKSMS:n on oltava SMS-sovelluksesi viestien merkitsemiseksi luetuksi</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to mark messages as unread --> - <string name="not_default_mark_unread">QKSMS:n on oltava SMS-sovelluksesi viestien merkitsemiseksi lukemattomaksi</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to send messages --> - <string name="not_default_delete">QKSMS:n on oltava SMS-sovelluksesi viestien poistamiseksi</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to delete messages --> - <string name="not_default_send">QKSMS:n on oltava SMS-sovelluksesi viestien lähettämiseksi</string> - <!-- Tells the user they should set QKSMS as the default messaging app --> - <string name="not_default_first">Jotkut asiat eivät toimi ennen kuin QKSMS on oletus SMS-sovelluksesi</string> - <string name="delayed_messaging_info">Delayed messaging allows you to cancel messages before they send. Change the default behavior and more in Settings</string> - <string name="delayed_duration_bounds_error">Duration must be between 1 and 30 seconds</string> - <!-- Dialog title for the Read Report dialog. --> - <string name="confirm">Vahvista</string> - <!-- Dialog text for the Read Report dialog. --> - <string name="message_send_read_report">Tekstiviestin lukemisraportti lähetetään.</string> - <!-- Dialog title for updating app icon color --> - <string name="update_icon_title">Päivitä kuvakkeen väri</string> - <!-- Dialog message for updating app icon color --> - <string name="update_icon_message">QKSMS must be restarted when changing the icon color</string> - <string name="dialog_conversation_details_title">Conversation details</string> - <string name="dialog_conversation_details_last_message_date">Last message date</string> - <string name="dialog_conversation_details_message_count">Message count</string> - <string name="dialog_conversation_details_recipients">Recipients (%s)</string> - <string name="dialog_should_i_answer_title">Should I Answer? not installed</string> - <string name="dialog_should_i_answer_message">Would you like to download the app from Google Play now?</string> - <string name="dialog_delete_old_messages">Are you sure you want to automatically delete old messages?</string> - <!-- Title for audio file picker --> - <string name="select_audio">Valitse ääni</string> - <!-- Menu title to copy an attachment to the shared storage [CHAR LIMIT=25] --> - <string name="copy_to_sdcard">Tallenna liite</string> - <!-- Toast message on successful copy to shared storage [CHAR LIMIT=30] --> - <string name="copy_to_sdcard_success">Liite tallennettu.</string> - <!-- Toast message on failed copy to shared storage [CHAR LIMIT=30] --> - <string name="copy_to_sdcard_fail">Liitteen tallennus epäonnistui.</string> - <!-- Menu title to save a sound as a ringtone --> - <string name="save_ringtone">Tallenna soittoäänenä</string> - <!-- Toast message on successful copying ringtone to drm provider --> - <string name="saved_ringtone">Soittoääni tallennettu.</string> - <!-- Toast message on failed copying ringtone to drm provider --> - <string name="saved_ringtone_fail">Soittoäänen tallennus epäonnistui.</string> - <!-- Menu item --> - <!-- Menu item [CHAR LIMIT=40] --> - <string name="menu_group_participants">Ryhmän jäsenet</string> - <!--Toast shown when a draft is saved--> - <string name="toast_draft">Tallennettu luonnos</string> - <!--Toast shown when a conversation is deleted--> - <string name="toast_conversation_deleted">Keskustelu poistettu</string> - <!--Toast shown when device is low on storage--> - <string name="toast_low_memory">"Puhelimen muisti on täynnä. Poista tiedostoja tilan vapauttamiseksi."</string> - <!--Toast shown to tell user that forwarding messages doesn't work yet--> - <string name="toast_forward">Tätä ominaisuutta ei ole vielä lisätty. Toistaiseksi voit käyttää Kopioi teksti -ominaisuutta ja liittää sen keskusteluun johon haluat sen lähettää</string> - <!--Toast shown for unimplemented features--> - <string name="toast_unimplemented">Tätä ominaisuutta ei ole vielä lisätty</string> - <!--Toast shown when a message fails to send--> - <string name="toast_message_failure">Viestin lähettäminen epäonnistui</string> - <!--Toast shown when a message is delivered--> - <string name="toast_message_delivered">Viesti lähetetty</string> - <!--Toast shown when a message is not delivered--> - <string name="toast_message_not_delivered">Viestiä ei lähetetty</string> - <!--Toast shown when default APNs are loaded--> - <string name="toast_default_apns_loaded">Oletus APN-asetukset palautettu</string> - <!--Toast shown when text is copied to the clipboard--> - <string name="toast_copy_text">Teksti kopioitu leikepöydälle</string> - <!--Toast shown when Google Play Services is not available for purchasing a product--> - <string name="toast_billing_not_available">Osto vaatii Google Play Kaupan (laskutus) laitteellasi</string> - <!--Toast shown when Google Play Services is not available for purchasing a product--> - <string name="toast_endlessjabber_not_installed">EndlessJabber ei ole asennettu, avataan Google Play</string> - <string name="toast_changelog_error">Couldn\'t load the changelog. Please try again later</string> - <string name="toast_conversation_error">Couldn\'t open conversation</string> - <string name="toast_deleting_old_messages">Your old messages will be deleted shortly</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_1">Kiitos lahjoituksesta! Olet uusi paras ystäväni.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_2">Kiitos lahjoituksesta! Minä rakastan sinua.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_3">Kiitos lahjoituksesta! Sinun avullasi QKSMS tulee olemaan paras koskaan tehty viestintäsovellus.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_4">Kiitos lahjoituksesta! Olet mahtava.</string> - <!--Menu option to mute conversation--> - <string name="menu_mute_conversation">Mute conversation</string> - <!--Menu option to mute conversation--> - <string name="menu_unmute_conversation">Unmute conversation</string> - <string name="menu_block_conversations">Block conversations</string> - <string name="menu_unblock_conversations">Unblock conversations</string> - <string name="menu_messages">Messages</string> - <string name="menu_blocked">Blocked</string> - <string name="menu_blocked_conversations">Blocked (%s new)</string> - <string name="menu_unblocked_conversations">Messages (%s new)</string> - <string name="menu_notifications">Notifications</string> - <string name="menu_notifications_off">Notifications off</string> - <string name="menu_notification_settings">Conversation settings</string> - <string name="menu_view_details">View details</string> - <string name="menu_mark_read">Mark read</string> - <string name="menu_mark_unread">Mark unread</string> - <string name="menu_delete_conversation">Delete conversation</string> - <string name="menu_multi_select">Select conversation</string> - <string name="menu_done">Done</string> - <string name="failed_message_title">Epäonnistuneen viestin asetukset</string> - <!--Toast shown to tell the user that they don't have a photo attachments app, and suggests that they download one--> - <string name="attachment_app_not_found">Attachments app not found. Try installing a photo gallery app!</string> - <string name="attachment_camera_error">Kameraa ei voitu avata</string> - <string name="pref_max_mms_attachment_size">MMS-liitteen enimmäiskoko</string> - <string name="error_no_recipients">Select some contacts to send this message to!</string> - <string name="error_file_not_found">QKSMS can\'t access the file you\'re trying to share!</string> - <string name="sending_blocked_welcome_screen_message">Hold up! You\'ll get to send real messages in a minute!</string> - <string name="notification_colored_icon_ready">Touch to add to your launcher from home screen.</string> - <string name="notification_title_colored_icon_ready">QKSMS colored icon is ready</string> - <string name="icon_ready">Your new icon is ready!</string> - <string name="icon_ready_message">You can now add it to your home screen again with the updated color.</string> - <string name="dont_ask_again">Älä kysy uudelleen</string> - <string name="warning">Stagefright warning</string> - <string name="stagefright_warning">Video messages may contain a harmful exploit that can leave your phone vulnerable to attacks. Would you like to continue?</string> - <!-- MMS DIALOG SETUP STRINGS --> - <string name="mms_setup_set_up_mms_title">Aseta multimediaviestit?</string> - <string name="mms_setup_set_up_mms_body">It appears that MMS isn\'t set up in QKSMS. Press okay to automatically configure MMS.</string> - <string name="mms_setup_setting_up_later_title">Setting up MMS later</string> - <string name="mms_setup_setting_up_later_body">Visit the MMS section of Settings to try automatic configuration, contact support, or enter your own configuration.</string> - <string name="mms_setup_no_configurations_found_title">No configurations found</string> - <string name="mms_setup_no_configurations_found_body">We couldn\'t find an MMS configuration for your carrier automatically. Press okay to contact support. We\'ll help you get set up! </string> - <string name="mms_setup_one_configuration_found_title">One configuration found</string> - <string name="mms_setup_one_configuration_found_body">We have found an MMS configuration for the %s carrier. Does that sound right?</string> - <string name="mms_setup_multiple_configurations_found_title">Multiple configuration found</string> - <string name="mms_setup_multiple_configurations_found_body">We have found multiple MMS configurations. Choose your carrier from the list, or press N/A if your carrier isn\'t on the list.</string> - <string name="mms_setup_next_steps_title">Next steps</string> - <string name="mms_setup_next_steps_body">Visit the MMS section of Settings to try automatic configuration again, contact support, or enter your own configuration.</string> - <string name="mms_setup_success_title">Success!</string> - <string name="mms_setup_success_body">If you encounter any issues, visit the MMS section of Settings to try automatic configuration again, contact support, or enter your own configuration.</string> - <string name="na">N/A</string> - <string name="no">No</string> - <string name="pref_automatically_configure_mms">Automatically Configure MMS</string> - <string name="pref_mms_contact_support">Contact Support</string> - <string name="pref_category_sending_mms">Sending MMS</string> - <string name="pref_category_mms_configuration">MMS Configuration</string> - <string name="pref_mms_contact_support_summary">Contact the QKSMS team for help setting up MMS</string> - <string name="pref_markdown_enabled">Text formatting</string> - <string name="pref_markdown_enabled_summary">Use markdown syntax to get bold, underline, and italics in your messages</string> - <string name="want_read_indicators">Want read indicators?</string> - <string name="color_swatch_description">Color %1$d</string> - <string name="color_swatch_description_selected">Color %1$d selected</string> - <string name="color_picker_default_title">Select a Color</string> - <string name="message_delivered">Message Delivered</string> - <string name="message_not_delivered">Message Not Delivered</string> - <string name="error">Error</string> - <string name="invalid_destination">Invalid destination address.</string> - <string name="service_not_activated">Service not activated on network.</string> - <string name="service_message_not_found">Message expired or not available.</string> - <string name="service_network_problem">Couldn\'t send due to network problem.</string> - <string name="message_queued">Currently can\'t send your message. It will be sent when the service becomes available.</string> - <string name="download_later">Can\'t download right now. Try again later.</string> - <string name="no_apn">No APN specified for the app, you need to set it up in settings!</string> - <string name="no_subject">(No subject)</string> - <string name="unknown_sender">Unknown sender</string> - <string name="dl_failure_notification">Couldn\'t download message <xliff:g id="subject">%1$s</xliff:g> from <xliff:g id="from">%2$s</xliff:g>.</string> - <string name="auto_select_multiple_apns">Multiple different configurations have been found. Try one now. If it doesn\'t work, you can try a new one by going to Settings > Advanced > Load default APNs.</string> - <string name="auto_select_apn">Automatically Select APNs</string> - <string name="auto_select_failed_title">Automatic configuration failed</string> - <string name="auto_select_failed">Try searching for your carrier\'s APN settings (MMSC, Port, and Proxy) and entering them in Settings > Advanced.</string> - <string name="date_yesterday">Yesterday</string> - <string name="date_just_now">Just now</string> - <string name="compose_loading_attachment">Loading attachment</string> - <string name="hint_no_messages">No messages yet.\nClick the + to send one!</string> - <string-array name="resend_menu"> - <item>Lähetä uudelleen</item> - <item>Muokkaa</item> - <item>Poista</item> - </string-array> - <string-array name="message_menu"> - <item>Välitä viesti</item> - <item>Kopioi teksti</item> - <item>Näytä tiedot</item> - <item>Poista viesti</item> - </string-array> - <string-array name="background_titles"> - <item>Material Light</item> - <item>Material Dark</item> - <item>Black</item> - </string-array> - <string-array name="font_sizes"> - <item>Pieni</item> - <item>Normaali</item> - <item>Suuri</item> - <item>Suurin</item> - </string-array> - <string-array name="font_families"> - <item>Roboto Regular</item> - <item>Roboto Condensed</item> - <item>System font</item> - </string-array> - <string-array name="font_weights"> - <item>Kevyt</item> - <item>Normaali</item> - </string-array> - <!-- String to match as no subject and filter out as a subject. For example, if the - subject string is "no subject", we won't display that. We'll pretend - no subject string was delivered. --> - <string-array name="empty_subject_strings"> - <item>ei aihetta</item> - </string-array> - <string-array name="qk_responses"> - <item>Kyllä</item> - <item>Anna minulle hetki</item> - <item>Olen matkalla</item> - <item>Kiitos</item> - <item>Kuulostaa hyvältä</item> - <item>Mitä kuuluu?</item> - <item>Sovittu</item> - <item>Ei</item> - <item>Rakastan sinua</item> - <item>Anteeksi</item> - <item>LOL</item> - <item>Se on okei</item> - </string-array> - <string-array name="enter_button_options"> - <item>Show emoji</item> - <item>New line</item> - <item>Send message</item> - </string-array> - <string-array name="notification_private_options"> - <item>Show all</item> - <item>Hide message</item> - <item>Hide message and sender</item> - </string-array> - <!-- Max MMS attachment sizes. I.e. will compress pictures that are larger than 300 KB down to - under 300KB. --> - <string-array name="max_mms_attachment_sizes"> - <item>300 KB</item> - <item>600 KB</item> - <item>1 MB</item> - <item>Rajoittamaton</item> - </string-array> -</resources> diff --git a/QKSMS/src/main/res/values-fr/strings.xml b/QKSMS/src/main/res/values-fr/strings.xml deleted file mode 100644 index c709e629f..000000000 --- a/QKSMS/src/main/res/values-fr/strings.xml +++ /dev/null @@ -1,768 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!--Generated by crowdin.com--> -<resources xmlns:xliff="http://schemas.android.com/apk/res-auto"> - <!--Slogan--> - <string name="slogan">Aimer à nouveau les textos.</string> - <!--Text shown when a phone number cannot be found--> - <string name="unknown_number">Numéro inconnu</string> - <!--Content description for photos--> - <string name="popup_photo_CD">Photo</string> - <!--Text to be displayed while content is loading--> - <string name="loading">Chargement…</string> - <!--Test string--> - <string name="test">Essayer</string> - <!--Hint for contacts text field--> - <string name="hint_contacts">Entrez un destinataire</string> - <!--Hint for search text field--> - <string name="hint_search">Recherchez quelque chose</string> - <!--Hint for message reply text field--> - <string name="hint_reply">Entrez un message</string> - <!--Hint for code redemption--> - <string name="hint_redeem">Entrez le code</string> - <string name="hint_hex">Hex</string> - <!--Text shown for single new message in notification--> - <string name="new_message">Nouveau message</string> - <!--Text shown after number of unread messages in notification (ex. 3 new messages)--> - <string name="new_messages">nouveaux messages</string> - <!--Text shown for single failed message in notification--> - <string name="failed_message">Échec de l\'envoi du message</string> - <!--Text shown after number of failed messages in notification (ex. 3 messages failed to send)--> - <string name="failed_messages">messages non envoyés</string> - <!--Text shown under failed message count--> - <string name="failed_messages_summary">Appuyez pour voir</string> - <!--QuickCompose notification title--> - <string name="quickcompose">QK Compose</string> - <!--QuickCompose notification text--> - <string name="quickcompose_detail">Appuyez pour envoyer</string> - <!--Welcome screen intro button--> - <string name="welcome_start">C\'est parti !</string> - <!--Allows user to skip welcome screen--> - <string name="welcome_skip">IGNORER</string> - <!--Allows user to finish the welcome screen--> - <string name="welcome_finish">TERMINÉ</string> - <!--Indicates to user they can pick a color--> - <string name="welcome_theme_title">Choisissez une couleur</string> - <!--Indicates to user they can pick any colors--> - <string name="welcome_theme_description">N\'importe quelle couleur.</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_night_description">Reposant pour les yeux.</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_night_hint">Appuyez</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_quickreply_title">QK Reply</string> - <!--QK Reply explanation--> - <string name="welcome_quickreply_description">Répondez aux messages plus rapidement que jamais.</string> - <!--Prompts user to try QK Reply--> - <string name="welcome_quickreply_hint">Essayez-le !</string> - <!--QK Reply demo message--> - <string name="welcome_quickreply_message_1">Wow ! C\'était pas génial ? Vous pouvez voir toute la conversation en un clin d’œil. Appuyez en dehors du popup ou sur la coche pour le faire disparaître.</string> - <!--QK Reply demo message--> - <string name="welcome_quickreply_message_2">Ceci est QK Reply. Maintenant vous pouvez répondre aux messages de n\'importe où. Appuyez sur le bouton déroulant pour voir ce qui se passe ensuite :)</string> - <!--Settings option in menu--> - <string name="menu_settings">Paramètres</string> - <!--Search option in menu--> - <string name="menu_search">Rechercher</string> - <!--Show full conversation in QuickReply--> - <string name="menu_show_all">Afficher tous les messages</string> - <!--Show only unread messages in QuickReply--> - <string name="menu_show_unread">Afficher les messages non lus</string> - <!--Open conversation option in menu (shown in QuickReply)--> - <string name="menu_open_thread">Ouvrir la conversation</string> - <!--Forward message option in menu--> - <string name="menu_forward">Transférer le message</string> - <!--Call contact option in menu--> - <string name="menu_call">Appeler</string> - <!--Mark a message/conversation as read option in menu--> - <string name="menu_read">Marquer comme lu</string> - <!--Delete a message option in menu--> - <string name="menu_delete">Supprimer</string> - <!--Donate option in menu--> - <string name="menu_billing">Donation</string> - <!--Copy text option in menu--> - <string name="menu_copy">Copier le texte</string> - <!--Changelog option in menu--> - <string name="menu_changelog">"Nouveautés"</string> - <!--Expand settings option in menu--> - <string name="menu_show_all_prefs">Tout afficher</string> - <!--Show less settings option in menu--> - <string name="menu_show_fewer_prefs">Afficher moins</string> - <!--Title for message details popup--> - <string name="details_title">Détails</string> - <!--Title for address that message is being sent to in message details popup--> - <string name="details_to">À</string> - <!--Title for address that message is sent from in message details popup--> - <string name="details_from">De</string> - <!--Title for text of a message in message details popup--> - <string name="details_body">Contenu</string> - <!--Title for date sent of a message in message details popup--> - <string name="details_date_sent">Date d\'envoi</string> - <!--Title for date received of a message in message details popup--> - <string name="details_date_received">Date de réception</string> - <!--Title for rate snackbar--> - <string name="rate_title">Vous aimez QKSMS ?</string> - <!--Title for rate button--> - <string name="rate_action">Évaluer</string> - <string name="pref_category_appearance">Apparence</string> - <string name="pref_category_summary_appearance">Thèmes, polices, couleurs, avatars et plus</string> - <string name="pref_category_general">Général</string> - <string name="pref_category_summary_general">Accusés de réception et d\'envoi, mise en forme</string> - <string name="pref_category_blocking">Blocage des messages</string> - <string name="pref_category_notifications">Notifications</string> - <string name="pref_category_summary_notifications">Sons, LED, vie privée</string> - <string name="pref_category_mms">MMS</string> - <string name="pref_category_summary_mms">Configurer les MMS (APNs), taille maximale, messagerie de groupe</string> - <string name="pref_category_quickreply">QK Reply</string> - <string name="pref_category_summary_quickreply">QK Reply, options de la fenêtre</string> - <string name="pref_category_quickcompose">QK compose</string> - <string name="pref_category_summary_quickcompose">QK Compose, contacts favoris</string> - <string name="pref_category_about">À propos</string> - <string name="pref_category_summary_about">Version, modifications, auteurs, remerciements</string> - <string name="pref_theme">Couleur du thème</string> - <string name="pref_theme_summary_alt">Appuyer pour changer le thème</string> - <string name="pref_icon">Icon color</string> - <string name="pref_icon_summary">Tap to change the QKSMS icon color</string> - <string name="pref_status_tint">Barre d\'état colorée</string> - <string name="pref_navigation_tint">Barre de navigation colorée</string> - <string name="pref_background">Couleur d\'arrière-plan</string> - <string name="pref_background_summary">Appuyer pour changer la couleur d\'arrière-plan</string> - <string name="pref_bubbles">Bulles de message</string> - <string name="pref_bubbles_summary">Appuyer pour changer l\'apparence des bulles de message</string> - <string name="pref_night">Mode nuit</string> - <string name="pref_night_summary">Économise la batterie et réduit la fatigue oculaire</string> - <string name="pref_night_amoled">Fond noir profond</string> - <string name="pref_night_amoled_summary">Économise de la batterie pour les téléphones à écran AMOLED</string> - <string name="pref_bubble_style_new">Nouveau style de bulle</string> - <string name="pref_color_sent">Colorer les messages envoyés</string> - <string name="pref_color_sent_summary">Colorer l\'arrière-plan des bulles pour les messages sortants</string> - <string name="pref_color_received">Colorer les messages reçus</string> - <string name="pref_color_received_summary">Colorer l\'arrière-plan des bulles pour les messages entrants</string> - <string name="pref_hide_avatar_conversations">Masquer les avatars des conversations</string> - <string name="pref_hide_avatar_conversations_summary">Masquer les avatars dans la liste de conversations</string> - <string name="pref_hide_avatar_sent">Masquer les avatars des messages envoyés</string> - <string name="pref_hide_avatar_sent_summary">Masquer votre avatar</string> - <string name="pref_hide_avatar_received">Masquer les avatars des messages reçus</string> - <string name="pref_hide_avatar_received_summary">Masquer l\'avatar de vos contacts</string> - <string name="pref_font_family">Famille de police</string> - <string name="pref_font_size">Taille de la police</string> - <string name="pref_font_weight">Format de la police</string> - <string name="pref_message_count">Compteur de messages</string> - <string name="pref_message_count_summary">Afficher le nombre de messages de chaque conversation</string> - <string name="pref_sent_timestamps">Horodatages envoyés</string> - <string name="pref_sent_timestamps_summary">Afficher l\'horodatage quand un message a été envoyé, pas reçu</string> - <string name="pref_force_timestamps">Forcer l\'horodatage</string> - <string name="pref_force_timestamps_summary">Activer l\'horodatage de tous les messages</string> - <string name="pref_key_timestamp_delay">Délai de l\'horodatage</string> - <string name="pref_key_timestamp_delay_summary">Nombre de minutes devant s\'écouler entre deux messages avant l\'affichage d\'un nouvel horodatage</string> - <string name="pref_compose_favorites">Contacts favoris</string> - <string name="pref_compose_summary_favorites">Afficher vos contacts favoris dans la fenêtre QK Compose afin d\'y accéder rapidement</string> - <string name="pref_prox_sensor_call">Capteur de proximité</string> - <string name="pref_prox_sensor_call_summary">Depuis une conversation, appeler le contact en déplaçant le téléphone à votre oreille</string> - <string name="pref_delivery">Accusés de réception</string> - <string name="pref_delivery_summary">Confirmer que les messages ont bien été envoyés</string> - <string name="pref_delivery_toast">Afficher une notification</string> - <string name="pref_delivery_toast_summary">Afficher une notification toast pour indiquer que le message a été reçu</string> - <string name="pref_delivery_vibrate">Vibrer</string> - <string name="pref_delivery_vibrate_summary">Vibrer quand le message est remis</string> - <string name="pref_delete_old_messages">Supprimer messages anciens</string> - <string name="pref_delete_old_messages_summary">Supprimer automatiquement les messages dès qu’ils sont assez anciens</string> - <string name="pref_delete_old_messages_unread">Messages non lus</string> - <string name="pref_delete_old_messages_unread_summary">Supprimer automatiquement les messages non lus après %s jours</string> - <string name="pref_delete_old_messages_read">Messages lus</string> - <string name="pref_delete_old_messages_read_summary">Supprimer automatiquement les messages lus après %s jours</string> - <string name="pref_yappy">Intégration de Yappy</string> - <string name="pref_endlessjabber_summary">Activer le support complet de Yappy</string> - <string name="pref_blocked_conversations">Conversations bloquées</string> - <string name="pref_blocked_conversations_summary">Appui long sur une conversation et bloquer pour déplacer vers l\'onglet Bloqué et arrêter les notifications</string> - <string name="pref_block_future">Bloquer les futurs messages</string> - <string name="pref_block_future_summary">Ajouter des numéros de téléphone à bloquer</string> - <string name="pref_should_i_answer">Intégration de Dois-je répondre ?</string> - <string name="pref_should_i_answer_summary">Supprimer automatiquement les messages entrants des numéros qui sont bloqués par Dois-je répondre ?</string> - <string name="pref_mobile_only">Numéros de mobile</string> - <string name="pref_mobile_only_summary">Afficher uniquement les numéros de mobile dans les suggestions de contact</string> - <string name="pref_auto_emoji">Émoticône automatique</string> - <string name="pref_auto_emoji_summary">Remplacer le texte avec l\'émoticône</string> - <string name="pref_enter_button">Bouton Entrée</string> - <string name="pref_enter_button_summary">Appuyer pour changer le comportement du bouton Entrée du clavier</string> - <string name="pref_compose_group">Messagerie de groupe</string> - <string name="pref_compose_group_summary">Lorsque vous composez un message pour plusieurs personnes, envoyer un message de groupe au lieu de messages individuels</string> - <string name="pref_auto_download">Télécharger MMS automatiquement</string> - <string name="pref_auto_download_summary">Télécharger les MMS automatiquement lorsqu\'ils sont disponibles</string> - <string name="pref_auto_data">Données mobiles automatique</string> - <string name="pref_auto_data_summary">Activer les données mobiles automatiquement lors de l\'envoi ou la réception d\'un MMS</string> - <string name="pref_split">Diviser les SMS</string> - <string name="pref_split_summary">Diviser les messages longs en messages plus courts</string> - <string name="pref_split_counter">Compteur de message</string> - <string name="pref_split_counter_summary">Ajouter un compteur devant chaque message divisé</string> - <string name="pref_long_as_mms">Conversion en MMS</string> - <string name="pref_long_as_mms_summary">Envoyer les messages longs en tant que MMS au lieu de les diviser</string> - <string name="pref_long_as_mms_after">Envoyer un message long en MMS après</string> - <string name="pref_long_as_mms_after_summary">Envoyer les messages longs en tant que MMS lorsqu\'ils dépassent une certaine longueur</string> - <string name="pref_return">Afficher le bouton retour</string> - <string name="pref_return_summary">Afficher le bouton retour sur le clavier au lieu du bouton émoticône</string> - <string name="pref_text">Texte</string> - <string name="pref_notifications">Notifications SMS</string> - <string name="pref_led">LED de notification</string> - <string name="pref_theme_led">Couleur de la LED</string> - <string name="pref_wake">Allumer l\'écran</string> - <string name="pref_wake_summary">Allumer votre écran lorsque vous recevez un nouveau message</string> - <string name="pref_notifications_private">Notifications privées</string> - <string name="pref_notifications_private_summary">Appuyer pour modifier ce qui doit être masqué dans la notification</string> - <string name="pref_ringtone">Son de notification</string> - <string name="pref_ringtone_summary">Sélectionner un son de notification</string> - <string name="pref_ticker">Afficher l\'aperçu</string> - <string name="pref_ticker_summary">Afficher l\'aperçu du nouveau message dans la barre de notification</string> - <string name="pref_vibration">Vibreur</string> - <string name="pref_vibration_summary">Vibrer quand un nouveau message est reçu</string> - <string name="pref_notification_call">Bouton appeler</string> - <string name="pref_notification_call_summary">Appeler l\'expéditeur d\'un message depuis la notification</string> - <string name="pref_dimiss_read">Marquer comme lu</string> - <string name="pref_dismiss_read_summary">Marquer le message comme lu lorsque la notification est effacée</string> - <string name="pref_delayed">Messagerie différée</string> - <string name="pref_delayed_summary">Attendre avant d\'envoyer le message pour avoir le temps de le modifier</string> - <string name="pref_delayed_duration">Durée du délai (secondes)</string> - <string name="pref_delayed_duration_summary">Délai d\'attente avant envoi du message</string> - <string name="pref_night_auto">Mode nuit automatique</string> - <string name="pref_night_auto_summary">Activer le mode nuit automatiquement selon l\'heure</string> - <string name="pref_day_start">Heure de début du jour</string> - <string name="pref_night_start">Heure de début de la nuit</string> - <string name="pref_qk_responses">QK Responses</string> - <string name="pref_qk_responses_summary">Modifier les réponses pré-définies à utiliser avec votre appareil Android Wear</string> - <string name="pref_quickreply_enabled">QK Reply activé</string> - <string name="pref_quickreply_enabled_summary">Afficher la fenêtre de QK Reply chaque fois qu\'un nouveau message est reçu</string> - <string name="pref_tap_to_quit">Appuyer pour quitter</string> - <string name="pref_tap_to_quit_summary">Appuyer n\'importe où hors de la fenêtre pour la fermer</string> - <string name="pref_quickcompose">QK Compose activé</string> - <string name="pref_quickcompose_summary">Afficher un raccourci vers \"Nouveau Message\" dans la barre de notification</string> - <string name="pref_mms_enabled">MMS activés</string> - <string name="pref_mms_enabled_summary">Permettre l\'envoi et la réception de MMS</string> - <string name="pref_mmsc_url">MMSC</string> - <string name="pref_mms_proxy">Proxy MMS</string> - <string name="pref_mms_port">Port MMS</string> - <string name="pref_apn_chooser">Charger les APNs prédéfinis</string> - <string name="pref_strip_unicode">Enlever les caractères Unicode</string> - <string name="pref_strip_unicode_summary">Remplacer les caractères qui ne sont pas supportés dans les messages longs pour des caractères compatibles avec GSM</string> - <string name="pref_system_bar_flat">Barres système plates</string> - <string name="pref_system_bar_flat_summary">Enlever le dégradé affiché sur les barres système de l\'interface de la plupart des appareils sous KitKat</string> - <string name="pref_status_compat">Patch pour la barre d\'état</string> - <string name="pref_status_compat_summary">Résout les problèmes causés par le mode immersif, Tinted Status Bar (Xposed), ou par des paramètres DPI personnalisés</string> - <string name="pref_navigation_compat">Patch pour la barre de navigation</string> - <string name="pref_navigation_compat_summary">Résout les problèmes causés par le mode immersif, Tinted Status Bar (Xposed), ou par des paramètres DPI personnalisés</string> - <string name="pref_about_version_title">Version de QKSMS</string> - <string name="pref_about_authors_title">Auteurs</string> - <string name="pref_about_authors_summary">Moez Bhatti</string> - <string name="pref_changelog_summary">Appuyer pour voir le journal des modifications</string> - <string name="pref_about_thanks_title">Merci</string> - <string name="pref_about_thanks_summary">Appuyer pour afficher les contributeurs open source</string> - <string name="pref_donate_title">Donation</string> - <string name="pref_donate_summary">QKSMS est gratuit. Aidez-nous via un don !</string> - <string name="pref_about_gplus_title">Google+</string> - <string name="pref_about_gplus_summary">Rejoindre la communauté QKSMS bêta test sur Google+</string> - <string name="pref_about_github_title">GitHub</string> - <string name="pref_about_github_summary">QKSMS est open source. Contribuer et signaler les problèmes sur GitHub</string> - <string name="pref_about_crowdin_title">Crowdin</string> - <string name="pref_about_crowdin_summary">Rejoindre le projet de traduction de QKSMS sur Crowdin</string> - <!--Preference subcategory--> - <string name="pref_subcat_theme">Thème</string> - <!--Preference subcategory--> - <string name="pref_subcat_system_bars">Barres système</string> - <!--Preference subcategory--> - <string name="pref_subcat_categories">Catégories</string> - <!--Preference subcategory--> - <string name="pref_subcat_font">Police</string> - <!--Preference subcategory--> - <string name="pref_subcat_messages">Messages</string> - <!--Preference subcategory--> - <string name="pref_subcat_avatars">Avatars</string> - <string name="donate_google">Donation avec Google</string> - <string name="donate_google_summary">Google prend 30% des dons</string> - <string name="donate_paypal">Donation avec PayPal</string> - <string name="donate_paypal_button">Don de n\'importe quel montant</string> - <string name="donate_paypal_button_summary">Achetez-moi ce que vous voulez !</string> - <!--Donation product name--> - <string name="product_name_donation">Donation</string> - <!--$1 donation product name--> - <string name="product_name_donate_1">Faire don de 1$</string> - <!--$5 donation product name--> - <string name="product_name_donate_5">Faire don de 5$</string> - <!--$3 donation product name--> - <string name="product_name_donate_10">Faire don de 10$</string> - <!--$1 donation product description--> - <string name="product_description_donate_1">Achetez-moi un soda</string> - <!--$5 donation product description--> - <string name="product_description_donate_5">Achetez-moi un sandwich</string> - <!--$10 donaion product description--> - <string name="product_description_donate_10">Achetez-moi un repas</string> - <string name="title_settings">Paramètres</string> - <string name="title_search">Rechercher</string> - <string name="title_compose">Écrire</string> - <string name="title_conversation_list">Conversations</string> - <string name="title_blocked">Bloqué</string> - <string name="title_changelog">Journal des modifications</string> - <string name="title_picker">Nouveaux messages</string> - <string name="title_donate">Donation</string> - <string name="title_qk_responses">QK Responses</string> - <string name="title_block_address">Bloquer le numéro</string> - <string name="title_unblock_address">Débloquer le numéro</string> - <string name="title_conversations_selected">%s sélectionnée(s)</string> - <string name="title_palette">Palette</string> - <string name="title_rgb">RGB</string> - <!-- Menu shown in the context menu when long pressing on a message when the message contains - one or more phone numbers and/or email addresses and the number or email is new to - contacts. [CHAR LIMIT=50] --> - <string name="menu_add_address_to_contacts">Ajouter <xliff:g id="contactEmailOrNumber">%s</xliff:g> aux contacts</string> - <!-- Context menu item on an individual message for viewing an attached slideshow --> - <string name="view_slideshow">Voir le diaporama</string> - <!-- Context menu item on an individual message for viewing message details such as time and date --> - <string name="view_message_details">Voir les détails</string> - <!-- Context menu item on an individual message for viewing a delivery report --> - <string name="view_delivery_report">Voir le rapport</string> - <!-- Context menu item on an individual message for deleting only that message --> - <string name="delete_message">Supprimer</string> - <!-- Abbreviation for "kilobyte" --> - <string name="kilobyte">Ko</string> - <!-- Individual message context menu item --> - <string name="copy_message_text">Copier le texte</string> - <!-- Header for context menu on an individual message --> - <string name="message_options">Options du message</string> - <!-- Delivery Header View --> - <!-- Title of "Report" window --> - <string name="delivery_header_title">Rapport</string> - <!--Text for app restart confirmation dialog--> - <string name="restart_message">Ces modifications prendront effet à la prochaine ouverture de QKSMS</string> - <!--Dialog title for asking if a user wants to delete a conversation--> - <string name="delete_conversation">Supprimer conversation(s)</string> - <!--Dialog title for asking if a user wants to delete all failed messages--> - <string name="delete_all_failed">Supprimer les messages ayant échoué</string> - <!--CDialog title for asking if a user wants to delete a conversation--> - <string name="delete_confirmation">Êtes-vous sûr de vouloir supprimer %s conversation(s) ?</string> - <!--CDialog title for asking if a user wants to delete all failed messages--> - <string name="delete_all_failed_confirmation">Êtes-vous sûr de vouloir supprimer les messages échoués de %s conversation(s) ?</string> - <!--(Unused) Dialog title shown if APNs have not been set--> - <string name="apns_not_set">APN non définis</string> - <!--(Unused) Dialog description shown if APNs have not been set--> - <string name="apns_not_set_description">Il semble que vos APN n\'aient pas été définis. Cela signifie que les MMS ne fonctionneront pas correctement. Appuyez sur OK afin que QKSMS vous les trouve :)</string> - <!--Dialog title show if MMS hasn't been configured--> - <string name="set_up_mms_title">Configurer les MMS ?</string> - <!--Dialog description shown if MMS hasn't yet been configured--> - <string name="set_up_mms_description">Il semble que les MMS n\'aient pas encore été configurés dans QKSMS. Appuyez sur OK les configure automatiquement.</string> - <!-- Dialog message text explaining that a draft message will not be saved due to invalid recipients --> - <string name="discard_message_reason">Votre message sera supprimé car il n\'a pas de destinataire valide.</string> - <string name="invalid_code">Code invalide</string> - <!--Button to restart app now instead of manually later--> - <string name="restart">Redémarrer maintenant</string> - <!--Notification action to reply to a message--> - <string name="reply">Répondre</string> - <!--Notification action to reply to a message--> - <string name="reply_qksms">Répondre avec QKSMS</string> - <!--Notification action to mark a message as read--> - <string name="read">Lu</string> - <!--Notification action to mark a message as read--> - <string name="mark_read">Marquer comme lu</string> - <!--Notification action to call the sender of a message--> - <string name="call">Appeler</string> - <!-- Notification toast message --> - <string name="notification_mute_on">Notifications activées</string> - <string name="notification_mute_off">Notifications désactivées</string> - <!--Positive action button--> - <string name="yes">Oui</string> - <string name="add">Ajouter</string> - <!--Positive action button--> - <string name="save">Enregistrer</string> - <!--Positive action button--> - <string name="enable">Activer</string> - <!--Positive action button--> - <string name="upgrade_now">Définir maintenant</string> - <!--Positive action button--> - <string name="okay">OK</string> - <!--Positive action button--> - <string name="redeem">Utiliser</string> - <!--Neutral action button--> - <string name="just_once">Juste une fois</string> - <!--Neutral action button--> - <string name="later">Plus tard</string> - <!--Neutral action button --> - <string name="cancel">Annuler</string> - <!-- Name of the local user when displaying sender of an outgoing message (personal pronoun) --> - <string name="messagelist_sender_self">Moi</string> - <!-- Sender to be used if the sender address has been hidden --> - <string name="hidden_sender_address">Adresse de l\'expéditeur masquée</string> - <!-- Subject to display in the conversation list if there is no subject --> - <string name="no_subject_view">(Aucun sujet)</string> - <!-- Time and date a message is due to expire --> - <string name="expire_on">"Expire le : <xliff:g id="date">%s</xliff:g>"</string> - <!-- Formatting for subject displayed inline, prepended to MMS message text --> - <string name="inline_subject">"<Sujet: <xliff:g id="subject">%s</xliff:g>>"</string> - <!-- Text of a button appearing for MMS messages that have not yet been downloaded, causing the message to be downloaded (imperative verb) --> - <string name="download">Télécharger</string> - <!-- Message displayed in place of the "download message" button once it has been pressed, indicating that the download is in progress --> - <string name="downloading">Téléchargement</string> - <!-- Toast message while an image is being resized --> - <string name="compressing">Image trop grande. Compression\u2026</string> - <!-- Header shown above favorite contacts in QKCompose --> - <string name="favorites">Contacts favoris</string> - <!-- Word represents 'self' in a conversation --> - <string name="me">Moi</string> - <string name="menu_edit">Modifier</string> - <string name="menu_delete_messages">Supprimer les messages</string> - <string name="menu_delete_failed">Supprimer les messages ayant échoué</string> - <string name="menu_lock">Verrouiller</string> - <string name="menu_unlock">Déverrouiller</string> - <!-- When the user tries to view message details and some error occurs while - retrieving those details, this message will be shown. --> - <string name="cannot_get_details">Impossible d\'obtenir les détails.</string> - <!-- Title of "Message details" dialog --> - <string name="message_details_title">Détails du message</string> - <!-- Label in "Message details" dialog --> - <string name="message_type_label">Type\u000A</string> - <!-- "Type" value in "Message details" dialog --> - <string name="text_message">Message texte</string> - <!-- "Type" value in "Message details" dialog --> - <string name="multimedia_message">Message multimédia</string> - <!-- "Type" value in "Message details" dialog --> - <string name="multimedia_notification">Notification de message multimédia</string> - <!-- Label in "Message details" dialog showing who sent the message. --> - <string name="from_label">De\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="to_address_label">À\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="bcc_label">Bcc\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="sent_label">Envoyé\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="received_label">Reçu\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="saved_label">Sauvegardé\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="subject_label">Sujet\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="message_size_label">Taille du message\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="priority_label">Priorité\u000A</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_high">Haute</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_normal">Normale</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_low">Basse</string> - <!-- Label in "Message details" dialog --> - <string name="message_class_label">Classe de message\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="error_code_label">Code d\'erreur\u000A</string> - <!-- Alert dialog title when creating a slideshow [CHAR LIMIT=none] --> - <string name="building_slideshow_title">Création du diaporama</string> - <!-- Tag appearing on conversations in the conversation list that contain a draft message --> - <string name="has_draft">Brouillon</string> - <!-- In conversation list items, this is the separator between a contact's name and the draft stamp [CHAR LIMIT=5] --> - <string name="draft_separator">, \u0020</string> - <!-- In conversation list items, this comes after the receipient's name and contains the number of messages in the thread [CHAR LIMIT=5] --> - <string name="message_count_format">\u00a0<xliff:g id="number" example="1">%1$s</xliff:g></string> - <!-- For debugging: Dialog box title indicating there's a situation where data has unexpectedly changed --> - <string name="error_state">État incohérent</string> - <!-- For debugging: Dialog box text indicating there's a situation where data has unexpectedly changed --> - <string name="error_state_text">L\'état des conversations et des destinataires est incohérent. Veuillez saisir un rapport de bug et envoyez le à http://go/droidanizer </string> - <!-- This is the dialog title for the "Select link" dialog, shown when the user clicks on a - chat in the chat history view if there are links in the chat message. The dialog displays the - links if there are any --> - <string name="select_link_title">Choisir l\'action</string> - <!-- In message list items, this string builds the timestamp line when the message is in a group [CHAR LIMIT=NONE] --> - <string name="message_timestamp_format">\u0020-\u0020 <xliff:g id="string" example="Fred Flinstone"> %1$s </xliff:g> <xliff:g id="string" example="9:39AM"> %2$s </xliff:g></string> - <!--Message sending status: sending--> - <string name="status_sending">Envoi…</string> - <!--Message sending status: failed--> - <!--<string name="status_failed">Failed. Tap to retry</string>--> - <!-- Delivery Report Activity --> - <!-- Status in "Report" window --> - <string name="status_none">(Aucun)</string> - <!-- Status in "Report" window --> - <string name="status_pending">En attente</string> - <!-- Status in "Report" window --> - <string name="status_read">Lu</string> - <!-- Status in "Report" window --> - <string name="status_received">Reçu</string> - <!-- Status in "Report" window --> - <string name="status_failed">Échec. Appuyez pour les options</string> - <!-- Status in "Report" window --> - <string name="status_unread">Non lu</string> - <!-- Status in "Report" window --> - <string name="status_rejected">Rejeté</string> - <!-- Label in "Report" window --> - <string name="recipient_label">Destinataire : \u0020</string> - <!-- Label in "Report" window --> - <string name="status_label">Statut : \u0020</string> - <!-- Label in "Report" window [CHAR LIMIT=50]--> - <string name="delivered_label">Transmis : \u0020</string> - <string name="do_something">Faire quelque chose</string> - <!-- Confirm Delete --> - <!-- Delete confirmation dialog title --> - <string name="confirm_dialog_title">Supprimer ?</string> - <!-- Delete confirmation dialog title for locked messages --> - <string name="confirm_dialog_locked_title">Supprimer le message verrouillé ?</string> - <!-- This message is displayed in a confirmation dialog when the user selects one or more - conversations and then taps the "Delete" button. --> - <plurals name="confirm_delete_conversation"> - <!-- Case of 1 result. --> - <item quantity="one">Une conversation sera supprimée.</item> - <!-- Case of 0 or 2 or more results. --> - <item quantity="other"><xliff:g id="number" example="15">%1$s</xliff:g> conversations seront supprimées.</item> - </plurals> - <string name="confirm_delete_conversation">La conversation entière sera supprimée.</string> - <!-- Delete all threads confirmation dialog message --> - <string name="confirm_delete_all_conversations">Toutes les conversations seront supprimées.</string> - <!-- Delete message confirmation dialog message --> - <string name="confirm_delete_message">Le message sera supprimé.</string> - <!-- Delete message confirmation dialog message for a locked message --> - <string name="confirm_delete_locked_message">Supprimer ce message verrouillé ?</string> - <!-- Delete all the messages on the SIM dialog message --> - <string name="confirm_delete_all_SIM_messages">Tous les messages sur la carte SIM seront supprimés.</string> - <!-- Delete the selected message on the SIM dialog message --> - <string name="confirm_delete_SIM_message">Ce message sur la carte SIM sera supprimé.</string> - <!-- Delete unlocked checkbox title --> - <string name="delete_unlocked">Supprimer les messages verrouillés</string> - <!-- Delete button title --> - <string name="delete">Supprimer</string> - <!-- More button title --> - <string name="more">Plus</string> - <!-- More button summary --> - <string name="more_summary">Appuyez pour voir plus</string> - <!-- Action bar mode title when multi-selecting conversations --> - <string name="select_conversations">Choisissez des conversations</string> - <!-- Show this in the middle of the main activity when there are no conversations [CHAR LIMIT=none] --> - <string name="no_conversations">Aucune conversation.</string> - <!-- Show this in the middle of the main activity when loading conversations [CHAR LIMIT=none] --> - <string name="loading_conversations">Chargement des conversations.</string> - <!-- Tells the user that QKSMS isn't the default SMS app --> - <string name="not_default">Application SMS par défaut</string> - <!-- Tells the user they need to set QKSMS as the default app in order to use this feature --> - <string name="default_info">QKSMS doit être votre application SMS par défaut pour faire ça</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to mark messages as read --> - <string name="not_default_mark_read">QKSMS doit être votre application SMS par défaut pour marquer les messages comme lus</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to mark messages as unread --> - <string name="not_default_mark_unread">QKSMS doit être votre application SMS par défaut pour marquer les messages comme non-lus</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to send messages --> - <string name="not_default_delete">QKSMS doit être votre application SMS par défaut pour supprimer des messages</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to delete messages --> - <string name="not_default_send">QKSMS doit être votre application SMS par défaut pour envoyer des messages</string> - <!-- Tells the user they should set QKSMS as the default messaging app --> - <string name="not_default_first">Certaines choses ne fonctionneront pas tant que QKSMS n\'est pas l\'application SMS par défaut</string> - <string name="delayed_messaging_info">Messagerie différée vous permet d\'annuler les messages avant de les envoyer. Changer le comportement par défaut et plus dans les Paramètres</string> - <string name="delayed_duration_bounds_error">Le délai doit être entre 1 et 30 secondes</string> - <!-- Dialog title for the Read Report dialog. --> - <string name="confirm">Confirmer</string> - <!-- Dialog text for the Read Report dialog. --> - <string name="message_send_read_report">Un accusé de lecture sera envoyé.</string> - <!-- Dialog title for updating app icon color --> - <string name="update_icon_title">Actualiser la couleur de l\'icône</string> - <!-- Dialog message for updating app icon color --> - <string name="update_icon_message">QKSMS doit redémarrer lorsque vous changez la couleur de l’icône</string> - <string name="dialog_conversation_details_title">Détails de la conversation</string> - <string name="dialog_conversation_details_last_message_date">Date du dernier message</string> - <string name="dialog_conversation_details_message_count">Compteur de messages</string> - <string name="dialog_conversation_details_recipients">Destinataires (%s)</string> - <string name="dialog_should_i_answer_title">Dois-je répondre ? non installé</string> - <string name="dialog_should_i_answer_message">Voulez-vous télécharger l\'application depuis le Play Store maintenant ?</string> - <string name="dialog_delete_old_messages">Êtes-vous sûr de vouloir supprimer automatiquement les anciens messages ?</string> - <!-- Title for audio file picker --> - <string name="select_audio">Choisir le fichier audio</string> - <!-- Menu title to copy an attachment to the shared storage [CHAR LIMIT=25] --> - <string name="copy_to_sdcard">Enregistrer la pièce jointe</string> - <!-- Toast message on successful copy to shared storage [CHAR LIMIT=30] --> - <string name="copy_to_sdcard_success">Pièce jointe enregistrée.</string> - <!-- Toast message on failed copy to shared storage [CHAR LIMIT=30] --> - <string name="copy_to_sdcard_fail">Impossible d\'enregistrer la pièce jointe.</string> - <!-- Menu title to save a sound as a ringtone --> - <string name="save_ringtone">Enregistrer comme sonnerie</string> - <!-- Toast message on successful copying ringtone to drm provider --> - <string name="saved_ringtone">Sonnerie enregistrée.</string> - <!-- Toast message on failed copying ringtone to drm provider --> - <string name="saved_ringtone_fail">Impossible d\'enregistrer la sonnerie.</string> - <!-- Menu item --> - <!-- Menu item [CHAR LIMIT=40] --> - <string name="menu_group_participants">Participants</string> - <!--Toast shown when a draft is saved--> - <string name="toast_draft">Brouillon sauvegardé</string> - <!--Toast shown when a conversation is deleted--> - <string name="toast_conversation_deleted">Conversation supprimée</string> - <!--Toast shown when device is low on storage--> - <string name="toast_low_memory">"La mémoire est saturée. Supprimez des fichiers pour générer de l'espace libre."</string> - <!--Toast shown to tell user that forwarding messages doesn't work yet--> - <string name="toast_forward">Cette fonctionnalité n\'est pas encore opérationnelle ! Veuillez utiliser l\'option \"Copier le texte\" et le coller dans la conversation désirée</string> - <!--Toast shown for unimplemented features--> - <string name="toast_unimplemented">Cette fonctionnalité n\'a pas encore été développée</string> - <!--Toast shown when a message fails to send--> - <string name="toast_message_failure">Échec de l\'envoi</string> - <!--Toast shown when a message is delivered--> - <string name="toast_message_delivered">Message transmis</string> - <!--Toast shown when a message is not delivered--> - <string name="toast_message_not_delivered">Message non transmis</string> - <!--Toast shown when default APNs are loaded--> - <string name="toast_default_apns_loaded">Les réglages APN prédéfinis ont été chargés</string> - <!--Toast shown when text is copied to the clipboard--> - <string name="toast_copy_text">Texte copié dans le presse-papiers</string> - <!--Toast shown when Google Play Services is not available for purchasing a product--> - <string name="toast_billing_not_available">Cet achat nécessite Google Play Store ainsi qu\'un moyen de paiement installé sur votre appareil</string> - <!--Toast shown when Google Play Services is not available for purchasing a product--> - <string name="toast_endlessjabber_not_installed">EndlessJabber n\'est pas installé, ouverture de Google Play</string> - <string name="toast_changelog_error">Impossible de charger le journal des modifications. Veuillez réessayer plus tard</string> - <string name="toast_conversation_error">Impossible d’ouvrir la conversation</string> - <string name="toast_deleting_old_messages">Vos anciens messages seront bientôt supprimés</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_1">Merci pour ton don ! Tu es mon nouveau meilleur ami.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_2">Merci pour ton don ! Je t\'aime.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_3">Merci pour ton don ! Tu participes à faire de QKSMS la meilleure application SMS faite à ce jour.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_4">Merci pour ton don ! Tu es génial.</string> - <!--Menu option to mute conversation--> - <string name="menu_mute_conversation">Conversation silencieuse</string> - <!--Menu option to mute conversation--> - <string name="menu_unmute_conversation">Conversation non silencieuse</string> - <string name="menu_block_conversations">Bloquer les conversations</string> - <string name="menu_unblock_conversations">Débloquer les conversations</string> - <string name="menu_messages">Messages</string> - <string name="menu_blocked">Bloqué</string> - <string name="menu_blocked_conversations">Bloqué (%s nouveau)</string> - <string name="menu_unblocked_conversations">Messages (%s nouveau)</string> - <string name="menu_notifications">Notifications</string> - <string name="menu_notifications_off">Notifications désactivées</string> - <string name="menu_notification_settings">Paramètres de conversation</string> - <string name="menu_view_details">Voir les détails</string> - <string name="menu_mark_read">Marquer comme lu</string> - <string name="menu_mark_unread">Marquer comme non lu</string> - <string name="menu_delete_conversation">Supprimer la conversation</string> - <string name="menu_multi_select">Sélectionner la conversation</string> - <string name="menu_done">Terminé</string> - <string name="failed_message_title">Options des messages échoués</string> - <!--Toast shown to tell the user that they don't have a photo attachments app, and suggests that they download one--> - <string name="attachment_app_not_found">Application non trouvée. Essayez d\'installer une application de galerie photo !</string> - <string name="attachment_camera_error">L\'appareil photo n\'a pas pu être ouvert</string> - <string name="pref_max_mms_attachment_size">Taille maximale des pièces jointes MMS</string> - <string name="error_no_recipients">Sélectionnez des contacts à qui envoyer ce message !</string> - <string name="error_file_not_found">QKSMS ne peut pas accéder au fichier que vous essayez de partager !</string> - <string name="sending_blocked_welcome_screen_message">Doucement ! Vous pourrez envoyer de vrais messages dans une minute !</string> - <string name="notification_colored_icon_ready">Appuyez pour ajouter sur l\'écran d’accueil.</string> - <string name="notification_title_colored_icon_ready">L\'icône colorée de QKSMS est prête</string> - <string name="icon_ready">Votre nouvelle icône est prête !</string> - <string name="icon_ready_message">Vous pouvez maintenant l\'ajouter à votre écran d\'accueil avec la nouvelle couleur.</string> - <string name="dont_ask_again">Ne plus demander</string> - <string name="warning">Avertissement Stagefright</string> - <string name="stagefright_warning">Les MMS vidéos peuvent contenir un exploit nocif pouvant rendre votre téléphone vulnérable aux attaques. Continuer ?</string> - <!-- MMS DIALOG SETUP STRINGS --> - <string name="mms_setup_set_up_mms_title">Configurer les MMS ?</string> - <string name="mms_setup_set_up_mms_body">Il semble que les MMS ne soient pas configurés dans QKSMS. Appuyez sur OK pour les configurer automatiquement.</string> - <string name="mms_setup_setting_up_later_title">Configurer les MMS plus tard</string> - <string name="mms_setup_setting_up_later_body">Allez voir la section MMS des paramètres pour essayer la configuration automatique, contacter le support ou entrer votre propre configuration.</string> - <string name="mms_setup_no_configurations_found_title">Aucune configuration trouvée</string> - <string name="mms_setup_no_configurations_found_body">Nous n\'avons pas pu trouver une configuration MMS pour votre opérateur. Appuyez sur OK pour contacter le support, nous vous aiderons à les configurer ! </string> - <string name="mms_setup_one_configuration_found_title">Une configuration trouvée</string> - <string name="mms_setup_one_configuration_found_body">Nous avons trouvé une configuration pour %s. Cela vous semble-t-il correct ?</string> - <string name="mms_setup_multiple_configurations_found_title">Plusieurs configurations trouvées</string> - <string name="mms_setup_multiple_configurations_found_body">Nous avons trouvé plusieurs configurations MMS. Choisissez votre opérateur dans la liste ou appuyez sur N/D s\'il n\'y figure pas.</string> - <string name="mms_setup_next_steps_title">Prochaine étape</string> - <string name="mms_setup_next_steps_body">Allez voir la section MMS des paramètres pour réessayer la configuration automatique, contacter le support ou entrer votre propre configuration.</string> - <string name="mms_setup_success_title">Succès !</string> - <string name="mms_setup_success_body">Si vous rencontrez des problèmes, allez voir la section MMS des paramètres pour réessayer la configuration automatique, contacter le support ou entrer votre propre configuration.</string> - <string name="na">N/D</string> - <string name="no">Non</string> - <string name="pref_automatically_configure_mms">Configurer automatiquement les MMS</string> - <string name="pref_mms_contact_support">Contacter le support</string> - <string name="pref_category_sending_mms">Envoi de MMS</string> - <string name="pref_category_mms_configuration">Configuration MMS</string> - <string name="pref_mms_contact_support_summary">Contacter l\'équipe de QKSMS pour l\'aide au paramétrage des MMS</string> - <string name="pref_markdown_enabled">Formatage du texte</string> - <string name="pref_markdown_enabled_summary">Utiliser la syntaxe markdown pour disposer du gras, du souligné et de l\'italique dans vos messages</string> - <string name="want_read_indicators">Voulez-vous lire les indicateurs ?</string> - <string name="color_swatch_description">Couleur %1$d</string> - <string name="color_swatch_description_selected">Couleur %1$d sélectionnée</string> - <string name="color_picker_default_title">Sélectionnez une couleur</string> - <string name="message_delivered">Message transmis</string> - <string name="message_not_delivered">Message non transmis</string> - <string name="error">Erreur</string> - <string name="invalid_destination">Adresse de destination invalide.</string> - <string name="service_not_activated">Service non activé sur le réseau.</string> - <string name="service_message_not_found">Message expiré ou non disponible.</string> - <string name="service_network_problem">Impossible d\'envoyer le message à cause d\'un problème réseau.</string> - <string name="message_queued">Impossible d\'envoyer le message. Il sera envoyé lorsque le service sera disponible.</string> - <string name="download_later">Impossible de télécharger maintenant. Réessayez plus tard.</string> - <string name="no_apn">Aucun APN spécifié pour l\'application, vous devez le configurer dans les paramètres !</string> - <string name="no_subject">(Aucun sujet)</string> - <string name="unknown_sender">Expéditeur inconnu</string> - <string name="dl_failure_notification">Impossible de télécharger le message <xliff:g id="subject">%1$s</xliff:g> de <xliff:g id="from">%2$s</xliff:g>.</string> - <string name="auto_select_multiple_apns">Plusieurs configurations ont été trouvées. Essayez-en une. Si elle ne fonctionne pas, vous pourrez en essayer une autre dans Paramètres > Avancés > Rétablir param. par défaut.</string> - <string name="auto_select_apn">Sélectionner les APN automatiquement</string> - <string name="auto_select_failed_title">Configuration automatique échouée</string> - <string name="auto_select_failed">Essayez de rechercher les paramètres APN (MMSC, port et proxy) de votre opérateur et renseignez-les dans Paramètres > Avancés.</string> - <string name="date_yesterday">Hier</string> - <string name="date_just_now">À l\'instant</string> - <string name="compose_loading_attachment">Chargement de la pièce jointe</string> - <string name="hint_no_messages">Aucun message.\nAppuyez sur + pour en envoyer !</string> - <string-array name="resend_menu"> - <item>Renvoyer</item> - <item>Modifier</item> - <item>Supprimer</item> - </string-array> - <string-array name="message_menu"> - <item>Transférer le message</item> - <item>Copier le texte</item> - <item>Voir les détails</item> - <item>Supprimer le message</item> - </string-array> - <string-array name="background_titles"> - <item>Clair</item> - <item>Sombre</item> - <item>Noir</item> - </string-array> - <string-array name="font_sizes"> - <item>Petite</item> - <item>Normale</item> - <item>Grande</item> - <item>Très grande</item> - </string-array> - <string-array name="font_families"> - <item>Roboto Regular</item> - <item>Roboto Condensed</item> - <item>Police système</item> - </string-array> - <string-array name="font_weights"> - <item>Léger</item> - <item>Normal</item> - </string-array> - <!-- String to match as no subject and filter out as a subject. For example, if the - subject string is "no subject", we won't display that. We'll pretend - no subject string was delivered. --> - <string-array name="empty_subject_strings"> - <item>aucun sujet</item> - </string-array> - <string-array name="qk_responses"> - <item>OK</item> - <item>Donnez-moi un moment</item> - <item>J\'arrive</item> - <item>Merci</item> - <item>Ça a l\'air bien</item> - <item>Quoi de neuf ?</item> - <item>D\'accord</item> - <item>Non</item> - <item>Je t\'aime</item> - <item>Désolé</item> - <item>LOL</item> - <item>C\'est d\'accord</item> - </string-array> - <string-array name="enter_button_options"> - <item>Afficher l\'émoticône</item> - <item>Nouvelle ligne</item> - <item>Envoyer le message</item> - </string-array> - <string-array name="notification_private_options"> - <item>Tout afficher</item> - <item>Masquer le message</item> - <item>Masquer le message et l\'expéditeur</item> - </string-array> - <!-- Max MMS attachment sizes. I.e. will compress pictures that are larger than 300 KB down to - under 300KB. --> - <string-array name="max_mms_attachment_sizes"> - <item>300 Ko</item> - <item>600 Ko</item> - <item>1 Mo</item> - <item>Illimité</item> - </string-array> -</resources> diff --git a/QKSMS/src/main/res/values-hi/strings.xml b/QKSMS/src/main/res/values-hi/strings.xml deleted file mode 100644 index 7453e96f2..000000000 --- a/QKSMS/src/main/res/values-hi/strings.xml +++ /dev/null @@ -1,768 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!--Generated by crowdin.com--> -<resources xmlns:xliff="http://schemas.android.com/apk/res-auto"> - <!--Slogan--> - <string name="slogan">Love texting again.</string> - <!--Text shown when a phone number cannot be found--> - <string name="unknown_number">अज्ञात संख्या</string> - <!--Content description for photos--> - <string name="popup_photo_CD">तसवीर</string> - <!--Text to be displayed while content is loading--> - <string name="loading">लोड हो रहा है...</string> - <!--Test string--> - <string name="test">स्ट्रिंग का परीक्षण</string> - <!--Hint for contacts text field--> - <string name="hint_contacts">प्राप्तकर्ता दर्ज करें</string> - <!--Hint for search text field--> - <string name="hint_search">कुछ खोजें</string> - <!--Hint for message reply text field--> - <string name="hint_reply">संदेश लिखें</string> - <!--Hint for code redemption--> - <string name="hint_redeem">कोड दर्ज करें</string> - <string name="hint_hex">Hex</string> - <!--Text shown for single new message in notification--> - <string name="new_message">नई संदेश</string> - <!--Text shown after number of unread messages in notification (ex. 3 new messages)--> - <string name="new_messages">नए संदेश</string> - <!--Text shown for single failed message in notification--> - <string name="failed_message">संदेश भेजने में विफल</string> - <!--Text shown after number of failed messages in notification (ex. 3 messages failed to send)--> - <string name="failed_messages">संदेश भेजने में विफल</string> - <!--Text shown under failed message count--> - <string name="failed_messages_summary">देखने के लिए टैप करें</string> - <!--QuickCompose notification title--> - <string name="quickcompose">QK Compose</string> - <!--QuickCompose notification text--> - <string name="quickcompose_detail">संदेश भेजने के लिए क्लिक करें</string> - <!--Welcome screen intro button--> - <string name="welcome_start">चलो शुरू हो जाओ!</string> - <!--Allows user to skip welcome screen--> - <string name="welcome_skip">SKIP</string> - <!--Allows user to finish the welcome screen--> - <string name="welcome_finish">FINISH</string> - <!--Indicates to user they can pick a color--> - <string name="welcome_theme_title">एक रंग चुनें</string> - <!--Indicates to user they can pick any colors--> - <string name="welcome_theme_description">किसी भी रंग।</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_night_description">Easy on the eyes.</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_night_hint">मुझे टॉगल करें</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_quickreply_title">QK Reply</string> - <!--QK Reply explanation--> - <string name="welcome_quickreply_description">Reply to messages faster than ever.</string> - <!--Prompts user to try QK Reply--> - <string name="welcome_quickreply_hint">Try it!</string> - <!--QK Reply demo message--> - <string name="welcome_quickreply_message_1">Wow! Now wasn\'t that awesome? You can view your entire conversation at a glance. Tap outside the popup or press the checkmark to dismiss it.</string> - <!--QK Reply demo message--> - <string name="welcome_quickreply_message_2">This is QK Reply. Now you can reply to messages from anywhere. Tap the expand button to see what happens next :)</string> - <!--Settings option in menu--> - <string name="menu_settings">सेटिंग्स</string> - <!--Search option in menu--> - <string name="menu_search">खोज</string> - <!--Show full conversation in QuickReply--> - <string name="menu_show_all">Show all messages</string> - <!--Show only unread messages in QuickReply--> - <string name="menu_show_unread">Show unread messages</string> - <!--Open conversation option in menu (shown in QuickReply)--> - <string name="menu_open_thread">बातचीत खोलें</string> - <!--Forward message option in menu--> - <string name="menu_forward">अग्रेषित संदेश</string> - <!--Call contact option in menu--> - <string name="menu_call">कॉल</string> - <!--Mark a message/conversation as read option in menu--> - <string name="menu_read">रीड मार्क करें</string> - <!--Delete a message option in menu--> - <string name="menu_delete">Delete</string> - <!--Donate option in menu--> - <string name="menu_billing">Donate</string> - <!--Copy text option in menu--> - <string name="menu_copy">कॉपी विषय</string> - <!--Changelog option in menu--> - <string name="menu_changelog">"क्या नया"</string> - <!--Expand settings option in menu--> - <string name="menu_show_all_prefs">Show all</string> - <!--Show less settings option in menu--> - <string name="menu_show_fewer_prefs">Show fewer</string> - <!--Title for message details popup--> - <string name="details_title">विवरण</string> - <!--Title for address that message is being sent to in message details popup--> - <string name="details_to">को</string> - <!--Title for address that message is sent from in message details popup--> - <string name="details_from">से</string> - <!--Title for text of a message in message details popup--> - <string name="details_body">निकाय</string> - <!--Title for date sent of a message in message details popup--> - <string name="details_date_sent">भेजा तिथि</string> - <!--Title for date received of a message in message details popup--> - <string name="details_date_received">प्राप्ति दिनांक</string> - <!--Title for rate snackbar--> - <string name="rate_title">Like QKSMS?</string> - <!--Title for rate button--> - <string name="rate_action">Rate</string> - <string name="pref_category_appearance">दिखावट</string> - <string name="pref_category_summary_appearance">Themes, fonts, colors, avatars, and more</string> - <string name="pref_category_general">सामान्य</string> - <string name="pref_category_summary_general">Delivery, message sending, formatting</string> - <string name="pref_category_blocking">Message blocking</string> - <string name="pref_category_notifications">सूचनाएं</string> - <string name="pref_category_summary_notifications">Sounds, LED, privacy</string> - <string name="pref_category_mms">MMS</string> - <string name="pref_category_summary_mms">Configure MMS (APNs), max size, group messaging</string> - <string name="pref_category_quickreply">QK Reply</string> - <string name="pref_category_summary_quickreply">QK Reply, popup options</string> - <string name="pref_category_quickcompose">QK Compose</string> - <string name="pref_category_summary_quickcompose">QK Compose, starred contacts</string> - <string name="pref_category_about">About</string> - <string name="pref_category_summary_about">Version, changelog, authors, thanks</string> - <string name="pref_theme">Theme color</string> - <string name="pref_theme_summary_alt">Tap to change theme</string> - <string name="pref_icon">Icon color</string> - <string name="pref_icon_summary">Tap to change the QKSMS icon color</string> - <string name="pref_status_tint">टिंटेड स्टेटस बार</string> - <string name="pref_navigation_tint">टिंटेड नेवीगेशन बार</string> - <string name="pref_background">Background color</string> - <string name="pref_background_summary">Tap to change background color</string> - <string name="pref_bubbles">Message bubbles</string> - <string name="pref_bubbles_summary">Tap to change message bubble preferences</string> - <string name="pref_night">रात मोड</string> - <string name="pref_night_summary">Save battery and reduce eye strain</string> - <string name="pref_night_amoled">शुद्ध काले रंग की पृष्ठभूमि</string> - <string name="pref_night_amoled_summary">AMOLED डिस्प्ले वाले उपकरणों पर अधिक बैटरी बचाये</string> - <string name="pref_bubble_style_new">Use new bubble style</string> - <string name="pref_color_sent">Color sent messages</string> - <string name="pref_color_sent_summary">Color the background bubbles for outgoing messages</string> - <string name="pref_color_received">Color received messages</string> - <string name="pref_color_received_summary">Color the background bubbles for incoming messages</string> - <string name="pref_hide_avatar_conversations">Hide conversation avatars</string> - <string name="pref_hide_avatar_conversations_summary">Hide avatars for contacts in conversation list</string> - <string name="pref_hide_avatar_sent">Hide sent message avatars</string> - <string name="pref_hide_avatar_sent_summary">Hide your avatar for outgoing messages</string> - <string name="pref_hide_avatar_received">Hide received message avatars</string> - <string name="pref_hide_avatar_received_summary">Hide contact avatar for incoming messages</string> - <string name="pref_font_family">फ़ॉन्ट परिवार</string> - <string name="pref_font_size">फ़ॉन्ट का आकार</string> - <string name="pref_font_weight">फ़ॉन्ट आकार</string> - <string name="pref_message_count">संदेश संख्या</string> - <string name="pref_message_count_summary">Show the number of messages for each conversation</string> - <string name="pref_sent_timestamps">Sent timestamps</string> - <string name="pref_sent_timestamps_summary">Show the timestamp for when a message was sent, not received</string> - <string name="pref_force_timestamps">Force timestamps</string> - <string name="pref_force_timestamps_summary">Enable timestamps for all messages</string> - <string name="pref_key_timestamp_delay">New timestamp delay</string> - <string name="pref_key_timestamp_delay_summary">The number of minutes which must elapse between two messages in order for a new timestamp to be shown.</string> - <string name="pref_compose_favorites">Starred contacts</string> - <string name="pref_compose_summary_favorites">Show your starred contacts in the QK Compose window, making them only a tap away</string> - <string name="pref_prox_sensor_call">Proximity sensor</string> - <string name="pref_prox_sensor_call_summary">While in a conversation, bring your phone to your ear to start a call</string> - <string name="pref_delivery">डिलिवरी पुष्टि</string> - <string name="pref_delivery_summary">Confirm that messages were sent successfully</string> - <string name="pref_delivery_toast">Show toast</string> - <string name="pref_delivery_toast_summary">Show a short toast to indicate a message being delivered</string> - <string name="pref_delivery_vibrate">वायब्रेट</string> - <string name="pref_delivery_vibrate_summary">संदेश डिलीवरी पर वायब्रेट</string> - <string name="pref_delete_old_messages">Delete old messages</string> - <string name="pref_delete_old_messages_summary">Automatically delete messages once they\'re old enough</string> - <string name="pref_delete_old_messages_unread">Unread messages</string> - <string name="pref_delete_old_messages_unread_summary">Automatically delete unread messages after %s days</string> - <string name="pref_delete_old_messages_read">Read messages</string> - <string name="pref_delete_old_messages_read_summary">Automatically delete read messages after %s days</string> - <string name="pref_yappy">Yappy integration</string> - <string name="pref_endlessjabber_summary">Enable full support for Yappy</string> - <string name="pref_blocked_conversations">Blocked conversations</string> - <string name="pref_blocked_conversations_summary">Long-press on a conversation and block to move to blocked inbox and stop notifications</string> - <string name="pref_block_future">Block future messages</string> - <string name="pref_block_future_summary">Add additional phone numbers to block</string> - <string name="pref_should_i_answer">Should I Answer? Integration</string> - <string name="pref_should_i_answer_summary">Automatically delete incoming messages from numbers which are blocked through Should I Answer?</string> - <string name="pref_mobile_only">Mobile numbers</string> - <string name="pref_mobile_only_summary">Only show mobile numbers in contact suggestions</string> - <string name="pref_auto_emoji">Automatic emoji</string> - <string name="pref_auto_emoji_summary">Replace text with image emoji</string> - <string name="pref_enter_button">Enter button</string> - <string name="pref_enter_button_summary">Tap to change keyboard enter button behavior</string> - <string name="pref_compose_group">Group messaging</string> - <string name="pref_compose_group_summary">When composing message to multiple people, send a group message instead of individual messages</string> - <string name="pref_auto_download">Auto download MMS</string> - <string name="pref_auto_download_summary">Automatically download MMS messages when they become available</string> - <string name="pref_auto_data">Automatic data</string> - <string name="pref_auto_data_summary">Turn on data automatically when sending or receiving MMS</string> - <string name="pref_split">एसएमएस विभाजन</string> - <string name="pref_split_summary">लंबे समय से संदेश को अलग-अलग संदेशों में विभाजित</string> - <string name="pref_split_counter">भाजित काउंटर</string> - <string name="pref_split_counter_summary">प्रत्येक विभाजन संदेश के सामने एक काउंटर दिखाए</string> - <string name="pref_long_as_mms">Send long as MMS</string> - <string name="pref_long_as_mms_summary">Send long messages as MMS instead of splitting them</string> - <string name="pref_long_as_mms_after">लंबे समय बाद MMS के रूप में भेजें</string> - <string name="pref_long_as_mms_after_summary">Send long messages as MMS when they exceed the length of a number of messages</string> - <string name="pref_return">वापसी बटन दिखाएँ</string> - <string name="pref_return_summary">Show return key on keyboard instead of Emoji button</string> - <string name="pref_text">Text</string> - <string name="pref_notifications">एसएमएस सूचनाएँ सक्षम किया गया</string> - <string name="pref_led">अधिसूचना एलईडी</string> - <string name="pref_theme_led">Notification LED color</string> - <string name="pref_wake">Wake phone</string> - <string name="pref_wake_summary">Turn your screen on when you receive a new message</string> - <string name="pref_notifications_private">निजी सूचनाएं</string> - <string name="pref_notifications_private_summary">Tap to change what should be hidden in notfication</string> - <string name="pref_ringtone">अधिसूचना ध्वनि</string> - <string name="pref_ringtone_summary">एक अधिसूचना ध्वनि का चयन करें</string> - <string name="pref_ticker">टिकर दिखाएँ</string> - <string name="pref_ticker_summary">Shows snippet of new message in notification bar</string> - <string name="pref_vibration">कंपन</string> - <string name="pref_vibration_summary">कंपन है जब नया संदेश प्राप्त होते हैं</string> - <string name="pref_notification_call">कॉल बटन</string> - <string name="pref_notification_call_summary">Call the sender of a message right from the notification</string> - <string name="pref_dimiss_read">Mark as read</string> - <string name="pref_dismiss_read_summary">Mark message as read when notification is cleared</string> - <string name="pref_delayed">Delayed messaging</string> - <string name="pref_delayed_summary">Wait before sending your messages, so you have a chance to review them</string> - <string name="pref_delayed_duration">Delay length (seconds)</string> - <string name="pref_delayed_duration_summary">Time to wait before sending your message</string> - <string name="pref_night_auto">Automatic night mode</string> - <string name="pref_night_auto_summary">Enable night mode automatically based on the time</string> - <string name="pref_day_start">Day time begins</string> - <string name="pref_night_start">Night time begins</string> - <string name="pref_qk_responses">QK Responses</string> - <string name="pref_qk_responses_summary">Modify your preset responses to be used from your Android Wear device</string> - <string name="pref_quickreply_enabled">QK Reply enabled</string> - <string name="pref_quickreply_enabled_summary">Show QK Reply window whenever a new message is received</string> - <string name="pref_tap_to_quit">Tap to dismiss</string> - <string name="pref_tap_to_quit_summary">Tap anywhere outside of the window to close it</string> - <string name="pref_quickcompose">QK Compose enabled</string> - <string name="pref_quickcompose_summary">Display a notification that allows you to click on to compose a new message</string> - <string name="pref_mms_enabled">MMS enabled</string> - <string name="pref_mms_enabled_summary">Enable sending and receiving of MMS messages</string> - <string name="pref_mmsc_url">MMSC</string> - <string name="pref_mms_proxy">एमएमएस प्रॉक्सी</string> - <string name="pref_mms_port">एमएमएस पोर्ट</string> - <string name="pref_apn_chooser">Load default APNs</string> - <string name="pref_strip_unicode">Strip unicode</string> - <string name="pref_strip_unicode_summary">Swap characters that are not supported in full-length messages for GSM compatible characters</string> - <string name="pref_system_bar_flat">Flat system bars</string> - <string name="pref_system_bar_flat_summary">Get rid of the gradient shown on the system UI bars on most KitKat devices</string> - <string name="pref_status_compat">स्टेटस बार फिक्स</string> - <string name="pref_status_compat_summary">Fixes issues caused by immersive mode, Tinted Status Bar (Xposed), or custom DPI settings</string> - <string name="pref_navigation_compat">नेविगेशन बार फिक्स</string> - <string name="pref_navigation_compat_summary">Fixes issues caused by immersive mode, Tinted Status Bar (Xposed), or custom DPI settings</string> - <string name="pref_about_version_title">QKSMS version</string> - <string name="pref_about_authors_title">Authors</string> - <string name="pref_about_authors_summary">Moez Bhatti</string> - <string name="pref_changelog_summary">Tap to view changelog</string> - <string name="pref_about_thanks_title">Thank you</string> - <string name="pref_about_thanks_summary">Tap to view open-source contributors</string> - <string name="pref_donate_title">Donate</string> - <string name="pref_donate_summary">QKSMS is free. Help support us by donating!</string> - <string name="pref_about_gplus_title">Google+</string> - <string name="pref_about_gplus_summary">Join the QKSMS Beta Testing community on Google+</string> - <string name="pref_about_github_title">GitHub</string> - <string name="pref_about_github_summary">QKSMS is open source. Contribute and report issues on GitHub</string> - <string name="pref_about_crowdin_title">Crowdin</string> - <string name="pref_about_crowdin_summary">Join the QKSMS translation project on Crowdin</string> - <!--Preference subcategory--> - <string name="pref_subcat_theme">Theme</string> - <!--Preference subcategory--> - <string name="pref_subcat_system_bars">System bars</string> - <!--Preference subcategory--> - <string name="pref_subcat_categories">Categories</string> - <!--Preference subcategory--> - <string name="pref_subcat_font">Font</string> - <!--Preference subcategory--> - <string name="pref_subcat_messages">Messages</string> - <!--Preference subcategory--> - <string name="pref_subcat_avatars">Avatars</string> - <string name="donate_google">Donate with Google</string> - <string name="donate_google_summary">Google takes 30% of donations</string> - <string name="donate_paypal">Donate with PayPal</string> - <string name="donate_paypal_button">Donate any amount</string> - <string name="donate_paypal_button_summary">Buy me anything you want!</string> - <!--Donation product name--> - <string name="product_name_donation">Donation</string> - <!--$1 donation product name--> - <string name="product_name_donate_1">Donate $1 USD</string> - <!--$5 donation product name--> - <string name="product_name_donate_5">Donate $5 USD</string> - <!--$3 donation product name--> - <string name="product_name_donate_10">Donate $10 USD</string> - <!--$1 donation product description--> - <string name="product_description_donate_1">मुझे एक कोक खरीदें</string> - <!--$5 donation product description--> - <string name="product_description_donate_5">मुझे एक सैंडविच खरीदें</string> - <!--$10 donaion product description--> - <string name="product_description_donate_10">मुझे भोजन खरीदें</string> - <string name="title_settings">सेटिंग्स</string> - <string name="title_search">खोज</string> - <string name="title_compose">रचना</string> - <string name="title_conversation_list">बातचीत</string> - <string name="title_blocked">Blocked</string> - <string name="title_changelog">Changelog</string> - <string name="title_picker">नए संदेश</string> - <string name="title_donate">Donate</string> - <string name="title_qk_responses">QK Responses</string> - <string name="title_block_address">Block number</string> - <string name="title_unblock_address">Unblock number</string> - <string name="title_conversations_selected">%s selected</string> - <string name="title_palette">Palette</string> - <string name="title_rgb">RGB</string> - <!-- Menu shown in the context menu when long pressing on a message when the message contains - one or more phone numbers and/or email addresses and the number or email is new to - contacts. [CHAR LIMIT=50] --> - <string name="menu_add_address_to_contacts"><xliff:g id="contactEmailOrNumber"> %s </xliff:g> को कॉन्टैक्ट्स में जोड़ें</string> - <!-- Context menu item on an individual message for viewing an attached slideshow --> - <string name="view_slideshow">View slideshow</string> - <!-- Context menu item on an individual message for viewing message details such as time and date --> - <string name="view_message_details">विवरण देखें</string> - <!-- Context menu item on an individual message for viewing a delivery report --> - <string name="view_delivery_report">रिपोर्ट देखें</string> - <!-- Context menu item on an individual message for deleting only that message --> - <string name="delete_message">हटाएँ</string> - <!-- Abbreviation for "kilobyte" --> - <string name="kilobyte">KB</string> - <!-- Individual message context menu item --> - <string name="copy_message_text">Copy text</string> - <!-- Header for context menu on an individual message --> - <string name="message_options">संदेश विकल्प</string> - <!-- Delivery Header View --> - <!-- Title of "Report" window --> - <string name="delivery_header_title">रिपोर्ट</string> - <!--Text for app restart confirmation dialog--> - <string name="restart_message">ये बदलाव QKSMS अगली बार खोलने के बाद लागू होगे.</string> - <!--Dialog title for asking if a user wants to delete a conversation--> - <string name="delete_conversation">Delete conversations</string> - <!--Dialog title for asking if a user wants to delete all failed messages--> - <string name="delete_all_failed">Delete failed messages</string> - <!--CDialog title for asking if a user wants to delete a conversation--> - <string name="delete_confirmation">Are you sure you would like to delete (%s) conversations?</string> - <!--CDialog title for asking if a user wants to delete all failed messages--> - <string name="delete_all_failed_confirmation">Are you sure you would like to delete failed messages from (%s) conversations?</string> - <!--(Unused) Dialog title shown if APNs have not been set--> - <string name="apns_not_set">APNs सेट नहीं</string> - <!--(Unused) Dialog description shown if APNs have not been set--> - <string name="apns_not_set_description">यह प्रतीत होता है कि आपके APNs सेट नहीं किया गया है। इसका मतलब यह है कि एमएमएस ठीक से काम नहीं करेगा। कृपया उन्हें QKSMS ने तुम्हारे लिए खोजने के लिये ठीक दबाये :)</string> - <!--Dialog title show if MMS hasn't been configured--> - <string name="set_up_mms_title">Set up MMS?</string> - <!--Dialog description shown if MMS hasn't yet been configured--> - <string name="set_up_mms_description">It appears that MMS hasn\'t been configured in QKSMS yet. Press okay automatically configure MMS.</string> - <!-- Dialog message text explaining that a draft message will not be saved due to invalid recipients --> - <string name="discard_message_reason">Your message will be discarded because it has no valid recipients.</string> - <string name="invalid_code">Invalid code</string> - <!--Button to restart app now instead of manually later--> - <string name="restart">अब फिर से शुरू करें</string> - <!--Notification action to reply to a message--> - <string name="reply">जवाब दे</string> - <!--Notification action to reply to a message--> - <string name="reply_qksms">Reply via QKSMS</string> - <!--Notification action to mark a message as read--> - <string name="read">पढ़ें</string> - <!--Notification action to mark a message as read--> - <string name="mark_read">Mark as read</string> - <!--Notification action to call the sender of a message--> - <string name="call">कॉल</string> - <!-- Notification toast message --> - <string name="notification_mute_on">Notifications enabled</string> - <string name="notification_mute_off">Notifications disabled</string> - <!--Positive action button--> - <string name="yes">हां</string> - <string name="add">Add</string> - <!--Positive action button--> - <string name="save">Save</string> - <!--Positive action button--> - <string name="enable">Enable</string> - <!--Positive action button--> - <string name="upgrade_now">Set now</string> - <!--Positive action button--> - <string name="okay">ठीक</string> - <!--Positive action button--> - <string name="redeem">Redeem</string> - <!--Neutral action button--> - <string name="just_once">Just once</string> - <!--Neutral action button--> - <string name="later">बाद में</string> - <!--Neutral action button --> - <string name="cancel">रद्द करें</string> - <!-- Name of the local user when displaying sender of an outgoing message (personal pronoun) --> - <string name="messagelist_sender_self">मुझे</string> - <!-- Sender to be used if the sender address has been hidden --> - <string name="hidden_sender_address">Hidden sender address</string> - <!-- Subject to display in the conversation list if there is no subject --> - <string name="no_subject_view">(No subject)</string> - <!-- Time and date a message is due to expire --> - <string name="expire_on">"Expires: <xliff:g id="date">%s</xliff:g>"</string> - <!-- Formatting for subject displayed inline, prepended to MMS message text --> - <string name="inline_subject">"<Subject: <xliff:g id="subject">%s</xliff:g>>"</string> - <!-- Text of a button appearing for MMS messages that have not yet been downloaded, causing the message to be downloaded (imperative verb) --> - <string name="download">डाउनलोड करें</string> - <!-- Message displayed in place of the "download message" button once it has been pressed, indicating that the download is in progress --> - <string name="downloading">डाउनलोड चालू है</string> - <!-- Toast message while an image is being resized --> - <string name="compressing">चित्र बहुत बड़ा। Compressing\u2026</string> - <!-- Header shown above favorite contacts in QKCompose --> - <string name="favorites">Starred contacts</string> - <!-- Word represents 'self' in a conversation --> - <string name="me">Me</string> - <string name="menu_edit">संपादित करें</string> - <string name="menu_delete_messages">संदेश हटाएं</string> - <string name="menu_delete_failed">Delete failed messages</string> - <string name="menu_lock">लॉक</string> - <string name="menu_unlock">अनलॉक</string> - <!-- When the user tries to view message details and some error occurs while - retrieving those details, this message will be shown. --> - <string name="cannot_get_details">विवरण प्राप्त नहीं कर सकता।</string> - <!-- Title of "Message details" dialog --> - <string name="message_details_title">संदेश विवरण</string> - <!-- Label in "Message details" dialog --> - <string name="message_type_label">Type\u000A</string> - <!-- "Type" value in "Message details" dialog --> - <string name="text_message">संदेश</string> - <!-- "Type" value in "Message details" dialog --> - <string name="multimedia_message">मल्टीमीिडया संदेश</string> - <!-- "Type" value in "Message details" dialog --> - <string name="multimedia_notification">Multimedia message notification</string> - <!-- Label in "Message details" dialog showing who sent the message. --> - <string name="from_label">From\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="to_address_label">To\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="bcc_label">Bcc\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="sent_label">Sent\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="received_label">Received\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="saved_label">Saved\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="subject_label">Subject\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="message_size_label">Message size\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="priority_label">Priority\u000A</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_high">उच्च</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_normal">सामान्य</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_low">कम</string> - <!-- Label in "Message details" dialog --> - <string name="message_class_label">Message class\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="error_code_label">Error code\u000A</string> - <!-- Alert dialog title when creating a slideshow [CHAR LIMIT=none] --> - <string name="building_slideshow_title">Building slideshow</string> - <!-- Tag appearing on conversations in the conversation list that contain a draft message --> - <string name="has_draft">Draft</string> - <!-- In conversation list items, this is the separator between a contact's name and the draft stamp [CHAR LIMIT=5] --> - <string name="draft_separator">,\u0020</string> - <!-- In conversation list items, this comes after the receipient's name and contains the number of messages in the thread [CHAR LIMIT=5] --> - <string name="message_count_format">\u00a0<xliff:g id="number" example="1">%1$s</xliff:g></string> - <!-- For debugging: Dialog box title indicating there's a situation where data has unexpectedly changed --> - <string name="error_state">Inconsistent state</string> - <!-- For debugging: Dialog box text indicating there's a situation where data has unexpectedly changed --> - <string name="error_state_text">The state of threads and recipients is inconsistent. Please capture a bug report and report it via http://go/droidanizer </string> - <!-- This is the dialog title for the "Select link" dialog, shown when the user clicks on a - chat in the chat history view if there are links in the chat message. The dialog displays the - links if there are any --> - <string name="select_link_title">Choose action</string> - <!-- In message list items, this string builds the timestamp line when the message is in a group [CHAR LIMIT=NONE] --> - <string name="message_timestamp_format"><xliff:g id="string" example="Fred Flinstone">%1$s</xliff:g>\u0020-\u0020<xliff:g id="string" example="9:39AM">%2$s</xliff:g></string> - <!--Message sending status: sending--> - <string name="status_sending">भेज रहा है ...</string> - <!--Message sending status: failed--> - <!--<string name="status_failed">Failed. Tap to retry</string>--> - <!-- Delivery Report Activity --> - <!-- Status in "Report" window --> - <string name="status_none">(None)</string> - <!-- Status in "Report" window --> - <string name="status_pending">Pending</string> - <!-- Status in "Report" window --> - <string name="status_read">पढ़ें</string> - <!-- Status in "Report" window --> - <string name="status_received">प्राप्त हुआ</string> - <!-- Status in "Report" window --> - <string name="status_failed">Failed. Tap for options</string> - <!-- Status in "Report" window --> - <string name="status_unread">नहीं पढ़ा गया</string> - <!-- Status in "Report" window --> - <string name="status_rejected">Rejected</string> - <!-- Label in "Report" window --> - <string name="recipient_label">प्राप्तकर्ता: \u0020</string> - <!-- Label in "Report" window --> - <string name="status_label">स्थिति: \u0020</string> - <!-- Label in "Report" window [CHAR LIMIT=50]--> - <string name="delivered_label">वितरित: \u0020</string> - <string name="do_something">Do something</string> - <!-- Confirm Delete --> - <!-- Delete confirmation dialog title --> - <string name="confirm_dialog_title">हटाएँ?</string> - <!-- Delete confirmation dialog title for locked messages --> - <string name="confirm_dialog_locked_title">लॉक संदेश हटाएँ?</string> - <!-- This message is displayed in a confirmation dialog when the user selects one or more - conversations and then taps the "Delete" button. --> - <plurals name="confirm_delete_conversation"> - <!-- Case of 1 result. --> - <item quantity="one">एक वार्तालाप हटा दिया जाएगा.</item> - <!-- Case of 0 or 2 or more results. --> - <item quantity="other"><xliff:g id="number" example="15">%1$s</xliff:g> conversations will be deleted.</item> - </plurals> - <string name="confirm_delete_conversation">The entire thread will be deleted.</string> - <!-- Delete all threads confirmation dialog message --> - <string name="confirm_delete_all_conversations">All threads will be deleted.</string> - <!-- Delete message confirmation dialog message --> - <string name="confirm_delete_message">संदेश को हटा दिया जाएगा।</string> - <!-- Delete message confirmation dialog message for a locked message --> - <string name="confirm_delete_locked_message">इस बंद संदेश हटाएँ?</string> - <!-- Delete all the messages on the SIM dialog message --> - <string name="confirm_delete_all_SIM_messages">All messages on the SIM card will be deleted.</string> - <!-- Delete the selected message on the SIM dialog message --> - <string name="confirm_delete_SIM_message">This message on the SIM card will be deleted.</string> - <!-- Delete unlocked checkbox title --> - <string name="delete_unlocked">लॉक संदेश हटाएँ?</string> - <!-- Delete button title --> - <string name="delete">हटाएँ</string> - <!-- More button title --> - <string name="more">More</string> - <!-- More button summary --> - <string name="more_summary">Tap to see more</string> - <!-- Action bar mode title when multi-selecting conversations --> - <string name="select_conversations">Choose conversations</string> - <!-- Show this in the middle of the main activity when there are no conversations [CHAR LIMIT=none] --> - <string name="no_conversations">No conversations.</string> - <!-- Show this in the middle of the main activity when loading conversations [CHAR LIMIT=none] --> - <string name="loading_conversations">Loading conversations.</string> - <!-- Tells the user that QKSMS isn't the default SMS app --> - <string name="not_default">Default SMS</string> - <!-- Tells the user they need to set QKSMS as the default app in order to use this feature --> - <string name="default_info">QKSMS needs to be your SMS app to do that</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to mark messages as read --> - <string name="not_default_mark_read">QKSMS must be your SMS app to mark messages read</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to mark messages as unread --> - <string name="not_default_mark_unread">QKSMS must be your SMS app to mark messages unread</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to send messages --> - <string name="not_default_delete">QKSMS must be your SMS app to delete messages</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to delete messages --> - <string name="not_default_send">QKSMS must be your SMS app to send messages</string> - <!-- Tells the user they should set QKSMS as the default messaging app --> - <string name="not_default_first">Some things won\'t work until QKSMS is the default SMS app</string> - <string name="delayed_messaging_info">Delayed messaging allows you to cancel messages before they send. Change the default behavior and more in Settings</string> - <string name="delayed_duration_bounds_error">Duration must be between 1 and 30 seconds</string> - <!-- Dialog title for the Read Report dialog. --> - <string name="confirm">की पुष्टि करें</string> - <!-- Dialog text for the Read Report dialog. --> - <string name="message_send_read_report">A read report will be sent.</string> - <!-- Dialog title for updating app icon color --> - <string name="update_icon_title">Update icon color</string> - <!-- Dialog message for updating app icon color --> - <string name="update_icon_message">QKSMS must be restarted when changing the icon color</string> - <string name="dialog_conversation_details_title">Conversation details</string> - <string name="dialog_conversation_details_last_message_date">Last message date</string> - <string name="dialog_conversation_details_message_count">Message count</string> - <string name="dialog_conversation_details_recipients">Recipients (%s)</string> - <string name="dialog_should_i_answer_title">Should I Answer? not installed</string> - <string name="dialog_should_i_answer_message">Would you like to download the app from Google Play now?</string> - <string name="dialog_delete_old_messages">Are you sure you want to automatically delete old messages?</string> - <!-- Title for audio file picker --> - <string name="select_audio">ऑडियो सेलेक्ट करे</string> - <!-- Menu title to copy an attachment to the shared storage [CHAR LIMIT=25] --> - <string name="copy_to_sdcard">अटैचमेंट सेव करे</string> - <!-- Toast message on successful copy to shared storage [CHAR LIMIT=30] --> - <string name="copy_to_sdcard_success">अटैचमेंट सेव हो गयी.</string> - <!-- Toast message on failed copy to shared storage [CHAR LIMIT=30] --> - <string name="copy_to_sdcard_fail">अटैचमेंट सेव कर नहीं सके</string> - <!-- Menu title to save a sound as a ringtone --> - <string name="save_ringtone">रिंगटोन के रूप में सेव करे</string> - <!-- Toast message on successful copying ringtone to drm provider --> - <string name="saved_ringtone">रिंगटोन सेव हो गयी</string> - <!-- Toast message on failed copying ringtone to drm provider --> - <string name="saved_ringtone_fail">Couldn\'t save ringtone.</string> - <!-- Menu item --> - <!-- Menu item [CHAR LIMIT=40] --> - <string name="menu_group_participants">Group participants</string> - <!--Toast shown when a draft is saved--> - <string name="toast_draft">Saved draft</string> - <!--Toast shown when a conversation is deleted--> - <string name="toast_conversation_deleted">Conversation deleted</string> - <!--Toast shown when device is low on storage--> - <string name="toast_low_memory">"Phone storage is full. Delete some files to free space."</string> - <!--Toast shown to tell user that forwarding messages doesn't work yet--> - <string name="toast_forward">This feature has not yet been implemented. For now please use the Copy text option and paste that in the conversation you would like to send it</string> - <!--Toast shown for unimplemented features--> - <string name="toast_unimplemented">यह सुविधा अभी तक कार्यान्वित नहीं किया गयी है</string> - <!--Toast shown when a message fails to send--> - <string name="toast_message_failure">संदेश भेजने में विफल</string> - <!--Toast shown when a message is delivered--> - <string name="toast_message_delivered">Message delivered</string> - <!--Toast shown when a message is not delivered--> - <string name="toast_message_not_delivered">Message not delivered</string> - <!--Toast shown when default APNs are loaded--> - <string name="toast_default_apns_loaded">डिफ़ॉल्ट APN सेटिंग्स लोड किए गए</string> - <!--Toast shown when text is copied to the clipboard--> - <string name="toast_copy_text">Copied text to clipboard</string> - <!--Toast shown when Google Play Services is not available for purchasing a product--> - <string name="toast_billing_not_available">Purchase requires Google Play Store (billing) on your Android</string> - <!--Toast shown when Google Play Services is not available for purchasing a product--> - <string name="toast_endlessjabber_not_installed">EndlessJabber is not installed, opening Google Play</string> - <string name="toast_changelog_error">Couldn\'t load the changelog. Please try again later</string> - <string name="toast_conversation_error">Couldn\'t open conversation</string> - <string name="toast_deleting_old_messages">Your old messages will be deleted shortly</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_1">दान के लिए धन्यवाद! आप मेरे नए सबसे अच्छे दोस्त हैं.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_2">दान के लिए धन्यवाद! मुझे तुमसे प्यार है.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_3">Thanks for donating! You\'re helping QKSMS become the best texting app ever made.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_4">दान के लिए धन्यवाद! तुम कमाल हो.</string> - <!--Menu option to mute conversation--> - <string name="menu_mute_conversation">Mute conversation</string> - <!--Menu option to mute conversation--> - <string name="menu_unmute_conversation">Unmute conversation</string> - <string name="menu_block_conversations">Block conversations</string> - <string name="menu_unblock_conversations">Unblock conversations</string> - <string name="menu_messages">Messages</string> - <string name="menu_blocked">Blocked</string> - <string name="menu_blocked_conversations">Blocked (%s new)</string> - <string name="menu_unblocked_conversations">Messages (%s new)</string> - <string name="menu_notifications">Notifications</string> - <string name="menu_notifications_off">Notifications off</string> - <string name="menu_notification_settings">Conversation settings</string> - <string name="menu_view_details">View details</string> - <string name="menu_mark_read">Mark read</string> - <string name="menu_mark_unread">Mark unread</string> - <string name="menu_delete_conversation">Delete conversation</string> - <string name="menu_multi_select">Select conversation</string> - <string name="menu_done">Done</string> - <string name="failed_message_title">Failed message options</string> - <!--Toast shown to tell the user that they don't have a photo attachments app, and suggests that they download one--> - <string name="attachment_app_not_found">Attachments app not found. Try installing a photo gallery app!</string> - <string name="attachment_camera_error">The camera could not be opened</string> - <string name="pref_max_mms_attachment_size">Maximum MMS attachment size</string> - <string name="error_no_recipients">Select some contacts to send this message to!</string> - <string name="error_file_not_found">QKSMS can\'t access the file you\'re trying to share!</string> - <string name="sending_blocked_welcome_screen_message">Hold up! You\'ll get to send real messages in a minute!</string> - <string name="notification_colored_icon_ready">Touch to add to your launcher from home screen.</string> - <string name="notification_title_colored_icon_ready">QKSMS colored icon is ready</string> - <string name="icon_ready">Your new icon is ready!</string> - <string name="icon_ready_message">You can now add it to your home screen again with the updated color.</string> - <string name="dont_ask_again">Don\'t ask again</string> - <string name="warning">Stagefright warning</string> - <string name="stagefright_warning">Video messages may contain a harmful exploit that can leave your phone vulnerable to attacks. Would you like to continue?</string> - <!-- MMS DIALOG SETUP STRINGS --> - <string name="mms_setup_set_up_mms_title">Set up MMS?</string> - <string name="mms_setup_set_up_mms_body">It appears that MMS isn\'t set up in QKSMS. Press okay to automatically configure MMS.</string> - <string name="mms_setup_setting_up_later_title">Setting up MMS later</string> - <string name="mms_setup_setting_up_later_body">Visit the MMS section of Settings to try automatic configuration, contact support, or enter your own configuration.</string> - <string name="mms_setup_no_configurations_found_title">No configurations found</string> - <string name="mms_setup_no_configurations_found_body">We couldn\'t find an MMS configuration for your carrier automatically. Press okay to contact support. We\'ll help you get set up! </string> - <string name="mms_setup_one_configuration_found_title">One configuration found</string> - <string name="mms_setup_one_configuration_found_body">We have found an MMS configuration for the %s carrier. Does that sound right?</string> - <string name="mms_setup_multiple_configurations_found_title">Multiple configuration found</string> - <string name="mms_setup_multiple_configurations_found_body">We have found multiple MMS configurations. Choose your carrier from the list, or press N/A if your carrier isn\'t on the list.</string> - <string name="mms_setup_next_steps_title">Next steps</string> - <string name="mms_setup_next_steps_body">Visit the MMS section of Settings to try automatic configuration again, contact support, or enter your own configuration.</string> - <string name="mms_setup_success_title">Success!</string> - <string name="mms_setup_success_body">If you encounter any issues, visit the MMS section of Settings to try automatic configuration again, contact support, or enter your own configuration.</string> - <string name="na">N/A</string> - <string name="no">No</string> - <string name="pref_automatically_configure_mms">Automatically Configure MMS</string> - <string name="pref_mms_contact_support">Contact Support</string> - <string name="pref_category_sending_mms">Sending MMS</string> - <string name="pref_category_mms_configuration">MMS Configuration</string> - <string name="pref_mms_contact_support_summary">Contact the QKSMS team for help setting up MMS</string> - <string name="pref_markdown_enabled">Text formatting</string> - <string name="pref_markdown_enabled_summary">Use markdown syntax to get bold, underline, and italics in your messages</string> - <string name="want_read_indicators">Want read indicators?</string> - <string name="color_swatch_description">Color %1$d</string> - <string name="color_swatch_description_selected">Color %1$d selected</string> - <string name="color_picker_default_title">Select a Color</string> - <string name="message_delivered">Message Delivered</string> - <string name="message_not_delivered">Message Not Delivered</string> - <string name="error">Error</string> - <string name="invalid_destination">Invalid destination address.</string> - <string name="service_not_activated">Service not activated on network.</string> - <string name="service_message_not_found">Message expired or not available.</string> - <string name="service_network_problem">Couldn\'t send due to network problem.</string> - <string name="message_queued">Currently can\'t send your message. It will be sent when the service becomes available.</string> - <string name="download_later">Can\'t download right now. Try again later.</string> - <string name="no_apn">No APN specified for the app, you need to set it up in settings!</string> - <string name="no_subject">(No subject)</string> - <string name="unknown_sender">Unknown sender</string> - <string name="dl_failure_notification">Couldn\'t download message <xliff:g id="subject">%1$s</xliff:g> from <xliff:g id="from">%2$s</xliff:g>.</string> - <string name="auto_select_multiple_apns">Multiple different configurations have been found. Try one now. If it doesn\'t work, you can try a new one by going to Settings > Advanced > Load default APNs.</string> - <string name="auto_select_apn">Automatically Select APNs</string> - <string name="auto_select_failed_title">Automatic configuration failed</string> - <string name="auto_select_failed">Try searching for your carrier\'s APN settings (MMSC, Port, and Proxy) and entering them in Settings > Advanced.</string> - <string name="date_yesterday">Yesterday</string> - <string name="date_just_now">Just now</string> - <string name="compose_loading_attachment">Loading attachment</string> - <string name="hint_no_messages">No messages yet.\nClick the + to send one!</string> - <string-array name="resend_menu"> - <item>Resend</item> - <item>Edit</item> - <item>Delete</item> - </string-array> - <string-array name="message_menu"> - <item>मैसेज आगे भेजे</item> - <item>कॉपी टेक्स्ट</item> - <item>विवरण देखें</item> - <item>संदेश हटाएं</item> - </string-array> - <string-array name="background_titles"> - <item>Material Light</item> - <item>Material Dark</item> - <item>Black</item> - </string-array> - <string-array name="font_sizes"> - <item>छोटा</item> - <item>सामान्य</item> - <item>बड़ा</item> - <item>सबसे बड़ा</item> - </string-array> - <string-array name="font_families"> - <item>Roboto Regular</item> - <item>Roboto Condensed</item> - <item>System font</item> - </string-array> - <string-array name="font_weights"> - <item>प्रकाश</item> - <item>सामान्य</item> - </string-array> - <!-- String to match as no subject and filter out as a subject. For example, if the - subject string is "no subject", we won't display that. We'll pretend - no subject string was delivered. --> - <string-array name="empty_subject_strings"> - <item>कोई विषय नहीं</item> - </string-array> - <string-array name="qk_responses"> - <item>Okay</item> - <item>Give me a moment</item> - <item>On my way</item> - <item>Thanks</item> - <item>Sounds good</item> - <item>What\'s up?</item> - <item>Agreed</item> - <item>No</item> - <item>Love you</item> - <item>Sorry</item> - <item>LOL</item> - <item>That\'s okay</item> - </string-array> - <string-array name="enter_button_options"> - <item>Show emoji</item> - <item>New line</item> - <item>Send message</item> - </string-array> - <string-array name="notification_private_options"> - <item>Show all</item> - <item>Hide message</item> - <item>Hide message and sender</item> - </string-array> - <!-- Max MMS attachment sizes. I.e. will compress pictures that are larger than 300 KB down to - under 300KB. --> - <string-array name="max_mms_attachment_sizes"> - <item>300 KB</item> - <item>600 KB</item> - <item>1 MB</item> - <item>Unlimited</item> - </string-array> -</resources> diff --git a/QKSMS/src/main/res/values-hu/strings.xml b/QKSMS/src/main/res/values-hu/strings.xml deleted file mode 100644 index e443096ec..000000000 --- a/QKSMS/src/main/res/values-hu/strings.xml +++ /dev/null @@ -1,768 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!--Generated by crowdin.com--> -<resources xmlns:xliff="http://schemas.android.com/apk/res-auto"> - <!--Slogan--> - <string name="slogan">Szeress bele újra az üzenetezésbe.</string> - <!--Text shown when a phone number cannot be found--> - <string name="unknown_number">Ismeretlen telefonszám</string> - <!--Content description for photos--> - <string name="popup_photo_CD">Fotó</string> - <!--Text to be displayed while content is loading--> - <string name="loading">Betöltés…</string> - <!--Test string--> - <string name="test">Teszt szöveg</string> - <!--Hint for contacts text field--> - <string name="hint_contacts">Adja meg a címzetteket</string> - <!--Hint for search text field--> - <string name="hint_search">Keress valamit</string> - <!--Hint for message reply text field--> - <string name="hint_reply">Írja be az üzenetet</string> - <!--Hint for code redemption--> - <string name="hint_redeem">Írja be a kódot</string> - <string name="hint_hex">Hex</string> - <!--Text shown for single new message in notification--> - <string name="new_message">Új üzenet</string> - <!--Text shown after number of unread messages in notification (ex. 3 new messages)--> - <string name="new_messages">új üzenet</string> - <!--Text shown for single failed message in notification--> - <string name="failed_message">Az üzenet küldése sikertelen</string> - <!--Text shown after number of failed messages in notification (ex. 3 messages failed to send)--> - <string name="failed_messages">az üzenet küldése sikertelen</string> - <!--Text shown under failed message count--> - <string name="failed_messages_summary">Érintse meg a megtekintéshez</string> - <!--QuickCompose notification title--> - <string name="quickcompose">QK Alkotó</string> - <!--QuickCompose notification text--> - <string name="quickcompose_detail">Kattintson egy üzenet elküldéséhez</string> - <!--Welcome screen intro button--> - <string name="welcome_start">Kezdje el!</string> - <!--Allows user to skip welcome screen--> - <string name="welcome_skip">KIHAGY</string> - <!--Allows user to finish the welcome screen--> - <string name="welcome_finish">BEFEJEZÉS</string> - <!--Indicates to user they can pick a color--> - <string name="welcome_theme_title">Válasszon ki egy színt</string> - <!--Indicates to user they can pick any colors--> - <string name="welcome_theme_description">Bármilyen szín.</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_night_description">Kellemes a szemnek.</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_night_hint">Nyomj meg</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_quickreply_title">QK Válasz</string> - <!--QK Reply explanation--> - <string name="welcome_quickreply_description">Válaszoljon az üzenetekre gyorsabban mint valaha.</string> - <!--Prompts user to try QK Reply--> - <string name="welcome_quickreply_hint">Próbálja ki!</string> - <!--QK Reply demo message--> - <string name="welcome_quickreply_message_1">Hú! Hát nem elképesztő? Egy szempillantás alatt megtekintheti az egész beszélgetést. Érintse meg a pipát, vagy egy, az ablakon kívül eső részt a kilépéshez.</string> - <!--QK Reply demo message--> - <string name="welcome_quickreply_message_2">Ez a QK Válasz. Mostantól akárhonnan válaszolhat az üzeneteire. Érintse meg a kiterjesztés gombot, hogy megtudja mi történik ezután :)</string> - <!--Settings option in menu--> - <string name="menu_settings">Beállítások</string> - <!--Search option in menu--> - <string name="menu_search">Keresés</string> - <!--Show full conversation in QuickReply--> - <string name="menu_show_all">Minden üzenet megjelenítése</string> - <!--Show only unread messages in QuickReply--> - <string name="menu_show_unread">Olvasatlan üzenetek megjelenítése</string> - <!--Open conversation option in menu (shown in QuickReply)--> - <string name="menu_open_thread">Beszélgetés megnyitása</string> - <!--Forward message option in menu--> - <string name="menu_forward">Üzenet továbbítása</string> - <!--Call contact option in menu--> - <string name="menu_call">Hívás</string> - <!--Mark a message/conversation as read option in menu--> - <string name="menu_read">Megjelölés olvasottként</string> - <!--Delete a message option in menu--> - <string name="menu_delete">Törlés</string> - <!--Donate option in menu--> - <string name="menu_billing">Adományozás</string> - <!--Copy text option in menu--> - <string name="menu_copy">Szöveg másolása</string> - <!--Changelog option in menu--> - <string name="menu_changelog">"Újdonságok"</string> - <!--Expand settings option in menu--> - <string name="menu_show_all_prefs">Összes megjelenítése</string> - <!--Show less settings option in menu--> - <string name="menu_show_fewer_prefs">Kevesebb megjelenítése</string> - <!--Title for message details popup--> - <string name="details_title">Részletek</string> - <!--Title for address that message is being sent to in message details popup--> - <string name="details_to">Címzett</string> - <!--Title for address that message is sent from in message details popup--> - <string name="details_from">Küldő</string> - <!--Title for text of a message in message details popup--> - <string name="details_body">Szövegtest</string> - <!--Title for date sent of a message in message details popup--> - <string name="details_date_sent">Küldés dátuma</string> - <!--Title for date received of a message in message details popup--> - <string name="details_date_received">Beérkezés dátuma</string> - <!--Title for rate snackbar--> - <string name="rate_title">Kedveli a QKSMS-t?</string> - <!--Title for rate button--> - <string name="rate_action">Minősítés</string> - <string name="pref_category_appearance">Megjelenés</string> - <string name="pref_category_summary_appearance">Témák, betűtípusok, színek, avatárok és más</string> - <string name="pref_category_general">Általános</string> - <string name="pref_category_summary_general">Kézbesítés, üzenetküldés, formázás</string> - <string name="pref_category_blocking">Blokkolt üzenetek</string> - <string name="pref_category_notifications">Értesítések</string> - <string name="pref_category_summary_notifications">Hangok, fények, magánszféra</string> - <string name="pref_category_mms">MMS</string> - <string name="pref_category_summary_mms">MMS (APN-ek) konfigurálása, maximális méret, csoportos üzenetküldés</string> - <string name="pref_category_quickreply">QK Válasz</string> - <string name="pref_category_summary_quickreply">QK Válasz, előugró ablak beállításai</string> - <string name="pref_category_quickcompose">QK Alkotó</string> - <string name="pref_category_summary_quickcompose">QK Alkotó, csillagozott névjegyek</string> - <string name="pref_category_about">Névjegy</string> - <string name="pref_category_summary_about">Verzió, változási napló, szerzők, köszönetnyilvánítás</string> - <string name="pref_theme">Színséma</string> - <string name="pref_theme_summary_alt">Érintse meg a téma módosításához</string> - <string name="pref_icon">Icon color</string> - <string name="pref_icon_summary">Tap to change the QKSMS icon color</string> - <string name="pref_status_tint">Színezett állapotsor</string> - <string name="pref_navigation_tint">Színezett navigációs sáv</string> - <string name="pref_background">Háttérszín</string> - <string name="pref_background_summary">Érintse meg a háttérszín megváltoztatásához</string> - <string name="pref_bubbles">Üzenetbuborékok</string> - <string name="pref_bubbles_summary">Érintse meg az üzenetbuborékok beállításaihoz</string> - <string name="pref_night">Éjszakai mód</string> - <string name="pref_night_summary">Akkumulátor kímélése és szemfáradtság csökkentése</string> - <string name="pref_night_amoled">Tiszta fekete háttér</string> - <string name="pref_night_amoled_summary">Extra akkuhasználat-csökkentés AMOLED kijelzőkön</string> - <string name="pref_bubble_style_new">Új buboréktéma használata</string> - <string name="pref_color_sent">Elküldött üzenetek színezése</string> - <string name="pref_color_sent_summary">Színezze ki az elküldött üzenetbuborékok hátterét</string> - <string name="pref_color_received">Bejövő üzenetek színezése</string> - <string name="pref_color_received_summary">Színezze ki az bejövő üzenetbuborékok hátterét</string> - <string name="pref_hide_avatar_conversations">Avatárok elrejtése</string> - <string name="pref_hide_avatar_conversations_summary">Avatárok elrejtése a beszélgetések listájában</string> - <string name="pref_hide_avatar_sent">Avatár elrejtése kimenő üzeneteknél</string> - <string name="pref_hide_avatar_sent_summary">Az ön avatárjának elrejtése kimenő üzeneteknél</string> - <string name="pref_hide_avatar_received">Avatár elrejtése bejövő üzeneteknél</string> - <string name="pref_hide_avatar_received_summary">Névjegy avatárjának elrejtése bejővő üzeneteknél</string> - <string name="pref_font_family">Betűtípus</string> - <string name="pref_font_size">Betűk mérete</string> - <string name="pref_font_weight">Betűk kövérsége</string> - <string name="pref_message_count">Üzenetek száma</string> - <string name="pref_message_count_summary">Üzenetek száma minden beszélgetéshez</string> - <string name="pref_sent_timestamps">Sent timestamps</string> - <string name="pref_sent_timestamps_summary">Show the timestamp for when a message was sent, not received</string> - <string name="pref_force_timestamps">Force timestamps</string> - <string name="pref_force_timestamps_summary">Enable timestamps for all messages</string> - <string name="pref_key_timestamp_delay">New timestamp delay</string> - <string name="pref_key_timestamp_delay_summary">The number of minutes which must elapse between two messages in order for a new timestamp to be shown.</string> - <string name="pref_compose_favorites">Csillagozott névjegyek</string> - <string name="pref_compose_summary_favorites">Jelenítse meg a csillagozott névjegyeket a QK Alkotóban, így csak egy érintésre lesznek</string> - <string name="pref_prox_sensor_call">Közelség érzékelő</string> - <string name="pref_prox_sensor_call_summary">Ha meg van nyitva egy beszélgetés, a füléhez emelve a telefont hívást kezdeményezhet</string> - <string name="pref_delivery">Kézbesítési jelentés</string> - <string name="pref_delivery_summary">Igazolja, hogy az üzenet sikeresen el lett küldve</string> - <string name="pref_delivery_toast">Toast mutatása</string> - <string name="pref_delivery_toast_summary">Rövid toast mutatása egy üzenet kézbesítése esetén</string> - <string name="pref_delivery_vibrate">Vibrál</string> - <string name="pref_delivery_vibrate_summary">Vibrál kézbesítés esetén</string> - <string name="pref_delete_old_messages">Delete old messages</string> - <string name="pref_delete_old_messages_summary">Automatically delete messages once they\'re old enough</string> - <string name="pref_delete_old_messages_unread">Unread messages</string> - <string name="pref_delete_old_messages_unread_summary">Automatically delete unread messages after %s days</string> - <string name="pref_delete_old_messages_read">Read messages</string> - <string name="pref_delete_old_messages_read_summary">Automatically delete read messages after %s days</string> - <string name="pref_yappy">Yappy integráció</string> - <string name="pref_endlessjabber_summary">Yappy teljes támogatásának engedélyezése</string> - <string name="pref_blocked_conversations">Blokkolt beszélgetések</string> - <string name="pref_blocked_conversations_summary">Hosszú érintés egy beszélgetésen és blokkolás a blokkolt postafiókba mozgatáshoz és az értesítések kikapcsolásához</string> - <string name="pref_block_future">Jövőbeli üzenetek blokkolása</string> - <string name="pref_block_future_summary">További telefonszámok blokkolása</string> - <string name="pref_should_i_answer">Should I Answer? Integráció</string> - <string name="pref_should_i_answer_summary">Bejövő üzenetek automatikus törlése a Should I Answer? által blokkolt számoktól</string> - <string name="pref_mobile_only">Mobil számok</string> - <string name="pref_mobile_only_summary">Csak a mobil számokat jelenítse meg a kapcsolatok javaslatakor</string> - <string name="pref_auto_emoji">Automatikus emoji</string> - <string name="pref_auto_emoji_summary">Szöveg lecserélése emoji-val</string> - <string name="pref_enter_button">Enter gomb</string> - <string name="pref_enter_button_summary">Érintse meg, hogy módosítja a billentyűzet enter gombjának működését</string> - <string name="pref_compose_group">Csoportos üzenetküldés</string> - <string name="pref_compose_group_summary">Több címzett esetén csoportos üzenet küldése különálló üzenetek helyett</string> - <string name="pref_auto_download">MMS automatikus letöltése</string> - <string name="pref_auto_download_summary">MMS automatikus letöltése amint elérhetőek lesznek</string> - <string name="pref_auto_data">Automatikus mobil adatkapcsolat</string> - <string name="pref_auto_data_summary">Mobil adatkapcsolat automatikus engedélyezése MMS küldése és fogadása esetén</string> - <string name="pref_split">SMS felosztása</string> - <string name="pref_split_summary">Ossza fel a hosszú üzeneteket különálló rövidebbekre</string> - <string name="pref_split_counter">Felosztás számláló</string> - <string name="pref_split_counter_summary">Számláló hozzáadása minden felosztott üzenet elejére</string> - <string name="pref_long_as_mms">Hosszú üzenetek küldése MMS-ként</string> - <string name="pref_long_as_mms_summary">Hosszú üzenetek küldése MMS-ként felosztás helyett</string> - <string name="pref_long_as_mms_after">Hosszú üzenetek küldése MMS-ként miután</string> - <string name="pref_long_as_mms_after_summary">Hosszú üzenetek küldése MMS-ként miután a számuk meghaladta a beállított értéket</string> - <string name="pref_return">Enter gomb megjelenítése</string> - <string name="pref_return_summary">Enter gomb megjelenítése az Emoji gomb helyett</string> - <string name="pref_text">Szöveg</string> - <string name="pref_notifications">SMS értesítés bekapcsolva</string> - <string name="pref_led">Értesítési fény</string> - <string name="pref_theme_led">Értesítési fény színe</string> - <string name="pref_wake">Telefon felébresztése</string> - <string name="pref_wake_summary">Képernyő bekapcsolása új üzenet beérkezésekor</string> - <string name="pref_notifications_private">Személyes értesítések</string> - <string name="pref_notifications_private_summary">Érintse meg, hogy beállítsa mi legyen elrejtve az értesítésben</string> - <string name="pref_ringtone">Értesítési hang</string> - <string name="pref_ringtone_summary">Válasszon ki egy értesítési hangot</string> - <string name="pref_ticker">Ticker megjelenítése</string> - <string name="pref_ticker_summary">Beérkező üzenet részletének mutatása az értesítési sávban</string> - <string name="pref_vibration">Rezgés</string> - <string name="pref_vibration_summary">Rezeg új üzenetek beérkezésekor</string> - <string name="pref_notification_call">Hívás gomb</string> - <string name="pref_notification_call_summary">Hívja fel az üzenet küldőjét rögtön az értesítésből</string> - <string name="pref_dimiss_read">Megjelölés olvasottként</string> - <string name="pref_dismiss_read_summary">Üzenet megjelölése olvasottként az értesítés eltüntetése esetén</string> - <string name="pref_delayed">Késleltetett üzenetküldés</string> - <string name="pref_delayed_summary">Várjon üzenetei küldése előtt, így lesz még esélye ellenőrizni őket</string> - <string name="pref_delayed_duration">Késleltetés hossza (másodperc)</string> - <string name="pref_delayed_duration_summary">Késleltetés hossza az üzenet elküldése előtt</string> - <string name="pref_night_auto">Automatikus éjszakai üzemmód</string> - <string name="pref_night_auto_summary">Éjszakai üzemmód automatikus bekapcsolása az idő függvényében</string> - <string name="pref_day_start">Nappali kezdete</string> - <string name="pref_night_start">Éjszaka kezdete</string> - <string name="pref_qk_responses">QK Válaszok</string> - <string name="pref_qk_responses_summary">Módosítsa az előre definiált válaszait hogy az Android Wear eszközéről ezek legyenek használva</string> - <string name="pref_quickreply_enabled">QK Válasz engedélyezve</string> - <string name="pref_quickreply_enabled_summary">QK Válasz ablak megjelenése minden bejövő üzenetnél</string> - <string name="pref_tap_to_quit">Érintse meg az eltüntetéshez</string> - <string name="pref_tap_to_quit_summary">Érintse meg bárhol az ablakon kívül, hogy kilépjen</string> - <string name="pref_quickcompose">QK Alkotó engedélyezve</string> - <string name="pref_quickcompose_summary">Olyan értesítés megjelenítése amire rákattintva új üzenetet írhat</string> - <string name="pref_mms_enabled">MMS engedélyezve</string> - <string name="pref_mms_enabled_summary">MMS küldésének és fogadásának engedélyezése</string> - <string name="pref_mmsc_url">MMSC</string> - <string name="pref_mms_proxy">MMS proxy</string> - <string name="pref_mms_port">MMS port</string> - <string name="pref_apn_chooser">Alapértelmezett APN betöltése</string> - <string name="pref_strip_unicode">Unicode karakterek kivágása</string> - <string name="pref_strip_unicode_summary">Nem támogatott karakterek cseréje GSM kompatibilis karakterekre</string> - <string name="pref_system_bar_flat">Lapos rendszersávok</string> - <string name="pref_system_bar_flat_summary">Színátmenet eltüntetése a Rendszer UI sávokról a legtöbb KitKat eszközön</string> - <string name="pref_status_compat">Állapotsor javítása</string> - <string name="pref_status_compat_summary">Kiterjesztett kijelző által fellépet hibák megoldása, Tinned Status Bar(Xposed), vagy egyéni képsűrűség</string> - <string name="pref_navigation_compat">Navigációs sáv javítása</string> - <string name="pref_navigation_compat_summary">Kiterjesztett kijelző által fellépet hibák megoldása, Tinned Status Bar(Xposed), vagy egyéni képsűrűség</string> - <string name="pref_about_version_title">QKSMS verzió</string> - <string name="pref_about_authors_title">Szerzők</string> - <string name="pref_about_authors_summary">Moez Bhatti</string> - <string name="pref_changelog_summary">Érintse meg a változási napló megjelenítéséhez</string> - <string name="pref_about_thanks_title">Köszönöm</string> - <string name="pref_about_thanks_summary">Érintse meg a nyílt forrású támogatók megtekintéséhez</string> - <string name="pref_donate_title">Adományozás</string> - <string name="pref_donate_summary">A QKSMS egy ingyenes alkalmazás. Támogasson minket adományával!</string> - <string name="pref_about_gplus_title">Google+</string> - <string name="pref_about_gplus_summary">Join the QKSMS Beta Testing community on Google+</string> - <string name="pref_about_github_title">GitHub</string> - <string name="pref_about_github_summary">QKSMS is open source. Contribute and report issues on GitHub</string> - <string name="pref_about_crowdin_title">Crowdin</string> - <string name="pref_about_crowdin_summary">Join the QKSMS translation project on Crowdin</string> - <!--Preference subcategory--> - <string name="pref_subcat_theme">Téma</string> - <!--Preference subcategory--> - <string name="pref_subcat_system_bars">Rendszer panelek</string> - <!--Preference subcategory--> - <string name="pref_subcat_categories">Kategóriák</string> - <!--Preference subcategory--> - <string name="pref_subcat_font">Betűtípus</string> - <!--Preference subcategory--> - <string name="pref_subcat_messages">Üzenetek</string> - <!--Preference subcategory--> - <string name="pref_subcat_avatars">Avatárok</string> - <string name="donate_google">Adományzzon a Google-el</string> - <string name="donate_google_summary">30% az adományból a Google-é lesz</string> - <string name="donate_paypal">Adományozás PayPal-al</string> - <string name="donate_paypal_button">Tetszőleges összeg adományozása</string> - <string name="donate_paypal_button_summary">Vásároljon nekem amit szeretne!</string> - <!--Donation product name--> - <string name="product_name_donation">Adomány</string> - <!--$1 donation product name--> - <string name="product_name_donate_1">Adományozzon 1 dollárt</string> - <!--$5 donation product name--> - <string name="product_name_donate_5">Adományozzon 5 dollárt</string> - <!--$3 donation product name--> - <string name="product_name_donate_10">Adományozzon 10 dollárt</string> - <!--$1 donation product description--> - <string name="product_description_donate_1">Vásároljon nekem egy tortát</string> - <!--$5 donation product description--> - <string name="product_description_donate_5">Vásároljon nekem egy szendvicset</string> - <!--$10 donaion product description--> - <string name="product_description_donate_10">Vásároljon nekem egy ebédet</string> - <string name="title_settings">Beállítások</string> - <string name="title_search">Keresés</string> - <string name="title_compose">Üzenetírás</string> - <string name="title_conversation_list">Beszélgetések</string> - <string name="title_blocked">Blokkolva</string> - <string name="title_changelog">Változási napló</string> - <string name="title_picker">Új üzenetek</string> - <string name="title_donate">Adományozás</string> - <string name="title_qk_responses">QK Válaszok</string> - <string name="title_block_address">Szám blokkolása</string> - <string name="title_unblock_address">Blokkolás feloldása</string> - <string name="title_conversations_selected">%s kijelölve</string> - <string name="title_palette">Palette</string> - <string name="title_rgb">RGB</string> - <!-- Menu shown in the context menu when long pressing on a message when the message contains - one or more phone numbers and/or email addresses and the number or email is new to - contacts. [CHAR LIMIT=50] --> - <string name="menu_add_address_to_contacts"><xliff:g id="contactEmailOrNumber">%s</xliff:g> hozzáadása egy névjegyhez</string> - <!-- Context menu item on an individual message for viewing an attached slideshow --> - <string name="view_slideshow">Diavetítés</string> - <!-- Context menu item on an individual message for viewing message details such as time and date --> - <string name="view_message_details">Részletek megtekintése</string> - <!-- Context menu item on an individual message for viewing a delivery report --> - <string name="view_delivery_report">Jelentés megtekintése</string> - <!-- Context menu item on an individual message for deleting only that message --> - <string name="delete_message">Törlés</string> - <!-- Abbreviation for "kilobyte" --> - <string name="kilobyte">KB</string> - <!-- Individual message context menu item --> - <string name="copy_message_text">Szöveg másolása</string> - <!-- Header for context menu on an individual message --> - <string name="message_options">További lehetőségek</string> - <!-- Delivery Header View --> - <!-- Title of "Report" window --> - <string name="delivery_header_title">Jelentés</string> - <!--Text for app restart confirmation dialog--> - <string name="restart_message">A változások a QKSMS következő megnyitásakor lépnek életbe</string> - <!--Dialog title for asking if a user wants to delete a conversation--> - <string name="delete_conversation">Beszélgetés törlése</string> - <!--Dialog title for asking if a user wants to delete all failed messages--> - <string name="delete_all_failed">Sikertelen üzenetek törlése</string> - <!--CDialog title for asking if a user wants to delete a conversation--> - <string name="delete_confirmation">Biztosan ki szeretné törölni a (%s) beszélgetéseket?</string> - <!--CDialog title for asking if a user wants to delete all failed messages--> - <string name="delete_all_failed_confirmation">Biztosan ki szeretné törölni a sikertelen üzeneteket (%s) a beszélgetésekből?</string> - <!--(Unused) Dialog title shown if APNs have not been set--> - <string name="apns_not_set">Nincs APN beállítva</string> - <!--(Unused) Dialog description shown if APNs have not been set--> - <string name="apns_not_set_description">Úgy tűnik nincs APN beállítva. Ez azt jelenti gondok lesznek az MMS-ekkel. Nyomja meg az oké gombot, hogy a QKSMS beállítsa önnek :)</string> - <!--Dialog title show if MMS hasn't been configured--> - <string name="set_up_mms_title">MMS beállítása?</string> - <!--Dialog description shown if MMS hasn't yet been configured--> - <string name="set_up_mms_description">Úgy tűnik az MMS-ek beállításai nem teljesek a QKSMS-ben. Nyomja meg az oké gombot automatikus konfigurációhoz.</string> - <!-- Dialog message text explaining that a draft message will not be saved due to invalid recipients --> - <string name="discard_message_reason">Az üzenete törlésre kerül mert nincs érvényes címzettje.</string> - <string name="invalid_code">Érvénytelen kód</string> - <!--Button to restart app now instead of manually later--> - <string name="restart">Újraindítás most</string> - <!--Notification action to reply to a message--> - <string name="reply">Válasz</string> - <!--Notification action to reply to a message--> - <string name="reply_qksms">Válasz QKSMS-el</string> - <!--Notification action to mark a message as read--> - <string name="read">Olvasott</string> - <!--Notification action to mark a message as read--> - <string name="mark_read">Megjelölés olvasottként</string> - <!--Notification action to call the sender of a message--> - <string name="call">Hívás</string> - <!-- Notification toast message --> - <string name="notification_mute_on">Notifications enabled</string> - <string name="notification_mute_off">Notifications disabled</string> - <!--Positive action button--> - <string name="yes">Igen</string> - <string name="add">Hozzáadás</string> - <!--Positive action button--> - <string name="save">Mentés</string> - <!--Positive action button--> - <string name="enable">Engedélyezés</string> - <!--Positive action button--> - <string name="upgrade_now">Beállítás</string> - <!--Positive action button--> - <string name="okay">Oké</string> - <!--Positive action button--> - <string name="redeem">Beváltás</string> - <!--Neutral action button--> - <string name="just_once">Csak egyszer</string> - <!--Neutral action button--> - <string name="later">Később</string> - <!--Neutral action button --> - <string name="cancel">Mégse</string> - <!-- Name of the local user when displaying sender of an outgoing message (personal pronoun) --> - <string name="messagelist_sender_self">Ön</string> - <!-- Sender to be used if the sender address has been hidden --> - <string name="hidden_sender_address">Küldő rejtett címe</string> - <!-- Subject to display in the conversation list if there is no subject --> - <string name="no_subject_view">(Nincs tárgy)</string> - <!-- Time and date a message is due to expire --> - <string name="expire_on">"Expires: <xliff:g id="date">%s</xliff:g>"</string> - <!-- Formatting for subject displayed inline, prepended to MMS message text --> - <string name="inline_subject">"<Subject: <xliff:g id="subject">%s</xliff:g>>"</string> - <!-- Text of a button appearing for MMS messages that have not yet been downloaded, causing the message to be downloaded (imperative verb) --> - <string name="download">Letöltés</string> - <!-- Message displayed in place of the "download message" button once it has been pressed, indicating that the download is in progress --> - <string name="downloading">Letöltés</string> - <!-- Toast message while an image is being resized --> - <string name="compressing">A kép túl nagy. Összesűrítés\u2026</string> - <!-- Header shown above favorite contacts in QKCompose --> - <string name="favorites">Csillagozott névjegyek</string> - <!-- Word represents 'self' in a conversation --> - <string name="me">Ön</string> - <string name="menu_edit">Szerkesztés</string> - <string name="menu_delete_messages">Üzenetek törlése</string> - <string name="menu_delete_failed">Sikertelen üzenetek törlése</string> - <string name="menu_lock">Zárolás</string> - <string name="menu_unlock">Feloldás</string> - <!-- When the user tries to view message details and some error occurs while - retrieving those details, this message will be shown. --> - <string name="cannot_get_details">Nem sikerült megszerezni a részeteket.</string> - <!-- Title of "Message details" dialog --> - <string name="message_details_title">Üzenet részletei</string> - <!-- Label in "Message details" dialog --> - <string name="message_type_label">Típus\u000A</string> - <!-- "Type" value in "Message details" dialog --> - <string name="text_message">Szöveges üzenet</string> - <!-- "Type" value in "Message details" dialog --> - <string name="multimedia_message">Multimédiás üzenet</string> - <!-- "Type" value in "Message details" dialog --> - <string name="multimedia_notification">Multimédiás üzenet értesítések</string> - <!-- Label in "Message details" dialog showing who sent the message. --> - <string name="from_label">Feladó\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="to_address_label">Címzett\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="bcc_label">Bcc\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="sent_label">Eélüldütt\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="received_label">Fogadott\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="saved_label">Mentve\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="subject_label">Tárgy\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="message_size_label">Üzenet mérete\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="priority_label">Prioritás\u000A</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_high">Magas</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_normal">Normál</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_low">Alacsony</string> - <!-- Label in "Message details" dialog --> - <string name="message_class_label">Üzenet besorolása\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="error_code_label">Hibakód\u000A</string> - <!-- Alert dialog title when creating a slideshow [CHAR LIMIT=none] --> - <string name="building_slideshow_title">Diavetítés előkészítése</string> - <!-- Tag appearing on conversations in the conversation list that contain a draft message --> - <string name="has_draft">Piszkozat</string> - <!-- In conversation list items, this is the separator between a contact's name and the draft stamp [CHAR LIMIT=5] --> - <string name="draft_separator">,\u0020</string> - <!-- In conversation list items, this comes after the receipient's name and contains the number of messages in the thread [CHAR LIMIT=5] --> - <string name="message_count_format">\u00a0<xliff:g id="number" example="1">%1$s</xliff:g></string> - <!-- For debugging: Dialog box title indicating there's a situation where data has unexpectedly changed --> - <string name="error_state">Inkonzisztens állapotban</string> - <!-- For debugging: Dialog box text indicating there's a situation where data has unexpectedly changed --> - <string name="error_state_text">A szálak és címzettek állapota inkonzisztens, Készítsen hibajelentést és jelentse a http://go/droidanizer segítségével </string> - <!-- This is the dialog title for the "Select link" dialog, shown when the user clicks on a - chat in the chat history view if there are links in the chat message. The dialog displays the - links if there are any --> - <string name="select_link_title">Művelet kiválasztása</string> - <!-- In message list items, this string builds the timestamp line when the message is in a group [CHAR LIMIT=NONE] --> - <string name="message_timestamp_format"><xliff:g id="string" example="Fred Flinstone">%1$s</xliff:g>\u0020-\u0020<xliff:g id="string" example="9:39AM">%2$s</xliff:g></string> - <!--Message sending status: sending--> - <string name="status_sending">Küldés…</string> - <!--Message sending status: failed--> - <!--<string name="status_failed">Failed. Tap to retry</string>--> - <!-- Delivery Report Activity --> - <!-- Status in "Report" window --> - <string name="status_none">(Üres)</string> - <!-- Status in "Report" window --> - <string name="status_pending">Függőben</string> - <!-- Status in "Report" window --> - <string name="status_read">Elolvasva</string> - <!-- Status in "Report" window --> - <string name="status_received">Fogadott</string> - <!-- Status in "Report" window --> - <string name="status_failed">Sikertelen. Érintse meg a lehetőségekért</string> - <!-- Status in "Report" window --> - <string name="status_unread">Olvasatlan</string> - <!-- Status in "Report" window --> - <string name="status_rejected">Elutasított</string> - <!-- Label in "Report" window --> - <string name="recipient_label">Fogadó:\u0020</string> - <!-- Label in "Report" window --> - <string name="status_label">Állapot:\u0020</string> - <!-- Label in "Report" window [CHAR LIMIT=50]--> - <string name="delivered_label">Kézbesítve:\u0020</string> - <string name="do_something">Tegyen valamit</string> - <!-- Confirm Delete --> - <!-- Delete confirmation dialog title --> - <string name="confirm_dialog_title">Törli?</string> - <!-- Delete confirmation dialog title for locked messages --> - <string name="confirm_dialog_locked_title">Törli a zárolt üzeneteket?</string> - <!-- This message is displayed in a confirmation dialog when the user selects one or more - conversations and then taps the "Delete" button. --> - <plurals name="confirm_delete_conversation"> - <!-- Case of 1 result. --> - <item quantity="one">Egy beszélgetés törlésre kerül.</item> - <!-- Case of 0 or 2 or more results. --> - <item quantity="other"><xliff:g id="number" example="15">%1$s</xliff:g> beszélgetés törlésre kerül.</item> - </plurals> - <string name="confirm_delete_conversation">Az egész szál törlésre kerül.</string> - <!-- Delete all threads confirmation dialog message --> - <string name="confirm_delete_all_conversations">Minden szál törlésre kerül.</string> - <!-- Delete message confirmation dialog message --> - <string name="confirm_delete_message">Az üzenet törlésre kerül.</string> - <!-- Delete message confirmation dialog message for a locked message --> - <string name="confirm_delete_locked_message">Törli ezt a zárolt üzenetet?</string> - <!-- Delete all the messages on the SIM dialog message --> - <string name="confirm_delete_all_SIM_messages">Minden üzenet a SIM kártyán törlésre kerül.</string> - <!-- Delete the selected message on the SIM dialog message --> - <string name="confirm_delete_SIM_message">Ez az üzenet a SIM kártyán törlésre kerül.</string> - <!-- Delete unlocked checkbox title --> - <string name="delete_unlocked">Zárolt üzenetek törlése</string> - <!-- Delete button title --> - <string name="delete">Törlés</string> - <!-- More button title --> - <string name="more">Több</string> - <!-- More button summary --> - <string name="more_summary">Érintse meg, hogy többet lásson</string> - <!-- Action bar mode title when multi-selecting conversations --> - <string name="select_conversations">Beszélgetések kiválasztása</string> - <!-- Show this in the middle of the main activity when there are no conversations [CHAR LIMIT=none] --> - <string name="no_conversations">Nincsenek beszélgetések.</string> - <!-- Show this in the middle of the main activity when loading conversations [CHAR LIMIT=none] --> - <string name="loading_conversations">Beszélgetések betöltése.</string> - <!-- Tells the user that QKSMS isn't the default SMS app --> - <string name="not_default">SMS alapértelmezés</string> - <!-- Tells the user they need to set QKSMS as the default app in order to use this feature --> - <string name="default_info">A QKSMS kell legyen az alapértelmezett SMS alkalmazás</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to mark messages as read --> - <string name="not_default_mark_read">A QKSMS kell legyen az alapértelmezett SMS alkalmazás, hogy megjelölhesse az üzeneteket olvasottként</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to mark messages as unread --> - <string name="not_default_mark_unread">A QKSMS kell legyen az alapértelmezett SMS alkalmazás, hogy megjelölhesse az üzeneteket olvasatlanként</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to send messages --> - <string name="not_default_delete">Üzenetek törléséhez a QKSMS kell legyen az alapértelmezett SMS alkalmazás</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to delete messages --> - <string name="not_default_send">Üzenetek küldéséhez a QKSMS kell legyen az alapértelmezett SMS alkalmazás</string> - <!-- Tells the user they should set QKSMS as the default messaging app --> - <string name="not_default_first">Néhány dolog csak azután fog működni, hogy a QKSMS az alapértelmezett SMS alkalmazás</string> - <string name="delayed_messaging_info">A késleltetett üzenetküldés lehetővé teszi az üzenetek küldésének leállítását. Az alapértelmezett működést módosíthatja a Beállításokban</string> - <string name="delayed_duration_bounds_error">Az időtartam 1 és 30 másodper között kel llennie</string> - <!-- Dialog title for the Read Report dialog. --> - <string name="confirm">Megerősít</string> - <!-- Dialog text for the Read Report dialog. --> - <string name="message_send_read_report">Egy olvasási jelentés küldésre kerül.</string> - <!-- Dialog title for updating app icon color --> - <string name="update_icon_title">Ikon színének frissítése</string> - <!-- Dialog message for updating app icon color --> - <string name="update_icon_message">QKSMS must be restarted when changing the icon color</string> - <string name="dialog_conversation_details_title">Beszélgetés részletei</string> - <string name="dialog_conversation_details_last_message_date">Utolsó üzenet dátuma</string> - <string name="dialog_conversation_details_message_count">Üzenetek száma</string> - <string name="dialog_conversation_details_recipients">Címzettek (%s)</string> - <string name="dialog_should_i_answer_title">A Should I Answer? nincs telepítve</string> - <string name="dialog_should_i_answer_message">Le szeretné tölteni az alkalmazást a Play Áruházból?</string> - <string name="dialog_delete_old_messages">Are you sure you want to automatically delete old messages?</string> - <!-- Title for audio file picker --> - <string name="select_audio">Válassza ki a hangot</string> - <!-- Menu title to copy an attachment to the shared storage [CHAR LIMIT=25] --> - <string name="copy_to_sdcard">Melléklet mentése</string> - <!-- Toast message on successful copy to shared storage [CHAR LIMIT=30] --> - <string name="copy_to_sdcard_success">Melléklet mentve.</string> - <!-- Toast message on failed copy to shared storage [CHAR LIMIT=30] --> - <string name="copy_to_sdcard_fail">Nem lehet elmenteni a mellékletet.</string> - <!-- Menu title to save a sound as a ringtone --> - <string name="save_ringtone">Elmentés csengőhangként</string> - <!-- Toast message on successful copying ringtone to drm provider --> - <string name="saved_ringtone">Csengőhang elmentve.</string> - <!-- Toast message on failed copying ringtone to drm provider --> - <string name="saved_ringtone_fail">Nem lehet elmenteni a csengőhangot.</string> - <!-- Menu item --> - <!-- Menu item [CHAR LIMIT=40] --> - <string name="menu_group_participants">Csoport résztvevői</string> - <!--Toast shown when a draft is saved--> - <string name="toast_draft">Mentett piszkozat</string> - <!--Toast shown when a conversation is deleted--> - <string name="toast_conversation_deleted">Beszélgetés törölve</string> - <!--Toast shown when device is low on storage--> - <string name="toast_low_memory">"A tárhely megtelt. Töröljön néhány fájlt a terület felszabadításához."</string> - <!--Toast shown to tell user that forwarding messages doesn't work yet--> - <string name="toast_forward">Ez a funkció még nincs megvalósítva. Kérem használja a Szöveg másolása lehetősége és másolja be a kívánt beszélgetésbe</string> - <!--Toast shown for unimplemented features--> - <string name="toast_unimplemented">Ez a funkció még nincs megvalósítva</string> - <!--Toast shown when a message fails to send--> - <string name="toast_message_failure">Üzenet küldése sikertelen</string> - <!--Toast shown when a message is delivered--> - <string name="toast_message_delivered">Üzenet kézbesítve</string> - <!--Toast shown when a message is not delivered--> - <string name="toast_message_not_delivered">Üzenet nincs kézbesítve</string> - <!--Toast shown when default APNs are loaded--> - <string name="toast_default_apns_loaded">Alapértelmezett APN betöltve</string> - <!--Toast shown when text is copied to the clipboard--> - <string name="toast_copy_text">Szöveg a vágólapra másolva</string> - <!--Toast shown when Google Play Services is not available for purchasing a product--> - <string name="toast_billing_not_available">A vásárláshoz szükség van a Google Play Áruházra (számlázás)</string> - <!--Toast shown when Google Play Services is not available for purchasing a product--> - <string name="toast_endlessjabber_not_installed">Az EndlessJabber nincs telepítve, Play Áruház megnyitása</string> - <string name="toast_changelog_error">Nem sikerült betölteni a változási naplót. Kérem próbálja meg később</string> - <string name="toast_conversation_error">Couldn\'t open conversation</string> - <string name="toast_deleting_old_messages">Your old messages will be deleted shortly</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_1">Köszönöm az adományát! Ön az új legjobb barátom.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_2">Köszönöm az adományát! Szeretem önt.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_3">Köszönöm az adományát! Ezzel támogatja a QKSMS-t, hogy a valaha volt legjobb üzenetező alkalmazássá váljon.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_4">Köszönöm az adományát! Ön csúcs.</string> - <!--Menu option to mute conversation--> - <string name="menu_mute_conversation">Beszélgetés némítása</string> - <!--Menu option to mute conversation--> - <string name="menu_unmute_conversation">Némítás feloldása</string> - <string name="menu_block_conversations">Beszélgetések blokkolása</string> - <string name="menu_unblock_conversations">Blokkolás feloldása</string> - <string name="menu_messages">Üzenetek</string> - <string name="menu_blocked">Blokkolva</string> - <string name="menu_blocked_conversations">Blokkolva (%s új)</string> - <string name="menu_unblocked_conversations">Üzenetek (%s új)</string> - <string name="menu_notifications">Értesítések</string> - <string name="menu_notifications_off">Értesítések kikapcsolása</string> - <string name="menu_notification_settings">Beszélgetés beállításai</string> - <string name="menu_view_details">Részletek megtekintése</string> - <string name="menu_mark_read">Megjelölés olvasottként</string> - <string name="menu_mark_unread">Megjelölés olvasatlanként</string> - <string name="menu_delete_conversation">Beszélgetés törlése</string> - <string name="menu_multi_select">Beszélgetés kiválasztása</string> - <string name="menu_done">Kész</string> - <string name="failed_message_title">Sikertelen üzenetek lehetőségei</string> - <!--Toast shown to tell the user that they don't have a photo attachments app, and suggests that they download one--> - <string name="attachment_app_not_found">Nincs alkalmazás a mellékletekhez. Próbáljon telepíteni egy fotó galéria alkalmazást!</string> - <string name="attachment_camera_error">Nem sikerült megnyitni a kamera alkalmazást</string> - <string name="pref_max_mms_attachment_size">MMS melléklet maximális mérete</string> - <string name="error_no_recipients">Válasszon ki néhány névjegyet akiknek elküldi az üzenetet!</string> - <string name="error_file_not_found">Nem lehet megnyitni a megosztásra szánt fájlt!</string> - <string name="sending_blocked_welcome_screen_message">Tartson ki! Hamarosan valódi üzeneteket küldhet!</string> - <string name="notification_colored_icon_ready">Érintse meg, hogy hozzáadja az indítóképernyőhöz.</string> - <string name="notification_title_colored_icon_ready">A QKSMS színezett ikonja elkészült</string> - <string name="icon_ready">Az új ikon készen áll!</string> - <string name="icon_ready_message">Most már hozzáadhatja a kezdő képernyőjéhez a frissített ikonnal.</string> - <string name="dont_ask_again">Ne kérdezze többször</string> - <string name="warning">Stagefright figyelmeztetés</string> - <string name="stagefright_warning">A videó üzenetek rosszindulatú kódokat tartalmazhatnak amik kiszolgáltathatják telefonját a támadásoknak. Biztosan folytatni szeretné?</string> - <!-- MMS DIALOG SETUP STRINGS --> - <string name="mms_setup_set_up_mms_title">Beállítja az MMS-t?</string> - <string name="mms_setup_set_up_mms_body">Úgy tűnik hogy az MMS-ek nincsenek megfelelően beállítva. Nyomja meg az oké gombot az automatikus konfigurációhoz.</string> - <string name="mms_setup_setting_up_later_title">MMS beállítása később</string> - <string name="mms_setup_setting_up_later_body">Nyissa meg az MMS ágát a Beállításoknak az automatikus konfiguráláshoz, vegye fel a kapcsolatot a szolgáltatójával vagy adja meg a saját konfigurációját.</string> - <string name="mms_setup_no_configurations_found_title">Nincsenek beállítások</string> - <string name="mms_setup_no_configurations_found_body">Nem találtunk automatikus MMS konfigurációt az ön szolgáltatójához. Nyomja meg az oké gombot a támogatáshoz. Mi majd segítünk önnek! </string> - <string name="mms_setup_one_configuration_found_title">Egy konfiguráció elérhető</string> - <string name="mms_setup_one_configuration_found_body">Találtunk egy MMS konfigurációt a(z) %s szolgáltatóhoz. Jónak tűnik?</string> - <string name="mms_setup_multiple_configurations_found_title">Több konfiguráció érhető el</string> - <string name="mms_setup_multiple_configurations_found_body">Több MMS konfiguráció érhető el. Válassza ki a szolgáltatóját a listából, vagy az N/A lehetőséget ha a lista nem tartalmazza az önét.</string> - <string name="mms_setup_next_steps_title">Következő lépések</string> - <string name="mms_setup_next_steps_body">Az automatikus konfiguráció újrapróbálásához látogasson el az MMS ágra a Beállításokban, vegye fel a kapcsolatot a szolgáltatóval vagy adja meg a saját konfigurációs adatait.</string> - <string name="mms_setup_success_title">Sikerült!</string> - <string name="mms_setup_success_body">Ha problémákba ütközik látogasson el az MMS ágra a Beállításokban és próbálja meg az automatikus konfigurációt, vegye fel a kapcsolatot a szolgáltatóval, vagy adja meg a saját konfigurációs adatait.</string> - <string name="na">Nincs adat</string> - <string name="no">Nem</string> - <string name="pref_automatically_configure_mms">MMS automatikus konfigurálása</string> - <string name="pref_mms_contact_support">Kapcsolatfelvétel az ügyfélszolgáltatóval</string> - <string name="pref_category_sending_mms">MMS küldése</string> - <string name="pref_category_mms_configuration">MMS Konfiguráció</string> - <string name="pref_mms_contact_support_summary">Lépjen kapcsolatba a QKSMS csapatával az MMS beállításához</string> - <string name="pref_markdown_enabled">Szöveg formázása</string> - <string name="pref_markdown_enabled_summary">Leíró szintaxis használata kövér, aláhúzott és dőlt betűkhöz a beszélgetésekben</string> - <string name="want_read_indicators">Szeretne olvasási visszajelzést?</string> - <string name="color_swatch_description">Szín %1$d</string> - <string name="color_swatch_description_selected">%1$d szín kiválasztva</string> - <string name="color_picker_default_title">Válasszon egy színt</string> - <string name="message_delivered">Üzenet kézbesítve</string> - <string name="message_not_delivered">Üzenet nincs kézbesítve</string> - <string name="error">Hiba</string> - <string name="invalid_destination">Érvénytelen cím.</string> - <string name="service_not_activated">Nincs aktiválva a hálózati szolgáltatás.</string> - <string name="service_message_not_found">Az üzenet lejárt vagy nem elérhető.</string> - <string name="service_network_problem">A küldés sikertelen egy hálózati hiba miatt.</string> - <string name="message_queued">Nem sikerült elküldeni az üzenetét. Elküldésre kerül amint a szolgáltatás helyreáll.</string> - <string name="download_later">A letöltés sikertelen. Kérem próbálja meg később.</string> - <string name="no_apn">Nincs elérhető APN, hozzon létre egyet a telefon beállításaiban!</string> - <string name="no_subject">(Nincs tárgy)</string> - <string name="unknown_sender">Ismeretlen küldő</string> - <string name="dl_failure_notification">Nem sikerült letölteni a(z) <xliff:g id="subject">%1$s</xliff:g> üzenetet <xliff:g id="from">%2$s</xliff:g> feladótól.</string> - <string name="auto_select_multiple_apns">Több konfiguráció is elérhető. Válasszon ki egyet. Ha nem működik, kiválaszthat egy másikat a Beállítások > Haladó > Alapértelmezett APN betöltése lehetőséggel.</string> - <string name="auto_select_apn">Automatikus APN választás</string> - <string name="auto_select_failed_title">Automatikus konfiguráció sikertelen</string> - <string name="auto_select_failed">Próbálja megszerezni a szolgáltatója APN beállításait (MMSC, Port és Proxy) majd adja meg őket a Beállítások > Haladó ágában.</string> - <string name="date_yesterday">Tegnap</string> - <string name="date_just_now">Éppen most</string> - <string name="compose_loading_attachment">Melléklet betöltése</string> - <string name="hint_no_messages">Még nincsenek üzenetek.\nÉrintse meg a \"+\"-t, hogy küldjön egyet!</string> - <string-array name="resend_menu"> - <item>Újraküldés</item> - <item>Szerkesztés</item> - <item>Törlés</item> - </string-array> - <string-array name="message_menu"> - <item>Üzenet továbbítása</item> - <item>Szöveg másolása</item> - <item>Részletek megtekintése</item> - <item>Üzenet törlése</item> - </string-array> - <string-array name="background_titles"> - <item>Material Light</item> - <item>Material Dark</item> - <item>Fekete</item> - </string-array> - <string-array name="font_sizes"> - <item>Kicsi</item> - <item>Normál</item> - <item>Nagy</item> - <item>Legnagyobb</item> - </string-array> - <string-array name="font_families"> - <item>Roboto Regular</item> - <item>Roboto Condensed</item> - <item>Rendszer alapértelmezett</item> - </string-array> - <string-array name="font_weights"> - <item>Vékony</item> - <item>Normál</item> - </string-array> - <!-- String to match as no subject and filter out as a subject. For example, if the - subject string is "no subject", we won't display that. We'll pretend - no subject string was delivered. --> - <string-array name="empty_subject_strings"> - <item>nincs tárgy</item> - </string-array> - <string-array name="qk_responses"> - <item>Oké</item> - <item>Adjon egy percet</item> - <item>Rajta vagyok</item> - <item>Köszönöm</item> - <item>Jónak tűnik</item> - <item>Mi a helyzet?</item> - <item>Elfogadva</item> - <item>Nem</item> - <item>Szeretem</item> - <item>Sajnálom</item> - <item>LOL</item> - <item>Semmi baj</item> - </string-array> - <string-array name="enter_button_options"> - <item>Emoji mutatása</item> - <item>Új sor</item> - <item>Üzenet küldése</item> - </string-array> - <string-array name="notification_private_options"> - <item>Minden mutatása</item> - <item>Üzenet elrejtése</item> - <item>Üzenet és küldő elrejtése</item> - </string-array> - <!-- Max MMS attachment sizes. I.e. will compress pictures that are larger than 300 KB down to - under 300KB. --> - <string-array name="max_mms_attachment_sizes"> - <item>300 KB</item> - <item>600 KB</item> - <item>1 MB</item> - <item>Korlátlan</item> - </string-array> -</resources> diff --git a/QKSMS/src/main/res/values-in/strings.xml b/QKSMS/src/main/res/values-in/strings.xml deleted file mode 100644 index 41e9fd8fb..000000000 --- a/QKSMS/src/main/res/values-in/strings.xml +++ /dev/null @@ -1,767 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!--Generated by crowdin.com--> -<resources xmlns:xliff="http://schemas.android.com/apk/res-auto"> - <!--Slogan--> - <string name="slogan">Suka sms-an lagi.</string> - <!--Text shown when a phone number cannot be found--> - <string name="unknown_number">Nomor tidak dikenal</string> - <!--Content description for photos--> - <string name="popup_photo_CD">Foto</string> - <!--Text to be displayed while content is loading--> - <string name="loading">Memuat…</string> - <!--Test string--> - <string name="test">Test string</string> - <!--Hint for contacts text field--> - <string name="hint_contacts">Tambah penerima</string> - <!--Hint for search text field--> - <string name="hint_search">Cari sesuatu</string> - <!--Hint for message reply text field--> - <string name="hint_reply">Ketik pesan</string> - <!--Hint for code redemption--> - <string name="hint_redeem">Masukkan kode</string> - <string name="hint_hex">Hex</string> - <!--Text shown for single new message in notification--> - <string name="new_message">Pesan baru</string> - <!--Text shown after number of unread messages in notification (ex. 3 new messages)--> - <string name="new_messages">pesan baru</string> - <!--Text shown for single failed message in notification--> - <string name="failed_message">Gagal untuk mengirim pesan</string> - <!--Text shown after number of failed messages in notification (ex. 3 messages failed to send)--> - <string name="failed_messages">gagal untuk mengirim pesan</string> - <!--Text shown under failed message count--> - <string name="failed_messages_summary">Ketuk untuk melihat</string> - <!--QuickCompose notification title--> - <string name="quickcompose">QK Compose</string> - <!--QuickCompose notification text--> - <string name="quickcompose_detail">Klik untuk mengirim pesan</string> - <!--Welcome screen intro button--> - <string name="welcome_start">Ayo mulai!</string> - <!--Allows user to skip welcome screen--> - <string name="welcome_skip">LEWATI</string> - <!--Allows user to finish the welcome screen--> - <string name="welcome_finish">SELESAI</string> - <!--Indicates to user they can pick a color--> - <string name="welcome_theme_title">Pilih warna</string> - <!--Indicates to user they can pick any colors--> - <string name="welcome_theme_description">Sembarang warna.</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_night_description">Indah dipandang.</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_night_hint">Jungkit saya</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_quickreply_title">QK Balas</string> - <!--QK Reply explanation--> - <string name="welcome_quickreply_description">Membalas pesan lebih cepat daripada sebelumnya.</string> - <!--Prompts user to try QK Reply--> - <string name="welcome_quickreply_hint">Cobalah!</string> - <!--QK Reply demo message--> - <string name="welcome_quickreply_message_1">Wow! Bukankah itu mengagumkan? Anda bisa melihat seluruh percakapan Anda dalam sekejap. Ketuk di luar jendela munculan atau tekan tanda centang untuk menutupnya.</string> - <!--QK Reply demo message--> - <string name="welcome_quickreply_message_2">Ini adalah QK Balas. Sekarang Anda bisa membalas pesan dari mana saja. Ketuk untuk memperluas tombol untuk melihat apa yang akan terjadi selanjutnya :)</string> - <!--Settings option in menu--> - <string name="menu_settings">Pengaturan</string> - <!--Search option in menu--> - <string name="menu_search">Cari</string> - <!--Show full conversation in QuickReply--> - <string name="menu_show_all">Tampilkan semua pesan</string> - <!--Show only unread messages in QuickReply--> - <string name="menu_show_unread">Tampilkan pesan belum dibaca</string> - <!--Open conversation option in menu (shown in QuickReply)--> - <string name="menu_open_thread">Buka percakapan</string> - <!--Forward message option in menu--> - <string name="menu_forward">Teruskan pesan</string> - <!--Call contact option in menu--> - <string name="menu_call">Panggil</string> - <!--Mark a message/conversation as read option in menu--> - <string name="menu_read">Tandai sudah dibaca</string> - <!--Delete a message option in menu--> - <string name="menu_delete">Hapus</string> - <!--Donate option in menu--> - <string name="menu_billing">Donasi</string> - <!--Copy text option in menu--> - <string name="menu_copy">Salin teks</string> - <!--Changelog option in menu--> - <string name="menu_changelog">"Apa yang baru"</string> - <!--Expand settings option in menu--> - <string name="menu_show_all_prefs">Tampilkan semua</string> - <!--Show less settings option in menu--> - <string name="menu_show_fewer_prefs">Tampilkan lebih sedikit</string> - <!--Title for message details popup--> - <string name="details_title">Detail</string> - <!--Title for address that message is being sent to in message details popup--> - <string name="details_to">Ke</string> - <!--Title for address that message is sent from in message details popup--> - <string name="details_from">Dari</string> - <!--Title for text of a message in message details popup--> - <string name="details_body">Body</string> - <!--Title for date sent of a message in message details popup--> - <string name="details_date_sent">Tanggal terkirim</string> - <!--Title for date received of a message in message details popup--> - <string name="details_date_received">Tanggal diterima</string> - <!--Title for rate snackbar--> - <string name="rate_title">Suka QKSMS?</string> - <!--Title for rate button--> - <string name="rate_action">Nilai</string> - <string name="pref_category_appearance">Penampilan</string> - <string name="pref_category_summary_appearance">Tema, huruf, warna, avatar, dan lainnya</string> - <string name="pref_category_general">Umum</string> - <string name="pref_category_summary_general">Pengiriman pesan, format pengiriman</string> - <string name="pref_category_blocking">Message blocking</string> - <string name="pref_category_notifications">Notifikasi</string> - <string name="pref_category_summary_notifications">Suara, LED, privasi</string> - <string name="pref_category_mms">MMS</string> - <string name="pref_category_summary_mms">Konfigurasi MMS (APN), ukuran maks, perpesanan grup</string> - <string name="pref_category_quickreply">QK Balas</string> - <string name="pref_category_summary_quickreply">QK Balas, opsi munculan</string> - <string name="pref_category_quickcompose">QK Compose</string> - <string name="pref_category_summary_quickcompose">QK Compose, starred contacts</string> - <string name="pref_category_about">Tentang</string> - <string name="pref_category_summary_about">Versi, catatan perubahan, pengembang, kontributor</string> - <string name="pref_theme">Warna tema</string> - <string name="pref_theme_summary_alt">Ketuk untuk mengubah tema</string> - <string name="pref_icon">Icon color</string> - <string name="pref_icon_summary">Tap to change the QKSMS icon color</string> - <string name="pref_status_tint">Bilah status berwarna</string> - <string name="pref_navigation_tint">Bilah navigasi berwarna</string> - <string name="pref_background">Warna latar belakang</string> - <string name="pref_background_summary">Ketuk untuk mengubah warna latar belakang</string> - <string name="pref_bubbles">Gelembung pesan</string> - <string name="pref_bubbles_summary">Ketuk untuk mengubah preferensi gelembung pesan</string> - <string name="pref_night">Mode malam</string> - <string name="pref_night_summary">Menghemat baterai dan mengurangi ketegangan mata</string> - <string name="pref_night_amoled">Latar belakang hitam pekat</string> - <string name="pref_night_amoled_summary">Menghemat lebih banyak baterai pada perangkat dengan layar AMOLED</string> - <string name="pref_bubble_style_new">Gunakan gaya gelembung baru</string> - <string name="pref_color_sent">Warna pesan keluar</string> - <string name="pref_color_sent_summary">Warnai latar belakang gelembung untuk pesan keluar</string> - <string name="pref_color_received">Warna pesan masuk</string> - <string name="pref_color_received_summary">Warnai latar belakang gelembung untuk pesan masuk</string> - <string name="pref_hide_avatar_conversations">Sembunyikan avatar percakapan</string> - <string name="pref_hide_avatar_conversations_summary">Sembunyikan avatar kontak di dalam daftar percakapan</string> - <string name="pref_hide_avatar_sent">Sembunyikan avatar pesan keluar</string> - <string name="pref_hide_avatar_sent_summary">Sembunyikan avatar Anda untuk pesan keluar</string> - <string name="pref_hide_avatar_received">Sembunyikan avatar pesan masuk</string> - <string name="pref_hide_avatar_received_summary">Sembunyikan avatar kontak untuk pesan masuk</string> - <string name="pref_font_family">Famili huruf</string> - <string name="pref_font_size">Ukuran huruf</string> - <string name="pref_font_weight">Bobot huruf</string> - <string name="pref_message_count">Jumlah pesan</string> - <string name="pref_message_count_summary">Tampilkan jumlah pesan untuk setiap percakapan</string> - <string name="pref_sent_timestamps">Sent timestamps</string> - <string name="pref_sent_timestamps_summary">Show the timestamp for when a message was sent, not received</string> - <string name="pref_force_timestamps">Force timestamps</string> - <string name="pref_force_timestamps_summary">Enable timestamps for all messages</string> - <string name="pref_key_timestamp_delay">New timestamp delay</string> - <string name="pref_key_timestamp_delay_summary">The number of minutes which must elapse between two messages in order for a new timestamp to be shown.</string> - <string name="pref_compose_favorites">Kontak favorit</string> - <string name="pref_compose_summary_favorites">Tampilkan kontak favorit Anda di dalam jendela QK Tulis, mempermudah untuk ditambahkan</string> - <string name="pref_prox_sensor_call">Sensor jarak</string> - <string name="pref_prox_sensor_call_summary">Ketika dalam percakapan, dekatkan telepon Anda ke telinga untuk memulai panggilan</string> - <string name="pref_delivery">Konfirmasi pengiriman</string> - <string name="pref_delivery_summary">Mengkonfirmasi bahwa pesan telah berhasil dikirim</string> - <string name="pref_delivery_toast">Tampilkan toast</string> - <string name="pref_delivery_toast_summary">Tampilkan toast untuk mengindikasikan bahwa pesan Anda sedang dikirimkan</string> - <string name="pref_delivery_vibrate">Bergetar</string> - <string name="pref_delivery_vibrate_summary">Bergetar pada saat pengiriman pesan</string> - <string name="pref_delete_old_messages">Delete old messages</string> - <string name="pref_delete_old_messages_summary">Automatically delete messages once they\'re old enough</string> - <string name="pref_delete_old_messages_unread">Unread messages</string> - <string name="pref_delete_old_messages_unread_summary">Automatically delete unread messages after %s days</string> - <string name="pref_delete_old_messages_read">Read messages</string> - <string name="pref_delete_old_messages_read_summary">Automatically delete read messages after %s days</string> - <string name="pref_yappy">Integrasi Yappy</string> - <string name="pref_endlessjabber_summary">Aktifkan dukungan penuh untuk Yappy</string> - <string name="pref_blocked_conversations">Blokir percakapan</string> - <string name="pref_blocked_conversations_summary">Tekan lama pada percakapan dan blokir untuk memindahkannya ke kotak blokir dan menghentikan notifikasi</string> - <string name="pref_block_future">Blokir pesan yang akan datang</string> - <string name="pref_block_future_summary">Tambah nomor telepon lainnya untuk diblokir</string> - <string name="pref_should_i_answer">Haruskah saya menjawab? Integrasi</string> - <string name="pref_should_i_answer_summary">Automatically delete incoming messages from numbers which are blocked through Should I Answer?</string> - <string name="pref_mobile_only">Nomor ponsel</string> - <string name="pref_mobile_only_summary">Hanya tampilkan nomor ponsel di dalam saran kontak</string> - <string name="pref_auto_emoji">Emoji otomatis</string> - <string name="pref_auto_emoji_summary">Ganti teks dengan gambar emoji</string> - <string name="pref_enter_button">Tombol enter</string> - <string name="pref_enter_button_summary">Ketuk untuk mengubah perilaku tombol enter</string> - <string name="pref_compose_group">Perpesanan grup</string> - <string name="pref_compose_group_summary">Ketika menulis pesan untuk banyak orang, kirim pesan grup bukan pesan individu</string> - <string name="pref_auto_download">Otomatis unduh MMS</string> - <string name="pref_auto_download_summary">Secara otomatis mengunduh pesan MMS ketika tersedia</string> - <string name="pref_auto_data">Data otomatis</string> - <string name="pref_auto_data_summary">Nyalakan data seluler secara otomatis ketika mengirim atau menerima MMS</string> - <string name="pref_split">Split SMS</string> - <string name="pref_split_summary">Bagi pesan panjang ke dalam beberapa pesan berbeda</string> - <string name="pref_split_counter">Split counter</string> - <string name="pref_split_counter_summary">Adds a counter to the front of each split message</string> - <string name="pref_long_as_mms">Kirim pesan panjang sebagai MMS</string> - <string name="pref_long_as_mms_summary">Send long messages as MMS instead of splitting them</string> - <string name="pref_long_as_mms_after">Kirim pesan panjang sebagai MMS setelah</string> - <string name="pref_long_as_mms_after_summary">Send long messages as MMS when they exceed the length of a number of messages</string> - <string name="pref_return">Tampilkan tombol enter</string> - <string name="pref_return_summary">Tampilkan tombol enter pada kibor bukan tombol Emoji</string> - <string name="pref_text">Teks</string> - <string name="pref_notifications">Notifikasi SMS diaktifkan</string> - <string name="pref_led">LED Notifikasi</string> - <string name="pref_theme_led">Warna LED Notifikasi</string> - <string name="pref_wake">Wake phone</string> - <string name="pref_wake_summary">Nyalakan layar ketika Anda menerima pesan baru</string> - <string name="pref_notifications_private">Notifikasi privat</string> - <string name="pref_notifications_private_summary">Ketuk untuk mengubah apa yang harus disembunyikan dari notifikasi</string> - <string name="pref_ringtone">Suara notifikasi</string> - <string name="pref_ringtone_summary">Pilih suara notifikasi</string> - <string name="pref_ticker">Show ticker</string> - <string name="pref_ticker_summary">Tampilkan cuplikan pesan baru di bilah notifikasi</string> - <string name="pref_vibration">Getaran</string> - <string name="pref_vibration_summary">Bergetar ketika pesan baru diterima</string> - <string name="pref_notification_call">Tombol panggil</string> - <string name="pref_notification_call_summary">Panggil pengirim pesan langsung dari notifikasi</string> - <string name="pref_dimiss_read">Tandai sudah dibaca</string> - <string name="pref_dismiss_read_summary">Tandai pesan sudah dibaca ketika notifikasi dibersihkan</string> - <string name="pref_delayed">Pesan tertunda</string> - <string name="pref_delayed_summary">Menunggu sebentar sebelum mengirim pesan, sehingga Anda memiliki kesempatan untuk meninjaunya</string> - <string name="pref_delayed_duration">Lama tundaan (detik)</string> - <string name="pref_delayed_duration_summary">Waktu menunggu sebelum mengirim pesan</string> - <string name="pref_night_auto">Mode malam otomatis</string> - <string name="pref_night_auto_summary">Aktifkan mode malam secara otomatis berdasarkan waktu</string> - <string name="pref_day_start">Day time begins</string> - <string name="pref_night_start">Night time begins</string> - <string name="pref_qk_responses">QK Respons</string> - <string name="pref_qk_responses_summary">Kelola prasetelan respons Anda untuk digunakan dari perangkat Android Wear</string> - <string name="pref_quickreply_enabled">QK Balas diaktifkan</string> - <string name="pref_quickreply_enabled_summary">Tampilkan jendela QK Balas setiap kali pesan baru diterima</string> - <string name="pref_tap_to_quit">Ketuk untuk mengabaikan</string> - <string name="pref_tap_to_quit_summary">Ketuk di manapun di luar jendela untuk menutupnya</string> - <string name="pref_quickcompose">QK Compose enabled</string> - <string name="pref_quickcompose_summary">Menampilkan notifikasi yang memperbolehkan anda untuk menulis pesan baru</string> - <string name="pref_mms_enabled">MMS diaktifkan</string> - <string name="pref_mms_enabled_summary">Memungkinkan mengirim dan menerima pesan MMS</string> - <string name="pref_mmsc_url">MMSC</string> - <string name="pref_mms_proxy">Proksi MMS</string> - <string name="pref_mms_port">Port MMS</string> - <string name="pref_apn_chooser">Muat APN bawaan</string> - <string name="pref_strip_unicode">Hilangkan unicode</string> - <string name="pref_strip_unicode_summary">Swap characters that are not supported in full-length messages for GSM compatible characters</string> - <string name="pref_system_bar_flat">Bilah sistem datar</string> - <string name="pref_system_bar_flat_summary">Buang gradien yang tertampil di bilah UI sistem pada sebagian besar perangkat KitKat</string> - <string name="pref_status_compat">Bilah status tetap</string> - <string name="pref_status_compat_summary">Memperbaiki masalah yang disebabkan oleh mode immersive, Tinted Status Bar (Xposed), atau pengaturan DPI ubahsuai</string> - <string name="pref_navigation_compat">Bilah navigasi tetap</string> - <string name="pref_navigation_compat_summary">Memperbaiki masalah yang disebabkan oleh mode immersive, Tinted Status Bar (Xposed), atau pengaturan DPI ubahsuai</string> - <string name="pref_about_version_title">Versi QKSMS</string> - <string name="pref_about_authors_title">Pengembang</string> - <string name="pref_about_authors_summary">Moez Bhatti</string> - <string name="pref_changelog_summary">Ketuk untuk melihat catatan perubahan</string> - <string name="pref_about_thanks_title">Terima kasih</string> - <string name="pref_about_thanks_summary">Ketuk untuk melihat kontributor sumber terbuka</string> - <string name="pref_donate_title">Donasi</string> - <string name="pref_donate_summary">QKSMS gratis. Bantu dan dukung kami dengan donasi!</string> - <string name="pref_about_gplus_title">Google+</string> - <string name="pref_about_gplus_summary">Join the QKSMS Beta Testing community on Google+</string> - <string name="pref_about_github_title">GitHub</string> - <string name="pref_about_github_summary">QKSMS is open source. Contribute and report issues on GitHub</string> - <string name="pref_about_crowdin_title">Crowdin</string> - <string name="pref_about_crowdin_summary">Join the QKSMS translation project on Crowdin</string> - <!--Preference subcategory--> - <string name="pref_subcat_theme">Tema</string> - <!--Preference subcategory--> - <string name="pref_subcat_system_bars">Bilah sistem</string> - <!--Preference subcategory--> - <string name="pref_subcat_categories">Kategori</string> - <!--Preference subcategory--> - <string name="pref_subcat_font">Huruf</string> - <!--Preference subcategory--> - <string name="pref_subcat_messages">Pesan</string> - <!--Preference subcategory--> - <string name="pref_subcat_avatars">Avatar</string> - <string name="donate_google">Donasi melalui Google</string> - <string name="donate_google_summary">Google mengambil 30% dari donasi</string> - <string name="donate_paypal">Donasi melalui PayPal</string> - <string name="donate_paypal_button">Donasi berapapun</string> - <string name="donate_paypal_button_summary">Belikan saya apapun yang Anda mau!</string> - <!--Donation product name--> - <string name="product_name_donation">Donasi</string> - <!--$1 donation product name--> - <string name="product_name_donate_1">Donasi $1 USD</string> - <!--$5 donation product name--> - <string name="product_name_donate_5">Donasi $5 USD</string> - <!--$3 donation product name--> - <string name="product_name_donate_10">Donasi $10 USD</string> - <!--$1 donation product description--> - <string name="product_description_donate_1">Belikan saya Coke</string> - <!--$5 donation product description--> - <string name="product_description_donate_5">Belikan saya sandwich</string> - <!--$10 donaion product description--> - <string name="product_description_donate_10">Belikan saya makan siang</string> - <string name="title_settings">Pengaturan</string> - <string name="title_search">Cari</string> - <string name="title_compose">Tulis Pesan baru</string> - <string name="title_conversation_list">Percakapan</string> - <string name="title_blocked">Diblokir</string> - <string name="title_changelog">Catatan perubahan</string> - <string name="title_picker">Pesan baru</string> - <string name="title_donate">Donasi</string> - <string name="title_qk_responses">QK Respons</string> - <string name="title_block_address">Blokir nomor</string> - <string name="title_unblock_address">Buka blokir nomor</string> - <string name="title_conversations_selected">%s dipilih</string> - <string name="title_palette">Palette</string> - <string name="title_rgb">RGB</string> - <!-- Menu shown in the context menu when long pressing on a message when the message contains - one or more phone numbers and/or email addresses and the number or email is new to - contacts. [CHAR LIMIT=50] --> - <string name="menu_add_address_to_contacts">Tambah <xliff:g id="contactEmailOrNumber">%s</xliff:g> ke Orang</string> - <!-- Context menu item on an individual message for viewing an attached slideshow --> - <string name="view_slideshow">View slideshow</string> - <!-- Context menu item on an individual message for viewing message details such as time and date --> - <string name="view_message_details">Lihat detail</string> - <!-- Context menu item on an individual message for viewing a delivery report --> - <string name="view_delivery_report">Lihat laporan</string> - <!-- Context menu item on an individual message for deleting only that message --> - <string name="delete_message">Hapus</string> - <!-- Abbreviation for "kilobyte" --> - <string name="kilobyte">KB</string> - <!-- Individual message context menu item --> - <string name="copy_message_text">Salin teks</string> - <!-- Header for context menu on an individual message --> - <string name="message_options">Opsi pesan</string> - <!-- Delivery Header View --> - <!-- Title of "Report" window --> - <string name="delivery_header_title">Laporan</string> - <!--Text for app restart confirmation dialog--> - <string name="restart_message">Ubahan ini akan berlaku pada saat berikutnya QKSMS dibuka</string> - <!--Dialog title for asking if a user wants to delete a conversation--> - <string name="delete_conversation">Hapus percakapan</string> - <!--Dialog title for asking if a user wants to delete all failed messages--> - <string name="delete_all_failed">Hapus pesan gagal</string> - <!--CDialog title for asking if a user wants to delete a conversation--> - <string name="delete_confirmation">Apakah Anda yakin ingin menghapus (%s) percakapan?</string> - <!--CDialog title for asking if a user wants to delete all failed messages--> - <string name="delete_all_failed_confirmation">Apakah Anda yakin ingin menghapus pesan gagal dari (%s) percakapan?</string> - <!--(Unused) Dialog title shown if APNs have not been set--> - <string name="apns_not_set">APN belum disetel</string> - <!--(Unused) Dialog description shown if APNs have not been set--> - <string name="apns_not_set_description">It appears that your APNs have not been set. This means that MMS will not work properly. Please press okay to have QKSMS find them for you :)</string> - <!--Dialog title show if MMS hasn't been configured--> - <string name="set_up_mms_title">Siapkan MMS?</string> - <!--Dialog description shown if MMS hasn't yet been configured--> - <string name="set_up_mms_description">Sepertinya MMS belum dikonfigurasi di QKSMS. Tekan ok secara otomatis mengkonfigurasi MMS.</string> - <!-- Dialog message text explaining that a draft message will not be saved due to invalid recipients --> - <string name="discard_message_reason">Pesan Anda akan dibuang karena tidak memiliki penerima yang valid.</string> - <string name="invalid_code">Kode tidak valid</string> - <!--Button to restart app now instead of manually later--> - <string name="restart">Mulai ulang sekarang</string> - <!--Notification action to reply to a message--> - <string name="reply">Balas</string> - <!--Notification action to reply to a message--> - <string name="reply_qksms">Balas via QKSMS</string> - <!--Notification action to mark a message as read--> - <string name="read">Baca</string> - <!--Notification action to mark a message as read--> - <string name="mark_read">Tandai sudah dibaca</string> - <!--Notification action to call the sender of a message--> - <string name="call">Panggil</string> - <!-- Notification toast message --> - <string name="notification_mute_on">Notifications enabled</string> - <string name="notification_mute_off">Notifications disabled</string> - <!--Positive action button--> - <string name="yes">Ya</string> - <string name="add">Tambah</string> - <!--Positive action button--> - <string name="save">Simpan</string> - <!--Positive action button--> - <string name="enable">Aktifkan</string> - <!--Positive action button--> - <string name="upgrade_now">Terapkan sekarang</string> - <!--Positive action button--> - <string name="okay">Oke</string> - <!--Positive action button--> - <string name="redeem">Tebus</string> - <!--Neutral action button--> - <string name="just_once">Hanya sekali</string> - <!--Neutral action button--> - <string name="later">Nanti</string> - <!--Neutral action button --> - <string name="cancel">Batal</string> - <!-- Name of the local user when displaying sender of an outgoing message (personal pronoun) --> - <string name="messagelist_sender_self">Saya</string> - <!-- Sender to be used if the sender address has been hidden --> - <string name="hidden_sender_address">Alamat pengirim tersembunyi</string> - <!-- Subject to display in the conversation list if there is no subject --> - <string name="no_subject_view">(Tidak ada subyek)</string> - <!-- Time and date a message is due to expire --> - <string name="expire_on">"Expires: <xliff:g id="date">%s</xliff:g>"</string> - <!-- Formatting for subject displayed inline, prepended to MMS message text --> - <string name="inline_subject">"<Subject: <xliff:g id="subject">%s</xliff:g>>"</string> - <!-- Text of a button appearing for MMS messages that have not yet been downloaded, causing the message to be downloaded (imperative verb) --> - <string name="download">Unduh</string> - <!-- Message displayed in place of the "download message" button once it has been pressed, indicating that the download is in progress --> - <string name="downloading">Mengunduh</string> - <!-- Toast message while an image is being resized --> - <string name="compressing">Gambar yang terlalu besar. Memampatkan\u2026</string> - <!-- Header shown above favorite contacts in QKCompose --> - <string name="favorites">Kontak favorit</string> - <!-- Word represents 'self' in a conversation --> - <string name="me">Saya</string> - <string name="menu_edit">Sunting</string> - <string name="menu_delete_messages">Hapus pesan</string> - <string name="menu_delete_failed">Menghapus pesan gagal</string> - <string name="menu_lock">Kunci</string> - <string name="menu_unlock">Buka kunci</string> - <!-- When the user tries to view message details and some error occurs while - retrieving those details, this message will be shown. --> - <string name="cannot_get_details">Tidak bisa mendapatkan detail.</string> - <!-- Title of "Message details" dialog --> - <string name="message_details_title">Detail pesan</string> - <!-- Label in "Message details" dialog --> - <string name="message_type_label">Tipe\u000A</string> - <!-- "Type" value in "Message details" dialog --> - <string name="text_message">Pesan teks</string> - <!-- "Type" value in "Message details" dialog --> - <string name="multimedia_message">Pesan multimedia</string> - <!-- "Type" value in "Message details" dialog --> - <string name="multimedia_notification">Notifikasi pesan multimedia</string> - <!-- Label in "Message details" dialog showing who sent the message. --> - <string name="from_label">Dari\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="to_address_label">Kepada\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="bcc_label">Bcc\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="sent_label">Terkirim\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="received_label">Diterima\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="saved_label">Tersimpan\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="subject_label">Subyek\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="message_size_label">Ukuran pesan\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="priority_label">Prioritas\u000A</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_high">Tinggi</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_normal">Normal</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_low">Rendah</string> - <!-- Label in "Message details" dialog --> - <string name="message_class_label">Kelas pesan\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="error_code_label">Kode galat\u000A</string> - <!-- Alert dialog title when creating a slideshow [CHAR LIMIT=none] --> - <string name="building_slideshow_title">Building slideshow</string> - <!-- Tag appearing on conversations in the conversation list that contain a draft message --> - <string name="has_draft">Draf</string> - <!-- In conversation list items, this is the separator between a contact's name and the draft stamp [CHAR LIMIT=5] --> - <string name="draft_separator">,\u0020</string> - <!-- In conversation list items, this comes after the receipient's name and contains the number of messages in the thread [CHAR LIMIT=5] --> - <string name="message_count_format">\u00a0<xliff:g id="number" example="1">%1$s</xliff:g></string> - <!-- For debugging: Dialog box title indicating there's a situation where data has unexpectedly changed --> - <string name="error_state">Tidak konsisten</string> - <!-- For debugging: Dialog box text indicating there's a situation where data has unexpectedly changed --> - <string name="error_state_text">The state of threads and recipients is inconsistent. Please capture a bug report and report it via http://go/droidanizer </string> - <!-- This is the dialog title for the "Select link" dialog, shown when the user clicks on a - chat in the chat history view if there are links in the chat message. The dialog displays the - links if there are any --> - <string name="select_link_title">Pilih tindakan</string> - <!-- In message list items, this string builds the timestamp line when the message is in a group [CHAR LIMIT=NONE] --> - <string name="message_timestamp_format"><xliff:g id="string" example="Fred Flinstone">%1$s</xliff:g>\u0020-\u0020<xliff:g id="string" example="9:39AM">%2$s</xliff:g></string> - <!--Message sending status: sending--> - <string name="status_sending">Mengirim…</string> - <!--Message sending status: failed--> - <!--<string name="status_failed">Failed. Tap to retry</string>--> - <!-- Delivery Report Activity --> - <!-- Status in "Report" window --> - <string name="status_none">(Nihil)</string> - <!-- Status in "Report" window --> - <string name="status_pending">Tertunda</string> - <!-- Status in "Report" window --> - <string name="status_read">Baca</string> - <!-- Status in "Report" window --> - <string name="status_received">Diterima</string> - <!-- Status in "Report" window --> - <string name="status_failed">Gagal. Ketuk untuk opsi</string> - <!-- Status in "Report" window --> - <string name="status_unread">Belum dibaca</string> - <!-- Status in "Report" window --> - <string name="status_rejected">Ditolak</string> - <!-- Label in "Report" window --> - <string name="recipient_label">Penerima:\u0020</string> - <!-- Label in "Report" window --> - <string name="status_label">Status:\u0020</string> - <!-- Label in "Report" window [CHAR LIMIT=50]--> - <string name="delivered_label">Diterima:\u0020</string> - <string name="do_something">Lakukan sesuatu</string> - <!-- Confirm Delete --> - <!-- Delete confirmation dialog title --> - <string name="confirm_dialog_title">Hapus?</string> - <!-- Delete confirmation dialog title for locked messages --> - <string name="confirm_dialog_locked_title">Hapus pesan yang terkunci?</string> - <!-- This message is displayed in a confirmation dialog when the user selects one or more - conversations and then taps the "Delete" button. --> - <plurals name="confirm_delete_conversation"> - <!-- Case of 1 result. --> - <!-- Case of 0 or 2 or more results. --> - <item quantity="other"><xliff:g id="number" example="15">%1$s</xliff:g> percakapan akan dihapus.</item> - </plurals> - <string name="confirm_delete_conversation">Seluruh percakapan akan dihapus.</string> - <!-- Delete all threads confirmation dialog message --> - <string name="confirm_delete_all_conversations">Semua percakapan akan dihapus.</string> - <!-- Delete message confirmation dialog message --> - <string name="confirm_delete_message">Pesan akan dihapus.</string> - <!-- Delete message confirmation dialog message for a locked message --> - <string name="confirm_delete_locked_message">Hapus pesan yang terkunci ini?</string> - <!-- Delete all the messages on the SIM dialog message --> - <string name="confirm_delete_all_SIM_messages">Semua pesan di kartu SIM akan dihapus.</string> - <!-- Delete the selected message on the SIM dialog message --> - <string name="confirm_delete_SIM_message">Pesan di kartu SIM ini akan dihapus.</string> - <!-- Delete unlocked checkbox title --> - <string name="delete_unlocked">Hapus pesan terkunci</string> - <!-- Delete button title --> - <string name="delete">Hapus</string> - <!-- More button title --> - <string name="more">Lainnya</string> - <!-- More button summary --> - <string name="more_summary">Ketuk untuk melihat lebih banyak</string> - <!-- Action bar mode title when multi-selecting conversations --> - <string name="select_conversations">Pilih percakapan</string> - <!-- Show this in the middle of the main activity when there are no conversations [CHAR LIMIT=none] --> - <string name="no_conversations">Tidak ada percakapan.</string> - <!-- Show this in the middle of the main activity when loading conversations [CHAR LIMIT=none] --> - <string name="loading_conversations">Memuat percakapan.</string> - <!-- Tells the user that QKSMS isn't the default SMS app --> - <string name="not_default">Aplikasi SMS Baku</string> - <!-- Tells the user they need to set QKSMS as the default app in order to use this feature --> - <string name="default_info">QKSMS perlu menjadi aplikasi SMS baku untuk melakukan hal tersebut</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to mark messages as read --> - <string name="not_default_mark_read">QKSMS harus menjadi aplikasi SMS baku untuk menandai pesan dibaca</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to mark messages as unread --> - <string name="not_default_mark_unread">QKSMS harus menjadi aplikasi SMS baku untuk menandai pesan belum dibaca</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to send messages --> - <string name="not_default_delete">QKSMS harus menjadi aplikasi SMS baku untuk menghapus pesan</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to delete messages --> - <string name="not_default_send">QKSMS harus menjadi aplikasi SMS baku untuk mengirim pesan</string> - <!-- Tells the user they should set QKSMS as the default messaging app --> - <string name="not_default_first">Beberapa hal tidak akan bekerja sampai QKSMS menjadi aplikasi SMS baku</string> - <string name="delayed_messaging_info">Pesan tertunda memungkinkan Anda membatalkan pesan sebelum mereka dikirimkan. Ubah perilaku bawaan dan lainnya di pengaturan</string> - <string name="delayed_duration_bounds_error">Durasi harus antara 1 sampai 30 detik</string> - <!-- Dialog title for the Read Report dialog. --> - <string name="confirm">Konfirmasi</string> - <!-- Dialog text for the Read Report dialog. --> - <string name="message_send_read_report">Laporan baca akan dikirimkan.</string> - <!-- Dialog title for updating app icon color --> - <string name="update_icon_title">Perbarui warna ikon</string> - <!-- Dialog message for updating app icon color --> - <string name="update_icon_message">QKSMS must be restarted when changing the icon color</string> - <string name="dialog_conversation_details_title">Detail percakapan</string> - <string name="dialog_conversation_details_last_message_date">Tanggal pesan terakhir</string> - <string name="dialog_conversation_details_message_count">Jumlah pesan</string> - <string name="dialog_conversation_details_recipients">Penerima (%s)</string> - <string name="dialog_should_i_answer_title">Haruskah saya menjawab? tidak terpasang</string> - <string name="dialog_should_i_answer_message">Apakah Anda ingin mengunduh aplikasi dari Google Play sekarang?</string> - <string name="dialog_delete_old_messages">Are you sure you want to automatically delete old messages?</string> - <!-- Title for audio file picker --> - <string name="select_audio">Pilih audio</string> - <!-- Menu title to copy an attachment to the shared storage [CHAR LIMIT=25] --> - <string name="copy_to_sdcard">Simpan lampiran</string> - <!-- Toast message on successful copy to shared storage [CHAR LIMIT=30] --> - <string name="copy_to_sdcard_success">Lampiran disimpan.</string> - <!-- Toast message on failed copy to shared storage [CHAR LIMIT=30] --> - <string name="copy_to_sdcard_fail">Tidak bisa menyimpan lampiran.</string> - <!-- Menu title to save a sound as a ringtone --> - <string name="save_ringtone">Simpan sebagai nada dering</string> - <!-- Toast message on successful copying ringtone to drm provider --> - <string name="saved_ringtone">Nada dering disimpan.</string> - <!-- Toast message on failed copying ringtone to drm provider --> - <string name="saved_ringtone_fail">Tidak bisa menyimpan nada dering.</string> - <!-- Menu item --> - <!-- Menu item [CHAR LIMIT=40] --> - <string name="menu_group_participants">Peserta grup</string> - <!--Toast shown when a draft is saved--> - <string name="toast_draft">Draf tersimpan</string> - <!--Toast shown when a conversation is deleted--> - <string name="toast_conversation_deleted">Percakapan dihapus</string> - <!--Toast shown when device is low on storage--> - <string name="toast_low_memory">"Penyimpanan telepon penuh. Hapus beberapa berkas untuk ruang bebas."</string> - <!--Toast shown to tell user that forwarding messages doesn't work yet--> - <string name="toast_forward">Fitur ini belum diimplementasikan. Sementara mohon gunakan opsi Salin teks dan tempel pada percakapan yang ingin Anda dikirimkan</string> - <!--Toast shown for unimplemented features--> - <string name="toast_unimplemented">Fitur ini belum diimplementasikan</string> - <!--Toast shown when a message fails to send--> - <string name="toast_message_failure">Gagal untuk mengirim pesan</string> - <!--Toast shown when a message is delivered--> - <string name="toast_message_delivered">Pesan telah sampai</string> - <!--Toast shown when a message is not delivered--> - <string name="toast_message_not_delivered">Pesan tidak sampai</string> - <!--Toast shown when default APNs are loaded--> - <string name="toast_default_apns_loaded">Memuat pengaturan APN bawaan</string> - <!--Toast shown when text is copied to the clipboard--> - <string name="toast_copy_text">Salin teks ke papan klip</string> - <!--Toast shown when Google Play Services is not available for purchasing a product--> - <string name="toast_billing_not_available">Pembelian membutuhkan Toko Google Play (penagihan) di Android Anda</string> - <!--Toast shown when Google Play Services is not available for purchasing a product--> - <string name="toast_endlessjabber_not_installed">EndlessJabber belum terpasang, membuka Google Play</string> - <string name="toast_changelog_error">Tidak bisa memuat catatan perubahan. Harap coba lagi nanti</string> - <string name="toast_conversation_error">Couldn\'t open conversation</string> - <string name="toast_deleting_old_messages">Your old messages will be deleted shortly</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_1">Terima kasih telah menyumbang! Sekarang Anda adalah teman baruku.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_2">Terima kasih telah menyumbang! Aku cinta kamu.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_3">Terima kasih telah menyumbang! Anda membantu QKSMS menjadi aplikasi perpesanan teks terbaik yang pernah dibuat.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_4">Terima kasih atas donasinya! Anda luar biasa.</string> - <!--Menu option to mute conversation--> - <string name="menu_mute_conversation">Bisukan percakapan</string> - <!--Menu option to mute conversation--> - <string name="menu_unmute_conversation">Bunyikan percakapan</string> - <string name="menu_block_conversations">Blokir percakapan</string> - <string name="menu_unblock_conversations">Buka blokir percakapan</string> - <string name="menu_messages">Pesan</string> - <string name="menu_blocked">Diblokir</string> - <string name="menu_blocked_conversations">Diblokir (%s baru)</string> - <string name="menu_unblocked_conversations">Pesan (%s baru)</string> - <string name="menu_notifications">Notifikasi</string> - <string name="menu_notifications_off">Notifikasi mati</string> - <string name="menu_notification_settings">Pengaturan percakapan</string> - <string name="menu_view_details">Lihat detail</string> - <string name="menu_mark_read">Tandai dibaca</string> - <string name="menu_mark_unread">Tandai belum dibaca</string> - <string name="menu_delete_conversation">Hapus percakapan</string> - <string name="menu_multi_select">Pilih percakapan</string> - <string name="menu_done">Selesai</string> - <string name="failed_message_title">Opsi pesan gagal</string> - <!--Toast shown to tell the user that they don't have a photo attachments app, and suggests that they download one--> - <string name="attachment_app_not_found">Aplikasi lampiran tidak ditemukan. Coba pasang aplikasi galeri foto!</string> - <string name="attachment_camera_error">Kamera tidak bisa dibuka</string> - <string name="pref_max_mms_attachment_size">Ukuran maksimum lampiran MMS</string> - <string name="error_no_recipients">Pilih beberapa kontak tujuan pengiriman pesan ini!</string> - <string name="error_file_not_found">QKSMS can\'t access the file you\'re trying to share!</string> - <string name="sending_blocked_welcome_screen_message">Hold up! You\'ll get to send real messages in a minute!</string> - <string name="notification_colored_icon_ready">Sentuh untuk menambahkan ke peluncur dari layar beranda.</string> - <string name="notification_title_colored_icon_ready">Ikon berwarna QKSMS telah siap</string> - <string name="icon_ready">Ikon baru Anda telah siap!</string> - <string name="icon_ready_message">Sekarang Anda bisa menambahkannya lagi ke layar beranda dengan warna yang telah diperbarui.</string> - <string name="dont_ask_again">Jangan tanya lagi</string> - <string name="warning">Peringatan Stagefright</string> - <string name="stagefright_warning">Pesan video mungkin mengandung eksploitasi yang berbahaya yang bisa mengakibatkan telepon Anda rentan terhadap serangan. Apakah Anda ingin melanjutkan?</string> - <!-- MMS DIALOG SETUP STRINGS --> - <string name="mms_setup_set_up_mms_title">Siapkan MMS?</string> - <string name="mms_setup_set_up_mms_body">Sepertinya MMS belum disiapkan di QKSMS. Tekan oke akan untuk otomatis mengkonfigurasi MMS.</string> - <string name="mms_setup_setting_up_later_title">Siapkan MMS nanti</string> - <string name="mms_setup_setting_up_later_body">Kunjungi bagian MMS di dalam Pengaturan untuk mencoba konfigurasi otomatis, hubungi dukungan, atau memasukkan konfigurasi Anda sendiri.</string> - <string name="mms_setup_no_configurations_found_title">Tidak ada konfigurasi yang ditemukan</string> - <string name="mms_setup_no_configurations_found_body">We couldn\'t find an MMS configuration for your carrier automatically. Press okay to contact support. We\'ll help you get set up! </string> - <string name="mms_setup_one_configuration_found_title">One configuration found</string> - <string name="mms_setup_one_configuration_found_body">We have found an MMS configuration for the %s carrier. Does that sound right?</string> - <string name="mms_setup_multiple_configurations_found_title">Multiple configuration found</string> - <string name="mms_setup_multiple_configurations_found_body">We have found multiple MMS configurations. Choose your carrier from the list, or press N/A if your carrier isn\'t on the list.</string> - <string name="mms_setup_next_steps_title">Langkah selanjutnya</string> - <string name="mms_setup_next_steps_body">Visit the MMS section of Settings to try automatic configuration again, contact support, or enter your own configuration.</string> - <string name="mms_setup_success_title">Sukses!</string> - <string name="mms_setup_success_body">If you encounter any issues, visit the MMS section of Settings to try automatic configuration again, contact support, or enter your own configuration.</string> - <string name="na">T/A</string> - <string name="no">Tidak</string> - <string name="pref_automatically_configure_mms">Otomatis mengkonfigurasi MMS</string> - <string name="pref_mms_contact_support">Hubungi Dukungan</string> - <string name="pref_category_sending_mms">Mengirim MMS</string> - <string name="pref_category_mms_configuration">Konfigurasi MMS</string> - <string name="pref_mms_contact_support_summary">Hubungi tim QKSMS untuk bantuan pengaturan MMS</string> - <string name="pref_markdown_enabled">Format teks</string> - <string name="pref_markdown_enabled_summary">Gunakan sintaks markdown untuk huruf tebal, garis bawah, dan miring dalam pesan Anda</string> - <string name="want_read_indicators">Want read indicators?</string> - <string name="color_swatch_description">Warna %1$d</string> - <string name="color_swatch_description_selected">Warna %1$d dipilih</string> - <string name="color_picker_default_title">Pilih Warna</string> - <string name="message_delivered">Pesan Diterima</string> - <string name="message_not_delivered">Pesan Tidak Diterima</string> - <string name="error">Galat</string> - <string name="invalid_destination">Alamat tujuan tidak valid.</string> - <string name="service_not_activated">Layanan tidak diaktifkan pada jaringan.</string> - <string name="service_message_not_found">Pesan kedaluwarsa atau tidak tersedia.</string> - <string name="service_network_problem">Tidak bisa mengirim karena masalah jaringan.</string> - <string name="message_queued">Currently can\'t send your message. It will be sent when the service becomes available.</string> - <string name="download_later">Tidak bisa mengunduh sekarang. Coba lagi nanti.</string> - <string name="no_apn">No APN specified for the app, you need to set it up in settings!</string> - <string name="no_subject">(Tidak ada subyek)</string> - <string name="unknown_sender">Pengirim tidak dikenal</string> - <string name="dl_failure_notification">Tidak bisa mengunduh pesan <xliff:g id="subject">%1$s</xliff:g> dari <xliff:g id="from">%2$s</xliff:g>.</string> - <string name="auto_select_multiple_apns">Multiple different configurations have been found. Try one now. If it doesn\'t work, you can try a new one by going to Settings > Advanced > Load default APNs.</string> - <string name="auto_select_apn">Otomatis Memilih APN</string> - <string name="auto_select_failed_title">Konfigurasi otomatis gagal</string> - <string name="auto_select_failed">Try searching for your carrier\'s APN settings (MMSC, Port, and Proxy) and entering them in Settings > Advanced.</string> - <string name="date_yesterday">Kemarin</string> - <string name="date_just_now">Baru saja</string> - <string name="compose_loading_attachment">Memuat lampiran</string> - <string name="hint_no_messages">Belum ada pesan.\nKlik ikon + untuk membuat dan mengirim!</string> - <string-array name="resend_menu"> - <item>Kirim ulang</item> - <item>Sunting</item> - <item>Hapus</item> - </string-array> - <string-array name="message_menu"> - <item>Teruskan pesan</item> - <item>Salin teks</item> - <item>Lihat detail</item> - <item>Hapus pesan</item> - </string-array> - <string-array name="background_titles"> - <item>Material Light</item> - <item>Material Dark</item> - <item>Hitam</item> - </string-array> - <string-array name="font_sizes"> - <item>Kecil</item> - <item>Normal</item> - <item>Besar</item> - <item>Terbesar</item> - </string-array> - <string-array name="font_families"> - <item>Roboto Regular</item> - <item>Roboto Condensed</item> - <item>Fon sistem</item> - </string-array> - <string-array name="font_weights"> - <item>Tipis</item> - <item>Normal</item> - </string-array> - <!-- String to match as no subject and filter out as a subject. For example, if the - subject string is "no subject", we won't display that. We'll pretend - no subject string was delivered. --> - <string-array name="empty_subject_strings"> - <item>tidak ada subyek</item> - </string-array> - <string-array name="qk_responses"> - <item>Oke</item> - <item>Beri Saya waktu sebentar</item> - <item>Sedang dalam perjalanan</item> - <item>Terima kasih</item> - <item>Kelihatannya bagus</item> - <item>Ada apa?</item> - <item>Setuju</item> - <item>Tidak</item> - <item>Aku cinta kamu</item> - <item>Maaf</item> - <item>LOL</item> - <item>Tidak apa-apa</item> - </string-array> - <string-array name="enter_button_options"> - <item>Tampilkan emoji</item> - <item>Baris baru</item> - <item>Kirim pesan</item> - </string-array> - <string-array name="notification_private_options"> - <item>Tampilkan semua</item> - <item>Sembunyikan pesan</item> - <item>Sembunyikan pesan dan pengirim</item> - </string-array> - <!-- Max MMS attachment sizes. I.e. will compress pictures that are larger than 300 KB down to - under 300KB. --> - <string-array name="max_mms_attachment_sizes"> - <item>300 KB</item> - <item>600 KB</item> - <item>1 MB</item> - <item>Tak terbatas</item> - </string-array> -</resources> diff --git a/QKSMS/src/main/res/values-it/strings.xml b/QKSMS/src/main/res/values-it/strings.xml deleted file mode 100644 index c78207a27..000000000 --- a/QKSMS/src/main/res/values-it/strings.xml +++ /dev/null @@ -1,768 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!--Generated by crowdin.com--> -<resources xmlns:xliff="http://schemas.android.com/apk/res-auto"> - <!--Slogan--> - <string name="slogan">Ama ancora messaggiare.</string> - <!--Text shown when a phone number cannot be found--> - <string name="unknown_number">Numero sconosciuto</string> - <!--Content description for photos--> - <string name="popup_photo_CD">Foto</string> - <!--Text to be displayed while content is loading--> - <string name="loading">Caricamento…</string> - <!--Test string--> - <string name="test">Testo di prova</string> - <!--Hint for contacts text field--> - <string name="hint_contacts">Inserisci i destinatari</string> - <!--Hint for search text field--> - <string name="hint_search">Cerca qualcosa</string> - <!--Hint for message reply text field--> - <string name="hint_reply">Inserisci un messaggio</string> - <!--Hint for code redemption--> - <string name="hint_redeem">Inserisci il codice</string> - <string name="hint_hex">Hex</string> - <!--Text shown for single new message in notification--> - <string name="new_message">Nuovo messaggio</string> - <!--Text shown after number of unread messages in notification (ex. 3 new messages)--> - <string name="new_messages">nuovi messaggi</string> - <!--Text shown for single failed message in notification--> - <string name="failed_message">Invio del messaggio non riuscito</string> - <!--Text shown after number of failed messages in notification (ex. 3 messages failed to send)--> - <string name="failed_messages">Invio dei messaggi non riuscito</string> - <!--Text shown under failed message count--> - <string name="failed_messages_summary">Tocca per visualizzare</string> - <!--QuickCompose notification title--> - <string name="quickcompose">Composizione QK</string> - <!--QuickCompose notification text--> - <string name="quickcompose_detail">Tocca per inviare un messaggio</string> - <!--Welcome screen intro button--> - <string name="welcome_start">Cominciamo!</string> - <!--Allows user to skip welcome screen--> - <string name="welcome_skip">SALTA</string> - <!--Allows user to finish the welcome screen--> - <string name="welcome_finish">CONCLUDI</string> - <!--Indicates to user they can pick a color--> - <string name="welcome_theme_title">Scegli un colore</string> - <!--Indicates to user they can pick any colors--> - <string name="welcome_theme_description">Qualsiasi colore.</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_night_description">Riposante per gli occhi.</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_night_hint">Cliccami</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_quickreply_title">Risposta</string> - <!--QK Reply explanation--> - <string name="welcome_quickreply_description">Rispondi ai messaggi più velocemente che mai.</string> - <!--Prompts user to try QK Reply--> - <string name="welcome_quickreply_hint">Provalo!</string> - <!--QK Reply demo message--> - <string name="welcome_quickreply_message_1">Che figata! Non è vero? Puoi vedere tutte le conversazioni per intero con uno sguardo. Tocca fuori dal popup o premi il segno di spunta per chiudere.</string> - <!--QK Reply demo message--> - <string name="welcome_quickreply_message_2">Questa è una Risposta QK. Ora puoi rispondere ai messaggi da ovunque. Tocca la barra in alto per vedere cosa succede dopo :)</string> - <!--Settings option in menu--> - <string name="menu_settings">Impostazioni</string> - <!--Search option in menu--> - <string name="menu_search">Cerca</string> - <!--Show full conversation in QuickReply--> - <string name="menu_show_all">Mostra tutti i messaggi</string> - <!--Show only unread messages in QuickReply--> - <string name="menu_show_unread">Mostra i messaggi non letti</string> - <!--Open conversation option in menu (shown in QuickReply)--> - <string name="menu_open_thread">Apri la conversazione</string> - <!--Forward message option in menu--> - <string name="menu_forward">Inoltra messaggio</string> - <!--Call contact option in menu--> - <string name="menu_call">Chiama</string> - <!--Mark a message/conversation as read option in menu--> - <string name="menu_read">Segna come già letto</string> - <!--Delete a message option in menu--> - <string name="menu_delete">Elimina</string> - <!--Donate option in menu--> - <string name="menu_billing">Donazioni</string> - <!--Copy text option in menu--> - <string name="menu_copy">Copia testo</string> - <!--Changelog option in menu--> - <string name="menu_changelog">"Novità"</string> - <!--Expand settings option in menu--> - <string name="menu_show_all_prefs">Visualizza tutti</string> - <!--Show less settings option in menu--> - <string name="menu_show_fewer_prefs">Visualizza meno</string> - <!--Title for message details popup--> - <string name="details_title">Dettagli</string> - <!--Title for address that message is being sent to in message details popup--> - <string name="details_to">A</string> - <!--Title for address that message is sent from in message details popup--> - <string name="details_from">Da</string> - <!--Title for text of a message in message details popup--> - <string name="details_body">Corpo del messaggio</string> - <!--Title for date sent of a message in message details popup--> - <string name="details_date_sent">Data di invio</string> - <!--Title for date received of a message in message details popup--> - <string name="details_date_received">Data di ricezione</string> - <!--Title for rate snackbar--> - <string name="rate_title">Ti piace QKSMS?</string> - <!--Title for rate button--> - <string name="rate_action">Vota</string> - <string name="pref_category_appearance">Aspetto</string> - <string name="pref_category_summary_appearance">Temi, caratteri, colori, avatar e altro ancora</string> - <string name="pref_category_general">Generale</string> - <string name="pref_category_summary_general">Consegna, invio messaggi, formattazione</string> - <string name="pref_category_blocking">Blocco dei messaggi</string> - <string name="pref_category_notifications">Notifiche</string> - <string name="pref_category_summary_notifications">Suoni, LED, privacy</string> - <string name="pref_category_mms">MMS</string> - <string name="pref_category_summary_mms">Configura gli MMS (APN), dimensione massima, messaggi di gruppo</string> - <string name="pref_category_quickreply">Risposta QK</string> - <string name="pref_category_summary_quickreply">Risposta QK, opzioni popup</string> - <string name="pref_category_quickcompose">Composizione QK</string> - <string name="pref_category_summary_quickcompose">Composizione QK, contatti speciali</string> - <string name="pref_category_about">Informazioni</string> - <string name="pref_category_summary_about">Versione, changelog, autori, ringraziamenti</string> - <string name="pref_theme">Colore del tema</string> - <string name="pref_theme_summary_alt">Tocca per cambiare tema</string> - <string name="pref_icon">Icon color</string> - <string name="pref_icon_summary">Tap to change the QKSMS icon color</string> - <string name="pref_status_tint">Barra di stato colorata</string> - <string name="pref_navigation_tint">Barra di navigazione colorata</string> - <string name="pref_background">Colore di sfondo</string> - <string name="pref_background_summary">Tocca per cambiare il colore di sfondo</string> - <string name="pref_bubbles">Bolle dei messaggi</string> - <string name="pref_bubbles_summary">Tocca per modificare le preferenze delle bolle dei messaggi</string> - <string name="pref_night">Modalità notturna</string> - <string name="pref_night_summary">Risparmia la batteria e riduci l\'affaticamento degli occhi</string> - <string name="pref_night_amoled">Sfondo nero totale</string> - <string name="pref_night_amoled_summary">Risparmia più batteria su dispositivi con display AMOLED</string> - <string name="pref_bubble_style_new">Utilizzare il nuovo stile di bolla</string> - <string name="pref_color_sent">Colore dei messaggi inviati</string> - <string name="pref_color_sent_summary">Colore di sfondo delle bolle per i messaggi in uscita</string> - <string name="pref_color_received">Colore dei messaggi ricevuti</string> - <string name="pref_color_received_summary">Colore di sfondo delle bolle per i messaggi in arrivo</string> - <string name="pref_hide_avatar_conversations">Nascondi gli avatar delle conversazioni</string> - <string name="pref_hide_avatar_conversations_summary">Nascondi gli avatar per i contatti nella lista delle conversazioni</string> - <string name="pref_hide_avatar_sent">Nascondi gli avatar nei messaggi inviati</string> - <string name="pref_hide_avatar_sent_summary">Nascondi il tuo avatar per i messaggi in uscita</string> - <string name="pref_hide_avatar_received">Nascondi gli avatar nei messaggi ricevuti</string> - <string name="pref_hide_avatar_received_summary">Nascondi l\'avatar del contatto per i messaggi in entrata</string> - <string name="pref_font_family">Famiglia carattere</string> - <string name="pref_font_size">Dimensione carattere</string> - <string name="pref_font_weight">Larghezza carattere</string> - <string name="pref_message_count">Contatore messaggi</string> - <string name="pref_message_count_summary">Visualizza il numero di messaggi per ogni conversazione</string> - <string name="pref_sent_timestamps">Date e orari di invio</string> - <string name="pref_sent_timestamps_summary">Mostra data e ora di quando un messaggio è stato inviato, non ricevuto</string> - <string name="pref_force_timestamps">Forzare date e orari</string> - <string name="pref_force_timestamps_summary">Abilitare date e orari per tutti i messaggi</string> - <string name="pref_key_timestamp_delay">Nuovo ritardo di data e orario</string> - <string name="pref_key_timestamp_delay_summary">Il numero di minuti che devono trascorrere tra due messaggi affinché una nuova data e orario siano mostrati.</string> - <string name="pref_compose_favorites">Contatti speciali</string> - <string name="pref_compose_summary_favorites">Mostra i tuoi contatti speciali nella Composizione QK, per sceglierli più velocemente</string> - <string name="pref_prox_sensor_call">Sensore di prossimità</string> - <string name="pref_prox_sensor_call_summary">In una conversazione, avvicinare il telefono all\'orecchio per avviare una chiamata</string> - <string name="pref_delivery">Conferme di recapito</string> - <string name="pref_delivery_summary">Conferma che i messaggi sono stati inviati con successo</string> - <string name="pref_delivery_toast">Mostra il toast</string> - <string name="pref_delivery_toast_summary">Mostra un piccolo \"toast\" per indicare che il messaggio è stato spedito</string> - <string name="pref_delivery_vibrate">Vibrazione</string> - <string name="pref_delivery_vibrate_summary">Vibra alla consegna di un messaggio</string> - <string name="pref_delete_old_messages">Cancella i vecchi messaggi</string> - <string name="pref_delete_old_messages_summary">Automatically delete messages once they\'re old enough</string> - <string name="pref_delete_old_messages_unread">Messaggi non letti</string> - <string name="pref_delete_old_messages_unread_summary">Automatically delete unread messages after %s days</string> - <string name="pref_delete_old_messages_read">Read messages</string> - <string name="pref_delete_old_messages_read_summary">Cancella automaticamente i messaggi letti dopo %s giorni</string> - <string name="pref_yappy">Integra con Yappy</string> - <string name="pref_endlessjabber_summary">Abilita il supporto compleato a Yappy</string> - <string name="pref_blocked_conversations">Conversazioni bloccate</string> - <string name="pref_blocked_conversations_summary">Premi a lungo su una conversazione e bloccala per spostarla fra i messaggi in arrivo bloccati e interrompere le notifiche</string> - <string name="pref_block_future">Bloccare i futuri messaggi</string> - <string name="pref_block_future_summary">Aggiungi altri numeri da bloccare</string> - <string name="pref_should_i_answer">Integrazione con Dovrei rispondere?</string> - <string name="pref_should_i_answer_summary">Elimina automaticamente i messaggi in ingresso da numeri che sono stati bloccati su Dovrei rispondere?</string> - <string name="pref_mobile_only">Numeri di cellulare</string> - <string name="pref_mobile_only_summary">Visualizza solo i numeri di cellulare nei suggerimenti dei contatti</string> - <string name="pref_auto_emoji">Emoji automatico</string> - <string name="pref_auto_emoji_summary">Sostituire il testo con gli emoji</string> - <string name="pref_enter_button">Tasto Enter</string> - <string name="pref_enter_button_summary">Tocca per cambiare il comportamento del pulsante di invio</string> - <string name="pref_compose_group">Messaggi di gruppo</string> - <string name="pref_compose_group_summary">Quando scrivi messaggi a più persone, invia un messaggio di gruppo, invece che più messaggi</string> - <string name="pref_auto_download">Auto scarica MMS</string> - <string name="pref_auto_download_summary">Scarica automaticamente i messaggi MMS quando sono disponibili</string> - <string name="pref_auto_data">Connessione dati automatici</string> - <string name="pref_auto_data_summary">Accendi i dati automaticamente quando invii o ricevi MMS</string> - <string name="pref_split">Dividi gli SMS</string> - <string name="pref_split_summary">Dividi i messaggi lunghi in messaggi separati</string> - <string name="pref_split_counter">Contatore</string> - <string name="pref_split_counter_summary">Aggiunge un contatore accanto ad ogni messaggio diviso</string> - <string name="pref_long_as_mms">Invia i messaggi lunghi come MMS</string> - <string name="pref_long_as_mms_summary">Invia i messaggi lunghi come MMS invece di dividerli</string> - <string name="pref_long_as_mms_after">Invia i messaggi lunghi come MMS dopo averli divisi</string> - <string name="pref_long_as_mms_after_summary">Invia i messaggi lunghi come MMS se per inviarli si supera un numero di messaggi</string> - <string name="pref_return">Mostra il tasto invio</string> - <string name="pref_return_summary">Mostra il tasto invio al posto del tasto Emoji</string> - <string name="pref_text">Testo</string> - <string name="pref_notifications">Notifiche SMS abilitate</string> - <string name="pref_led">LED di notifica</string> - <string name="pref_theme_led">Colore del LED di notifica</string> - <string name="pref_wake">Sveglia il telefono</string> - <string name="pref_wake_summary">Accendi lo schermo quando ricevi un nuovo messaggio</string> - <string name="pref_notifications_private">Notifiche private</string> - <string name="pref_notifications_private_summary">Tocca per cambiare cosa dovrebbe essere nascosto nella notifica</string> - <string name="pref_ringtone">Suono di notifica</string> - <string name="pref_ringtone_summary">Seleziona un suono di notifica</string> - <string name="pref_ticker">Mostra l\'indicatore</string> - <string name="pref_ticker_summary">Mostra una porzione del nuovo messaggio nella barra di notifica</string> - <string name="pref_vibration">Vibrazione</string> - <string name="pref_vibration_summary">Vibra alla ricezione di nuovi messaggi</string> - <string name="pref_notification_call">Pulsante di chiamata</string> - <string name="pref_notification_call_summary">Chiama il mittente direttamente dalla notifica</string> - <string name="pref_dimiss_read">Segna come già letto</string> - <string name="pref_dismiss_read_summary">Contrassegnare il messaggio come già letto quando la notifica viene cancellata</string> - <string name="pref_delayed">Ritardo messaggi</string> - <string name="pref_delayed_summary">Attendere prima di inviare i messaggi, in modo da avere la possibilità di rivederli</string> - <string name="pref_delayed_duration">Durata ritardo (secondi)</string> - <string name="pref_delayed_duration_summary">Tempo di attesa prima di inviare il messaggio</string> - <string name="pref_night_auto">Modalità notturna automatica</string> - <string name="pref_night_auto_summary">Abilita la modalità notturna basata automaticamente sull\'orario</string> - <string name="pref_day_start">Inizio del giorno</string> - <string name="pref_night_start">Inizio della notte</string> - <string name="pref_qk_responses">Risposte QK</string> - <string name="pref_qk_responses_summary">Modifica la risposta predefinita che deve essere usata dal tuo dispositivo Android Wear</string> - <string name="pref_quickreply_enabled">Risposta QK abilitata</string> - <string name="pref_quickreply_enabled_summary">Mostra la finestra di Risposta QK quando arriva un nuovo messaggio</string> - <string name="pref_tap_to_quit">Tocca per archiviare</string> - <string name="pref_tap_to_quit_summary">Toccare un punto qualsiasi all\'esterno della finestra per chiuderla</string> - <string name="pref_quickcompose">Composizione QK abilitata</string> - <string name="pref_quickcompose_summary">Mostra una notifica che mi permetta di comporre un nuovo messaggio</string> - <string name="pref_mms_enabled">Abilita MMS</string> - <string name="pref_mms_enabled_summary">Abilita l\'invio e la ricezione di messaggi MMS</string> - <string name="pref_mmsc_url">MMSC</string> - <string name="pref_mms_proxy">Proxy MMS</string> - <string name="pref_mms_port">Porta MMS</string> - <string name="pref_apn_chooser">Carica APN predefiniti</string> - <string name="pref_strip_unicode">Conversione dei caratteri unicode</string> - <string name="pref_strip_unicode_summary">Modifica i caratteri non supportati in caratteri compatibili GSM</string> - <string name="pref_system_bar_flat">Barre di sistema</string> - <string name="pref_system_bar_flat_summary">Rimuovere la sfumatura sulle barre dell\'interfaccia utente del sistema nella maggior parte dei dispositivi KitKat</string> - <string name="pref_status_compat">Correzione della barra di stato</string> - <string name="pref_status_compat_summary">Risolve problematiche causate dalla modalità estesa, da Tinted Status Bar (modulo Xposed), o da impostazioni DPI personalizzate</string> - <string name="pref_navigation_compat">Correzione della barra di navigazione</string> - <string name="pref_navigation_compat_summary">Risolve problematiche causate dalla modalità estesa, da Tinted Status Bar (modulo Xposed), o da impostazioni DPI personalizzate</string> - <string name="pref_about_version_title">Versione di QKSMS</string> - <string name="pref_about_authors_title">Autori</string> - <string name="pref_about_authors_summary">Moez Bhatti</string> - <string name="pref_changelog_summary">Tocca per vedere il changelog</string> - <string name="pref_about_thanks_title">Grazie</string> - <string name="pref_about_thanks_summary">Tocca per visualizzare i contributori open-source</string> - <string name="pref_donate_title">Dona</string> - <string name="pref_donate_summary">QKSMS è un software libero. Supportaci con una donazione!</string> - <string name="pref_about_gplus_title">Google+</string> - <string name="pref_about_gplus_summary">Entra nella community QKSMS Beta Testing su Google+</string> - <string name="pref_about_github_title">GitHub</string> - <string name="pref_about_github_summary">QKSMS è open source. Contribuisci e riporta i problemi su GitHub</string> - <string name="pref_about_crowdin_title">Crowdin</string> - <string name="pref_about_crowdin_summary">Entra nel progetto di traduzione di QKSMS su Crowdin</string> - <!--Preference subcategory--> - <string name="pref_subcat_theme">Tema</string> - <!--Preference subcategory--> - <string name="pref_subcat_system_bars">Barre del sistema</string> - <!--Preference subcategory--> - <string name="pref_subcat_categories">Categorie</string> - <!--Preference subcategory--> - <string name="pref_subcat_font">Carattere</string> - <!--Preference subcategory--> - <string name="pref_subcat_messages">Messaggi</string> - <!--Preference subcategory--> - <string name="pref_subcat_avatars">Avatar</string> - <string name="donate_google">Donazione con Google</string> - <string name="donate_google_summary">Google prende il 30% delle donazioni</string> - <string name="donate_paypal">Donazione con Paypal</string> - <string name="donate_paypal_button">Dona qualsiasi importo</string> - <string name="donate_paypal_button_summary">Comprami tutto quello che vuoi!</string> - <!--Donation product name--> - <string name="product_name_donation">Donazioni</string> - <!--$1 donation product name--> - <string name="product_name_donate_1">Dona $1 USD</string> - <!--$5 donation product name--> - <string name="product_name_donate_5">Dona $5 USD</string> - <!--$3 donation product name--> - <string name="product_name_donate_10">Dona $10 USD</string> - <!--$1 donation product description--> - <string name="product_description_donate_1">Comprami una cola</string> - <!--$5 donation product description--> - <string name="product_description_donate_5">Comprami un panino</string> - <!--$10 donaion product description--> - <string name="product_description_donate_10">Comprami un pranzo</string> - <string name="title_settings">Impostazioni</string> - <string name="title_search">Cerca</string> - <string name="title_compose">Scrivi</string> - <string name="title_conversation_list">Conversazioni</string> - <string name="title_blocked">Bloccato</string> - <string name="title_changelog">Changelog</string> - <string name="title_picker">Nuovi messaggi</string> - <string name="title_donate">Dona</string> - <string name="title_qk_responses">Risposte QK</string> - <string name="title_block_address">Bloccare il numero</string> - <string name="title_unblock_address">Sbloccare il numero</string> - <string name="title_conversations_selected">%s selezionata</string> - <string name="title_palette">Palette</string> - <string name="title_rgb">RGB</string> - <!-- Menu shown in the context menu when long pressing on a message when the message contains - one or more phone numbers and/or email addresses and the number or email is new to - contacts. [CHAR LIMIT=50] --> - <string name="menu_add_address_to_contacts">Aggiungi <xliff:g id="contactEmailOrNumber">%s</xliff:g> a Persone</string> - <!-- Context menu item on an individual message for viewing an attached slideshow --> - <string name="view_slideshow">Visualizza presentazione</string> - <!-- Context menu item on an individual message for viewing message details such as time and date --> - <string name="view_message_details">Visualizza dettagli</string> - <!-- Context menu item on an individual message for viewing a delivery report --> - <string name="view_delivery_report">Visualizza report</string> - <!-- Context menu item on an individual message for deleting only that message --> - <string name="delete_message">Elimina</string> - <!-- Abbreviation for "kilobyte" --> - <string name="kilobyte">KB</string> - <!-- Individual message context menu item --> - <string name="copy_message_text">Copia testo</string> - <!-- Header for context menu on an individual message --> - <string name="message_options">Opzioni messaggio</string> - <!-- Delivery Header View --> - <!-- Title of "Report" window --> - <string name="delivery_header_title">Report</string> - <!--Text for app restart confirmation dialog--> - <string name="restart_message">Le modifiche saranno apportate alla prossima apertura di QKSMS</string> - <!--Dialog title for asking if a user wants to delete a conversation--> - <string name="delete_conversation">Eliminare le conversazioni</string> - <!--Dialog title for asking if a user wants to delete all failed messages--> - <string name="delete_all_failed">Elimina i messaggi non inviati</string> - <!--CDialog title for asking if a user wants to delete a conversation--> - <string name="delete_confirmation">Sicuro di voler eliminare (%s) conversazione/i?</string> - <!--CDialog title for asking if a user wants to delete all failed messages--> - <string name="delete_all_failed_confirmation">Sei sicuro di voler eliminare i messaggi falliti da (%s) conversazione/i?</string> - <!--(Unused) Dialog title shown if APNs have not been set--> - <string name="apns_not_set">APN non impostati</string> - <!--(Unused) Dialog description shown if APNs have not been set--> - <string name="apns_not_set_description">Sembra che i tuoi APN non siano stati ancora configurati. Ciò vuol dire che gli MMS non funzioneranno correttamente. Premi okay per fare in modo che QKSMS li trovi per te :)</string> - <!--Dialog title show if MMS hasn't been configured--> - <string name="set_up_mms_title">Imposta MMS?</string> - <!--Dialog description shown if MMS hasn't yet been configured--> - <string name="set_up_mms_description">Sembra che gli MMS non siano stati ancora configurati in QKSMS. Premi okay per configurarli automaticamente.</string> - <!-- Dialog message text explaining that a draft message will not be saved due to invalid recipients --> - <string name="discard_message_reason">Il tuo messaggio sarà scartato perché non ha destinatari validi.</string> - <string name="invalid_code">Codice errato</string> - <!--Button to restart app now instead of manually later--> - <string name="restart">Riavvia subito</string> - <!--Notification action to reply to a message--> - <string name="reply">Rispondi</string> - <!--Notification action to reply to a message--> - <string name="reply_qksms">Rispondi via QKSMS</string> - <!--Notification action to mark a message as read--> - <string name="read">Letto</string> - <!--Notification action to mark a message as read--> - <string name="mark_read">Segna come già letto</string> - <!--Notification action to call the sender of a message--> - <string name="call">Chiama</string> - <!-- Notification toast message --> - <string name="notification_mute_on">Notifiche abilitate</string> - <string name="notification_mute_off">Notifiche disabilitate</string> - <!--Positive action button--> - <string name="yes">Sì</string> - <string name="add">Aggiungi</string> - <!--Positive action button--> - <string name="save">Salva</string> - <!--Positive action button--> - <string name="enable">Abilita</string> - <!--Positive action button--> - <string name="upgrade_now">Imposta ora</string> - <!--Positive action button--> - <string name="okay">Okay</string> - <!--Positive action button--> - <string name="redeem">Riscattare</string> - <!--Neutral action button--> - <string name="just_once">Solo una volta</string> - <!--Neutral action button--> - <string name="later">Più tardi</string> - <!--Neutral action button --> - <string name="cancel">Annulla</string> - <!-- Name of the local user when displaying sender of an outgoing message (personal pronoun) --> - <string name="messagelist_sender_self">Io</string> - <!-- Sender to be used if the sender address has been hidden --> - <string name="hidden_sender_address">Indirizzo del mittente nascosto</string> - <!-- Subject to display in the conversation list if there is no subject --> - <string name="no_subject_view">(Nessun oggetto)</string> - <!-- Time and date a message is due to expire --> - <string name="expire_on">"Scade il: <xliff:g id="date">%s</xliff:g>"</string> - <!-- Formatting for subject displayed inline, prepended to MMS message text --> - <string name="inline_subject">"<Oggetto: <xliff:g id="subject">%s</xliff:g>>"</string> - <!-- Text of a button appearing for MMS messages that have not yet been downloaded, causing the message to be downloaded (imperative verb) --> - <string name="download">Scarica</string> - <!-- Message displayed in place of the "download message" button once it has been pressed, indicating that the download is in progress --> - <string name="downloading">Scaricamento in corso</string> - <!-- Toast message while an image is being resized --> - <string name="compressing">Immagine troppo grande. Compressione in corso\u2026</string> - <!-- Header shown above favorite contacts in QKCompose --> - <string name="favorites">Contatti speciali</string> - <!-- Word represents 'self' in a conversation --> - <string name="me">Io</string> - <string name="menu_edit">Modifica</string> - <string name="menu_delete_messages">Elimina messaggi</string> - <string name="menu_delete_failed">Elimina i messaggi non inviati</string> - <string name="menu_lock">Blocca</string> - <string name="menu_unlock">Sblocca</string> - <!-- When the user tries to view message details and some error occurs while - retrieving those details, this message will be shown. --> - <string name="cannot_get_details">Impossibile ottenere i dettagli.</string> - <!-- Title of "Message details" dialog --> - <string name="message_details_title">Dettagli messaggio</string> - <!-- Label in "Message details" dialog --> - <string name="message_type_label">Tipo\u000A</string> - <!-- "Type" value in "Message details" dialog --> - <string name="text_message">Messaggio di testo</string> - <!-- "Type" value in "Message details" dialog --> - <string name="multimedia_message">Messaggio multimediale</string> - <!-- "Type" value in "Message details" dialog --> - <string name="multimedia_notification">Notifica del messaggio multimediale</string> - <!-- Label in "Message details" dialog showing who sent the message. --> - <string name="from_label">Da\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="to_address_label">Per\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="bcc_label">Ccn\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="sent_label">Inviato\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="received_label">Ricevuto\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="saved_label">Salvato\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="subject_label">Soggetto\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="message_size_label">Dimensione del messaggio\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="priority_label">Priorità\u000A</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_high">Alta</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_normal">Normale</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_low">Bassa</string> - <!-- Label in "Message details" dialog --> - <string name="message_class_label">Classe del messaggio\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="error_code_label">Codice di errore\u000A</string> - <!-- Alert dialog title when creating a slideshow [CHAR LIMIT=none] --> - <string name="building_slideshow_title">Creazione presentazione in corso</string> - <!-- Tag appearing on conversations in the conversation list that contain a draft message --> - <string name="has_draft">Bozza</string> - <!-- In conversation list items, this is the separator between a contact's name and the draft stamp [CHAR LIMIT=5] --> - <string name="draft_separator">,\u0020</string> - <!-- In conversation list items, this comes after the receipient's name and contains the number of messages in the thread [CHAR LIMIT=5] --> - <string name="message_count_format">\u00a0<xliff:g id="number" example="1">%1$s</xliff:g></string> - <!-- For debugging: Dialog box title indicating there's a situation where data has unexpectedly changed --> - <string name="error_state">Stato inconsistente</string> - <!-- For debugging: Dialog box text indicating there's a situation where data has unexpectedly changed --> - <string name="error_state_text">Lo stato delle conversazioni e dei destinatari è inconsistente. Fai un bug report e riportalo con http://go/droidanizer </string> - <!-- This is the dialog title for the "Select link" dialog, shown when the user clicks on a - chat in the chat history view if there are links in the chat message. The dialog displays the - links if there are any --> - <string name="select_link_title">Scegli azione</string> - <!-- In message list items, this string builds the timestamp line when the message is in a group [CHAR LIMIT=NONE] --> - <string name="message_timestamp_format"><xliff:g id="string" example="Fred Flinstone">%1$s</xliff:g>\u0020-\u0020<xliff:g id="string" example="9:39AM">%2$s</xliff:g></string> - <!--Message sending status: sending--> - <string name="status_sending">Invio…</string> - <!--Message sending status: failed--> - <!--<string name="status_failed">Failed. Tap to retry</string>--> - <!-- Delivery Report Activity --> - <!-- Status in "Report" window --> - <string name="status_none">(Nessuno)</string> - <!-- Status in "Report" window --> - <string name="status_pending">In sospeso</string> - <!-- Status in "Report" window --> - <string name="status_read">Letto</string> - <!-- Status in "Report" window --> - <string name="status_received">Ricevuto</string> - <!-- Status in "Report" window --> - <string name="status_failed">Fallito. Tocca per opzioni</string> - <!-- Status in "Report" window --> - <string name="status_unread">Non letto</string> - <!-- Status in "Report" window --> - <string name="status_rejected">Respinto</string> - <!-- Label in "Report" window --> - <string name="recipient_label">Destinatario:\u0020</string> - <!-- Label in "Report" window --> - <string name="status_label">Stato:\u0020</string> - <!-- Label in "Report" window [CHAR LIMIT=50]--> - <string name="delivered_label">Consegnato:\u0020</string> - <string name="do_something">Fai qualcosa</string> - <!-- Confirm Delete --> - <!-- Delete confirmation dialog title --> - <string name="confirm_dialog_title">Eliminare?</string> - <!-- Delete confirmation dialog title for locked messages --> - <string name="confirm_dialog_locked_title">Eliminare il messaggio bloccato?</string> - <!-- This message is displayed in a confirmation dialog when the user selects one or more - conversations and then taps the "Delete" button. --> - <plurals name="confirm_delete_conversation"> - <!-- Case of 1 result. --> - <item quantity="one">Una conversazione sarà eliminata.</item> - <!-- Case of 0 or 2 or more results. --> - <item quantity="other"><xliff:g id="number" example="15">%1$s</xliff:g> conversazioni saranno eliminate.</item> - </plurals> - <string name="confirm_delete_conversation">L\'intera conversazione sarà eliminata.</string> - <!-- Delete all threads confirmation dialog message --> - <string name="confirm_delete_all_conversations">Tutte le conversazioni saranno eliminate.</string> - <!-- Delete message confirmation dialog message --> - <string name="confirm_delete_message">Questo messaggio sarà eliminato.</string> - <!-- Delete message confirmation dialog message for a locked message --> - <string name="confirm_delete_locked_message">Eliminare questo messaggio bloccato?</string> - <!-- Delete all the messages on the SIM dialog message --> - <string name="confirm_delete_all_SIM_messages">Tutti i messaggi sulla SIM saranno eliminati.</string> - <!-- Delete the selected message on the SIM dialog message --> - <string name="confirm_delete_SIM_message">Questo messaggio sulla SIM sarà eliminato.</string> - <!-- Delete unlocked checkbox title --> - <string name="delete_unlocked">Elimina i messaggi bloccati</string> - <!-- Delete button title --> - <string name="delete">Elimina</string> - <!-- More button title --> - <string name="more">Più</string> - <!-- More button summary --> - <string name="more_summary">Toccare per vedere di più</string> - <!-- Action bar mode title when multi-selecting conversations --> - <string name="select_conversations">Scegli conversazioni</string> - <!-- Show this in the middle of the main activity when there are no conversations [CHAR LIMIT=none] --> - <string name="no_conversations">Nessuna conversazione.</string> - <!-- Show this in the middle of the main activity when loading conversations [CHAR LIMIT=none] --> - <string name="loading_conversations">Caricamento delle conversazioni in corso...</string> - <!-- Tells the user that QKSMS isn't the default SMS app --> - <string name="not_default">SMS Predefinito</string> - <!-- Tells the user they need to set QKSMS as the default app in order to use this feature --> - <string name="default_info">QKSMS deve essere l\'app SMS predefinita per farlo</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to mark messages as read --> - <string name="not_default_mark_read">QKSMS deve essere l\'app SMS predefinita per contrassegnare i messaggi già letto</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to mark messages as unread --> - <string name="not_default_mark_unread">QKSMS deve essere l\'app SMS predefinita per contrassegnare i messaggi non letti</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to send messages --> - <string name="not_default_delete">QKSMS deve essere l\'app SMS predefinita per eliminare i messaggi</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to delete messages --> - <string name="not_default_send">QKSMS deve essere l\'app SMS predefinita per inviare messaggi</string> - <!-- Tells the user they should set QKSMS as the default messaging app --> - <string name="not_default_first">Alcune cose non funzionano fino a quando QKSMS è l\'app predefinita per gli SMS</string> - <string name="delayed_messaging_info">Il ritardo dei messaggi consente di cancellarli prima dell\'invio. Modificare il comportamento predefinito ed altro in Impostazioni</string> - <string name="delayed_duration_bounds_error">La durata deve essere compresa tra 1 e 30 secondi</string> - <!-- Dialog title for the Read Report dialog. --> - <string name="confirm">Conferma</string> - <!-- Dialog text for the Read Report dialog. --> - <string name="message_send_read_report">Verrà inviato un report di lettura.</string> - <!-- Dialog title for updating app icon color --> - <string name="update_icon_title">Aggiorna colore icona</string> - <!-- Dialog message for updating app icon color --> - <string name="update_icon_message">QKSMS deve essere riavviato quando si cambia il colore dell\'icona</string> - <string name="dialog_conversation_details_title">Dettagli conversazione</string> - <string name="dialog_conversation_details_last_message_date">Data ultimo messaggio</string> - <string name="dialog_conversation_details_message_count">Numero di messaggi</string> - <string name="dialog_conversation_details_recipients">Destinatari (%s)</string> - <string name="dialog_should_i_answer_title">Dovrei rispondere? non installato</string> - <string name="dialog_should_i_answer_message">Vorresti scaricare l\'app da Google Play ora?</string> - <string name="dialog_delete_old_messages">Sei sicuro di voler eliminare automaticamente i vecchi messaggi?</string> - <!-- Title for audio file picker --> - <string name="select_audio">Scegli audio</string> - <!-- Menu title to copy an attachment to the shared storage [CHAR LIMIT=25] --> - <string name="copy_to_sdcard">Salva allegato</string> - <!-- Toast message on successful copy to shared storage [CHAR LIMIT=30] --> - <string name="copy_to_sdcard_success">Allegato salvato.</string> - <!-- Toast message on failed copy to shared storage [CHAR LIMIT=30] --> - <string name="copy_to_sdcard_fail">Impossibile salvare l\'allegato.</string> - <!-- Menu title to save a sound as a ringtone --> - <string name="save_ringtone">Salva come suoneria</string> - <!-- Toast message on successful copying ringtone to drm provider --> - <string name="saved_ringtone">Suoneria salvata.</string> - <!-- Toast message on failed copying ringtone to drm provider --> - <string name="saved_ringtone_fail">Impossibile salvare la suoneria.</string> - <!-- Menu item --> - <!-- Menu item [CHAR LIMIT=40] --> - <string name="menu_group_participants">Partecipanti al gruppo</string> - <!--Toast shown when a draft is saved--> - <string name="toast_draft">Bozza salvata</string> - <!--Toast shown when a conversation is deleted--> - <string name="toast_conversation_deleted">Conversazione eliminata</string> - <!--Toast shown when device is low on storage--> - <string name="toast_low_memory">"Memoria del telefono piena. Elimina qualche file per liberare spazio."</string> - <!--Toast shown to tell user that forwarding messages doesn't work yet--> - <string name="toast_forward">Questa funzione non è ancora stata implementata. Per ora copia il testo ed incollalo nella conversazione in cui vuoi inviarlo</string> - <!--Toast shown for unimplemented features--> - <string name="toast_unimplemented">Questa funzione non è stata ancora implementata</string> - <!--Toast shown when a message fails to send--> - <string name="toast_message_failure">Invio del messaggio non riuscito</string> - <!--Toast shown when a message is delivered--> - <string name="toast_message_delivered">Messaggio consegnato</string> - <!--Toast shown when a message is not delivered--> - <string name="toast_message_not_delivered">Messaggio non consegnato</string> - <!--Toast shown when default APNs are loaded--> - <string name="toast_default_apns_loaded">Impostazioni predefinite APN caricate</string> - <!--Toast shown when text is copied to the clipboard--> - <string name="toast_copy_text">Testo copiato negli appunti</string> - <!--Toast shown when Google Play Services is not available for purchasing a product--> - <string name="toast_billing_not_available">L\'acquisto richiede la fatturazione tramite Google Play Store</string> - <!--Toast shown when Google Play Services is not available for purchasing a product--> - <string name="toast_endlessjabber_not_installed">EndlessJabber non è installato, apertura di Google Play in corso</string> - <string name="toast_changelog_error">Impossibile caricare i cambiamenti. Per favore riprova più tardi</string> - <string name="toast_conversation_error">Impossibile aprire la conversazione</string> - <string name="toast_deleting_old_messages">Your old messages will be deleted shortly</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_1">Grazie per la donazione! Sei il mio nuovo migliore amico.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_2">Grazie per la donazione! Ti amo.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_3">Grazie per la donazione! Stai aiutando QKSMS a diventare la migliore applicazione SMS mai realizzata.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_4">Grazie per la donazione! Sei magnifico.</string> - <!--Menu option to mute conversation--> - <string name="menu_mute_conversation">Silenzia conversazione</string> - <!--Menu option to mute conversation--> - <string name="menu_unmute_conversation">Attivare l\'audio di conversazione</string> - <string name="menu_block_conversations">Bloccare le conversazioni</string> - <string name="menu_unblock_conversations">Sbloccare le conversazioni</string> - <string name="menu_messages">Messaggi</string> - <string name="menu_blocked">Bloccato</string> - <string name="menu_blocked_conversations">Bloccati (%s nuovi)</string> - <string name="menu_unblocked_conversations">Messaggi (%s nuovi)</string> - <string name="menu_notifications">Notifiche</string> - <string name="menu_notifications_off">Notifiche disattivate</string> - <string name="menu_notification_settings">Impostazioni della conversazione</string> - <string name="menu_view_details">Visualizza dettagli</string> - <string name="menu_mark_read">Segna come \"da leggere\"</string> - <string name="menu_mark_unread">Segna come \"letto\"</string> - <string name="menu_delete_conversation">Elimina conversazione</string> - <string name="menu_multi_select">Selezionare la conversazione</string> - <string name="menu_done">Fatto</string> - <string name="failed_message_title">Opzioni messaggio fallito</string> - <!--Toast shown to tell the user that they don't have a photo attachments app, and suggests that they download one--> - <string name="attachment_app_not_found">App per gli allegati non trovata. Prova a installare una applicazione galleria!</string> - <string name="attachment_camera_error">La fotocamera non può essere aperta</string> - <string name="pref_max_mms_attachment_size">Massima dimensione degli allegati MMS</string> - <string name="error_no_recipients">Seleziona alcuni contatti a cui inviare questo messaggio!</string> - <string name="error_file_not_found">QKSMS non riesce ad accedere al file che stai tentando di condividere!</string> - <string name="sending_blocked_welcome_screen_message">Fermati! Potrai mandare messaggi in tempo reale in un minuto!</string> - <string name="notification_colored_icon_ready">Tocca per aggiungere al tuo launcher dalla schermata home.</string> - <string name="notification_title_colored_icon_ready">L\'icona colorata QKSMS è pronta</string> - <string name="icon_ready">La nuova icona è pronta!</string> - <string name="icon_ready_message">Ora è possibile aggiungerlo alla nuovamente home con il colore aggiornato.</string> - <string name="dont_ask_again">Non chiedere di nuovo</string> - <string name="warning">Attenzione: Stagefright</string> - <string name="stagefright_warning">I video messaggi potrebbero contenere exploit dannosi che possono rendere il tuo telefono vulnerabile ad attacchi. Desideri davvero continuare?</string> - <!-- MMS DIALOG SETUP STRINGS --> - <string name="mms_setup_set_up_mms_title">Imposta MMS?</string> - <string name="mms_setup_set_up_mms_body">Sembra che gli MMS non siano stati ancora configurati in QKSMS. Premi okay per configurarli automaticamente.</string> - <string name="mms_setup_setting_up_later_title">Configurazione MMS più tardi</string> - <string name="mms_setup_setting_up_later_body">Visita la sezione MMS in Impostazioni per provare la configurazione automatica, contattare il supporto tecnico o immettere la propria configurazione.</string> - <string name="mms_setup_no_configurations_found_title">Nessuna configurazione trovata</string> - <string name="mms_setup_no_configurations_found_body">Non siamo riusciti a trovare automaticamente una configurazione MMS per il tuo gestore. Premi okay per contattare il supporto. Ti aiuteremo a configurarli! </string> - <string name="mms_setup_one_configuration_found_title">Una configurazione trovata</string> - <string name="mms_setup_one_configuration_found_body">Abbiamo trovato una configurazione MMS per il gestore %s. Potrebbe avere senso?</string> - <string name="mms_setup_multiple_configurations_found_title">Trovate più configurazioni</string> - <string name="mms_setup_multiple_configurations_found_body">Abbiamo trovato diverse configurazioni MMS. Scegli il tuo gestore dalla lista, o premi N/A se il tuo gestore non è applicabile a questa lista.</string> - <string name="mms_setup_next_steps_title">Prossimi passi</string> - <string name="mms_setup_next_steps_body">Visita la sezione MMS nelle Impostazioni per riprovare una configurazione, contattare il supporto, o inserire la tua configurazione.</string> - <string name="mms_setup_success_title">Successo!</string> - <string name="mms_setup_success_body">Se incontri qualche problema, visita la sezione MMS nelle Impostazioni per riprovare una configurazione automatica, contattare il supporto, o inserire la tua configurazione.</string> - <string name="na">N/A</string> - <string name="no">No</string> - <string name="pref_automatically_configure_mms">Configurare automatica degli MMS</string> - <string name="pref_mms_contact_support">Contatta il supporto</string> - <string name="pref_category_sending_mms">L\'invio di MMS</string> - <string name="pref_category_mms_configuration">Configurazione MMS</string> - <string name="pref_mms_contact_support_summary">Contatta il team di QKSMS per avere supporto nella configurazione dei MMS</string> - <string name="pref_markdown_enabled">Formattazione del testo</string> - <string name="pref_markdown_enabled_summary">Usa la sintassi markdown per avere il grassetto, sottolineato e corsivo nei tuoi messaggi</string> - <string name="want_read_indicators">Vuoi indicatori di lettura?</string> - <string name="color_swatch_description">Colore %1$d</string> - <string name="color_swatch_description_selected">Colore %1$d selezionato</string> - <string name="color_picker_default_title">Selezionare un colore</string> - <string name="message_delivered">Messaggio consegnato</string> - <string name="message_not_delivered">Messaggio non consegnato</string> - <string name="error">Errore</string> - <string name="invalid_destination">Indirizzo di destinazione non valido.</string> - <string name="service_not_activated">Servizio non attivato sulla rete.</string> - <string name="service_message_not_found">Messaggio scaduto o non disponibile.</string> - <string name="service_network_problem">Impossibile inviare a causa di problema di rete.</string> - <string name="message_queued">Attualmente non è possibile inviare il messaggio. Verrà inviato quando il servizio diventa disponibile.</string> - <string name="download_later">Non è possibile scaricare in questo momento. Riprovare più tardi.</string> - <string name="no_apn">Nessun APN specificato per l\'app, hai bisogno di impostarli dalle Impostazioni!</string> - <string name="no_subject">(Nessun oggetto)</string> - <string name="unknown_sender">Mittente sconosciuto</string> - <string name="dl_failure_notification">Impossibile scaricare il messaggio <xliff:g id="subject">%1$s</xliff:g> da <xliff:g id="from">%2$s</xliff:g>.</string> - <string name="auto_select_multiple_apns">Sono state trovate diverse configurazioni. Provane una adesso. Se non funziona, puoi provarne un\'altra andando in Impostazioni > Avanzate > Imposta APN predefiniti.</string> - <string name="auto_select_apn">Selezione automatica APN</string> - <string name="auto_select_failed_title">Configurazione automatica non riuscita</string> - <string name="auto_select_failed">Prova a cercare le impostazioni APN del tuo gestore (MMSC, Port and Proxy) e ad impostarle in Impostazioni > Avanzate.</string> - <string name="date_yesterday">Ieri</string> - <string name="date_just_now">Solo ora</string> - <string name="compose_loading_attachment">Scarica allegati</string> - <string name="hint_no_messages">Ancora nessun messaggio.\n Clicca + per inviarne uno!</string> - <string-array name="resend_menu"> - <item>Reinvia</item> - <item>Modifica</item> - <item>Elimina</item> - </string-array> - <string-array name="message_menu"> - <item>Inoltra messaggio</item> - <item>Copia testo</item> - <item>Visualizza dettagli</item> - <item>Elimina il messaggio</item> - </string-array> - <string-array name="background_titles"> - <item>Material chiaro</item> - <item>Material scuro</item> - <item>Nero</item> - </string-array> - <string-array name="font_sizes"> - <item>Piccolo</item> - <item>Normale</item> - <item>Grande</item> - <item>Più grande</item> - </string-array> - <string-array name="font_families"> - <item>Roboto Regular</item> - <item>Roboto Condensed</item> - <item>Font di sistema</item> - </string-array> - <string-array name="font_weights"> - <item>Sottile</item> - <item>Normale</item> - </string-array> - <!-- String to match as no subject and filter out as a subject. For example, if the - subject string is "no subject", we won't display that. We'll pretend - no subject string was delivered. --> - <string-array name="empty_subject_strings"> - <item>nessun oggetto</item> - </string-array> - <string-array name="qk_responses"> - <item>Okay</item> - <item>Dammi un attimo</item> - <item>Sono per strada</item> - <item>Grazie</item> - <item>Buona idea</item> - <item>Come va?</item> - <item>D\'accordo</item> - <item>No</item> - <item>Ti amo</item> - <item>Scusa</item> - <item>LOL</item> - <item>Va bene</item> - </string-array> - <string-array name="enter_button_options"> - <item>Visualizza emoji</item> - <item>Nuova linea</item> - <item>Invia messaggio</item> - </string-array> - <string-array name="notification_private_options"> - <item>Visualizza tutti</item> - <item>Nascondere il messaggio</item> - <item>Nascondere il mittente e il messaggio</item> - </string-array> - <!-- Max MMS attachment sizes. I.e. will compress pictures that are larger than 300 KB down to - under 300KB. --> - <string-array name="max_mms_attachment_sizes"> - <item>300 KB</item> - <item>600 KB</item> - <item>1 MB</item> - <item>Illimitato</item> - </string-array> -</resources> diff --git a/QKSMS/src/main/res/values-iw/strings.xml b/QKSMS/src/main/res/values-iw/strings.xml deleted file mode 100644 index c74ccc2b4..000000000 --- a/QKSMS/src/main/res/values-iw/strings.xml +++ /dev/null @@ -1,775 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!--Generated by crowdin.com--> -<resources xmlns:xliff="http://schemas.android.com/apk/res-auto"> - <!--Slogan--> - <string name="slogan">אשמח להסתמס שוב.</string> - <!--Text shown when a phone number cannot be found--> - <string name="unknown_number">מספר חסוי</string> - <!--Content description for photos--> - <string name="popup_photo_CD">תמונה</string> - <!--Text to be displayed while content is loading--> - <string name="loading">טוען…</string> - <!--Test string--> - <string name="test">טקסט בדיקה</string> - <!--Hint for contacts text field--> - <string name="hint_contacts">הכנס נמענים</string> - <!--Hint for search text field--> - <string name="hint_search">חפש משהו</string> - <!--Hint for message reply text field--> - <string name="hint_reply">הכנס הודעה</string> - <!--Hint for code redemption--> - <string name="hint_redeem">הכנס קוד</string> - <string name="hint_hex">Hex</string> - <!--Text shown for single new message in notification--> - <string name="new_message">הודעה חדשה</string> - <!--Text shown after number of unread messages in notification (ex. 3 new messages)--> - <string name="new_messages">הודעות חדשות</string> - <!--Text shown for single failed message in notification--> - <string name="failed_message">שליחת ההודעה נכשלה</string> - <!--Text shown after number of failed messages in notification (ex. 3 messages failed to send)--> - <string name="failed_messages">שליחת ההודעה נכשלה</string> - <!--Text shown under failed message count--> - <string name="failed_messages_summary">הקש לצפיה</string> - <!--QuickCompose notification title--> - <string name="quickcompose">כתיבת הודעה מהירה</string> - <!--QuickCompose notification text--> - <string name="quickcompose_detail">לחץ לשליחת הודעה</string> - <!--Welcome screen intro button--> - <string name="welcome_start">בואו נתחיל!</string> - <!--Allows user to skip welcome screen--> - <string name="welcome_skip">דלג</string> - <!--Allows user to finish the welcome screen--> - <string name="welcome_finish">סיים</string> - <!--Indicates to user they can pick a color--> - <string name="welcome_theme_title">בחר צבע</string> - <!--Indicates to user they can pick any colors--> - <string name="welcome_theme_description">כל צבע.</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_night_description">קל לעיניים בחושך.</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_night_hint">שנה את מצבי</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_quickreply_title">תגובה מהירה</string> - <!--QK Reply explanation--> - <string name="welcome_quickreply_description">השב להודעות במהירות.</string> - <!--Prompts user to try QK Reply--> - <string name="welcome_quickreply_hint">נסה זאת!</string> - <!--QK Reply demo message--> - <string name="welcome_quickreply_message_1">וואו! נכון שזה היה מדהים? עכשיו אתה יכול לראות את כל ההתכתבות שלך במבט חטוף. לחץ מחוץ לחלון או לחץ על הוי כדי לסגור אותו.</string> - <!--QK Reply demo message--> - <string name="welcome_quickreply_message_2">זוהי תגובה מהירה. -עכשיו תוכל לענות.להודעות מכל מקום. -הקש על לחצן ההרחב לראות.מה קורה הלאה :-)</string> - <!--Settings option in menu--> - <string name="menu_settings">הגדרות</string> - <!--Search option in menu--> - <string name="menu_search">חיפוש</string> - <!--Show full conversation in QuickReply--> - <string name="menu_show_all">הצג את כל ההודעות</string> - <!--Show only unread messages in QuickReply--> - <string name="menu_show_unread">הצג הודעות שלא נקראו</string> - <!--Open conversation option in menu (shown in QuickReply)--> - <string name="menu_open_thread">פתח את ההתכתבות</string> - <!--Forward message option in menu--> - <string name="menu_forward">העבר הלאה את ההודעה</string> - <!--Call contact option in menu--> - <string name="menu_call">התקשר</string> - <!--Mark a message/conversation as read option in menu--> - <string name="menu_read">סמן כהודעה שנקראה</string> - <!--Delete a message option in menu--> - <string name="menu_delete">מחק</string> - <!--Donate option in menu--> - <string name="menu_billing">תרום</string> - <!--Copy text option in menu--> - <string name="menu_copy">העתק תוכן הודעה</string> - <!--Changelog option in menu--> - <string name="menu_changelog">"חידושים באפליקציה"</string> - <!--Expand settings option in menu--> - <string name="menu_show_all_prefs">הצג הכל</string> - <!--Show less settings option in menu--> - <string name="menu_show_fewer_prefs">הצג פחות</string> - <!--Title for message details popup--> - <string name="details_title">פרטים</string> - <!--Title for address that message is being sent to in message details popup--> - <string name="details_to">אל</string> - <!--Title for address that message is sent from in message details popup--> - <string name="details_from">מ</string> - <!--Title for text of a message in message details popup--> - <string name="details_body">גוף ההודעה</string> - <!--Title for date sent of a message in message details popup--> - <string name="details_date_sent">תאריך השליחה</string> - <!--Title for date received of a message in message details popup--> - <string name="details_date_received">תאריך הקבלה</string> - <!--Title for rate snackbar--> - <string name="rate_title">אוהב את OKSMS ?</string> - <!--Title for rate button--> - <string name="rate_action">דרג</string> - <string name="pref_category_appearance">תצוגה</string> - <string name="pref_category_summary_appearance">ערכות נושא, גופנים, צבעים, תמונות פרופיל ועוד</string> - <string name="pref_category_general">הגדרות כלליות</string> - <string name="pref_category_summary_general">משלוח, שליחת הודעות, עיצוב</string> - <string name="pref_category_blocking">Message blocking</string> - <string name="pref_category_notifications">התראות</string> - <string name="pref_category_summary_notifications">צלילים, נורת התראות, פרטיות</string> - <string name="pref_category_mms">הודעות מולטימדיה</string> - <string name="pref_category_summary_mms">הגדר MMS (הודעות מדיה) -דרך APN (ההגדרות של החברה הסלולרית אליה אתה מנוי) -גודל מקסימליא , הודעות קבוצתיות</string> - <string name="pref_category_quickreply">תגובה מהירה</string> - <string name="pref_category_summary_quickreply">תגובה. מהירה, אפשרויות קופצות</string> - <string name="pref_category_quickcompose">כתיבת הודעה מהירה</string> - <string name="pref_category_summary_quickcompose">כתוב הודעה, אנשי קשר מועדפים</string> - <string name="pref_category_about">אודות</string> - <string name="pref_category_summary_about">גירסה, רשימת שינויים, מחברים, תודות</string> - <string name="pref_theme">Theme color</string> - <string name="pref_theme_summary_alt">לחץ כדי לשנות ערכת צבעים</string> - <string name="pref_icon">Icon color</string> - <string name="pref_icon_summary">Tap to change the QKSMS icon color</string> - <string name="pref_status_tint">צביעה של שורת המצב</string> - <string name="pref_navigation_tint">צביעה של סרגל הניווט בצבעי האפליקציה</string> - <string name="pref_background">צבע הרקע</string> - <string name="pref_background_summary">לחץ כדי לשנות את צבע הרקע</string> - <string name="pref_bubbles">בועות ההודעות</string> - <string name="pref_bubbles_summary">לחץ כדי לשנות את בועות ההודעות</string> - <string name="pref_night">מצב לילה</string> - <string name="pref_night_summary">חסוך סוללה והקל על העיניים</string> - <string name="pref_night_amoled">רקע שחור לגמרי</string> - <string name="pref_night_amoled_summary">טוב לחסכון נוסף בסוללה על מסכים מסוג AMOLED</string> - <string name="pref_bubble_style_new">השתמש בעיצוב בועות חדש</string> - <string name="pref_color_sent">צבע הודעות שנשלחו</string> - <string name="pref_color_sent_summary">צבע את הרקע של הבועות להודעות יוצאות</string> - <string name="pref_color_received">צבע להודעות שהתקבלו</string> - <string name="pref_color_received_summary">צבע את הרקע של בועות להודעות נכנסות</string> - <string name="pref_hide_avatar_conversations">החבא את. האואטארים של השיחות</string> - <string name="pref_hide_avatar_conversations_summary">הסתר אווטארים של אנשי הקשר ברשימת השיחות.</string> - <string name="pref_hide_avatar_sent">הסתר אווטארים של הודעות שנשלחו</string> - <string name="pref_hide_avatar_sent_summary">הסתר את האוואטר שלך בהודעות יוצאות</string> - <string name="pref_hide_avatar_received">הסתר אווטאר של הודעות שהתקבלו</string> - <string name="pref_hide_avatar_received_summary">הסתר אווטר אנשי קשר עבור הודעות נכנסות</string> - <string name="pref_font_family">משפחת גופנים</string> - <string name="pref_font_size">גודל הטקסט</string> - <string name="pref_font_weight">רוחב גופן</string> - <string name="pref_message_count">כמות ההודעות</string> - <string name="pref_message_count_summary">הצג את מספר ההודעות עבור כל שיחה</string> - <string name="pref_sent_timestamps">Sent timestamps</string> - <string name="pref_sent_timestamps_summary">Show the timestamp for when a message was sent, not received</string> - <string name="pref_force_timestamps">Force timestamps</string> - <string name="pref_force_timestamps_summary">Enable timestamps for all messages</string> - <string name="pref_key_timestamp_delay">New timestamp delay</string> - <string name="pref_key_timestamp_delay_summary">The number of minutes which must elapse between two messages in order for a new timestamp to be shown.</string> - <string name="pref_compose_favorites">אנשי קשר מועדפים</string> - <string name="pref_compose_summary_favorites">הצג את אנשי הקשר המועדפים בחלונית צור הודעה חדשה -כך שיהיו במרחק נגיעה אחת</string> - <string name="pref_prox_sensor_call">חיישן קרבה</string> - <string name="pref_prox_sensor_call_summary">בזמן צפיה בתכתובת התקשר לנמען על ידי קירוב הטלפון לאוזן</string> - <string name="pref_delivery">קבל אישור על השלמת השליחה</string> - <string name="pref_delivery_summary">לאשר ההודעה נשלחה והגיע לנמען</string> - <string name="pref_delivery_toast">הצג הודעות קופצות</string> - <string name="pref_delivery_toast_summary">הראה הודעות קופצות כדי לציין שההודעה התקבלה</string> - <string name="pref_delivery_vibrate">רטט בקבלת הודעה</string> - <string name="pref_delivery_vibrate_summary">רטט בשליחת הודעה</string> - <string name="pref_delete_old_messages">Delete old messages</string> - <string name="pref_delete_old_messages_summary">Automatically delete messages once they\'re old enough</string> - <string name="pref_delete_old_messages_unread">Unread messages</string> - <string name="pref_delete_old_messages_unread_summary">Automatically delete unread messages after %s days</string> - <string name="pref_delete_old_messages_read">Read messages</string> - <string name="pref_delete_old_messages_read_summary">Automatically delete read messages after %s days</string> - <string name="pref_yappy">שילוב יאפי (YAPPY)</string> - <string name="pref_endlessjabber_summary">לאפשר תמיכה מלאה עבור Yappy</string> - <string name="pref_blocked_conversations">שיחות חסומות</string> - <string name="pref_blocked_conversations_summary">לחיצה ארוכה על שיחה על מנת לחסום ולהעביר אותה לתיבת חסומים ולהפסיק לקבל התראות</string> - <string name="pref_block_future">חסום הודעות עתידיות</string> - <string name="pref_block_future_summary">הוסף מספרי טלפון נוספים לחסימה</string> - <string name="pref_should_i_answer">Should I Answer? Integration</string> - <string name="pref_should_i_answer_summary">Automatically delete incoming messages from numbers which are blocked through Should I Answer?</string> - <string name="pref_mobile_only">מספרי טלפון נייד</string> - <string name="pref_mobile_only_summary">הצג רק מספרים טלפון ניידים בהצעות אנשי הקשר</string> - <string name="pref_auto_emoji">Emoji אוטומטי</string> - <string name="pref_auto_emoji_summary">החלף טקסט בתמונת אימוגי</string> - <string name="pref_enter_button">מקש האנטר</string> - <string name="pref_enter_button_summary">Tap to change keyboard enter button behavior</string> - <string name="pref_compose_group">Group messaging</string> - <string name="pref_compose_group_summary">When composing message to multiple people, send a group message instead of individual messages</string> - <string name="pref_auto_download">Auto download MMS</string> - <string name="pref_auto_download_summary">Automatically download MMS messages when they become available</string> - <string name="pref_auto_data">Automatic data</string> - <string name="pref_auto_data_summary">Turn on data automatically when sending or receiving MMS</string> - <string name="pref_split">חילוק הודעות SMS</string> - <string name="pref_split_summary">מחלק הודעות ארוכות של SMS לכמה הודעות קטנות</string> - <string name="pref_split_counter">מונה פיצול הודעות</string> - <string name="pref_split_counter_summary">מוסיף מספר המראה לכמה הודעות קצרות הודעה זו תפוצל</string> - <string name="pref_long_as_mms">שלח הודעות ארוכות כהודעת MMS</string> - <string name="pref_long_as_mms_summary">שלח הודעות ארוכות כהודעת MMS במקום כמה הודעות SMS</string> - <string name="pref_long_as_mms_after">שלח את ההודעה כהודעת MMS אחרי עקיפת</string> - <string name="pref_long_as_mms_after_summary">Send long messages as MMS when they exceed the length of a number of messages</string> - <string name="pref_return">הראה את לחצן החזרה</string> - <string name="pref_return_summary">הראה את לחצן החזרה במקלדת במקום כפתור החייכנים (Emoji)</string> - <string name="pref_text">Text</string> - <string name="pref_notifications">אפשר קבלת התראות עבור SMS</string> - <string name="pref_led">אור הLED בקבלת התראות</string> - <string name="pref_theme_led">Notification LED color</string> - <string name="pref_wake">Wake phone</string> - <string name="pref_wake_summary">Turn your screen on when you receive a new message</string> - <string name="pref_notifications_private">התראות פרטיות</string> - <string name="pref_notifications_private_summary">Tap to change what should be hidden in notfication</string> - <string name="pref_ringtone">צליל בקבלת הודעה</string> - <string name="pref_ringtone_summary">בחירת צליל שמושמע בקבלת הודעה</string> - <string name="pref_ticker">הראה חלק מטקסט ההודעה בחלון ההתראות</string> - <string name="pref_ticker_summary">הראה בחלון ההתראות קטע מהודעה שמתקבלת</string> - <string name="pref_vibration">רטט</string> - <string name="pref_vibration_summary">הפעלת רטט כשנכנסת הודעה חדשה</string> - <string name="pref_notification_call">כפתור התקשרות</string> - <string name="pref_notification_call_summary">טלפן לשולח ההודעה ישר מההתראה בחלון ההתראות</string> - <string name="pref_dimiss_read">סמן כהודעה שנקראה</string> - <string name="pref_dismiss_read_summary">Mark message as read when notification is cleared</string> - <string name="pref_delayed">Delayed messaging</string> - <string name="pref_delayed_summary">Wait before sending your messages, so you have a chance to review them</string> - <string name="pref_delayed_duration">Delay length (seconds)</string> - <string name="pref_delayed_duration_summary">Time to wait before sending your message</string> - <string name="pref_night_auto">מצב לילה אוטומטי</string> - <string name="pref_night_auto_summary">הפעל את מצב הלילה באופן אוטומטי כתלות בזמן</string> - <string name="pref_day_start">תחילת שעות היום</string> - <string name="pref_night_start">תחילת שעות הלילה</string> - <string name="pref_qk_responses">תגובות מהירות</string> - <string name="pref_qk_responses_summary">Modify your preset responses to be used from your Android Wear device</string> - <string name="pref_quickreply_enabled">הפעל תגובות מיידיות</string> - <string name="pref_quickreply_enabled_summary">הצג חלון תגובית מהירה כאשר מתקבלת הודעה חדשה</string> - <string name="pref_tap_to_quit">לחץ לסילוק ההתראה</string> - <string name="pref_tap_to_quit_summary">Tap anywhere outside of the window to close it</string> - <string name="pref_quickcompose">QK Compose enabled</string> - <string name="pref_quickcompose_summary">הצג באופן תמידי הודעה בחלון ההתראות שמאפשרת לך לכתוב הודעה חדשה</string> - <string name="pref_mms_enabled">MMS enabled</string> - <string name="pref_mms_enabled_summary">Enable sending and receiving of MMS messages</string> - <string name="pref_mmsc_url">MMSC</string> - <string name="pref_mms_proxy">פרוקסי של MMS</string> - <string name="pref_mms_port">פורט של MMS</string> - <string name="pref_apn_chooser">טען את הAPN שנמצא בברית המחדל</string> - <string name="pref_strip_unicode">פשיטת unicode</string> - <string name="pref_strip_unicode_summary">החלף תווים שאינם נתמכים בהודעות באורך מלא בתווים שנתמכים בGSM</string> - <string name="pref_system_bar_flat">Flat system bars</string> - <string name="pref_system_bar_flat_summary">Get rid of the gradient shown on the system UI bars on most KitKat devices</string> - <string name="pref_status_compat">תיקון שורת הסטטוס</string> - <string name="pref_status_compat_summary">תיקון תקלות שנגרמות בגלל Immersive mode, בעיה בצביעת שורת הסטטוס (XPOSED), או הגדרות מקוסטמות של DPI</string> - <string name="pref_navigation_compat">תיקון סרגל הניווט</string> - <string name="pref_navigation_compat_summary">תיקון תקלות שנגרמות בגלל Immersive mode, בעיה בצביעת שורת הסטטוס (XPOSED), או הגדרות מקוסטמות של DPI</string> - <string name="pref_about_version_title">QKSMS version</string> - <string name="pref_about_authors_title">Authors</string> - <string name="pref_about_authors_summary">Moez Bhatti</string> - <string name="pref_changelog_summary">Tap to view changelog</string> - <string name="pref_about_thanks_title">Thank you</string> - <string name="pref_about_thanks_summary">Tap to view open-source contributors</string> - <string name="pref_donate_title">Donate</string> - <string name="pref_donate_summary">QKSMS is free. Help support us by donating!</string> - <string name="pref_about_gplus_title">Google+</string> - <string name="pref_about_gplus_summary">Join the QKSMS Beta Testing community on Google+</string> - <string name="pref_about_github_title">GitHub</string> - <string name="pref_about_github_summary">QKSMS is open source. Contribute and report issues on GitHub</string> - <string name="pref_about_crowdin_title">Crowdin</string> - <string name="pref_about_crowdin_summary">Join the QKSMS translation project on Crowdin</string> - <!--Preference subcategory--> - <string name="pref_subcat_theme">ערכת נושא</string> - <!--Preference subcategory--> - <string name="pref_subcat_system_bars">System bars</string> - <!--Preference subcategory--> - <string name="pref_subcat_categories">Categories</string> - <!--Preference subcategory--> - <string name="pref_subcat_font">Font</string> - <!--Preference subcategory--> - <string name="pref_subcat_messages">Messages</string> - <!--Preference subcategory--> - <string name="pref_subcat_avatars">Avatars</string> - <string name="donate_google">Donate with Google</string> - <string name="donate_google_summary">Google takes 30% of donations</string> - <string name="donate_paypal">Donate with PayPal</string> - <string name="donate_paypal_button">Donate any amount</string> - <string name="donate_paypal_button_summary">Buy me anything you want!</string> - <!--Donation product name--> - <string name="product_name_donation">Donation</string> - <!--$1 donation product name--> - <string name="product_name_donate_1">Donate $1 USD</string> - <!--$5 donation product name--> - <string name="product_name_donate_5">Donate $5 USD</string> - <!--$3 donation product name--> - <string name="product_name_donate_10">Donate $10 USD</string> - <!--$1 donation product description--> - <string name="product_description_donate_1">Buy me a Coke</string> - <!--$5 donation product description--> - <string name="product_description_donate_5">Buy me a sandwich</string> - <!--$10 donaion product description--> - <string name="product_description_donate_10">Buy me lunch</string> - <string name="title_settings">הגדרות</string> - <string name="title_search">Search</string> - <string name="title_compose">כתוב הודעה</string> - <string name="title_conversation_list">התכתבויות</string> - <string name="title_blocked">Blocked</string> - <string name="title_changelog">שינויים באפליקציה</string> - <string name="title_picker">הודעות חדשות</string> - <string name="title_donate">Donate</string> - <string name="title_qk_responses">QK Responses</string> - <string name="title_block_address">Block number</string> - <string name="title_unblock_address">Unblock number</string> - <string name="title_conversations_selected">%s selected</string> - <string name="title_palette">Palette</string> - <string name="title_rgb">RGB</string> - <!-- Menu shown in the context menu when long pressing on a message when the message contains - one or more phone numbers and/or email addresses and the number or email is new to - contacts. [CHAR LIMIT=50] --> - <string name="menu_add_address_to_contacts">Add <xliff:g id="contactEmailOrNumber">%s</xliff:g> to People</string> - <!-- Context menu item on an individual message for viewing an attached slideshow --> - <string name="view_slideshow">View slideshow</string> - <!-- Context menu item on an individual message for viewing message details such as time and date --> - <string name="view_message_details">View details</string> - <!-- Context menu item on an individual message for viewing a delivery report --> - <string name="view_delivery_report">View report</string> - <!-- Context menu item on an individual message for deleting only that message --> - <string name="delete_message">Delete</string> - <!-- Abbreviation for "kilobyte" --> - <string name="kilobyte">קילובייט</string> - <!-- Individual message context menu item --> - <string name="copy_message_text">Copy text</string> - <!-- Header for context menu on an individual message --> - <string name="message_options">Message options</string> - <!-- Delivery Header View --> - <!-- Title of "Report" window --> - <string name="delivery_header_title">Report</string> - <!--Text for app restart confirmation dialog--> - <string name="restart_message">השינויים ייכנסו לתוקף בפעם הבאה שQKSMS יפתח</string> - <!--Dialog title for asking if a user wants to delete a conversation--> - <string name="delete_conversation">Delete conversations</string> - <!--Dialog title for asking if a user wants to delete all failed messages--> - <string name="delete_all_failed">Delete failed messages</string> - <!--CDialog title for asking if a user wants to delete a conversation--> - <string name="delete_confirmation">Are you sure you would like to delete (%s) conversations?</string> - <!--CDialog title for asking if a user wants to delete all failed messages--> - <string name="delete_all_failed_confirmation">Are you sure you would like to delete failed messages from (%s) conversations?</string> - <!--(Unused) Dialog title shown if APNs have not been set--> - <string name="apns_not_set">APN לא נקבעו</string> - <!--(Unused) Dialog description shown if APNs have not been set--> - <string name="apns_not_set_description">נראה שהגדרות שAPN שלך לא מסודרות. זה אומר שהודעות MMS לא יעבדו כמו שצריך. לחץ על בסדר על מנת שQKSMS ימצא אותם עבורך :)</string> - <!--Dialog title show if MMS hasn't been configured--> - <string name="set_up_mms_title">Set up MMS?</string> - <!--Dialog description shown if MMS hasn't yet been configured--> - <string name="set_up_mms_description">It appears that MMS hasn\'t been configured in QKSMS yet. Press okay automatically configure MMS.</string> - <!-- Dialog message text explaining that a draft message will not be saved due to invalid recipients --> - <string name="discard_message_reason">Your message will be discarded because it has no valid recipients.</string> - <string name="invalid_code">Invalid code</string> - <!--Button to restart app now instead of manually later--> - <string name="restart">הפעל מחדש את האפליקציה עכשיו</string> - <!--Notification action to reply to a message--> - <string name="reply">הגב</string> - <!--Notification action to reply to a message--> - <string name="reply_qksms">Reply via QKSMS</string> - <!--Notification action to mark a message as read--> - <string name="read">קרא</string> - <!--Notification action to mark a message as read--> - <string name="mark_read">Mark as read</string> - <!--Notification action to call the sender of a message--> - <string name="call">התקשר</string> - <!-- Notification toast message --> - <string name="notification_mute_on">Notifications enabled</string> - <string name="notification_mute_off">Notifications disabled</string> - <!--Positive action button--> - <string name="yes">כן</string> - <string name="add">Add</string> - <!--Positive action button--> - <string name="save">Save</string> - <!--Positive action button--> - <string name="enable">Enable</string> - <!--Positive action button--> - <string name="upgrade_now">Set now</string> - <!--Positive action button--> - <string name="okay">בסדר</string> - <!--Positive action button--> - <string name="redeem">Redeem</string> - <!--Neutral action button--> - <string name="just_once">Just once</string> - <!--Neutral action button--> - <string name="later">אח\"כ</string> - <!--Neutral action button --> - <string name="cancel">בטל</string> - <!-- Name of the local user when displaying sender of an outgoing message (personal pronoun) --> - <string name="messagelist_sender_self">אני</string> - <!-- Sender to be used if the sender address has been hidden --> - <string name="hidden_sender_address">כתובת השולח מוחבאת</string> - <!-- Subject to display in the conversation list if there is no subject --> - <string name="no_subject_view">(ללא נושא)</string> - <!-- Time and date a message is due to expire --> - <string name="expire_on">"פג תוקפו ב: <xliff:g id="date">%s</xliff:g>"</string> - <!-- Formatting for subject displayed inline, prepended to MMS message text --> - <string name="inline_subject">"<נושא: <xliff:g id="subject">%s</xliff:g>>"</string> - <!-- Text of a button appearing for MMS messages that have not yet been downloaded, causing the message to be downloaded (imperative verb) --> - <string name="download">הורד</string> - <!-- Message displayed in place of the "download message" button once it has been pressed, indicating that the download is in progress --> - <string name="downloading">מוריד</string> - <!-- Toast message while an image is being resized --> - <string name="compressing">Picture too large. Compressing\u2026</string> - <!-- Header shown above favorite contacts in QKCompose --> - <string name="favorites">Starred contacts</string> - <!-- Word represents 'self' in a conversation --> - <string name="me">Me</string> - <string name="menu_edit">Edit</string> - <string name="menu_delete_messages">Delete messages</string> - <string name="menu_delete_failed">Delete failed messages</string> - <string name="menu_lock">Lock</string> - <string name="menu_unlock">Unlock</string> - <!-- When the user tries to view message details and some error occurs while - retrieving those details, this message will be shown. --> - <string name="cannot_get_details">Can\'t get details.</string> - <!-- Title of "Message details" dialog --> - <string name="message_details_title">Message details</string> - <!-- Label in "Message details" dialog --> - <string name="message_type_label">Type\u000A</string> - <!-- "Type" value in "Message details" dialog --> - <string name="text_message">Text message</string> - <!-- "Type" value in "Message details" dialog --> - <string name="multimedia_message">Multimedia message</string> - <!-- "Type" value in "Message details" dialog --> - <string name="multimedia_notification">Multimedia message notification</string> - <!-- Label in "Message details" dialog showing who sent the message. --> - <string name="from_label">From\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="to_address_label">To\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="bcc_label">Bcc\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="sent_label">Sent\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="received_label">Received\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="saved_label">Saved\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="subject_label">Subject\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="message_size_label">Message size\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="priority_label">Priority\u000A</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_high">High</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_normal">Normal</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_low">Low</string> - <!-- Label in "Message details" dialog --> - <string name="message_class_label">Message class\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="error_code_label">Error code\u000A</string> - <!-- Alert dialog title when creating a slideshow [CHAR LIMIT=none] --> - <string name="building_slideshow_title">Building slideshow</string> - <!-- Tag appearing on conversations in the conversation list that contain a draft message --> - <string name="has_draft">טיוטה</string> - <!-- In conversation list items, this is the separator between a contact's name and the draft stamp [CHAR LIMIT=5] --> - <string name="draft_separator">,\u0020</string> - <!-- In conversation list items, this comes after the receipient's name and contains the number of messages in the thread [CHAR LIMIT=5] --> - <string name="message_count_format">\u00a0<xliff:g id="number" example="1">%1$s</xliff:g></string> - <!-- For debugging: Dialog box title indicating there's a situation where data has unexpectedly changed --> - <string name="error_state">מצב לא עקבי</string> - <!-- For debugging: Dialog box text indicating there's a situation where data has unexpectedly changed --> - <string name="error_state_text">המצב של ההתכתבויות ואנשי הקשר אינו עקבי. אנא שלח דיווח שגיאות לכתובת : http://go/droidanizer</string> - <!-- This is the dialog title for the "Select link" dialog, shown when the user clicks on a - chat in the chat history view if there are links in the chat message. The dialog displays the - links if there are any --> - <string name="select_link_title">בחר פעולה</string> - <!-- In message list items, this string builds the timestamp line when the message is in a group [CHAR LIMIT=NONE] --> - <string name="message_timestamp_format"><xliff:g id="string" example="Fred Flinstone">%1$s</xliff:g>\u0020-\u0020<xliff:g id="string" example="9:39AM">%2$s</xliff:g></string> - <!--Message sending status: sending--> - <string name="status_sending">שולח…</string> - <!--Message sending status: failed--> - <!--<string name="status_failed">Failed. Tap to retry</string>--> - <!-- Delivery Report Activity --> - <!-- Status in "Report" window --> - <string name="status_none">(None)</string> - <!-- Status in "Report" window --> - <string name="status_pending">Pending</string> - <!-- Status in "Report" window --> - <string name="status_read">Read</string> - <!-- Status in "Report" window --> - <string name="status_received">Received</string> - <!-- Status in "Report" window --> - <string name="status_failed">Failed. Tap for options</string> - <!-- Status in "Report" window --> - <string name="status_unread">Unread</string> - <!-- Status in "Report" window --> - <string name="status_rejected">Rejected</string> - <!-- Label in "Report" window --> - <string name="recipient_label">Recipient:\u0020</string> - <!-- Label in "Report" window --> - <string name="status_label">Status:\u0020</string> - <!-- Label in "Report" window [CHAR LIMIT=50]--> - <string name="delivered_label">Delivered:\u0020</string> - <string name="do_something">Do something</string> - <!-- Confirm Delete --> - <!-- Delete confirmation dialog title --> - <string name="confirm_dialog_title">Delete?</string> - <!-- Delete confirmation dialog title for locked messages --> - <string name="confirm_dialog_locked_title">Delete locked message?</string> - <!-- This message is displayed in a confirmation dialog when the user selects one or more - conversations and then taps the "Delete" button. --> - <plurals name="confirm_delete_conversation"> - <!-- Case of 1 result. --> - <item quantity="one">One conversation will be deleted.</item> - <item quantity="two"><xliff:g id="number" example="15">%1$s</xliff:g> conversations will be deleted.</item> - <item quantity="many"><xliff:g id="number" example="15">%1$s</xliff:g> conversations will be deleted.</item> - <!-- Case of 0 or 2 or more results. --> - <item quantity="other"><xliff:g id="number" example="15">%1$s</xliff:g> conversations will be deleted.</item> - </plurals> - <string name="confirm_delete_conversation">The entire thread will be deleted.</string> - <!-- Delete all threads confirmation dialog message --> - <string name="confirm_delete_all_conversations">All threads will be deleted.</string> - <!-- Delete message confirmation dialog message --> - <string name="confirm_delete_message">The message will be deleted.</string> - <!-- Delete message confirmation dialog message for a locked message --> - <string name="confirm_delete_locked_message">Delete this locked message?</string> - <!-- Delete all the messages on the SIM dialog message --> - <string name="confirm_delete_all_SIM_messages">All messages on the SIM card will be deleted.</string> - <!-- Delete the selected message on the SIM dialog message --> - <string name="confirm_delete_SIM_message">This message on the SIM card will be deleted.</string> - <!-- Delete unlocked checkbox title --> - <string name="delete_unlocked">Delete locked messages</string> - <!-- Delete button title --> - <string name="delete">Delete</string> - <!-- More button title --> - <string name="more">More</string> - <!-- More button summary --> - <string name="more_summary">Tap to see more</string> - <!-- Action bar mode title when multi-selecting conversations --> - <string name="select_conversations">Choose conversations</string> - <!-- Show this in the middle of the main activity when there are no conversations [CHAR LIMIT=none] --> - <string name="no_conversations">No conversations.</string> - <!-- Show this in the middle of the main activity when loading conversations [CHAR LIMIT=none] --> - <string name="loading_conversations">Loading conversations.</string> - <!-- Tells the user that QKSMS isn't the default SMS app --> - <string name="not_default">Default SMS</string> - <!-- Tells the user they need to set QKSMS as the default app in order to use this feature --> - <string name="default_info">QKSMS needs to be your SMS app to do that</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to mark messages as read --> - <string name="not_default_mark_read">QKSMS must be your SMS app to mark messages read</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to mark messages as unread --> - <string name="not_default_mark_unread">QKSMS must be your SMS app to mark messages unread</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to send messages --> - <string name="not_default_delete">QKSMS must be your SMS app to delete messages</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to delete messages --> - <string name="not_default_send">QKSMS must be your SMS app to send messages</string> - <!-- Tells the user they should set QKSMS as the default messaging app --> - <string name="not_default_first">Some things won\'t work until QKSMS is the default SMS app</string> - <string name="delayed_messaging_info">Delayed messaging allows you to cancel messages before they send. Change the default behavior and more in Settings</string> - <string name="delayed_duration_bounds_error">Duration must be between 1 and 30 seconds</string> - <!-- Dialog title for the Read Report dialog. --> - <string name="confirm">Confirm</string> - <!-- Dialog text for the Read Report dialog. --> - <string name="message_send_read_report">A read report will be sent.</string> - <!-- Dialog title for updating app icon color --> - <string name="update_icon_title">Update icon color</string> - <!-- Dialog message for updating app icon color --> - <string name="update_icon_message">QKSMS must be restarted when changing the icon color</string> - <string name="dialog_conversation_details_title">Conversation details</string> - <string name="dialog_conversation_details_last_message_date">Last message date</string> - <string name="dialog_conversation_details_message_count">Message count</string> - <string name="dialog_conversation_details_recipients">Recipients (%s)</string> - <string name="dialog_should_i_answer_title">Should I Answer? not installed</string> - <string name="dialog_should_i_answer_message">Would you like to download the app from Google Play now?</string> - <string name="dialog_delete_old_messages">Are you sure you want to automatically delete old messages?</string> - <!-- Title for audio file picker --> - <string name="select_audio">Choose audio</string> - <!-- Menu title to copy an attachment to the shared storage [CHAR LIMIT=25] --> - <string name="copy_to_sdcard">Save attachment</string> - <!-- Toast message on successful copy to shared storage [CHAR LIMIT=30] --> - <string name="copy_to_sdcard_success">Attachment saved.</string> - <!-- Toast message on failed copy to shared storage [CHAR LIMIT=30] --> - <string name="copy_to_sdcard_fail">Couldn\'t save attachment.</string> - <!-- Menu title to save a sound as a ringtone --> - <string name="save_ringtone">Save as ringtone</string> - <!-- Toast message on successful copying ringtone to drm provider --> - <string name="saved_ringtone">Ringtone saved.</string> - <!-- Toast message on failed copying ringtone to drm provider --> - <string name="saved_ringtone_fail">Couldn\'t save ringtone.</string> - <!-- Menu item --> - <!-- Menu item [CHAR LIMIT=40] --> - <string name="menu_group_participants">Group participants</string> - <!--Toast shown when a draft is saved--> - <string name="toast_draft">נשמר כטיוטה</string> - <!--Toast shown when a conversation is deleted--> - <string name="toast_conversation_deleted">ההתכתבות נמחקה</string> - <!--Toast shown when device is low on storage--> - <string name="toast_low_memory">"אין מקום בזיכרון הטלפון. מחקו קבצים לפינוי מקום."</string> - <!--Toast shown to tell user that forwarding messages doesn't work yet--> - <string name="toast_forward">האפשרות הזו עדיין לא הוכנסה לאפליקציה. נכון לרגע זה אתם יכולים להשתמש באפשרות העתקת תוכן ולהדביק את התוכן המועתק בהתכתבות הרצויה</string> - <!--Toast shown for unimplemented features--> - <string name="toast_unimplemented">האפשרות הזו עדיין לא הוכנסה לאפליקציה</string> - <!--Toast shown when a message fails to send--> - <string name="toast_message_failure">שליחת ההודעה נכשלה</string> - <!--Toast shown when a message is delivered--> - <string name="toast_message_delivered">ההודעה נשלחה</string> - <!--Toast shown when a message is not delivered--> - <string name="toast_message_not_delivered">ההודעה לא נשלחה</string> - <!--Toast shown when default APNs are loaded--> - <string name="toast_default_apns_loaded">הגדרות הAPN שנמצאות בברירת המחדל נטענו</string> - <!--Toast shown when text is copied to the clipboard--> - <string name="toast_copy_text">הטקסט הועתק ללוח</string> - <!--Toast shown when Google Play Services is not available for purchasing a product--> - <string name="toast_billing_not_available">הרכישה מצריכה אפשרות לביצוע קניות דרך Google Play Store במכשיר האנדרואיד</string> - <!--Toast shown when Google Play Services is not available for purchasing a product--> - <string name="toast_endlessjabber_not_installed">EndlessJabber לא מותקן. פותח את Google Play</string> - <string name="toast_changelog_error">Couldn\'t load the changelog. Please try again later</string> - <string name="toast_conversation_error">Couldn\'t open conversation</string> - <string name="toast_deleting_old_messages">Your old messages will be deleted shortly</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_1">תודה על תרומתך! אתה החבר הכי טוב שלי.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_2">תודה על תרומתך! אני אוהב אותך.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_3">תודה על תרומתך! אתה עוזר לQKSMS להפוך לאפליקציית ההודעות הטובה שנבנתה אי פעם.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_4">תודה על תרומתך! אתה מדהים.</string> - <!--Menu option to mute conversation--> - <string name="menu_mute_conversation">Mute conversation</string> - <!--Menu option to mute conversation--> - <string name="menu_unmute_conversation">Unmute conversation</string> - <string name="menu_block_conversations">Block conversations</string> - <string name="menu_unblock_conversations">Unblock conversations</string> - <string name="menu_messages">Messages</string> - <string name="menu_blocked">Blocked</string> - <string name="menu_blocked_conversations">Blocked (%s new)</string> - <string name="menu_unblocked_conversations">Messages (%s new)</string> - <string name="menu_notifications">Notifications</string> - <string name="menu_notifications_off">Notifications off</string> - <string name="menu_notification_settings">Conversation settings</string> - <string name="menu_view_details">View details</string> - <string name="menu_mark_read">Mark read</string> - <string name="menu_mark_unread">Mark unread</string> - <string name="menu_delete_conversation">Delete conversation</string> - <string name="menu_multi_select">Select conversation</string> - <string name="menu_done">Done</string> - <string name="failed_message_title">Failed message options</string> - <!--Toast shown to tell the user that they don't have a photo attachments app, and suggests that they download one--> - <string name="attachment_app_not_found">Attachments app not found. Try installing a photo gallery app!</string> - <string name="attachment_camera_error">The camera could not be opened</string> - <string name="pref_max_mms_attachment_size">Maximum MMS attachment size</string> - <string name="error_no_recipients">Select some contacts to send this message to!</string> - <string name="error_file_not_found">QKSMS can\'t access the file you\'re trying to share!</string> - <string name="sending_blocked_welcome_screen_message">Hold up! You\'ll get to send real messages in a minute!</string> - <string name="notification_colored_icon_ready">Touch to add to your launcher from home screen.</string> - <string name="notification_title_colored_icon_ready">QKSMS colored icon is ready</string> - <string name="icon_ready">Your new icon is ready!</string> - <string name="icon_ready_message">You can now add it to your home screen again with the updated color.</string> - <string name="dont_ask_again">Don\'t ask again</string> - <string name="warning">Stagefright warning</string> - <string name="stagefright_warning">Video messages may contain a harmful exploit that can leave your phone vulnerable to attacks. Would you like to continue?</string> - <!-- MMS DIALOG SETUP STRINGS --> - <string name="mms_setup_set_up_mms_title">Set up MMS?</string> - <string name="mms_setup_set_up_mms_body">It appears that MMS isn\'t set up in QKSMS. Press okay to automatically configure MMS.</string> - <string name="mms_setup_setting_up_later_title">Setting up MMS later</string> - <string name="mms_setup_setting_up_later_body">Visit the MMS section of Settings to try automatic configuration, contact support, or enter your own configuration.</string> - <string name="mms_setup_no_configurations_found_title">No configurations found</string> - <string name="mms_setup_no_configurations_found_body">We couldn\'t find an MMS configuration for your carrier automatically. Press okay to contact support. We\'ll help you get set up! </string> - <string name="mms_setup_one_configuration_found_title">One configuration found</string> - <string name="mms_setup_one_configuration_found_body">We have found an MMS configuration for the %s carrier. Does that sound right?</string> - <string name="mms_setup_multiple_configurations_found_title">Multiple configuration found</string> - <string name="mms_setup_multiple_configurations_found_body">We have found multiple MMS configurations. Choose your carrier from the list, or press N/A if your carrier isn\'t on the list.</string> - <string name="mms_setup_next_steps_title">Next steps</string> - <string name="mms_setup_next_steps_body">Visit the MMS section of Settings to try automatic configuration again, contact support, or enter your own configuration.</string> - <string name="mms_setup_success_title">Success!</string> - <string name="mms_setup_success_body">If you encounter any issues, visit the MMS section of Settings to try automatic configuration again, contact support, or enter your own configuration.</string> - <string name="na">N/A</string> - <string name="no">No</string> - <string name="pref_automatically_configure_mms">Automatically Configure MMS</string> - <string name="pref_mms_contact_support">Contact Support</string> - <string name="pref_category_sending_mms">Sending MMS</string> - <string name="pref_category_mms_configuration">MMS Configuration</string> - <string name="pref_mms_contact_support_summary">Contact the QKSMS team for help setting up MMS</string> - <string name="pref_markdown_enabled">Text formatting</string> - <string name="pref_markdown_enabled_summary">Use markdown syntax to get bold, underline, and italics in your messages</string> - <string name="want_read_indicators">Want read indicators?</string> - <string name="color_swatch_description">Color %1$d</string> - <string name="color_swatch_description_selected">Color %1$d selected</string> - <string name="color_picker_default_title">Select a Color</string> - <string name="message_delivered">Message Delivered</string> - <string name="message_not_delivered">Message Not Delivered</string> - <string name="error">Error</string> - <string name="invalid_destination">Invalid destination address.</string> - <string name="service_not_activated">Service not activated on network.</string> - <string name="service_message_not_found">Message expired or not available.</string> - <string name="service_network_problem">Couldn\'t send due to network problem.</string> - <string name="message_queued">Currently can\'t send your message. It will be sent when the service becomes available.</string> - <string name="download_later">Can\'t download right now. Try again later.</string> - <string name="no_apn">No APN specified for the app, you need to set it up in settings!</string> - <string name="no_subject">(No subject)</string> - <string name="unknown_sender">Unknown sender</string> - <string name="dl_failure_notification">Couldn\'t download message <xliff:g id="subject">%1$s</xliff:g> from <xliff:g id="from">%2$s</xliff:g>.</string> - <string name="auto_select_multiple_apns">Multiple different configurations have been found. Try one now. If it doesn\'t work, you can try a new one by going to Settings > Advanced > Load default APNs.</string> - <string name="auto_select_apn">Automatically Select APNs</string> - <string name="auto_select_failed_title">Automatic configuration failed</string> - <string name="auto_select_failed">Try searching for your carrier\'s APN settings (MMSC, Port, and Proxy) and entering them in Settings > Advanced.</string> - <string name="date_yesterday">Yesterday</string> - <string name="date_just_now">Just now</string> - <string name="compose_loading_attachment">Loading attachment</string> - <string name="hint_no_messages">No messages yet.\nClick the + to send one!</string> - <string-array name="resend_menu"> - <item>Resend</item> - <item>Edit</item> - <item>Delete</item> - </string-array> - <string-array name="message_menu"> - <item>העבר הלאה את ההודעה</item> - <item>העתק תוכן הודעה</item> - <item>ראה פרטים</item> - <item>מחק הודעה</item> - </string-array> - <string-array name="background_titles"> - <item>Material Light</item> - <item>Material Dark</item> - <item>Black</item> - </string-array> - <string-array name="font_sizes"> - <item>קטן</item> - <item>רגיל</item> - <item>גדול</item> - <item>גדול מאד</item> - </string-array> - <string-array name="font_families"> - <item>Roboto Regular</item> - <item>Roboto Condensed</item> - <item>System font</item> - </string-array> - <string-array name="font_weights"> - <item>Light</item> - <item>Normal</item> - </string-array> - <!-- String to match as no subject and filter out as a subject. For example, if the - subject string is "no subject", we won't display that. We'll pretend - no subject string was delivered. --> - <string-array name="empty_subject_strings"> - <item>ללא נושא</item> - </string-array> - <string-array name="qk_responses"> - <item>Okay</item> - <item>Give me a moment</item> - <item>On my way</item> - <item>Thanks</item> - <item>Sounds good</item> - <item>What\'s up?</item> - <item>Agreed</item> - <item>No</item> - <item>Love you</item> - <item>Sorry</item> - <item>LOL</item> - <item>That\'s okay</item> - </string-array> - <string-array name="enter_button_options"> - <item>Show emoji</item> - <item>New line</item> - <item>Send message</item> - </string-array> - <string-array name="notification_private_options"> - <item>Show all</item> - <item>Hide message</item> - <item>Hide message and sender</item> - </string-array> - <!-- Max MMS attachment sizes. I.e. will compress pictures that are larger than 300 KB down to - under 300KB. --> - <string-array name="max_mms_attachment_sizes"> - <item>300 KB</item> - <item>600 KB</item> - <item>1 MB</item> - <item>Unlimited</item> - </string-array> -</resources> diff --git a/QKSMS/src/main/res/values-ja/strings.xml b/QKSMS/src/main/res/values-ja/strings.xml deleted file mode 100644 index c4b2ba1ef..000000000 --- a/QKSMS/src/main/res/values-ja/strings.xml +++ /dev/null @@ -1,767 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!--Generated by crowdin.com--> -<resources xmlns:xliff="http://schemas.android.com/apk/res-auto"> - <!--Slogan--> - <string name="slogan">やっぱりテキストメッセージが好き。</string> - <!--Text shown when a phone number cannot be found--> - <string name="unknown_number">不明な番号</string> - <!--Content description for photos--> - <string name="popup_photo_CD">写真</string> - <!--Text to be displayed while content is loading--> - <string name="loading">読み込み中…</string> - <!--Test string--> - <string name="test">テスト文字列</string> - <!--Hint for contacts text field--> - <string name="hint_contacts">受信者を入力してください</string> - <!--Hint for search text field--> - <string name="hint_search">何かを検索します</string> - <!--Hint for message reply text field--> - <string name="hint_reply">メッセージを入力します</string> - <!--Hint for code redemption--> - <string name="hint_redeem">コードを入力します</string> - <string name="hint_hex">16 進数</string> - <!--Text shown for single new message in notification--> - <string name="new_message">新しいメッセージ</string> - <!--Text shown after number of unread messages in notification (ex. 3 new messages)--> - <string name="new_messages">新しいメッセージ</string> - <!--Text shown for single failed message in notification--> - <string name="failed_message">メッセージの送信に失敗しました</string> - <!--Text shown after number of failed messages in notification (ex. 3 messages failed to send)--> - <string name="failed_messages">メッセージの送信に失敗しました</string> - <!--Text shown under failed message count--> - <string name="failed_messages_summary">タップすると表示します</string> - <!--QuickCompose notification title--> - <string name="quickcompose">QK 作成</string> - <!--QuickCompose notification text--> - <string name="quickcompose_detail">クリックしてメッセージを送信します</string> - <!--Welcome screen intro button--> - <string name="welcome_start">始めましょう!</string> - <!--Allows user to skip welcome screen--> - <string name="welcome_skip">スキップ</string> - <!--Allows user to finish the welcome screen--> - <string name="welcome_finish">完了</string> - <!--Indicates to user they can pick a color--> - <string name="welcome_theme_title">色を選択</string> - <!--Indicates to user they can pick any colors--> - <string name="welcome_theme_description">どんな色でも。</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_night_description">目に優しい。</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_night_hint">切り替え</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_quickreply_title">QK 返信</string> - <!--QK Reply explanation--> - <string name="welcome_quickreply_description">今までよりもすばやくメッセージに返信します。</string> - <!--Prompts user to try QK Reply--> - <string name="welcome_quickreply_hint">お試しください!</string> - <!--QK Reply demo message--> - <string name="welcome_quickreply_message_1">ワオ! 素晴らしくないですか? 一目で会話の全体を見ることができます。ポップアップの外側をタップするか、チェック マークを押して、それを消します。</string> - <!--QK Reply demo message--> - <string name="welcome_quickreply_message_2">これは QK 返信です。どこからでもメッセージに返信することができます。展開ボタンをタップして、次に何が起こるか見てください :)</string> - <!--Settings option in menu--> - <string name="menu_settings">設定</string> - <!--Search option in menu--> - <string name="menu_search">検索</string> - <!--Show full conversation in QuickReply--> - <string name="menu_show_all">すべてのメッセージを表示</string> - <!--Show only unread messages in QuickReply--> - <string name="menu_show_unread">未読メ ッ セージを表示</string> - <!--Open conversation option in menu (shown in QuickReply)--> - <string name="menu_open_thread">会話を開く</string> - <!--Forward message option in menu--> - <string name="menu_forward">メッセージを転送</string> - <!--Call contact option in menu--> - <string name="menu_call">通話</string> - <!--Mark a message/conversation as read option in menu--> - <string name="menu_read">既読としてマーク</string> - <!--Delete a message option in menu--> - <string name="menu_delete">削除</string> - <!--Donate option in menu--> - <string name="menu_billing">寄付</string> - <!--Copy text option in menu--> - <string name="menu_copy">テキストをコピー</string> - <!--Changelog option in menu--> - <string name="menu_changelog">"新着情報"</string> - <!--Expand settings option in menu--> - <string name="menu_show_all_prefs">すべて表示</string> - <!--Show less settings option in menu--> - <string name="menu_show_fewer_prefs">少し表示</string> - <!--Title for message details popup--> - <string name="details_title">詳細</string> - <!--Title for address that message is being sent to in message details popup--> - <string name="details_to">宛先</string> - <!--Title for address that message is sent from in message details popup--> - <string name="details_from">差出人</string> - <!--Title for text of a message in message details popup--> - <string name="details_body">本文</string> - <!--Title for date sent of a message in message details popup--> - <string name="details_date_sent">送信日</string> - <!--Title for date received of a message in message details popup--> - <string name="details_date_received">受信日</string> - <!--Title for rate snackbar--> - <string name="rate_title">QKSMS はいかがですか?</string> - <!--Title for rate button--> - <string name="rate_action">評価</string> - <string name="pref_category_appearance">外観</string> - <string name="pref_category_summary_appearance">テーマ、フォント、色、アバター、その他</string> - <string name="pref_category_general">全般</string> - <string name="pref_category_summary_general">配信、メッセージ送信、書式</string> - <string name="pref_category_blocking">メッセージのブロック</string> - <string name="pref_category_notifications">通知</string> - <string name="pref_category_summary_notifications">音、LED、プライバシー</string> - <string name="pref_category_mms">MMS</string> - <string name="pref_category_summary_mms">MMS (APN)、最大サイズ、グループ メッセージ送信の設定</string> - <string name="pref_category_quickreply">QK 返信</string> - <string name="pref_category_summary_quickreply">QK 返信、ポップアップのオプション</string> - <string name="pref_category_quickcompose">QK 作成</string> - <string name="pref_category_summary_quickcompose">QK 作成、スターを付けた連絡先</string> - <string name="pref_category_about">アプリについて</string> - <string name="pref_category_summary_about">バージョン、変更履歴、作者、謝辞</string> - <string name="pref_theme">テーマ色</string> - <string name="pref_theme_summary_alt">タップするとテーマを変更します</string> - <string name="pref_icon">Icon color</string> - <string name="pref_icon_summary">Tap to change the QKSMS icon color</string> - <string name="pref_status_tint">彩色のステータス バー</string> - <string name="pref_navigation_tint">彩色のナビゲーション バー</string> - <string name="pref_background">背景色</string> - <string name="pref_background_summary">タップすると背景色を変更します</string> - <string name="pref_bubbles">メッセージ バブル</string> - <string name="pref_bubbles_summary">タップするとメッセージ バブルの設定を変更します</string> - <string name="pref_night">夜間モード</string> - <string name="pref_night_summary">バッテリーを節約し、目の負担を軽減します</string> - <string name="pref_night_amoled">純粋な黒の背景</string> - <string name="pref_night_amoled_summary">AMOLED ディスプレイのデバイスで余分なバッテリーを節約します</string> - <string name="pref_bubble_style_new">新しいバブル スタイルを使用する</string> - <string name="pref_color_sent">送信したメッセージを色分け</string> - <string name="pref_color_sent_summary">送信メッセージの背景のバブルに色を付けます</string> - <string name="pref_color_received">受信したメッセージを色分けする</string> - <string name="pref_color_received_summary">受信メッセージの背景のバブルに色を付けます</string> - <string name="pref_hide_avatar_conversations">会話のアバターを非表示にする</string> - <string name="pref_hide_avatar_conversations_summary">会話リストで連絡先のアバターを非表示にします</string> - <string name="pref_hide_avatar_sent">送信メッセージのアバターを非表示にする</string> - <string name="pref_hide_avatar_sent_summary">送信メッセージのアバターを非表示にします</string> - <string name="pref_hide_avatar_received">受信メッセージのアバターを非表示にする</string> - <string name="pref_hide_avatar_received_summary">受信メッセージの連絡先のアバターを非表示にします</string> - <string name="pref_font_family">フォント ファミリー</string> - <string name="pref_font_size">フォントサイズ</string> - <string name="pref_font_weight">フォントの太さ</string> - <string name="pref_message_count">メッセージ件数</string> - <string name="pref_message_count_summary">会話ごとにメッセージ数を表示します</string> - <string name="pref_sent_timestamps">送信タイムスタンプ</string> - <string name="pref_sent_timestamps_summary">受信されていないメッセージが送信されたときのタイムスタンプを表示します</string> - <string name="pref_force_timestamps">強制的にタイムスタンプ</string> - <string name="pref_force_timestamps_summary">すべてのメッセージでタイムスタンプを有効にします</string> - <string name="pref_key_timestamp_delay">新しいタイムスタンプの遅延</string> - <string name="pref_key_timestamp_delay_summary">新しいタイムスタンプを表示するまで、2 つのメッセージ間で経過する必要がある分数。</string> - <string name="pref_compose_favorites">スターを付けた連絡先</string> - <string name="pref_compose_summary_favorites">QK 作成ウィンドウにスターを付けた連絡先を表示します。タップすると消えます</string> - <string name="pref_prox_sensor_call">近接センサー</string> - <string name="pref_prox_sensor_call_summary">会話中に、お使いの電話を耳に持って来ると通話を開始します</string> - <string name="pref_delivery">配信確認</string> - <string name="pref_delivery_summary">メッセージが正常に送信されたことを確認します</string> - <string name="pref_delivery_toast">トーストを表示</string> - <string name="pref_delivery_toast_summary">メッセージの配信を示す、短いトーストを表示します</string> - <string name="pref_delivery_vibrate">振動</string> - <string name="pref_delivery_vibrate_summary">メッセージ配信で振動します</string> - <string name="pref_delete_old_messages">古いメッセージを削除</string> - <string name="pref_delete_old_messages_summary">十分に古くなったメッセージを自動的に削除します</string> - <string name="pref_delete_old_messages_unread">未読メ ッ セージ</string> - <string name="pref_delete_old_messages_unread_summary">%s 日後に自動的に未読メ ッ セージを削除します</string> - <string name="pref_delete_old_messages_read">既読メッセージ</string> - <string name="pref_delete_old_messages_read_summary">%s 日後に自動的に既読メッセージを削除します</string> - <string name="pref_yappy">Yappy 統合</string> - <string name="pref_endlessjabber_summary">Yappy の完全なサポートを有効にします</string> - <string name="pref_blocked_conversations">ブロックされた会話</string> - <string name="pref_blocked_conversations_summary">会話を長押ししてブロックすると、ブロックされた受信トレイに移動して通知を停止します</string> - <string name="pref_block_future">将来のメッセージをブロック</string> - <string name="pref_block_future_summary">ブロックする電話番号を追加します</string> - <string name="pref_should_i_answer">回答する必要がありますか? 統合</string> - <string name="pref_should_i_answer_summary">ブロックされている番号からの受信メッセージを自動的に削除します。回答する必要がありますか?</string> - <string name="pref_mobile_only">携帯電話番号</string> - <string name="pref_mobile_only_summary">連絡先の候補で携帯電話番号のみを表示します</string> - <string name="pref_auto_emoji">自動絵文字</string> - <string name="pref_auto_emoji_summary">画像絵文字で、テキストを置き換えます</string> - <string name="pref_enter_button">Enter ボタン</string> - <string name="pref_enter_button_summary">タップすると、キーボードの Enter ボタンの動作を変更します</string> - <string name="pref_compose_group">グループ メッセージ送信</string> - <string name="pref_compose_group_summary">複数の人にメッセージを作成するとき、個々のメッセージの代わりにグループ メッセージを送信します</string> - <string name="pref_auto_download">自動ダウンロード MMS</string> - <string name="pref_auto_download_summary">使用可能になったとき、自動的に MMS メッセージをダウンロードします</string> - <string name="pref_auto_data">自動データ</string> - <string name="pref_auto_data_summary">MMS の送受信時に自動的にデータをオンにします</string> - <string name="pref_split">SMS の分割</string> - <string name="pref_split_summary">長いメッセージを個別のメッセージに分割します</string> - <string name="pref_split_counter">分割カウンター</string> - <string name="pref_split_counter_summary">それぞれの分割メッセージの前にカウンターを追加します</string> - <string name="pref_long_as_mms">長いメッセージを MMS として送信</string> - <string name="pref_long_as_mms_summary">長いメッセージを分割ではなく MMS として送信します</string> - <string name="pref_long_as_mms_after">MMS として送信する長さ</string> - <string name="pref_long_as_mms_after_summary">メッセージの長さを超えた場合、長いメッセージを MMS として送信します</string> - <string name="pref_return">Return ボタンを表示</string> - <string name="pref_return_summary">絵文字ボタンの代わりにキーボードの return キーを表示します</string> - <string name="pref_text">テキスト</string> - <string name="pref_notifications">SMS 通知を有効にする</string> - <string name="pref_led">通知 LED</string> - <string name="pref_theme_led">通知 LED 色</string> - <string name="pref_wake">携帯電話をウェイク</string> - <string name="pref_wake_summary">新しいメッセージを受信したときに画面をオンにします</string> - <string name="pref_notifications_private">プライベート通知</string> - <string name="pref_notifications_private_summary">タップして、非表示にする通知を変更します</string> - <string name="pref_ringtone">通知音</string> - <string name="pref_ringtone_summary">通知音を選択します</string> - <string name="pref_ticker">ティッカーを表示</string> - <string name="pref_ticker_summary">通知バーに新しいメッセージのスニペットを表示します</string> - <string name="pref_vibration">振動</string> - <string name="pref_vibration_summary">新しいメッセージを受信したときに振動します</string> - <string name="pref_notification_call">通話ボタン</string> - <string name="pref_notification_call_summary">通知から、メッセージの送信者に電話します</string> - <string name="pref_dimiss_read">既読としてマーク</string> - <string name="pref_dismiss_read_summary">通知をクリアしたとき、メッセージを既読としてマークします</string> - <string name="pref_delayed">メッセージ送信遅延</string> - <string name="pref_delayed_summary">メッセージを送信する前に待機して、確認する機会を与えます</string> - <string name="pref_delayed_duration">遅延時間 (秒)</string> - <string name="pref_delayed_duration_summary">メッセージを送信する前に待機する時間</string> - <string name="pref_night_auto">自動夜間モード</string> - <string name="pref_night_auto_summary">時間に基づいて、自動的に夜間モードを有効にします</string> - <string name="pref_day_start">日中の開始時間</string> - <string name="pref_night_start">夜間の開始時間</string> - <string name="pref_qk_responses">QK 応答</string> - <string name="pref_qk_responses_summary">Android ウェアデバイスから使用する、プリセットの応答を変更します</string> - <string name="pref_quickreply_enabled">QK 返信を有効にしました</string> - <string name="pref_quickreply_enabled_summary">新しいメッセージを受信するたびに、QK 返信ウィンドウを表示します</string> - <string name="pref_tap_to_quit">タップして閉じる</string> - <string name="pref_tap_to_quit_summary">ウィンドウの外側の任意の場所をタップすると、閉じます</string> - <string name="pref_quickcompose">QK 作成を有効にしました</string> - <string name="pref_quickcompose_summary">クリックして新しいメッセージを作成できる通知を表示します</string> - <string name="pref_mms_enabled">MMS を有効にしました</string> - <string name="pref_mms_enabled_summary">MMS メッセージの送信および受信を有効にします</string> - <string name="pref_mmsc_url">MMSC</string> - <string name="pref_mms_proxy">MMS プロキシ</string> - <string name="pref_mms_port">MMS ポート</string> - <string name="pref_apn_chooser">デフォルト APN を読み込む</string> - <string name="pref_strip_unicode">ユニコードを除去</string> - <string name="pref_strip_unicode_summary">GSM 互換文字のフルレングスのメッセージでサポートされていない文字をスワップします</string> - <string name="pref_system_bar_flat">フラット システム バー</string> - <string name="pref_system_bar_flat_summary">ほとんどの KitKat デバイスで、システム UI バーのグラデーションを取り除きます</string> - <string name="pref_status_compat">ステータス バーの修正</string> - <string name="pref_status_compat_summary">イマーシブ モード、彩色ステータス バー (Xposed) またはカスタム DPI 設定によって引き起こされる問題を修正します</string> - <string name="pref_navigation_compat">ナビゲーション バーの修正</string> - <string name="pref_navigation_compat_summary">イマーシブ モード、彩色ステータス バー (Xposed) またはカスタム DPI 設定によって引き起こされる問題を修正します</string> - <string name="pref_about_version_title">QKSMS バージョン</string> - <string name="pref_about_authors_title">作者</string> - <string name="pref_about_authors_summary">Moez Bhatti</string> - <string name="pref_changelog_summary">タップすると、変更履歴を表示します</string> - <string name="pref_about_thanks_title">ありがとうございます</string> - <string name="pref_about_thanks_summary">タップすると、オープン ソース貢献者を表示します</string> - <string name="pref_donate_title">寄付</string> - <string name="pref_donate_summary">QKSMS は無料です。寄付をして私たちをサポートしてください!</string> - <string name="pref_about_gplus_title">Google+</string> - <string name="pref_about_gplus_summary">Google+ の QKSMS ベータ テスト コミュニティに参加してください</string> - <string name="pref_about_github_title">GitHub</string> - <string name="pref_about_github_summary">QKSMS はオープンソースです。GitHub で貢献や問題の報告をしてください</string> - <string name="pref_about_crowdin_title">Crowdin</string> - <string name="pref_about_crowdin_summary">Crowdin の QKSMS の翻訳プロジェクトに参加してください</string> - <!--Preference subcategory--> - <string name="pref_subcat_theme">テーマ</string> - <!--Preference subcategory--> - <string name="pref_subcat_system_bars">システム バー</string> - <!--Preference subcategory--> - <string name="pref_subcat_categories">カテゴリー</string> - <!--Preference subcategory--> - <string name="pref_subcat_font">フォント</string> - <!--Preference subcategory--> - <string name="pref_subcat_messages">メッセージ</string> - <!--Preference subcategory--> - <string name="pref_subcat_avatars">アバター</string> - <string name="donate_google">Google で寄付</string> - <string name="donate_google_summary">Google は寄付金の 30% 受け取ります</string> - <string name="donate_paypal">PayPal で寄付</string> - <string name="donate_paypal_button">任意の金額を寄付</string> - <string name="donate_paypal_button_summary">あなたが欲しいものを買いなさい!</string> - <!--Donation product name--> - <string name="product_name_donation">寄付</string> - <!--$1 donation product name--> - <string name="product_name_donate_1">1 ドル寄付する</string> - <!--$5 donation product name--> - <string name="product_name_donate_5">5 ドル寄付する</string> - <!--$3 donation product name--> - <string name="product_name_donate_10">10 ドル寄付する</string> - <!--$1 donation product description--> - <string name="product_description_donate_1">私にコーラを買ってください</string> - <!--$5 donation product description--> - <string name="product_description_donate_5">私にサンドイッチを買ってください</string> - <!--$10 donaion product description--> - <string name="product_description_donate_10">私にランチを買ってください</string> - <string name="title_settings">設定</string> - <string name="title_search">検索</string> - <string name="title_compose">作成</string> - <string name="title_conversation_list">会話</string> - <string name="title_blocked">ブロック</string> - <string name="title_changelog">変更履歴</string> - <string name="title_picker">新しいメッセージ</string> - <string name="title_donate">寄付</string> - <string name="title_qk_responses">QK 応答</string> - <string name="title_block_address">ブロック番号</string> - <string name="title_unblock_address">ブロック解除番号</string> - <string name="title_conversations_selected">%s 選択しました</string> - <string name="title_palette">パレット</string> - <string name="title_rgb">RGB</string> - <!-- Menu shown in the context menu when long pressing on a message when the message contains - one or more phone numbers and/or email addresses and the number or email is new to - contacts. [CHAR LIMIT=50] --> - <string name="menu_add_address_to_contacts">人に <xliff:g id="contactEmailOrNumber">%s</xliff:g> を追加</string> - <!-- Context menu item on an individual message for viewing an attached slideshow --> - <string name="view_slideshow">スライド ショーの表示</string> - <!-- Context menu item on an individual message for viewing message details such as time and date --> - <string name="view_message_details">詳細の表示</string> - <!-- Context menu item on an individual message for viewing a delivery report --> - <string name="view_delivery_report">レポートの表示</string> - <!-- Context menu item on an individual message for deleting only that message --> - <string name="delete_message">削除</string> - <!-- Abbreviation for "kilobyte" --> - <string name="kilobyte">KB</string> - <!-- Individual message context menu item --> - <string name="copy_message_text">テキストをコピー</string> - <!-- Header for context menu on an individual message --> - <string name="message_options">メッセージ オプション</string> - <!-- Delivery Header View --> - <!-- Title of "Report" window --> - <string name="delivery_header_title">レポート</string> - <!--Text for app restart confirmation dialog--> - <string name="restart_message">この変更は次に QKSMS を開いたときに有効になります</string> - <!--Dialog title for asking if a user wants to delete a conversation--> - <string name="delete_conversation">会話を削除</string> - <!--Dialog title for asking if a user wants to delete all failed messages--> - <string name="delete_all_failed">失敗したメッセージを削除</string> - <!--CDialog title for asking if a user wants to delete a conversation--> - <string name="delete_confirmation">(%s) 会話を削除してもよろしいですか?</string> - <!--CDialog title for asking if a user wants to delete all failed messages--> - <string name="delete_all_failed_confirmation">(%s) 会話から失敗したメッセージを削除してもよろしいですか?</string> - <!--(Unused) Dialog title shown if APNs have not been set--> - <string name="apns_not_set">APN が設定されていません</string> - <!--(Unused) Dialog description shown if APNs have not been set--> - <string name="apns_not_set_description">APN が設定されていないようです。これは MMS が正しく動作しないことを意味します。QKSMS が見つけるために OK を押してください :)</string> - <!--Dialog title show if MMS hasn't been configured--> - <string name="set_up_mms_title">MMS を設定しますか?</string> - <!--Dialog description shown if MMS hasn't yet been configured--> - <string name="set_up_mms_description">QKSMS で MMS が設定されていないようです。MMS を設定するには OK を押してください。</string> - <!-- Dialog message text explaining that a draft message will not be saved due to invalid recipients --> - <string name="discard_message_reason">受信者が無効なため、メッセージは破棄されます。</string> - <string name="invalid_code">無効なコード</string> - <!--Button to restart app now instead of manually later--> - <string name="restart">今すぐ再起動</string> - <!--Notification action to reply to a message--> - <string name="reply">返信</string> - <!--Notification action to reply to a message--> - <string name="reply_qksms">QKSMS 経由で返信</string> - <!--Notification action to mark a message as read--> - <string name="read">読む</string> - <!--Notification action to mark a message as read--> - <string name="mark_read">既読としてマーク</string> - <!--Notification action to call the sender of a message--> - <string name="call">通話</string> - <!-- Notification toast message --> - <string name="notification_mute_on">通知を有効にしました</string> - <string name="notification_mute_off">通知を無効にしました</string> - <!--Positive action button--> - <string name="yes">はい</string> - <string name="add">追加</string> - <!--Positive action button--> - <string name="save">保存</string> - <!--Positive action button--> - <string name="enable">有効</string> - <!--Positive action button--> - <string name="upgrade_now">今すぐ設定</string> - <!--Positive action button--> - <string name="okay">OK</string> - <!--Positive action button--> - <string name="redeem">交換</string> - <!--Neutral action button--> - <string name="just_once">一度だけ</string> - <!--Neutral action button--> - <string name="later">後で</string> - <!--Neutral action button --> - <string name="cancel">キャンセル</string> - <!-- Name of the local user when displaying sender of an outgoing message (personal pronoun) --> - <string name="messagelist_sender_self">自分</string> - <!-- Sender to be used if the sender address has been hidden --> - <string name="hidden_sender_address">送信者アドレスを非表示</string> - <!-- Subject to display in the conversation list if there is no subject --> - <string name="no_subject_view">(件名なし)</string> - <!-- Time and date a message is due to expire --> - <string name="expire_on">"Expires: <xliff:g id="date">%s</xliff:g>"</string> - <!-- Formatting for subject displayed inline, prepended to MMS message text --> - <string name="inline_subject">"<Subject: <xliff:g id="subject">%s</xliff:g>>"</string> - <!-- Text of a button appearing for MMS messages that have not yet been downloaded, causing the message to be downloaded (imperative verb) --> - <string name="download">ダウンロード</string> - <!-- Message displayed in place of the "download message" button once it has been pressed, indicating that the download is in progress --> - <string name="downloading">ダウンロード中</string> - <!-- Toast message while an image is being resized --> - <string name="compressing">画像が大きすぎます。圧縮中\u2026</string> - <!-- Header shown above favorite contacts in QKCompose --> - <string name="favorites">スターを付けた連絡先</string> - <!-- Word represents 'self' in a conversation --> - <string name="me">自分</string> - <string name="menu_edit">編集</string> - <string name="menu_delete_messages">メッセージを削除</string> - <string name="menu_delete_failed">失敗したメッセージを削除</string> - <string name="menu_lock">ロック</string> - <string name="menu_unlock">ロックを解除</string> - <!-- When the user tries to view message details and some error occurs while - retrieving those details, this message will be shown. --> - <string name="cannot_get_details">詳細を取得できません</string> - <!-- Title of "Message details" dialog --> - <string name="message_details_title">メッセージの詳細</string> - <!-- Label in "Message details" dialog --> - <string name="message_type_label">種類\u000A</string> - <!-- "Type" value in "Message details" dialog --> - <string name="text_message">テキスト メッセージ</string> - <!-- "Type" value in "Message details" dialog --> - <string name="multimedia_message">マルチメディア メッセージ</string> - <!-- "Type" value in "Message details" dialog --> - <string name="multimedia_notification">マルチメディア メッセージの通知</string> - <!-- Label in "Message details" dialog showing who sent the message. --> - <string name="from_label">差出人\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="to_address_label">宛先\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="bcc_label">Bcc\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="sent_label">送信\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="received_label">受信\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="saved_label">保存\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="subject_label">件名\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="message_size_label">メッセージ サイズ\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="priority_label">優先度\u000A</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_high">高</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_normal">通常</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_low">低</string> - <!-- Label in "Message details" dialog --> - <string name="message_class_label">メッセージ分類\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="error_code_label">エラー コード\u000A</string> - <!-- Alert dialog title when creating a slideshow [CHAR LIMIT=none] --> - <string name="building_slideshow_title">スライド ショーを構築中</string> - <!-- Tag appearing on conversations in the conversation list that contain a draft message --> - <string name="has_draft">下書き</string> - <!-- In conversation list items, this is the separator between a contact's name and the draft stamp [CHAR LIMIT=5] --> - <string name="draft_separator">,\u0020</string> - <!-- In conversation list items, this comes after the receipient's name and contains the number of messages in the thread [CHAR LIMIT=5] --> - <string name="message_count_format">\u00a0<xliff:g id="number" example="1">%1$s</xliff:g></string> - <!-- For debugging: Dialog box title indicating there's a situation where data has unexpectedly changed --> - <string name="error_state">矛盾した状態</string> - <!-- For debugging: Dialog box text indicating there's a situation where data has unexpectedly changed --> - <string name="error_state_text">スレッドと受信者の状態に一貫性がありません。バグレポートを取り込んで http://go/droidanizer で報告してください </string> - <!-- This is the dialog title for the "Select link" dialog, shown when the user clicks on a - chat in the chat history view if there are links in the chat message. The dialog displays the - links if there are any --> - <string name="select_link_title">アクションを選択</string> - <!-- In message list items, this string builds the timestamp line when the message is in a group [CHAR LIMIT=NONE] --> - <string name="message_timestamp_format"><xliff:g id="string" example="Fred Flinstone">%1$s</xliff:g>\u0020-\u0020<xliff:g id="string" example="9:39AM">%2$s</xliff:g></string> - <!--Message sending status: sending--> - <string name="status_sending">送信中…</string> - <!--Message sending status: failed--> - <!--<string name="status_failed">Failed. Tap to retry</string>--> - <!-- Delivery Report Activity --> - <!-- Status in "Report" window --> - <string name="status_none">(なし)</string> - <!-- Status in "Report" window --> - <string name="status_pending">保留</string> - <!-- Status in "Report" window --> - <string name="status_read">既読</string> - <!-- Status in "Report" window --> - <string name="status_received">受信</string> - <!-- Status in "Report" window --> - <string name="status_failed">失敗しました。タップするとオプション</string> - <!-- Status in "Report" window --> - <string name="status_unread">未読</string> - <!-- Status in "Report" window --> - <string name="status_rejected">拒否</string> - <!-- Label in "Report" window --> - <string name="recipient_label">受信者:\u0020</string> - <!-- Label in "Report" window --> - <string name="status_label">ステータス:\u0020</string> - <!-- Label in "Report" window [CHAR LIMIT=50]--> - <string name="delivered_label">配信:\u0020</string> - <string name="do_something">何かを行います</string> - <!-- Confirm Delete --> - <!-- Delete confirmation dialog title --> - <string name="confirm_dialog_title">削除しますか?</string> - <!-- Delete confirmation dialog title for locked messages --> - <string name="confirm_dialog_locked_title">ロックされたメッセージを削除しますか?</string> - <!-- This message is displayed in a confirmation dialog when the user selects one or more - conversations and then taps the "Delete" button. --> - <plurals name="confirm_delete_conversation"> - <!-- Case of 1 result. --> - <!-- Case of 0 or 2 or more results. --> - <item quantity="other"><xliff:g id="number" example="15">%1$s</xliff:g> の会話が削除されます。</item> - </plurals> - <string name="confirm_delete_conversation">スレッド全体が削除されます。</string> - <!-- Delete all threads confirmation dialog message --> - <string name="confirm_delete_all_conversations">すべてのスレッドが削除されます。</string> - <!-- Delete message confirmation dialog message --> - <string name="confirm_delete_message">メッセージが削除されます。</string> - <!-- Delete message confirmation dialog message for a locked message --> - <string name="confirm_delete_locked_message">このロックされたメッセージを削除しますか?</string> - <!-- Delete all the messages on the SIM dialog message --> - <string name="confirm_delete_all_SIM_messages">SIM カード上のすべてのメッセージが削除されます。</string> - <!-- Delete the selected message on the SIM dialog message --> - <string name="confirm_delete_SIM_message">SIM カード上のこのメッセージが削除されます。</string> - <!-- Delete unlocked checkbox title --> - <string name="delete_unlocked">ロックされたメッセージを削除</string> - <!-- Delete button title --> - <string name="delete">削除</string> - <!-- More button title --> - <string name="more">詳細</string> - <!-- More button summary --> - <string name="more_summary">タップすると、詳細を参照</string> - <!-- Action bar mode title when multi-selecting conversations --> - <string name="select_conversations">会話を選択</string> - <!-- Show this in the middle of the main activity when there are no conversations [CHAR LIMIT=none] --> - <string name="no_conversations">会話はありません</string> - <!-- Show this in the middle of the main activity when loading conversations [CHAR LIMIT=none] --> - <string name="loading_conversations">会話を読み込んでいます。</string> - <!-- Tells the user that QKSMS isn't the default SMS app --> - <string name="not_default">デフォルト SMS</string> - <!-- Tells the user they need to set QKSMS as the default app in order to use this feature --> - <string name="default_info">QKSMS は、それを行うために SMS アプリにする必要があります</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to mark messages as read --> - <string name="not_default_mark_read">QKSMS は、メッセージを既読にマークするために SMS アプリにする必要があります</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to mark messages as unread --> - <string name="not_default_mark_unread">QKSMS は、メッセージを未読にするために SMS アプリにする必要があります</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to send messages --> - <string name="not_default_delete">QKSMS は、メッセージを削除するために SMS アプリにする必要があります</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to delete messages --> - <string name="not_default_send">QKSMS は、メッセージを送信するために SMS アプリにする必要があります</string> - <!-- Tells the user they should set QKSMS as the default messaging app --> - <string name="not_default_first">いくつかのものは、QKSMS がデフォルトの SMS アプリになるまで動作しません</string> - <string name="delayed_messaging_info">メッセージ送信遅延は、メッセージを送信する前にキャンセルできます。設定でデフォルトの動作および詳細を変更してください。</string> - <string name="delayed_duration_bounds_error">期間は 1 ~ 30 秒の間にする必要があります</string> - <!-- Dialog title for the Read Report dialog. --> - <string name="confirm">確認</string> - <!-- Dialog text for the Read Report dialog. --> - <string name="message_send_read_report">既読報告が送信されます。</string> - <!-- Dialog title for updating app icon color --> - <string name="update_icon_title">アイコンの色を更新</string> - <!-- Dialog message for updating app icon color --> - <string name="update_icon_message">アイコンの色を変更するときに QKSMS を再起動する必要があります</string> - <string name="dialog_conversation_details_title">会話の詳細</string> - <string name="dialog_conversation_details_last_message_date">最新メッセージの日付</string> - <string name="dialog_conversation_details_message_count">メッセージ件数</string> - <string name="dialog_conversation_details_recipients">受信者 (%s)</string> - <string name="dialog_should_i_answer_title">回答する必要がありますか? インストールされていません</string> - <string name="dialog_should_i_answer_message">Google Play から今すぐアプリをダウンロードしますか?</string> - <string name="dialog_delete_old_messages">自動的に古いメッセージを削除してもよろしいですか?</string> - <!-- Title for audio file picker --> - <string name="select_audio">音を選択</string> - <!-- Menu title to copy an attachment to the shared storage [CHAR LIMIT=25] --> - <string name="copy_to_sdcard">添付ファイルを保存</string> - <!-- Toast message on successful copy to shared storage [CHAR LIMIT=30] --> - <string name="copy_to_sdcard_success">添付ファイルを保存しました。</string> - <!-- Toast message on failed copy to shared storage [CHAR LIMIT=30] --> - <string name="copy_to_sdcard_fail">添付ファイルを保存できませんでした。</string> - <!-- Menu title to save a sound as a ringtone --> - <string name="save_ringtone">着信音として保存</string> - <!-- Toast message on successful copying ringtone to drm provider --> - <string name="saved_ringtone">着信音を保存しました。</string> - <!-- Toast message on failed copying ringtone to drm provider --> - <string name="saved_ringtone_fail">着信音を保存できませんでした。</string> - <!-- Menu item --> - <!-- Menu item [CHAR LIMIT=40] --> - <string name="menu_group_participants">グループの参加者</string> - <!--Toast shown when a draft is saved--> - <string name="toast_draft">保存された下書き</string> - <!--Toast shown when a conversation is deleted--> - <string name="toast_conversation_deleted">会話を削除しました</string> - <!--Toast shown when device is low on storage--> - <string name="toast_low_memory">"電話のストレージがいっぱいです。いくつかのファイルを削除して、領域を解放してください。"</string> - <!--Toast shown to tell user that forwarding messages doesn't work yet--> - <string name="toast_forward">この機能は実装されていません。今のところ、テキストのコピー オプションを使用して、そして送信したい会話にそれを貼り付けてください。</string> - <!--Toast shown for unimplemented features--> - <string name="toast_unimplemented">この機能はまだ実装されていません</string> - <!--Toast shown when a message fails to send--> - <string name="toast_message_failure">メッセージの送信に失敗しました</string> - <!--Toast shown when a message is delivered--> - <string name="toast_message_delivered">メッセージを配信しました</string> - <!--Toast shown when a message is not delivered--> - <string name="toast_message_not_delivered">メッセージは配信されていません</string> - <!--Toast shown when default APNs are loaded--> - <string name="toast_default_apns_loaded">デフォルト APN の設定を読み込みました</string> - <!--Toast shown when text is copied to the clipboard--> - <string name="toast_copy_text">テキストをクリップボードにコピーしました</string> - <!--Toast shown when Google Play Services is not available for purchasing a product--> - <string name="toast_billing_not_available">購入は、お使いの Android に Google Play ストア (課金) が必要です</string> - <!--Toast shown when Google Play Services is not available for purchasing a product--> - <string name="toast_endlessjabber_not_installed">EndlessJabber がインストールされていません。Google Play を開きます</string> - <string name="toast_changelog_error">変更履歴を読み込めませんでした。もう一度やり直してください</string> - <string name="toast_conversation_error">会話を開くことができませんでした</string> - <string name="toast_deleting_old_messages">古いメッセージはすぐに削除されます</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_1">寄付をありがとう! あなたは私の新しい親友です。</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_2">寄付をありがとう! 大好きです。</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_3">寄付をありがとう! あなたは、これまでに作られた最高のテキスト メッセージのアプリになる QKSMS を支援しています。</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_4">寄付をありがとう! あなたは素晴らしい人です。</string> - <!--Menu option to mute conversation--> - <string name="menu_mute_conversation">会話をミュート</string> - <!--Menu option to mute conversation--> - <string name="menu_unmute_conversation">会話をミュート解除</string> - <string name="menu_block_conversations">会話をブロック</string> - <string name="menu_unblock_conversations">会話のブロックを解除</string> - <string name="menu_messages">メッセージ</string> - <string name="menu_blocked">ブロック</string> - <string name="menu_blocked_conversations">ブロック (新規 %s)</string> - <string name="menu_unblocked_conversations">メッセージ (新規 %s)</string> - <string name="menu_notifications">通知</string> - <string name="menu_notifications_off">通知オフ</string> - <string name="menu_notification_settings">会話の設定</string> - <string name="menu_view_details">詳細を表示</string> - <string name="menu_mark_read">既読にマーク</string> - <string name="menu_mark_unread">未読にマーク</string> - <string name="menu_delete_conversation">会話を削除</string> - <string name="menu_multi_select">会話を選択</string> - <string name="menu_done">完了</string> - <string name="failed_message_title">失敗したメッセージのオプション</string> - <!--Toast shown to tell the user that they don't have a photo attachments app, and suggests that they download one--> - <string name="attachment_app_not_found">添付ファイルのアプリが見つかりません。フォトギャラリー アプリをインストールしてみてください!</string> - <string name="attachment_camera_error">カメラを開くことができませんでした</string> - <string name="pref_max_mms_attachment_size">最大 MMS 添付ファイル サイズ</string> - <string name="error_no_recipients">このメッセージを送信する連絡先を選択してください!</string> - <string name="error_file_not_found">QKSMS は、共有しようとしているファイルにアクセスできません!</string> - <string name="sending_blocked_welcome_screen_message">ホールドアップ! 1 分で実際のメッセージを送ることができます!</string> - <string name="notification_colored_icon_ready">タップすると、ホーム画面からランチャーに追加します。</string> - <string name="notification_title_colored_icon_ready">QKSMS カラー アイコンが用意されています</string> - <string name="icon_ready">あなたの新しいアイコンが用意されています!</string> - <string name="icon_ready_message">更新された色で再度あなたのホーム画面にそれを追加できます。</string> - <string name="dont_ask_again">次回から表示しない</string> - <string name="warning">Stagefright 警告</string> - <string name="stagefright_warning">ビデオ メッセージは、お使いの携帯電話を攻撃を受けやすくする、有害な悪用コードが含まれることがあります。続行しますか?</string> - <!-- MMS DIALOG SETUP STRINGS --> - <string name="mms_setup_set_up_mms_title">MMS を設定しますか?</string> - <string name="mms_setup_set_up_mms_body">QKSMS で MMS が設定されていないようです。OK を押すと、MMS を自動的に設定します。</string> - <string name="mms_setup_setting_up_later_title">後で MMS を設定する</string> - <string name="mms_setup_setting_up_later_body">自動設定、サポートに連絡、または独自の設定を入力する場合は、設定の MMS のセクションをご覧ください。</string> - <string name="mms_setup_no_configurations_found_title">設定が見つかりません</string> - <string name="mms_setup_no_configurations_found_body">お使いのキャリアの MMS 設定を自動的に見つけることができませんでした。OK を押すと、サポートに連絡します。設定をお手伝いします! </string> - <string name="mms_setup_one_configuration_found_title">1 つの設定が見つかりました</string> - <string name="mms_setup_one_configuration_found_body">%s キャリアの MMS 設定が見つかりました。これは正しそうですか?</string> - <string name="mms_setup_multiple_configurations_found_title">複数の設定が見つかりました</string> - <string name="mms_setup_multiple_configurations_found_body">複数の MMS 設定が見つかりました。リストからお使いのキャリアを選択するか、お使いのキャリアが一覧にない場合は N/A を押します。</string> - <string name="mms_setup_next_steps_title">次のステップ</string> - <string name="mms_setup_next_steps_body">再度自動設定、サポートに連絡、または独自の設定を入力する場合は、設定の MMS のセクションをご覧ください。</string> - <string name="mms_setup_success_title">成功!</string> - <string name="mms_setup_success_body">再度自動設定、サポートに連絡、または独自の構成を入力する場合、問題が発生した場合、設定の MMS セクションをご覧ください。</string> - <string name="na">N/A</string> - <string name="no">いいえ</string> - <string name="pref_automatically_configure_mms">自動的に MMS を設定</string> - <string name="pref_mms_contact_support">サポートに問い合わせ</string> - <string name="pref_category_sending_mms">MMS を送信しています</string> - <string name="pref_category_mms_configuration">MMS 設定</string> - <string name="pref_mms_contact_support_summary">MMS を設定する支援をうけるため、QKSMS チームに連絡します</string> - <string name="pref_markdown_enabled">テキストの書式設定</string> - <string name="pref_markdown_enabled_summary">メッセージで、太字、下線、および斜体にするため、マークダウンの構文を使用します</string> - <string name="want_read_indicators">既読インジケーターが必要ですか?</string> - <string name="color_swatch_description">色 %1$d</string> - <string name="color_swatch_description_selected">色 %1$d を選択しました</string> - <string name="color_picker_default_title">色を選択</string> - <string name="message_delivered">メッセージを配信しました</string> - <string name="message_not_delivered">メッセージは配信されませんでした</string> - <string name="error">エラー</string> - <string name="invalid_destination">無効な送信先アドレスです。</string> - <string name="service_not_activated">ネットワークでサービスが有効ではありません。</string> - <string name="service_message_not_found">メッセージが有効期限切れ、または利用できません。</string> - <string name="service_network_problem">ネットワークの問題で、送信できませんでした。</string> - <string name="message_queued">現在、メッセージを送信できません。サービスが利用可能になったときに送信されます。</string> - <string name="download_later">今は、ダウンロードできません。後でもう一度試してください。</string> - <string name="no_apn">アプリの APN が指定されていません。設定で、設定する必要があります!</string> - <string name="no_subject">(件名なし)</string> - <string name="unknown_sender">不明な送信者</string> - <string name="dl_failure_notification"><xliff:g id="from">%2$s</xliff:g> からメッセージ <xliff:g id="subject">%1$s</xliff:g> がダウンロードできませんでした。</string> - <string name="auto_select_multiple_apns">複数の異なる設定が見つかりました。1 つ試してください。それが動作しない場合は、設定 > 詳細 > デフォルト APN をロード、に移動して新しいものを試すことができます。</string> - <string name="auto_select_apn">自動的に APN を選択</string> - <string name="auto_select_failed_title">自動設定に失敗しました</string> - <string name="auto_select_failed">お使いのキャリアの APN 設定を探してみてください (MMSC、ポート、およびプロキシ) 設定 > 詳細、でそれを入力してください。</string> - <string name="date_yesterday">昨日</string> - <string name="date_just_now">ちょうど今</string> - <string name="compose_loading_attachment">添付ファイルを読み込んでいます</string> - <string name="hint_no_messages">まだメッセージはありません。\n+ をクリックして送信します!</string> - <string-array name="resend_menu"> - <item>再送信</item> - <item>編集</item> - <item>削除</item> - </string-array> - <string-array name="message_menu"> - <item>メッセージを転送</item> - <item>テキストをコピー</item> - <item>詳細を表示</item> - <item>メッセージを削除</item> - </string-array> - <string-array name="background_titles"> - <item>マテリアル ライト</item> - <item>マテリアル ダーク</item> - <item>ブラック</item> - </string-array> - <string-array name="font_sizes"> - <item>小</item> - <item>通常</item> - <item>大</item> - <item>最大</item> - </string-array> - <string-array name="font_families"> - <item>Roboto 標準</item> - <item>Roboto コンデンス</item> - <item>システム フォント</item> - </string-array> - <string-array name="font_weights"> - <item>ライト</item> - <item>標準</item> - </string-array> - <!-- String to match as no subject and filter out as a subject. For example, if the - subject string is "no subject", we won't display that. We'll pretend - no subject string was delivered. --> - <string-array name="empty_subject_strings"> - <item>件名なし</item> - </string-array> - <string-array name="qk_responses"> - <item>OK</item> - <item>しばらくお待ちください</item> - <item>今、途中です</item> - <item>ありがとう</item> - <item>良さそうですね</item> - <item>最近どうですか?</item> - <item>了解</item> - <item>いいえ</item> - <item>好き</item> - <item>ごめんなさい</item> - <item>大爆笑です</item> - <item>大丈夫です</item> - </string-array> - <string-array name="enter_button_options"> - <item>絵文字を表示</item> - <item>改行</item> - <item>メッセージを送信</item> - </string-array> - <string-array name="notification_private_options"> - <item>すべて表示</item> - <item>メッセージを非表示</item> - <item>メッセージと送信者を非表示</item> - </string-array> - <!-- Max MMS attachment sizes. I.e. will compress pictures that are larger than 300 KB down to - under 300KB. --> - <string-array name="max_mms_attachment_sizes"> - <item>300 KB</item> - <item>600 KB</item> - <item>1 MB</item> - <item>無制限</item> - </string-array> -</resources> diff --git a/QKSMS/src/main/res/values-ko/strings.xml b/QKSMS/src/main/res/values-ko/strings.xml deleted file mode 100644 index b7c01f407..000000000 --- a/QKSMS/src/main/res/values-ko/strings.xml +++ /dev/null @@ -1,767 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!--Generated by crowdin.com--> -<resources xmlns:xliff="http://schemas.android.com/apk/res-auto"> - <!--Slogan--> - <string name="slogan">Love texting again.</string> - <!--Text shown when a phone number cannot be found--> - <string name="unknown_number">알 수 없는 번호</string> - <!--Content description for photos--> - <string name="popup_photo_CD">사진</string> - <!--Text to be displayed while content is loading--> - <string name="loading">로딩중...</string> - <!--Test string--> - <string name="test">테스트 문자</string> - <!--Hint for contacts text field--> - <string name="hint_contacts">받는 사람</string> - <!--Hint for search text field--> - <string name="hint_search">Search something</string> - <!--Hint for message reply text field--> - <string name="hint_reply">메시지 입력</string> - <!--Hint for code redemption--> - <string name="hint_redeem">Enter code</string> - <string name="hint_hex">Hex</string> - <!--Text shown for single new message in notification--> - <string name="new_message">새로운 메시지</string> - <!--Text shown after number of unread messages in notification (ex. 3 new messages)--> - <string name="new_messages">개의 새로운 메시지</string> - <!--Text shown for single failed message in notification--> - <string name="failed_message">메시지 전송 실패</string> - <!--Text shown after number of failed messages in notification (ex. 3 messages failed to send)--> - <string name="failed_messages">메시지 전송 실패</string> - <!--Text shown under failed message count--> - <string name="failed_messages_summary">Tap to view</string> - <!--QuickCompose notification title--> - <string name="quickcompose">QK Compose</string> - <!--QuickCompose notification text--> - <string name="quickcompose_detail">터치해서 문자 작성</string> - <!--Welcome screen intro button--> - <string name="welcome_start">Let\'s get started!</string> - <!--Allows user to skip welcome screen--> - <string name="welcome_skip">건너 뛰기</string> - <!--Allows user to finish the welcome screen--> - <string name="welcome_finish">완료</string> - <!--Indicates to user they can pick a color--> - <string name="welcome_theme_title">색을 정하세요.</string> - <!--Indicates to user they can pick any colors--> - <string name="welcome_theme_description">아무 색이나 좋아요.</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_night_description">눈이 편합니다.</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_night_hint">눌러서 바꾸기</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_quickreply_title">QK 답장</string> - <!--QK Reply explanation--> - <string name="welcome_quickreply_description">Reply to messages faster than ever.</string> - <!--Prompts user to try QK Reply--> - <string name="welcome_quickreply_hint">한번 써 보세요!</string> - <!--QK Reply demo message--> - <string name="welcome_quickreply_message_1">와우! 멋있죠? 한눈에 대화내역이 다 들어온답니다. 팝업창 바깥을 누르거나 체크마크를 누르면 꺼집니다.</string> - <!--QK Reply demo message--> - <string name="welcome_quickreply_message_2">이게 QK 답장입니다. 어디서나 문자에 답장을 할 수 있죠. 확장 버튼을 누르면 어떻게 될까요 :)</string> - <!--Settings option in menu--> - <string name="menu_settings">설정</string> - <!--Search option in menu--> - <string name="menu_search">검색</string> - <!--Show full conversation in QuickReply--> - <string name="menu_show_all">모든 메시지 표시</string> - <!--Show only unread messages in QuickReply--> - <string name="menu_show_unread">읽지 않은 메시지 표시</string> - <!--Open conversation option in menu (shown in QuickReply)--> - <string name="menu_open_thread">대화 열기</string> - <!--Forward message option in menu--> - <string name="menu_forward">메시지 전달</string> - <!--Call contact option in menu--> - <string name="menu_call">전화</string> - <!--Mark a message/conversation as read option in menu--> - <string name="menu_read">읽음으로 표시</string> - <!--Delete a message option in menu--> - <string name="menu_delete">삭제</string> - <!--Donate option in menu--> - <string name="menu_billing">기부</string> - <!--Copy text option in menu--> - <string name="menu_copy">복사</string> - <!--Changelog option in menu--> - <string name="menu_changelog">"업데이트 로그"</string> - <!--Expand settings option in menu--> - <string name="menu_show_all_prefs">모두 보기</string> - <!--Show less settings option in menu--> - <string name="menu_show_fewer_prefs">일부만 보기</string> - <!--Title for message details popup--> - <string name="details_title">자세히</string> - <!--Title for address that message is being sent to in message details popup--> - <string name="details_to">받는사람</string> - <!--Title for address that message is sent from in message details popup--> - <string name="details_from">보내는사람</string> - <!--Title for text of a message in message details popup--> - <string name="details_body">내용</string> - <!--Title for date sent of a message in message details popup--> - <string name="details_date_sent">보낸 날짜</string> - <!--Title for date received of a message in message details popup--> - <string name="details_date_received">받은 날짜</string> - <!--Title for rate snackbar--> - <string name="rate_title">QKSMS 어떠신가요?</string> - <!--Title for rate button--> - <string name="rate_action">별점 매기기</string> - <string name="pref_category_appearance">겉모양</string> - <string name="pref_category_summary_appearance">테마, 글꼴, 색상, 아바타 등</string> - <string name="pref_category_general">일반</string> - <string name="pref_category_summary_general">Delivery, message sending, formatting</string> - <string name="pref_category_blocking">메시지 차단</string> - <string name="pref_category_notifications">알림</string> - <string name="pref_category_summary_notifications">Sounds, LED, privacy</string> - <string name="pref_category_mms">MMS</string> - <string name="pref_category_summary_mms">MMS (APN) 설정, 최대 크기, 그룹 메시지 설정</string> - <string name="pref_category_quickreply">QK 답장</string> - <string name="pref_category_summary_quickreply">QK 답장, 팝업 설정</string> - <string name="pref_category_quickcompose">QK 작성</string> - <string name="pref_category_summary_quickcompose">QK 작성, 별표 표시된 연락처</string> - <string name="pref_category_about">앱 정보</string> - <string name="pref_category_summary_about">버전, 변경이력, 제작자, 감사의 말</string> - <string name="pref_theme">테마 색상</string> - <string name="pref_theme_summary_alt">테마를 변경하려면 탭하기</string> - <string name="pref_icon">Icon color</string> - <string name="pref_icon_summary">Tap to change the QKSMS icon color</string> - <string name="pref_status_tint">상단바 색상표시(투명화)</string> - <string name="pref_navigation_tint">소프트키 색상표시(투명화)</string> - <string name="pref_background">배경 색상</string> - <string name="pref_background_summary">배경 색상을 바꾸려면 탭하기</string> - <string name="pref_bubbles">Message bubbles</string> - <string name="pref_bubbles_summary">Tap to change message bubble preferences</string> - <string name="pref_night">나이트 모드</string> - <string name="pref_night_summary">Save battery and reduce eye strain</string> - <string name="pref_night_amoled">완전한 검은색 배경</string> - <string name="pref_night_amoled_summary">AMOLED 디스플레이를 사용하는 기기에서 추가적인 배터리 절약</string> - <string name="pref_bubble_style_new">Use new bubble style</string> - <string name="pref_color_sent">Color sent messages</string> - <string name="pref_color_sent_summary">Color the background bubbles for outgoing messages</string> - <string name="pref_color_received">Color received messages</string> - <string name="pref_color_received_summary">Color the background bubbles for incoming messages</string> - <string name="pref_hide_avatar_conversations">Hide conversation avatars</string> - <string name="pref_hide_avatar_conversations_summary">Hide avatars for contacts in conversation list</string> - <string name="pref_hide_avatar_sent">Hide sent message avatars</string> - <string name="pref_hide_avatar_sent_summary">Hide your avatar for outgoing messages</string> - <string name="pref_hide_avatar_received">Hide received message avatars</string> - <string name="pref_hide_avatar_received_summary">Hide contact avatar for incoming messages</string> - <string name="pref_font_family">Font family</string> - <string name="pref_font_size">글꼴 크기</string> - <string name="pref_font_weight">Font weight</string> - <string name="pref_message_count">Message count</string> - <string name="pref_message_count_summary">Show the number of messages for each conversation</string> - <string name="pref_sent_timestamps">Sent timestamps</string> - <string name="pref_sent_timestamps_summary">Show the timestamp for when a message was sent, not received</string> - <string name="pref_force_timestamps">Force timestamps</string> - <string name="pref_force_timestamps_summary">Enable timestamps for all messages</string> - <string name="pref_key_timestamp_delay">New timestamp delay</string> - <string name="pref_key_timestamp_delay_summary">The number of minutes which must elapse between two messages in order for a new timestamp to be shown.</string> - <string name="pref_compose_favorites">Starred contacts</string> - <string name="pref_compose_summary_favorites">Show your starred contacts in the QK Compose window, making them only a tap away</string> - <string name="pref_prox_sensor_call">Proximity sensor</string> - <string name="pref_prox_sensor_call_summary">While in a conversation, bring your phone to your ear to start a call</string> - <string name="pref_delivery">Delivery confirmations</string> - <string name="pref_delivery_summary">메시지가 전송되었습니다.</string> - <string name="pref_delivery_toast">Show toast</string> - <string name="pref_delivery_toast_summary">Show a short toast to indicate a message being delivered</string> - <string name="pref_delivery_vibrate">Vibrate</string> - <string name="pref_delivery_vibrate_summary">Vibrate on message delivery</string> - <string name="pref_delete_old_messages">Delete old messages</string> - <string name="pref_delete_old_messages_summary">Automatically delete messages once they\'re old enough</string> - <string name="pref_delete_old_messages_unread">Unread messages</string> - <string name="pref_delete_old_messages_unread_summary">Automatically delete unread messages after %s days</string> - <string name="pref_delete_old_messages_read">Read messages</string> - <string name="pref_delete_old_messages_read_summary">Automatically delete read messages after %s days</string> - <string name="pref_yappy">Yappy integration</string> - <string name="pref_endlessjabber_summary">Enable full support for Yappy</string> - <string name="pref_blocked_conversations">Blocked conversations</string> - <string name="pref_blocked_conversations_summary">Long-press on a conversation and block to move to blocked inbox and stop notifications</string> - <string name="pref_block_future">Block future messages</string> - <string name="pref_block_future_summary">Add additional phone numbers to block</string> - <string name="pref_should_i_answer">Should I Answer? Integration</string> - <string name="pref_should_i_answer_summary">Automatically delete incoming messages from numbers which are blocked through Should I Answer?</string> - <string name="pref_mobile_only">Mobile numbers</string> - <string name="pref_mobile_only_summary">Only show mobile numbers in contact suggestions</string> - <string name="pref_auto_emoji">Automatic emoji</string> - <string name="pref_auto_emoji_summary">Replace text with image emoji</string> - <string name="pref_enter_button">Enter button</string> - <string name="pref_enter_button_summary">Tap to change keyboard enter button behavior</string> - <string name="pref_compose_group">Group messaging</string> - <string name="pref_compose_group_summary">When composing message to multiple people, send a group message instead of individual messages</string> - <string name="pref_auto_download">Auto download MMS</string> - <string name="pref_auto_download_summary">Automatically download MMS messages when they become available</string> - <string name="pref_auto_data">Automatic data</string> - <string name="pref_auto_data_summary">Turn on data automatically when sending or receiving MMS</string> - <string name="pref_split">Split SMS</string> - <string name="pref_split_summary">메시지가 길 경우 나누어서 전송합니다.</string> - <string name="pref_split_counter">Split counter</string> - <string name="pref_split_counter_summary">Adds a counter to the front of each split message</string> - <string name="pref_long_as_mms">Send long as MMS</string> - <string name="pref_long_as_mms_summary">Send long messages as MMS instead of splitting them</string> - <string name="pref_long_as_mms_after">Send long as MMS after</string> - <string name="pref_long_as_mms_after_summary">Send long messages as MMS when they exceed the length of a number of messages</string> - <string name="pref_return">Show return button</string> - <string name="pref_return_summary">Show return key on keyboard instead of Emoji button</string> - <string name="pref_text">Text</string> - <string name="pref_notifications">문자 알림</string> - <string name="pref_led">LED 알림</string> - <string name="pref_theme_led">Notification LED color</string> - <string name="pref_wake">Wake phone</string> - <string name="pref_wake_summary">Turn your screen on when you receive a new message</string> - <string name="pref_notifications_private">비밀 알림</string> - <string name="pref_notifications_private_summary">Tap to change what should be hidden in notfication</string> - <string name="pref_ringtone">알림 소리</string> - <string name="pref_ringtone_summary">알림음을 선택해주세요</string> - <string name="pref_ticker">Show ticker</string> - <string name="pref_ticker_summary">Shows snippet of new message in notification bar</string> - <string name="pref_vibration">진동</string> - <string name="pref_vibration_summary">새로운 메시지가 왔을 때 진동이 울립니다.</string> - <string name="pref_notification_call">전화걸기 버튼</string> - <string name="pref_notification_call_summary">메시지를 보낼 때 전화걸기 버튼이 오른쪽에 표시됩니다.</string> - <string name="pref_dimiss_read">Mark as read</string> - <string name="pref_dismiss_read_summary">Mark message as read when notification is cleared</string> - <string name="pref_delayed">Delayed messaging</string> - <string name="pref_delayed_summary">Wait before sending your messages, so you have a chance to review them</string> - <string name="pref_delayed_duration">Delay length (seconds)</string> - <string name="pref_delayed_duration_summary">Time to wait before sending your message</string> - <string name="pref_night_auto">Automatic night mode</string> - <string name="pref_night_auto_summary">Enable night mode automatically based on the time</string> - <string name="pref_day_start">Day time begins</string> - <string name="pref_night_start">Night time begins</string> - <string name="pref_qk_responses">QK Responses</string> - <string name="pref_qk_responses_summary">Modify your preset responses to be used from your Android Wear device</string> - <string name="pref_quickreply_enabled">QK Reply enabled</string> - <string name="pref_quickreply_enabled_summary">Show QK Reply window whenever a new message is received</string> - <string name="pref_tap_to_quit">Tap to dismiss</string> - <string name="pref_tap_to_quit_summary">Tap anywhere outside of the window to close it</string> - <string name="pref_quickcompose">QK Compose enabled</string> - <string name="pref_quickcompose_summary">알림창에서 터치하면 문자를 새로 작성할 수 있습니다.</string> - <string name="pref_mms_enabled">MMS enabled</string> - <string name="pref_mms_enabled_summary">Enable sending and receiving of MMS messages</string> - <string name="pref_mmsc_url">MMSC</string> - <string name="pref_mms_proxy">MMS proxy</string> - <string name="pref_mms_port">MMS port</string> - <string name="pref_apn_chooser">기본 APN 불러오기</string> - <string name="pref_strip_unicode">Strip unicode</string> - <string name="pref_strip_unicode_summary">Swap characters that are not supported in full-length messages for GSM compatible characters</string> - <string name="pref_system_bar_flat">Flat system bars</string> - <string name="pref_system_bar_flat_summary">Get rid of the gradient shown on the system UI bars on most KitKat devices</string> - <string name="pref_status_compat">상단바 수정</string> - <string name="pref_status_compat_summary">Fixes issues caused by immersive mode, Tinted Status Bar (Xposed), or custom DPI settings</string> - <string name="pref_navigation_compat">소프트키 수정</string> - <string name="pref_navigation_compat_summary">Fixes issues caused by immersive mode, Tinted Status Bar (Xposed), or custom DPI settings</string> - <string name="pref_about_version_title">QKSMS version</string> - <string name="pref_about_authors_title">Authors</string> - <string name="pref_about_authors_summary">Moez Bhatti</string> - <string name="pref_changelog_summary">Tap to view changelog</string> - <string name="pref_about_thanks_title">Thank you</string> - <string name="pref_about_thanks_summary">Tap to view open-source contributors</string> - <string name="pref_donate_title">Donate</string> - <string name="pref_donate_summary">QKSMS is free. Help support us by donating!</string> - <string name="pref_about_gplus_title">Google+</string> - <string name="pref_about_gplus_summary">Join the QKSMS Beta Testing community on Google+</string> - <string name="pref_about_github_title">GitHub</string> - <string name="pref_about_github_summary">QKSMS is open source. Contribute and report issues on GitHub</string> - <string name="pref_about_crowdin_title">Crowdin</string> - <string name="pref_about_crowdin_summary">Join the QKSMS translation project on Crowdin</string> - <!--Preference subcategory--> - <string name="pref_subcat_theme">Theme</string> - <!--Preference subcategory--> - <string name="pref_subcat_system_bars">System bars</string> - <!--Preference subcategory--> - <string name="pref_subcat_categories">Categories</string> - <!--Preference subcategory--> - <string name="pref_subcat_font">Font</string> - <!--Preference subcategory--> - <string name="pref_subcat_messages">Messages</string> - <!--Preference subcategory--> - <string name="pref_subcat_avatars">Avatars</string> - <string name="donate_google">Donate with Google</string> - <string name="donate_google_summary">Google takes 30% of donations</string> - <string name="donate_paypal">Donate with PayPal</string> - <string name="donate_paypal_button">Donate any amount</string> - <string name="donate_paypal_button_summary">Buy me anything you want!</string> - <!--Donation product name--> - <string name="product_name_donation">Donation</string> - <!--$1 donation product name--> - <string name="product_name_donate_1">Donate $1 USD</string> - <!--$5 donation product name--> - <string name="product_name_donate_5">Donate $5 USD</string> - <!--$3 donation product name--> - <string name="product_name_donate_10">Donate $10 USD</string> - <!--$1 donation product description--> - <string name="product_description_donate_1">Buy me a Coke</string> - <!--$5 donation product description--> - <string name="product_description_donate_5">Buy me a sandwich</string> - <!--$10 donaion product description--> - <string name="product_description_donate_10">Buy me lunch</string> - <string name="title_settings">설정</string> - <string name="title_search">Search</string> - <string name="title_compose">문자작성</string> - <string name="title_conversation_list">대화 목록</string> - <string name="title_blocked">Blocked</string> - <string name="title_changelog">체인지로그</string> - <string name="title_picker">새로운 메시지</string> - <string name="title_donate">Donate</string> - <string name="title_qk_responses">QK Responses</string> - <string name="title_block_address">Block number</string> - <string name="title_unblock_address">Unblock number</string> - <string name="title_conversations_selected">%s selected</string> - <string name="title_palette">Palette</string> - <string name="title_rgb">RGB</string> - <!-- Menu shown in the context menu when long pressing on a message when the message contains - one or more phone numbers and/or email addresses and the number or email is new to - contacts. [CHAR LIMIT=50] --> - <string name="menu_add_address_to_contacts">Add <xliff:g id="contactEmailOrNumber">%s</xliff:g> to People</string> - <!-- Context menu item on an individual message for viewing an attached slideshow --> - <string name="view_slideshow">슬라이드쇼 보기</string> - <!-- Context menu item on an individual message for viewing message details such as time and date --> - <string name="view_message_details">자세히 보기</string> - <!-- Context menu item on an individual message for viewing a delivery report --> - <string name="view_delivery_report">보고서 보기</string> - <!-- Context menu item on an individual message for deleting only that message --> - <string name="delete_message">삭제</string> - <!-- Abbreviation for "kilobyte" --> - <string name="kilobyte">KB</string> - <!-- Individual message context menu item --> - <string name="copy_message_text">문자 복사하기</string> - <!-- Header for context menu on an individual message --> - <string name="message_options">문자 옵션</string> - <!-- Delivery Header View --> - <!-- Title of "Report" window --> - <string name="delivery_header_title">보고서</string> - <!--Text for app restart confirmation dialog--> - <string name="restart_message">변경사항을 적용하려면 QKSMS를 재시작 해야합니다.</string> - <!--Dialog title for asking if a user wants to delete a conversation--> - <string name="delete_conversation">Delete conversations</string> - <!--Dialog title for asking if a user wants to delete all failed messages--> - <string name="delete_all_failed">Delete failed messages</string> - <!--CDialog title for asking if a user wants to delete a conversation--> - <string name="delete_confirmation">Are you sure you would like to delete (%s) conversations?</string> - <!--CDialog title for asking if a user wants to delete all failed messages--> - <string name="delete_all_failed_confirmation">Are you sure you would like to delete failed messages from (%s) conversations?</string> - <!--(Unused) Dialog title shown if APNs have not been set--> - <string name="apns_not_set">APN이 아직 설정되지 않았습니다.</string> - <!--(Unused) Dialog description shown if APNs have not been set--> - <string name="apns_not_set_description">아직 APN 설정을 하지 않아 MMS가 작동하지 않고 있습니다. QKSMS가 문제를 해결할 수 있도록 확인 버튼을 눌러주세요:)</string> - <!--Dialog title show if MMS hasn't been configured--> - <string name="set_up_mms_title">Set up MMS?</string> - <!--Dialog description shown if MMS hasn't yet been configured--> - <string name="set_up_mms_description">It appears that MMS hasn\'t been configured in QKSMS yet. Press okay automatically configure MMS.</string> - <!-- Dialog message text explaining that a draft message will not be saved due to invalid recipients --> - <string name="discard_message_reason">Your message will be discarded because it has no valid recipients.</string> - <string name="invalid_code">Invalid code</string> - <!--Button to restart app now instead of manually later--> - <string name="restart">재시작</string> - <!--Notification action to reply to a message--> - <string name="reply">답장</string> - <!--Notification action to reply to a message--> - <string name="reply_qksms">Reply via QKSMS</string> - <!--Notification action to mark a message as read--> - <string name="read">읽음</string> - <!--Notification action to mark a message as read--> - <string name="mark_read">Mark as read</string> - <!--Notification action to call the sender of a message--> - <string name="call">전화</string> - <!-- Notification toast message --> - <string name="notification_mute_on">Notifications enabled</string> - <string name="notification_mute_off">Notifications disabled</string> - <!--Positive action button--> - <string name="yes">예</string> - <string name="add">Add</string> - <!--Positive action button--> - <string name="save">Save</string> - <!--Positive action button--> - <string name="enable">Enable</string> - <!--Positive action button--> - <string name="upgrade_now">Set now</string> - <!--Positive action button--> - <string name="okay">Okay</string> - <!--Positive action button--> - <string name="redeem">Redeem</string> - <!--Neutral action button--> - <string name="just_once">Just once</string> - <!--Neutral action button--> - <string name="later">Later</string> - <!--Neutral action button --> - <string name="cancel">취소</string> - <!-- Name of the local user when displaying sender of an outgoing message (personal pronoun) --> - <string name="messagelist_sender_self">나</string> - <!-- Sender to be used if the sender address has been hidden --> - <string name="hidden_sender_address">Hidden sender address</string> - <!-- Subject to display in the conversation list if there is no subject --> - <string name="no_subject_view">(제목 없음)</string> - <!-- Time and date a message is due to expire --> - <string name="expire_on">"Expires: <xliff:g id="date">%s</xliff:g>"</string> - <!-- Formatting for subject displayed inline, prepended to MMS message text --> - <string name="inline_subject">"<Subject: <xliff:g id="subject">%s</xliff:g>>"</string> - <!-- Text of a button appearing for MMS messages that have not yet been downloaded, causing the message to be downloaded (imperative verb) --> - <string name="download">다운로드 하기</string> - <!-- Message displayed in place of the "download message" button once it has been pressed, indicating that the download is in progress --> - <string name="downloading">다운로드 중</string> - <!-- Toast message while an image is being resized --> - <string name="compressing">Picture too large. Compressing\u2026</string> - <!-- Header shown above favorite contacts in QKCompose --> - <string name="favorites">Starred contacts</string> - <!-- Word represents 'self' in a conversation --> - <string name="me">나</string> - <string name="menu_edit">편집하기</string> - <string name="menu_delete_messages">메시지 삭제</string> - <string name="menu_delete_failed">Delete failed messages</string> - <string name="menu_lock">잠금</string> - <string name="menu_unlock">잠금 해제</string> - <!-- When the user tries to view message details and some error occurs while - retrieving those details, this message will be shown. --> - <string name="cannot_get_details">Can\'t get details.</string> - <!-- Title of "Message details" dialog --> - <string name="message_details_title">Message details</string> - <!-- Label in "Message details" dialog --> - <string name="message_type_label">Type\u000A</string> - <!-- "Type" value in "Message details" dialog --> - <string name="text_message">Text message</string> - <!-- "Type" value in "Message details" dialog --> - <string name="multimedia_message">Multimedia message</string> - <!-- "Type" value in "Message details" dialog --> - <string name="multimedia_notification">Multimedia message notification</string> - <!-- Label in "Message details" dialog showing who sent the message. --> - <string name="from_label">From\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="to_address_label">To\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="bcc_label">Bcc\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="sent_label">Sent\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="received_label">Received\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="saved_label">Saved\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="subject_label">Subject\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="message_size_label">Message size\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="priority_label">Priority\u000A</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_high">High</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_normal">Normal</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_low">Low</string> - <!-- Label in "Message details" dialog --> - <string name="message_class_label">Message class\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="error_code_label">Error code\u000A</string> - <!-- Alert dialog title when creating a slideshow [CHAR LIMIT=none] --> - <string name="building_slideshow_title">Building slideshow</string> - <!-- Tag appearing on conversations in the conversation list that contain a draft message --> - <string name="has_draft">Draft</string> - <!-- In conversation list items, this is the separator between a contact's name and the draft stamp [CHAR LIMIT=5] --> - <string name="draft_separator">,\u0020</string> - <!-- In conversation list items, this comes after the receipient's name and contains the number of messages in the thread [CHAR LIMIT=5] --> - <string name="message_count_format">\u00a0<xliff:g id="number" example="1">%1$s</xliff:g></string> - <!-- For debugging: Dialog box title indicating there's a situation where data has unexpectedly changed --> - <string name="error_state">Inconsistent state</string> - <!-- For debugging: Dialog box text indicating there's a situation where data has unexpectedly changed --> - <string name="error_state_text">The state of threads and recipients is inconsistent. Please capture a bug report and report it via http://go/droidanizer </string> - <!-- This is the dialog title for the "Select link" dialog, shown when the user clicks on a - chat in the chat history view if there are links in the chat message. The dialog displays the - links if there are any --> - <string name="select_link_title">Choose action</string> - <!-- In message list items, this string builds the timestamp line when the message is in a group [CHAR LIMIT=NONE] --> - <string name="message_timestamp_format"><xliff:g id="string" example="Fred Flinstone">%1$s</xliff:g>\u0020-\u0020<xliff:g id="string" example="9:39AM">%2$s</xliff:g></string> - <!--Message sending status: sending--> - <string name="status_sending">보내는 중...</string> - <!--Message sending status: failed--> - <!--<string name="status_failed">Failed. Tap to retry</string>--> - <!-- Delivery Report Activity --> - <!-- Status in "Report" window --> - <string name="status_none">(None)</string> - <!-- Status in "Report" window --> - <string name="status_pending">Pending</string> - <!-- Status in "Report" window --> - <string name="status_read">Read</string> - <!-- Status in "Report" window --> - <string name="status_received">Received</string> - <!-- Status in "Report" window --> - <string name="status_failed">Failed. Tap for options</string> - <!-- Status in "Report" window --> - <string name="status_unread">Unread</string> - <!-- Status in "Report" window --> - <string name="status_rejected">Rejected</string> - <!-- Label in "Report" window --> - <string name="recipient_label">Recipient:\u0020</string> - <!-- Label in "Report" window --> - <string name="status_label">Status:\u0020</string> - <!-- Label in "Report" window [CHAR LIMIT=50]--> - <string name="delivered_label">Delivered:\u0020</string> - <string name="do_something">Do something</string> - <!-- Confirm Delete --> - <!-- Delete confirmation dialog title --> - <string name="confirm_dialog_title">Delete?</string> - <!-- Delete confirmation dialog title for locked messages --> - <string name="confirm_dialog_locked_title">Delete locked message?</string> - <!-- This message is displayed in a confirmation dialog when the user selects one or more - conversations and then taps the "Delete" button. --> - <plurals name="confirm_delete_conversation"> - <!-- Case of 1 result. --> - <!-- Case of 0 or 2 or more results. --> - <item quantity="other"><xliff:g id="number" example="15">%1$s</xliff:g> conversations will be deleted.</item> - </plurals> - <string name="confirm_delete_conversation">The entire thread will be deleted.</string> - <!-- Delete all threads confirmation dialog message --> - <string name="confirm_delete_all_conversations">All threads will be deleted.</string> - <!-- Delete message confirmation dialog message --> - <string name="confirm_delete_message">The message will be deleted.</string> - <!-- Delete message confirmation dialog message for a locked message --> - <string name="confirm_delete_locked_message">Delete this locked message?</string> - <!-- Delete all the messages on the SIM dialog message --> - <string name="confirm_delete_all_SIM_messages">All messages on the SIM card will be deleted.</string> - <!-- Delete the selected message on the SIM dialog message --> - <string name="confirm_delete_SIM_message">This message on the SIM card will be deleted.</string> - <!-- Delete unlocked checkbox title --> - <string name="delete_unlocked">Delete locked messages</string> - <!-- Delete button title --> - <string name="delete">삭제</string> - <!-- More button title --> - <string name="more">더보기</string> - <!-- More button summary --> - <string name="more_summary">Tap to see more</string> - <!-- Action bar mode title when multi-selecting conversations --> - <string name="select_conversations">Choose conversations</string> - <!-- Show this in the middle of the main activity when there are no conversations [CHAR LIMIT=none] --> - <string name="no_conversations">No conversations.</string> - <!-- Show this in the middle of the main activity when loading conversations [CHAR LIMIT=none] --> - <string name="loading_conversations">Loading conversations.</string> - <!-- Tells the user that QKSMS isn't the default SMS app --> - <string name="not_default">기본 SMS</string> - <!-- Tells the user they need to set QKSMS as the default app in order to use this feature --> - <string name="default_info">QKSMS needs to be your SMS app to do that</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to mark messages as read --> - <string name="not_default_mark_read">QKSMS must be your SMS app to mark messages read</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to mark messages as unread --> - <string name="not_default_mark_unread">QKSMS must be your SMS app to mark messages unread</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to send messages --> - <string name="not_default_delete">QKSMS must be your SMS app to delete messages</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to delete messages --> - <string name="not_default_send">QKSMS must be your SMS app to send messages</string> - <!-- Tells the user they should set QKSMS as the default messaging app --> - <string name="not_default_first">Some things won\'t work until QKSMS is the default SMS app</string> - <string name="delayed_messaging_info">Delayed messaging allows you to cancel messages before they send. Change the default behavior and more in Settings</string> - <string name="delayed_duration_bounds_error">Duration must be between 1 and 30 seconds</string> - <!-- Dialog title for the Read Report dialog. --> - <string name="confirm">제출</string> - <!-- Dialog text for the Read Report dialog. --> - <string name="message_send_read_report">A read report will be sent.</string> - <!-- Dialog title for updating app icon color --> - <string name="update_icon_title">Update icon color</string> - <!-- Dialog message for updating app icon color --> - <string name="update_icon_message">QKSMS must be restarted when changing the icon color</string> - <string name="dialog_conversation_details_title">Conversation details</string> - <string name="dialog_conversation_details_last_message_date">Last message date</string> - <string name="dialog_conversation_details_message_count">Message count</string> - <string name="dialog_conversation_details_recipients">Recipients (%s)</string> - <string name="dialog_should_i_answer_title">Should I Answer? not installed</string> - <string name="dialog_should_i_answer_message">Would you like to download the app from Google Play now?</string> - <string name="dialog_delete_old_messages">Are you sure you want to automatically delete old messages?</string> - <!-- Title for audio file picker --> - <string name="select_audio">Choose audio</string> - <!-- Menu title to copy an attachment to the shared storage [CHAR LIMIT=25] --> - <string name="copy_to_sdcard">Save attachment</string> - <!-- Toast message on successful copy to shared storage [CHAR LIMIT=30] --> - <string name="copy_to_sdcard_success">Attachment saved.</string> - <!-- Toast message on failed copy to shared storage [CHAR LIMIT=30] --> - <string name="copy_to_sdcard_fail">Couldn\'t save attachment.</string> - <!-- Menu title to save a sound as a ringtone --> - <string name="save_ringtone">Save as ringtone</string> - <!-- Toast message on successful copying ringtone to drm provider --> - <string name="saved_ringtone">Ringtone saved.</string> - <!-- Toast message on failed copying ringtone to drm provider --> - <string name="saved_ringtone_fail">Couldn\'t save ringtone.</string> - <!-- Menu item --> - <!-- Menu item [CHAR LIMIT=40] --> - <string name="menu_group_participants">Group participants</string> - <!--Toast shown when a draft is saved--> - <string name="toast_draft">Saved draft</string> - <!--Toast shown when a conversation is deleted--> - <string name="toast_conversation_deleted">대화가 삭제되었습니다.</string> - <!--Toast shown when device is low on storage--> - <string name="toast_low_memory">"Phone storage is full. Delete some files to free space."</string> - <!--Toast shown to tell user that forwarding messages doesn't work yet--> - <string name="toast_forward">This feature has not yet been implemented. For now please use the Copy text option and paste that in the conversation you would like to send it</string> - <!--Toast shown for unimplemented features--> - <string name="toast_unimplemented">This feature has not yet been implemented</string> - <!--Toast shown when a message fails to send--> - <string name="toast_message_failure">Message failed to send</string> - <!--Toast shown when a message is delivered--> - <string name="toast_message_delivered">Message delivered</string> - <!--Toast shown when a message is not delivered--> - <string name="toast_message_not_delivered">Message not delivered</string> - <!--Toast shown when default APNs are loaded--> - <string name="toast_default_apns_loaded">Loaded default APN settings</string> - <!--Toast shown when text is copied to the clipboard--> - <string name="toast_copy_text">클립보드에 복사되었습니다.</string> - <!--Toast shown when Google Play Services is not available for purchasing a product--> - <string name="toast_billing_not_available">Purchase requires Google Play Store (billing) on your Android</string> - <!--Toast shown when Google Play Services is not available for purchasing a product--> - <string name="toast_endlessjabber_not_installed">EndlessJabber is not installed, opening Google Play</string> - <string name="toast_changelog_error">Couldn\'t load the changelog. Please try again later</string> - <string name="toast_conversation_error">Couldn\'t open conversation</string> - <string name="toast_deleting_old_messages">Your old messages will be deleted shortly</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_1">Thank you for donating! You\'re my new best friend.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_2">Thanks for the donation! I love you.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_3">Thanks for donating! You\'re helping QKSMS become the best texting app ever made.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_4">Thanks for the donation! You\'re awesome.</string> - <!--Menu option to mute conversation--> - <string name="menu_mute_conversation">Mute conversation</string> - <!--Menu option to mute conversation--> - <string name="menu_unmute_conversation">Unmute conversation</string> - <string name="menu_block_conversations">Block conversations</string> - <string name="menu_unblock_conversations">Unblock conversations</string> - <string name="menu_messages">Messages</string> - <string name="menu_blocked">Blocked</string> - <string name="menu_blocked_conversations">Blocked (%s new)</string> - <string name="menu_unblocked_conversations">Messages (%s new)</string> - <string name="menu_notifications">Notifications</string> - <string name="menu_notifications_off">Notifications off</string> - <string name="menu_notification_settings">Conversation settings</string> - <string name="menu_view_details">View details</string> - <string name="menu_mark_read">Mark read</string> - <string name="menu_mark_unread">Mark unread</string> - <string name="menu_delete_conversation">Delete conversation</string> - <string name="menu_multi_select">Select conversation</string> - <string name="menu_done">Done</string> - <string name="failed_message_title">Failed message options</string> - <!--Toast shown to tell the user that they don't have a photo attachments app, and suggests that they download one--> - <string name="attachment_app_not_found">Attachments app not found. Try installing a photo gallery app!</string> - <string name="attachment_camera_error">The camera could not be opened</string> - <string name="pref_max_mms_attachment_size">Maximum MMS attachment size</string> - <string name="error_no_recipients">Select some contacts to send this message to!</string> - <string name="error_file_not_found">QKSMS can\'t access the file you\'re trying to share!</string> - <string name="sending_blocked_welcome_screen_message">Hold up! You\'ll get to send real messages in a minute!</string> - <string name="notification_colored_icon_ready">Touch to add to your launcher from home screen.</string> - <string name="notification_title_colored_icon_ready">QKSMS colored icon is ready</string> - <string name="icon_ready">Your new icon is ready!</string> - <string name="icon_ready_message">You can now add it to your home screen again with the updated color.</string> - <string name="dont_ask_again">Don\'t ask again</string> - <string name="warning">Stagefright warning</string> - <string name="stagefright_warning">Video messages may contain a harmful exploit that can leave your phone vulnerable to attacks. Would you like to continue?</string> - <!-- MMS DIALOG SETUP STRINGS --> - <string name="mms_setup_set_up_mms_title">Set up MMS?</string> - <string name="mms_setup_set_up_mms_body">It appears that MMS isn\'t set up in QKSMS. Press okay to automatically configure MMS.</string> - <string name="mms_setup_setting_up_later_title">Setting up MMS later</string> - <string name="mms_setup_setting_up_later_body">Visit the MMS section of Settings to try automatic configuration, contact support, or enter your own configuration.</string> - <string name="mms_setup_no_configurations_found_title">No configurations found</string> - <string name="mms_setup_no_configurations_found_body">We couldn\'t find an MMS configuration for your carrier automatically. Press okay to contact support. We\'ll help you get set up! </string> - <string name="mms_setup_one_configuration_found_title">One configuration found</string> - <string name="mms_setup_one_configuration_found_body">We have found an MMS configuration for the %s carrier. Does that sound right?</string> - <string name="mms_setup_multiple_configurations_found_title">Multiple configuration found</string> - <string name="mms_setup_multiple_configurations_found_body">We have found multiple MMS configurations. Choose your carrier from the list, or press N/A if your carrier isn\'t on the list.</string> - <string name="mms_setup_next_steps_title">Next steps</string> - <string name="mms_setup_next_steps_body">Visit the MMS section of Settings to try automatic configuration again, contact support, or enter your own configuration.</string> - <string name="mms_setup_success_title">Success!</string> - <string name="mms_setup_success_body">If you encounter any issues, visit the MMS section of Settings to try automatic configuration again, contact support, or enter your own configuration.</string> - <string name="na">N/A</string> - <string name="no">No</string> - <string name="pref_automatically_configure_mms">Automatically Configure MMS</string> - <string name="pref_mms_contact_support">Contact Support</string> - <string name="pref_category_sending_mms">Sending MMS</string> - <string name="pref_category_mms_configuration">MMS Configuration</string> - <string name="pref_mms_contact_support_summary">Contact the QKSMS team for help setting up MMS</string> - <string name="pref_markdown_enabled">Text formatting</string> - <string name="pref_markdown_enabled_summary">Use markdown syntax to get bold, underline, and italics in your messages</string> - <string name="want_read_indicators">Want read indicators?</string> - <string name="color_swatch_description">Color %1$d</string> - <string name="color_swatch_description_selected">Color %1$d selected</string> - <string name="color_picker_default_title">Select a Color</string> - <string name="message_delivered">Message Delivered</string> - <string name="message_not_delivered">Message Not Delivered</string> - <string name="error">Error</string> - <string name="invalid_destination">Invalid destination address.</string> - <string name="service_not_activated">Service not activated on network.</string> - <string name="service_message_not_found">Message expired or not available.</string> - <string name="service_network_problem">Couldn\'t send due to network problem.</string> - <string name="message_queued">Currently can\'t send your message. It will be sent when the service becomes available.</string> - <string name="download_later">Can\'t download right now. Try again later.</string> - <string name="no_apn">No APN specified for the app, you need to set it up in settings!</string> - <string name="no_subject">(No subject)</string> - <string name="unknown_sender">Unknown sender</string> - <string name="dl_failure_notification">Couldn\'t download message <xliff:g id="subject">%1$s</xliff:g> from <xliff:g id="from">%2$s</xliff:g>.</string> - <string name="auto_select_multiple_apns">Multiple different configurations have been found. Try one now. If it doesn\'t work, you can try a new one by going to Settings > Advanced > Load default APNs.</string> - <string name="auto_select_apn">Automatically Select APNs</string> - <string name="auto_select_failed_title">Automatic configuration failed</string> - <string name="auto_select_failed">Try searching for your carrier\'s APN settings (MMSC, Port, and Proxy) and entering them in Settings > Advanced.</string> - <string name="date_yesterday">Yesterday</string> - <string name="date_just_now">Just now</string> - <string name="compose_loading_attachment">Loading attachment</string> - <string name="hint_no_messages">No messages yet.\nClick the + to send one!</string> - <string-array name="resend_menu"> - <item>Resend</item> - <item>Edit</item> - <item>Delete</item> - </string-array> - <string-array name="message_menu"> - <item>메시지 전달</item> - <item>복사</item> - <item>자세히 보기</item> - <item>메시지 삭제</item> - </string-array> - <string-array name="background_titles"> - <item>Material Light</item> - <item>Material Dark</item> - <item>Black</item> - </string-array> - <string-array name="font_sizes"> - <item>작음</item> - <item>보통</item> - <item>크게</item> - <item>매우크게</item> - </string-array> - <string-array name="font_families"> - <item>Roboto Regular</item> - <item>Roboto Condensed</item> - <item>System font</item> - </string-array> - <string-array name="font_weights"> - <item>Light</item> - <item>일반</item> - </string-array> - <!-- String to match as no subject and filter out as a subject. For example, if the - subject string is "no subject", we won't display that. We'll pretend - no subject string was delivered. --> - <string-array name="empty_subject_strings"> - <item>제목 없음</item> - </string-array> - <string-array name="qk_responses"> - <item>확인</item> - <item>잠시만 기다려주세요.</item> - <item>On my way</item> - <item>감사합니다</item> - <item>좋아요</item> - <item>무슨 일 이에요?</item> - <item>동의</item> - <item>아니요</item> - <item>사랑해요</item> - <item>죄송합니다</item> - <item>웃음</item> - <item>괜찮아요</item> - </string-array> - <string-array name="enter_button_options"> - <item>Show emoji</item> - <item>New line</item> - <item>Send message</item> - </string-array> - <string-array name="notification_private_options"> - <item>Show all</item> - <item>Hide message</item> - <item>Hide message and sender</item> - </string-array> - <!-- Max MMS attachment sizes. I.e. will compress pictures that are larger than 300 KB down to - under 300KB. --> - <string-array name="max_mms_attachment_sizes"> - <item>300 KB</item> - <item>600 KB</item> - <item>1 MB</item> - <item>제한없음</item> - </string-array> -</resources> diff --git a/QKSMS/src/main/res/values-lt/strings.xml b/QKSMS/src/main/res/values-lt/strings.xml deleted file mode 100644 index 61e6b5094..000000000 --- a/QKSMS/src/main/res/values-lt/strings.xml +++ /dev/null @@ -1,769 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!--Generated by crowdin.com--> -<resources xmlns:xliff="http://schemas.android.com/apk/res-auto"> - <!--Slogan--> - <string name="slogan">Meilės text dar kartą.</string> - <!--Text shown when a phone number cannot be found--> - <string name="unknown_number">Nežinomas numeris</string> - <!--Content description for photos--> - <string name="popup_photo_CD">Nuotrauka</string> - <!--Text to be displayed while content is loading--> - <string name="loading">Kraunama…</string> - <!--Test string--> - <string name="test">Test string</string> - <!--Hint for contacts text field--> - <string name="hint_contacts">Įrašykite gavėjus</string> - <!--Hint for search text field--> - <string name="hint_search">Ieškoti kažko</string> - <!--Hint for message reply text field--> - <string name="hint_reply">Rašykite žinutę</string> - <!--Hint for code redemption--> - <string name="hint_redeem">Enter code</string> - <string name="hint_hex">Hex</string> - <!--Text shown for single new message in notification--> - <string name="new_message">Nauja žinutė</string> - <!--Text shown after number of unread messages in notification (ex. 3 new messages)--> - <string name="new_messages">naujos žinutės</string> - <!--Text shown for single failed message in notification--> - <string name="failed_message">Nepavyko išsiųsti žinutės</string> - <!--Text shown after number of failed messages in notification (ex. 3 messages failed to send)--> - <string name="failed_messages">žinučių išsiųsti nepavyko</string> - <!--Text shown under failed message count--> - <string name="failed_messages_summary">Paspauskite, kad peržiūrėtumėte</string> - <!--QuickCompose notification title--> - <string name="quickcompose">QK Compose</string> - <!--QuickCompose notification text--> - <string name="quickcompose_detail">Paspauskite, jei norite išsiųsti žinutę</string> - <!--Welcome screen intro button--> - <string name="welcome_start">Pradėkime!</string> - <!--Allows user to skip welcome screen--> - <string name="welcome_skip">PRALEISTI</string> - <!--Allows user to finish the welcome screen--> - <string name="welcome_finish">BAIGTI</string> - <!--Indicates to user they can pick a color--> - <string name="welcome_theme_title">Išsirink spalvą</string> - <!--Indicates to user they can pick any colors--> - <string name="welcome_theme_description">Betkokią spalvą.</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_night_description">Easy on the eyes.</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_night_hint">Toggle me</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_quickreply_title">QK atsakymas</string> - <!--QK Reply explanation--> - <string name="welcome_quickreply_description">Reply to messages faster than ever.</string> - <!--Prompts user to try QK Reply--> - <string name="welcome_quickreply_hint">Išbandyk!</string> - <!--QK Reply demo message--> - <string name="welcome_quickreply_message_1">Wow! Now wasn\'t that awesome? You can view your entire conversation at a glance. Tap outside the popup or press the checkmark to dismiss it.</string> - <!--QK Reply demo message--> - <string name="welcome_quickreply_message_2">This is QK Reply. Now you can reply to messages from anywhere. Tap the expand button to see what happens next :)</string> - <!--Settings option in menu--> - <string name="menu_settings">Nustatymai</string> - <!--Search option in menu--> - <string name="menu_search">Ieška</string> - <!--Show full conversation in QuickReply--> - <string name="menu_show_all">Show all messages</string> - <!--Show only unread messages in QuickReply--> - <string name="menu_show_unread">Show unread messages</string> - <!--Open conversation option in menu (shown in QuickReply)--> - <string name="menu_open_thread">Atidaryti pokalbį</string> - <!--Forward message option in menu--> - <string name="menu_forward">Persiųsti žinutę</string> - <!--Call contact option in menu--> - <string name="menu_call">Skambinti</string> - <!--Mark a message/conversation as read option in menu--> - <string name="menu_read">Pažymėti kaip perskaitytą</string> - <!--Delete a message option in menu--> - <string name="menu_delete">Delete</string> - <!--Donate option in menu--> - <string name="menu_billing">Donate</string> - <!--Copy text option in menu--> - <string name="menu_copy">Kopijuoti tekstą</string> - <!--Changelog option in menu--> - <string name="menu_changelog">"Kas naujo programėlėje"</string> - <!--Expand settings option in menu--> - <string name="menu_show_all_prefs">Show all</string> - <!--Show less settings option in menu--> - <string name="menu_show_fewer_prefs">Show fewer</string> - <!--Title for message details popup--> - <string name="details_title">Išsamiau</string> - <!--Title for address that message is being sent to in message details popup--> - <string name="details_to">Kam</string> - <!--Title for address that message is sent from in message details popup--> - <string name="details_from">Nuo</string> - <!--Title for text of a message in message details popup--> - <string name="details_body">Tekstas</string> - <!--Title for date sent of a message in message details popup--> - <string name="details_date_sent">Išsiuntimo data</string> - <!--Title for date received of a message in message details popup--> - <string name="details_date_received">Gavimo data</string> - <!--Title for rate snackbar--> - <string name="rate_title">Like QKSMS?</string> - <!--Title for rate button--> - <string name="rate_action">Rate</string> - <string name="pref_category_appearance">Išvaizda</string> - <string name="pref_category_summary_appearance">Themes, fonts, colors, avatars, and more</string> - <string name="pref_category_general">Pagrindiniai</string> - <string name="pref_category_summary_general">Delivery, message sending, formatting</string> - <string name="pref_category_blocking">Message blocking</string> - <string name="pref_category_notifications">Pranešimai</string> - <string name="pref_category_summary_notifications">Sounds, LED, privacy</string> - <string name="pref_category_mms">MMS</string> - <string name="pref_category_summary_mms">Configure MMS (APNs), max size, group messaging</string> - <string name="pref_category_quickreply">QK Reply</string> - <string name="pref_category_summary_quickreply">QK Reply, popup options</string> - <string name="pref_category_quickcompose">QK Compose</string> - <string name="pref_category_summary_quickcompose">QK Compose, starred contacts</string> - <string name="pref_category_about">Apie</string> - <string name="pref_category_summary_about">Version, changelog, authors, thanks</string> - <string name="pref_theme">Theme color</string> - <string name="pref_theme_summary_alt">Tap to change theme</string> - <string name="pref_icon">Icon color</string> - <string name="pref_icon_summary">Tap to change the QKSMS icon color</string> - <string name="pref_status_tint">Pranešimų juostos spalvos efektas</string> - <string name="pref_navigation_tint">Navigacijos juostos spalvos efektas</string> - <string name="pref_background">Background color</string> - <string name="pref_background_summary">Tap to change background color</string> - <string name="pref_bubbles">Message bubbles</string> - <string name="pref_bubbles_summary">Tap to change message bubble preferences</string> - <string name="pref_night">Naktinis rėžimas</string> - <string name="pref_night_summary">Save battery and reduce eye strain</string> - <string name="pref_night_amoled">Visiškai juodas fonas</string> - <string name="pref_night_amoled_summary">Sutaupo daugiau baterijos ant įrenginių su AMOLED ekranais</string> - <string name="pref_bubble_style_new">Use new bubble style</string> - <string name="pref_color_sent">Color sent messages</string> - <string name="pref_color_sent_summary">Color the background bubbles for outgoing messages</string> - <string name="pref_color_received">Color received messages</string> - <string name="pref_color_received_summary">Color the background bubbles for incoming messages</string> - <string name="pref_hide_avatar_conversations">Paslėpti pokalbių sąrašo nuotraukas</string> - <string name="pref_hide_avatar_conversations_summary">Paslepia kontaktų nuotraukas pokalbių sąraše</string> - <string name="pref_hide_avatar_sent">Paslėpti išsiųstų žinučių nuotraukas</string> - <string name="pref_hide_avatar_sent_summary">Paslepia jūsų nuotrauką žinučių sąraše</string> - <string name="pref_hide_avatar_received">Paslėpti gautų žinučių nuotraukas</string> - <string name="pref_hide_avatar_received_summary">Paslepia kontaktų nuotraukas žinučių sąraše</string> - <string name="pref_font_family">Šrifto išvaizda</string> - <string name="pref_font_size">Šrifto dydis</string> - <string name="pref_font_weight">Šrifto stambumas</string> - <string name="pref_message_count">Žinučių kiekis</string> - <string name="pref_message_count_summary">Show the number of messages for each conversation</string> - <string name="pref_sent_timestamps">Sent timestamps</string> - <string name="pref_sent_timestamps_summary">Show the timestamp for when a message was sent, not received</string> - <string name="pref_force_timestamps">Force timestamps</string> - <string name="pref_force_timestamps_summary">Enable timestamps for all messages</string> - <string name="pref_key_timestamp_delay">New timestamp delay</string> - <string name="pref_key_timestamp_delay_summary">The number of minutes which must elapse between two messages in order for a new timestamp to be shown.</string> - <string name="pref_compose_favorites">Starred contacts</string> - <string name="pref_compose_summary_favorites">Show your starred contacts in the QK Compose window, making them only a tap away</string> - <string name="pref_prox_sensor_call">Proximity sensor</string> - <string name="pref_prox_sensor_call_summary">While in a conversation, bring your phone to your ear to start a call</string> - <string name="pref_delivery">Pristatymo patvirtinimai</string> - <string name="pref_delivery_summary">Patvirtina, kad žinutės buvo sėkmingai išsiųstos</string> - <string name="pref_delivery_toast">Show toast</string> - <string name="pref_delivery_toast_summary">Show a short toast to indicate a message being delivered</string> - <string name="pref_delivery_vibrate">Vibracija</string> - <string name="pref_delivery_vibrate_summary">Vibruoja kai pristatoma žinutė</string> - <string name="pref_delete_old_messages">Delete old messages</string> - <string name="pref_delete_old_messages_summary">Automatically delete messages once they\'re old enough</string> - <string name="pref_delete_old_messages_unread">Unread messages</string> - <string name="pref_delete_old_messages_unread_summary">Automatically delete unread messages after %s days</string> - <string name="pref_delete_old_messages_read">Read messages</string> - <string name="pref_delete_old_messages_read_summary">Automatically delete read messages after %s days</string> - <string name="pref_yappy">Yappy integration</string> - <string name="pref_endlessjabber_summary">Enable full support for Yappy</string> - <string name="pref_blocked_conversations">Blocked conversations</string> - <string name="pref_blocked_conversations_summary">Long-press on a conversation and block to move to blocked inbox and stop notifications</string> - <string name="pref_block_future">Block future messages</string> - <string name="pref_block_future_summary">Add additional phone numbers to block</string> - <string name="pref_should_i_answer">Should I Answer? Integration</string> - <string name="pref_should_i_answer_summary">Automatically delete incoming messages from numbers which are blocked through Should I Answer?</string> - <string name="pref_mobile_only">Mobile numbers</string> - <string name="pref_mobile_only_summary">Only show mobile numbers in contact suggestions</string> - <string name="pref_auto_emoji">Automatic emoji</string> - <string name="pref_auto_emoji_summary">Replace text with image emoji</string> - <string name="pref_enter_button">Enter button</string> - <string name="pref_enter_button_summary">Tap to change keyboard enter button behavior</string> - <string name="pref_compose_group">Žinučių siuntimas grupei</string> - <string name="pref_compose_group_summary">Rašydami pranešimą keliems žmonės, pasirinkite „Žinučių siuntimas grupei“ vietoj individualių žinučių</string> - <string name="pref_auto_download">Auto download MMS</string> - <string name="pref_auto_download_summary">Automatically download MMS messages when they become available</string> - <string name="pref_auto_data">Automatic data</string> - <string name="pref_auto_data_summary">Turn on data automatically when sending or receiving MMS</string> - <string name="pref_split">Išskaidyti žinutes</string> - <string name="pref_split_summary">Išskaido ilgesnes žinutes į atskiras</string> - <string name="pref_split_counter">Skaidymo žymėjimas</string> - <string name="pref_split_counter_summary">Sunumeruoja kiekvieną išskaidytą žinutę jos pradžioje</string> - <string name="pref_long_as_mms">Siųsti ilgas žinutes kaip MMS</string> - <string name="pref_long_as_mms_summary">Siunčia ilgas žinutes kaip MMS užuot išskaidžiusi jas</string> - <string name="pref_long_as_mms_after">Siųsti ilgas žinutes kaip MMS po...</string> - <string name="pref_long_as_mms_after_summary">Send long messages as MMS when they exceed the length of a number of messages</string> - <string name="pref_return">Rodyti eilutės perkėlimo mygtuką (Enter)</string> - <string name="pref_return_summary">Rodo eilutės perkėlimo mygtuką vietoj Emoji mygtuko</string> - <string name="pref_text">Text</string> - <string name="pref_notifications">Įjungti pranešimus apie naujas žinutes</string> - <string name="pref_led">Naudoti įspėjamąją LED lemputę</string> - <string name="pref_theme_led">Pranešimų LED lemputės spalva</string> - <string name="pref_wake">Wake phone</string> - <string name="pref_wake_summary">Įjunk savo ekraną, kai gauni naują žinutę</string> - <string name="pref_notifications_private">Privatūs pranešimai</string> - <string name="pref_notifications_private_summary">Tap to change what should be hidden in notfication</string> - <string name="pref_ringtone">Pranešimų garsas</string> - <string name="pref_ringtone_summary">Pasirinkite pranešimų garsą</string> - <string name="pref_ticker">Rodyti teksto fragmentą</string> - <string name="pref_ticker_summary">Parodo naujos žinutės fragmentą pranešimų juostoje</string> - <string name="pref_vibration">Vibracija</string> - <string name="pref_vibration_summary">Vibruoti, kai gaunamas naujas pranešimas</string> - <string name="pref_notification_call">Skambinimo mygtukas</string> - <string name="pref_notification_call_summary">Leidžia skambinti žinutės siuntėjui tiesiai iš pranešimo</string> - <string name="pref_dimiss_read">Mark as read</string> - <string name="pref_dismiss_read_summary">Mark message as read when notification is cleared</string> - <string name="pref_delayed">Delayed messaging</string> - <string name="pref_delayed_summary">Wait before sending your messages, so you have a chance to review them</string> - <string name="pref_delayed_duration">Delay length (seconds)</string> - <string name="pref_delayed_duration_summary">Time to wait before sending your message</string> - <string name="pref_night_auto">Automatinis nakties rėžimas</string> - <string name="pref_night_auto_summary">Įjungia nakties rėžimą automatiškai pagal laiko nuostatas</string> - <string name="pref_day_start">Diena prasideda</string> - <string name="pref_night_start">Naktis prasideda</string> - <string name="pref_qk_responses">QK atsakymai</string> - <string name="pref_qk_responses_summary">Pakeiskite savo išankstinius nustatymus, kad naudoti iš Android Wear prietaiso</string> - <string name="pref_quickreply_enabled">QK Reply enabled</string> - <string name="pref_quickreply_enabled_summary">Show QK Reply window whenever a new message is received</string> - <string name="pref_tap_to_quit">Spustelėkite, kad atmestumėte</string> - <string name="pref_tap_to_quit_summary">Tap anywhere outside of the window to close it</string> - <string name="pref_quickcompose">QK Compose enabled</string> - <string name="pref_quickcompose_summary">Visada rodo pranešimą, kurį paspaudus rašoma nauja žinutė</string> - <string name="pref_mms_enabled">MMS įgalintas</string> - <string name="pref_mms_enabled_summary">Įgalinti MMS gavimą ir išsiuntimą</string> - <string name="pref_mmsc_url">MMS centras</string> - <string name="pref_mms_proxy">MMS proxy</string> - <string name="pref_mms_port">MMS portas</string> - <string name="pref_apn_chooser">Įkelti numatytuosius APN nustatymus</string> - <string name="pref_strip_unicode">Trumpinti Unicode</string> - <string name="pref_strip_unicode_summary">Keičia pilno ilgio žinutėse nepalaikomus simbolius į simbolius, suderinamus su GSM</string> - <string name="pref_system_bar_flat">Flat system bars</string> - <string name="pref_system_bar_flat_summary">Get rid of the gradient shown on the system UI bars on most KitKat devices</string> - <string name="pref_status_compat">Pranešimų juostos pataisymas</string> - <string name="pref_status_compat_summary">Pataiso problemas, kurias sukelia juostų slėpimo rėžimas, \"Tinted Status Bar\" (Xposed modulis), ar pakeistos DPI nuostatos</string> - <string name="pref_navigation_compat">Navigacijos juostos pataisymas</string> - <string name="pref_navigation_compat_summary">Pataiso problemas, kurias sukelia juostų slėpimo rėžimas, \"Tinted Status Bar\" (Xposed modulis), ar pakeistos DPI nuostatos</string> - <string name="pref_about_version_title">QKSMS versija</string> - <string name="pref_about_authors_title">Autoriai</string> - <string name="pref_about_authors_summary">Moez Bhatti</string> - <string name="pref_changelog_summary">Spustelėkite, kad pamatytumėte pasikeitimų žurnalą</string> - <string name="pref_about_thanks_title">Ačiū</string> - <string name="pref_about_thanks_summary">Spustelėkite, norėdami pamatyti atviro kodo autorius</string> - <string name="pref_donate_title">Donate</string> - <string name="pref_donate_summary">QKSMS is free. Help support us by donating!</string> - <string name="pref_about_gplus_title">Google+</string> - <string name="pref_about_gplus_summary">Join the QKSMS Beta Testing community on Google+</string> - <string name="pref_about_github_title">GitHub</string> - <string name="pref_about_github_summary">QKSMS is open source. Contribute and report issues on GitHub</string> - <string name="pref_about_crowdin_title">Crowdin</string> - <string name="pref_about_crowdin_summary">Join the QKSMS translation project on Crowdin</string> - <!--Preference subcategory--> - <string name="pref_subcat_theme">Theme</string> - <!--Preference subcategory--> - <string name="pref_subcat_system_bars">System bars</string> - <!--Preference subcategory--> - <string name="pref_subcat_categories">Categories</string> - <!--Preference subcategory--> - <string name="pref_subcat_font">Font</string> - <!--Preference subcategory--> - <string name="pref_subcat_messages">Messages</string> - <!--Preference subcategory--> - <string name="pref_subcat_avatars">Avatars</string> - <string name="donate_google">Donate with Google</string> - <string name="donate_google_summary">Google takes 30% of donations</string> - <string name="donate_paypal">Donate with PayPal</string> - <string name="donate_paypal_button">Donate any amount</string> - <string name="donate_paypal_button_summary">Buy me anything you want!</string> - <!--Donation product name--> - <string name="product_name_donation">Donation</string> - <!--$1 donation product name--> - <string name="product_name_donate_1">Donate $1 USD</string> - <!--$5 donation product name--> - <string name="product_name_donate_5">Donate $5 USD</string> - <!--$3 donation product name--> - <string name="product_name_donate_10">Donate $10 USD</string> - <!--$1 donation product description--> - <string name="product_description_donate_1">Nupirkti man Coca-Cola</string> - <!--$5 donation product description--> - <string name="product_description_donate_5">Nupirkti man sumuštinį</string> - <!--$10 donaion product description--> - <string name="product_description_donate_10">Nupirkti man pietus</string> - <string name="title_settings">Nustatymai</string> - <string name="title_search">Ieška</string> - <string name="title_compose">Rašyti</string> - <string name="title_conversation_list">Pokalbiai</string> - <string name="title_blocked">Blocked</string> - <string name="title_changelog">Pasikeitimų sąrašas</string> - <string name="title_picker">Naujos žinutės</string> - <string name="title_donate">Donate</string> - <string name="title_qk_responses">QK atsakymai</string> - <string name="title_block_address">Block number</string> - <string name="title_unblock_address">Unblock number</string> - <string name="title_conversations_selected">%s selected</string> - <string name="title_palette">Palette</string> - <string name="title_rgb">RGB</string> - <!-- Menu shown in the context menu when long pressing on a message when the message contains - one or more phone numbers and/or email addresses and the number or email is new to - contacts. [CHAR LIMIT=50] --> - <string name="menu_add_address_to_contacts">Pridėti <xliff:g id="contactEmailOrNumber">%s</xliff:g> į telefonų knygą</string> - <!-- Context menu item on an individual message for viewing an attached slideshow --> - <string name="view_slideshow">Žiūrėti skaidres</string> - <!-- Context menu item on an individual message for viewing message details such as time and date --> - <string name="view_message_details">Išsamiau</string> - <!-- Context menu item on an individual message for viewing a delivery report --> - <string name="view_delivery_report">Žiūrėti pristatymo ataskaitą</string> - <!-- Context menu item on an individual message for deleting only that message --> - <string name="delete_message">Ištrinti</string> - <!-- Abbreviation for "kilobyte" --> - <string name="kilobyte">KB</string> - <!-- Individual message context menu item --> - <string name="copy_message_text">Kopijuoti tekstą</string> - <!-- Header for context menu on an individual message --> - <string name="message_options">Žinutės nustatymai</string> - <!-- Delivery Header View --> - <!-- Title of "Report" window --> - <string name="delivery_header_title">Žinutės ataskaita</string> - <!--Text for app restart confirmation dialog--> - <string name="restart_message">Šie pakeitimai įsigalios kitą kartą atidarius QKSMS</string> - <!--Dialog title for asking if a user wants to delete a conversation--> - <string name="delete_conversation">Delete conversations</string> - <!--Dialog title for asking if a user wants to delete all failed messages--> - <string name="delete_all_failed">Delete failed messages</string> - <!--CDialog title for asking if a user wants to delete a conversation--> - <string name="delete_confirmation">Are you sure you would like to delete (%s) conversations?</string> - <!--CDialog title for asking if a user wants to delete all failed messages--> - <string name="delete_all_failed_confirmation">Are you sure you would like to delete failed messages from (%s) conversations?</string> - <!--(Unused) Dialog title shown if APNs have not been set--> - <string name="apns_not_set">APN nenustatytas</string> - <!--(Unused) Dialog description shown if APNs have not been set--> - <string name="apns_not_set_description">Pasirodo jūsų APN nėra nustatytas. Tai reiškia, kad MMS neveiks tinkamai. Paspauskite Gerai, kad QKSMS surastų APN už jus. :)</string> - <!--Dialog title show if MMS hasn't been configured--> - <string name="set_up_mms_title">Set up MMS?</string> - <!--Dialog description shown if MMS hasn't yet been configured--> - <string name="set_up_mms_description">It appears that MMS hasn\'t been configured in QKSMS yet. Press okay automatically configure MMS.</string> - <!-- Dialog message text explaining that a draft message will not be saved due to invalid recipients --> - <string name="discard_message_reason">Žinutė nebus išsaugota, nes ji neturi jokių tinkamų gavėjų.</string> - <string name="invalid_code">Invalid code</string> - <!--Button to restart app now instead of manually later--> - <string name="restart">Paleisti iš naujo dabar</string> - <!--Notification action to reply to a message--> - <string name="reply">Atsakyti</string> - <!--Notification action to reply to a message--> - <string name="reply_qksms">Atsakyti naudojant QKSMS</string> - <!--Notification action to mark a message as read--> - <string name="read">Skaityti</string> - <!--Notification action to mark a message as read--> - <string name="mark_read">Pažymėti kaip perskaitytą</string> - <!--Notification action to call the sender of a message--> - <string name="call">Skambinti</string> - <!-- Notification toast message --> - <string name="notification_mute_on">Notifications enabled</string> - <string name="notification_mute_off">Notifications disabled</string> - <!--Positive action button--> - <string name="yes">Taip</string> - <string name="add">Add</string> - <!--Positive action button--> - <string name="save">Išsaugoti</string> - <!--Positive action button--> - <string name="enable">Enable</string> - <!--Positive action button--> - <string name="upgrade_now">Nustatyti dabar</string> - <!--Positive action button--> - <string name="okay">Gerai</string> - <!--Positive action button--> - <string name="redeem">Redeem</string> - <!--Neutral action button--> - <string name="just_once">Just once</string> - <!--Neutral action button--> - <string name="later">Vėliau</string> - <!--Neutral action button --> - <string name="cancel">Atšaukti</string> - <!-- Name of the local user when displaying sender of an outgoing message (personal pronoun) --> - <string name="messagelist_sender_self">Aš</string> - <!-- Sender to be used if the sender address has been hidden --> - <string name="hidden_sender_address">Siuntėjo adresas paslėptas</string> - <!-- Subject to display in the conversation list if there is no subject --> - <string name="no_subject_view">(nėra temos)</string> - <!-- Time and date a message is due to expire --> - <string name="expire_on">"Galiojimas baigsis: <xliff:g id="date">%s</xliff:g>"</string> - <!-- Formatting for subject displayed inline, prepended to MMS message text --> - <string name="inline_subject">"<Subject: <xliff:g id="subject">%s</xliff:g>>"</string> - <!-- Text of a button appearing for MMS messages that have not yet been downloaded, causing the message to be downloaded (imperative verb) --> - <string name="download">Atsisiųsti</string> - <!-- Message displayed in place of the "download message" button once it has been pressed, indicating that the download is in progress --> - <string name="downloading">Atsisiunčiama</string> - <!-- Toast message while an image is being resized --> - <string name="compressing">Nuotrauka per didelė. Suspaudžiama\u2026</string> - <!-- Header shown above favorite contacts in QKCompose --> - <string name="favorites">Starred contacts</string> - <!-- Word represents 'self' in a conversation --> - <string name="me">Aš</string> - <string name="menu_edit">Redaguoti</string> - <string name="menu_delete_messages">Ištrinti žinutes</string> - <string name="menu_delete_failed">Delete failed messages</string> - <string name="menu_lock">Rakinti</string> - <string name="menu_unlock">Atrakinti</string> - <!-- When the user tries to view message details and some error occurs while - retrieving those details, this message will be shown. --> - <string name="cannot_get_details">Nepavyko gauti išsamesnės informacijos.</string> - <!-- Title of "Message details" dialog --> - <string name="message_details_title">Žinutės informacija</string> - <!-- Label in "Message details" dialog --> - <string name="message_type_label">Tipas\u000A</string> - <!-- "Type" value in "Message details" dialog --> - <string name="text_message">Tekstinė žinutė</string> - <!-- "Type" value in "Message details" dialog --> - <string name="multimedia_message">Daugiaformatė žinutė</string> - <!-- "Type" value in "Message details" dialog --> - <string name="multimedia_notification">Daugiaformatės žinutės pranešimas</string> - <!-- Label in "Message details" dialog showing who sent the message. --> - <string name="from_label">Nuo\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="to_address_label">Kam\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="bcc_label">Bcc\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="sent_label">Išsiųsta\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="received_label">Gauta\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="saved_label">Išsaugota\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="subject_label">Tema\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="message_size_label">Žinutės dydis\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="priority_label">Prioritetas\u000A</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_high">Didelė</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_normal">Vidutinė</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_low">Žema</string> - <!-- Label in "Message details" dialog --> - <string name="message_class_label">Žinutės tipas\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="error_code_label">Klaidos kodas\u000A</string> - <!-- Alert dialog title when creating a slideshow [CHAR LIMIT=none] --> - <string name="building_slideshow_title">Daroma peržiūra</string> - <!-- Tag appearing on conversations in the conversation list that contain a draft message --> - <string name="has_draft">Nebaigta rašyti žinutė</string> - <!-- In conversation list items, this is the separator between a contact's name and the draft stamp [CHAR LIMIT=5] --> - <string name="draft_separator">,\u0020</string> - <!-- In conversation list items, this comes after the receipient's name and contains the number of messages in the thread [CHAR LIMIT=5] --> - <string name="message_count_format">\u00a0<xliff:g id="number" example="1">%1$s</xliff:g></string> - <!-- For debugging: Dialog box title indicating there's a situation where data has unexpectedly changed --> - <string name="error_state">Nepastovi būsena</string> - <!-- For debugging: Dialog box text indicating there's a situation where data has unexpectedly changed --> - <string name="error_state_text">Įrašų ir gavėjų buklė nesutampa. Prašau pranešti apie klaidą http://go/droidanizer </string> - <!-- This is the dialog title for the "Select link" dialog, shown when the user clicks on a - chat in the chat history view if there are links in the chat message. The dialog displays the - links if there are any --> - <string name="select_link_title">Pasirinkti veiksmą</string> - <!-- In message list items, this string builds the timestamp line when the message is in a group [CHAR LIMIT=NONE] --> - <string name="message_timestamp_format"><xliff:g id="string" example="Fred Flinstone">%1$s</xliff:g>\u0020-\u0020<xliff:g id="string" example="9:39AM">%2$s</xliff:g></string> - <!--Message sending status: sending--> - <string name="status_sending">Siunčiama…</string> - <!--Message sending status: failed--> - <!--<string name="status_failed">Failed. Tap to retry</string>--> - <!-- Delivery Report Activity --> - <!-- Status in "Report" window --> - <string name="status_none">(Nėra)</string> - <!-- Status in "Report" window --> - <string name="status_pending">Laukiama</string> - <!-- Status in "Report" window --> - <string name="status_read">Perskaityta</string> - <!-- Status in "Report" window --> - <string name="status_received">Gauta</string> - <!-- Status in "Report" window --> - <string name="status_failed">Failed. Tap for options</string> - <!-- Status in "Report" window --> - <string name="status_unread">Neskaityta</string> - <!-- Status in "Report" window --> - <string name="status_rejected">Atmesta</string> - <!-- Label in "Report" window --> - <string name="recipient_label">Gavėjas:\u0020</string> - <!-- Label in "Report" window --> - <string name="status_label">Būsena:\u0020</string> - <!-- Label in "Report" window [CHAR LIMIT=50]--> - <string name="delivered_label">Pristatyta:\u0020</string> - <string name="do_something">Daryk ką nors</string> - <!-- Confirm Delete --> - <!-- Delete confirmation dialog title --> - <string name="confirm_dialog_title">Ištrinti?</string> - <!-- Delete confirmation dialog title for locked messages --> - <string name="confirm_dialog_locked_title">Ištrinti užrakintą žinutę?</string> - <!-- This message is displayed in a confirmation dialog when the user selects one or more - conversations and then taps the "Delete" button. --> - <plurals name="confirm_delete_conversation"> - <!-- Case of 1 result. --> - <item quantity="one">Vienas pokalbis bus ištrintas.</item> - <item quantity="few"><xliff:g id="number" example="15">%1$s</xliff:g> pokalbiai bus ištrinti.</item> - <!-- Case of 0 or 2 or more results. --> - <item quantity="other"><xliff:g id="number" example="15">%1$s</xliff:g> pokalbių bus ištrinta.</item> - </plurals> - <string name="confirm_delete_conversation">Visas pokalbis ir jo įrašai bus ištrinti.</string> - <!-- Delete all threads confirmation dialog message --> - <string name="confirm_delete_all_conversations">Visi įrašai bus ištrinti.</string> - <!-- Delete message confirmation dialog message --> - <string name="confirm_delete_message">Žinutė bus ištrinta.</string> - <!-- Delete message confirmation dialog message for a locked message --> - <string name="confirm_delete_locked_message">Ištrinti šią užrakintą žinutę?</string> - <!-- Delete all the messages on the SIM dialog message --> - <string name="confirm_delete_all_SIM_messages">Visos žinutės esančios SIM kortelėje bus ištrintos.</string> - <!-- Delete the selected message on the SIM dialog message --> - <string name="confirm_delete_SIM_message">Ši žinutė SIM kortelėje bus ištrinta.</string> - <!-- Delete unlocked checkbox title --> - <string name="delete_unlocked">Ištrinti užrakintas žinutes</string> - <!-- Delete button title --> - <string name="delete">Ištrinti</string> - <!-- More button title --> - <string name="more">Daugiau</string> - <!-- More button summary --> - <string name="more_summary">Tap to see more</string> - <!-- Action bar mode title when multi-selecting conversations --> - <string name="select_conversations">Pasirinkti pokalbius</string> - <!-- Show this in the middle of the main activity when there are no conversations [CHAR LIMIT=none] --> - <string name="no_conversations">Nėra pokalbių.</string> - <!-- Show this in the middle of the main activity when loading conversations [CHAR LIMIT=none] --> - <string name="loading_conversations">Įkraunami pokalbiai.</string> - <!-- Tells the user that QKSMS isn't the default SMS app --> - <string name="not_default">Numatytasis SMS</string> - <!-- Tells the user they need to set QKSMS as the default app in order to use this feature --> - <string name="default_info">QKSMS needs to be your SMS app to do that</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to mark messages as read --> - <string name="not_default_mark_read">QKSMS must be your SMS app to mark messages read</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to mark messages as unread --> - <string name="not_default_mark_unread">QKSMS must be your SMS app to mark messages unread</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to send messages --> - <string name="not_default_delete">QKSMS must be your SMS app to delete messages</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to delete messages --> - <string name="not_default_send">QKSMS must be your SMS app to send messages</string> - <!-- Tells the user they should set QKSMS as the default messaging app --> - <string name="not_default_first">Some things won\'t work until QKSMS is the default SMS app</string> - <string name="delayed_messaging_info">Delayed messaging allows you to cancel messages before they send. Change the default behavior and more in Settings</string> - <string name="delayed_duration_bounds_error">Duration must be between 1 and 30 seconds</string> - <!-- Dialog title for the Read Report dialog. --> - <string name="confirm">Patvirtinti</string> - <!-- Dialog text for the Read Report dialog. --> - <string name="message_send_read_report">Perskaitymo ataskaita bus išsiųsta.</string> - <!-- Dialog title for updating app icon color --> - <string name="update_icon_title">Update icon color</string> - <!-- Dialog message for updating app icon color --> - <string name="update_icon_message">QKSMS must be restarted when changing the icon color</string> - <string name="dialog_conversation_details_title">Conversation details</string> - <string name="dialog_conversation_details_last_message_date">Last message date</string> - <string name="dialog_conversation_details_message_count">Message count</string> - <string name="dialog_conversation_details_recipients">Recipients (%s)</string> - <string name="dialog_should_i_answer_title">Should I Answer? not installed</string> - <string name="dialog_should_i_answer_message">Would you like to download the app from Google Play now?</string> - <string name="dialog_delete_old_messages">Are you sure you want to automatically delete old messages?</string> - <!-- Title for audio file picker --> - <string name="select_audio">Pasirinkti garso failą</string> - <!-- Menu title to copy an attachment to the shared storage [CHAR LIMIT=25] --> - <string name="copy_to_sdcard">Išsaugoti prisegtą failą</string> - <!-- Toast message on successful copy to shared storage [CHAR LIMIT=30] --> - <string name="copy_to_sdcard_success">Prisegtas failas Išsaugotas.</string> - <!-- Toast message on failed copy to shared storage [CHAR LIMIT=30] --> - <string name="copy_to_sdcard_fail">Nepavyko išsaugoti prisegto failo.</string> - <!-- Menu title to save a sound as a ringtone --> - <string name="save_ringtone">Išsaugoti kaip skambutį</string> - <!-- Toast message on successful copying ringtone to drm provider --> - <string name="saved_ringtone">Skambutis išsaugotas.</string> - <!-- Toast message on failed copying ringtone to drm provider --> - <string name="saved_ringtone_fail">Nepavyko išsaugoti skambučio.</string> - <!-- Menu item --> - <!-- Menu item [CHAR LIMIT=40] --> - <string name="menu_group_participants">Grupės dalyviai</string> - <!--Toast shown when a draft is saved--> - <string name="toast_draft">Išsaugota neišsiųsta žinutė</string> - <!--Toast shown when a conversation is deleted--> - <string name="toast_conversation_deleted">Pokalbis ištrintas</string> - <!--Toast shown when device is low on storage--> - <string name="toast_low_memory">"Telefono atmintis pilna. Ištrinkite kelis failus, kad ją atlaisvintumėte."</string> - <!--Toast shown to tell user that forwarding messages doesn't work yet--> - <string name="toast_forward">Ši funkcija dar neveikia. Kurį laiką prašau naudoti \"Kopijuoti tekstą\" mygtuką ir įklijuoti jūsų norimame pokalbyje</string> - <!--Toast shown for unimplemented features--> - <string name="toast_unimplemented">Ši funkcija kol kas neveikia</string> - <!--Toast shown when a message fails to send--> - <string name="toast_message_failure">Nepavyko išsiųsti žinutės</string> - <!--Toast shown when a message is delivered--> - <string name="toast_message_delivered">Žinutė pristatyta</string> - <!--Toast shown when a message is not delivered--> - <string name="toast_message_not_delivered">Žinutė nepristatyta</string> - <!--Toast shown when default APNs are loaded--> - <string name="toast_default_apns_loaded">Įkelti numatytieji APN nustatymai</string> - <!--Toast shown when text is copied to the clipboard--> - <string name="toast_copy_text">Tekstas nukopijuotas</string> - <!--Toast shown when Google Play Services is not available for purchasing a product--> - <string name="toast_billing_not_available">Pirkimas reikalauja aktyvuotos mokėjimo sąskaitos Google Play Parduotuvėje jūsų įrenginyje</string> - <!--Toast shown when Google Play Services is not available for purchasing a product--> - <string name="toast_endlessjabber_not_installed">\"EndlessJabber\" neįrašyta, atidaroma Google Play Parduotuvė</string> - <string name="toast_changelog_error">Couldn\'t load the changelog. Please try again later</string> - <string name="toast_conversation_error">Couldn\'t open conversation</string> - <string name="toast_deleting_old_messages">Your old messages will be deleted shortly</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_1">Ačiū, kad remiate! Jūs mano nauji geriausi draugai.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_2">Ačiū, kad remiate. Aš Jus myliu.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_3">Ačiū, kad remiate! Jūs padedate QKSMS tapti geriausia žinučių programėle.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_4">Ačiū, kad remiate! Jūs nuostabus.</string> - <!--Menu option to mute conversation--> - <string name="menu_mute_conversation">Mute conversation</string> - <!--Menu option to mute conversation--> - <string name="menu_unmute_conversation">Unmute conversation</string> - <string name="menu_block_conversations">Block conversations</string> - <string name="menu_unblock_conversations">Unblock conversations</string> - <string name="menu_messages">Messages</string> - <string name="menu_blocked">Blocked</string> - <string name="menu_blocked_conversations">Blocked (%s new)</string> - <string name="menu_unblocked_conversations">Messages (%s new)</string> - <string name="menu_notifications">Notifications</string> - <string name="menu_notifications_off">Notifications off</string> - <string name="menu_notification_settings">Conversation settings</string> - <string name="menu_view_details">View details</string> - <string name="menu_mark_read">Mark read</string> - <string name="menu_mark_unread">Mark unread</string> - <string name="menu_delete_conversation">Delete conversation</string> - <string name="menu_multi_select">Select conversation</string> - <string name="menu_done">Done</string> - <string name="failed_message_title">Failed message options</string> - <!--Toast shown to tell the user that they don't have a photo attachments app, and suggests that they download one--> - <string name="attachment_app_not_found">Attachments app not found. Try installing a photo gallery app!</string> - <string name="attachment_camera_error">The camera could not be opened</string> - <string name="pref_max_mms_attachment_size">Maximum MMS attachment size</string> - <string name="error_no_recipients">Pasirinkite adresatus, kuriems norite išsiųsti šią žinutę!</string> - <string name="error_file_not_found">QKSMS can\'t access the file you\'re trying to share!</string> - <string name="sending_blocked_welcome_screen_message">Hold up! You\'ll get to send real messages in a minute!</string> - <string name="notification_colored_icon_ready">Touch to add to your launcher from home screen.</string> - <string name="notification_title_colored_icon_ready">QKSMS colored icon is ready</string> - <string name="icon_ready">Your new icon is ready!</string> - <string name="icon_ready_message">You can now add it to your home screen again with the updated color.</string> - <string name="dont_ask_again">Don\'t ask again</string> - <string name="warning">Stagefright warning</string> - <string name="stagefright_warning">Video messages may contain a harmful exploit that can leave your phone vulnerable to attacks. Would you like to continue?</string> - <!-- MMS DIALOG SETUP STRINGS --> - <string name="mms_setup_set_up_mms_title">Set up MMS?</string> - <string name="mms_setup_set_up_mms_body">It appears that MMS isn\'t set up in QKSMS. Press okay to automatically configure MMS.</string> - <string name="mms_setup_setting_up_later_title">Setting up MMS later</string> - <string name="mms_setup_setting_up_later_body">Visit the MMS section of Settings to try automatic configuration, contact support, or enter your own configuration.</string> - <string name="mms_setup_no_configurations_found_title">No configurations found</string> - <string name="mms_setup_no_configurations_found_body">We couldn\'t find an MMS configuration for your carrier automatically. Press okay to contact support. We\'ll help you get set up! </string> - <string name="mms_setup_one_configuration_found_title">One configuration found</string> - <string name="mms_setup_one_configuration_found_body">We have found an MMS configuration for the %s carrier. Does that sound right?</string> - <string name="mms_setup_multiple_configurations_found_title">Multiple configuration found</string> - <string name="mms_setup_multiple_configurations_found_body">We have found multiple MMS configurations. Choose your carrier from the list, or press N/A if your carrier isn\'t on the list.</string> - <string name="mms_setup_next_steps_title">Next steps</string> - <string name="mms_setup_next_steps_body">Visit the MMS section of Settings to try automatic configuration again, contact support, or enter your own configuration.</string> - <string name="mms_setup_success_title">Success!</string> - <string name="mms_setup_success_body">If you encounter any issues, visit the MMS section of Settings to try automatic configuration again, contact support, or enter your own configuration.</string> - <string name="na">N/A</string> - <string name="no">No</string> - <string name="pref_automatically_configure_mms">Automatically Configure MMS</string> - <string name="pref_mms_contact_support">Contact Support</string> - <string name="pref_category_sending_mms">Sending MMS</string> - <string name="pref_category_mms_configuration">MMS Configuration</string> - <string name="pref_mms_contact_support_summary">Contact the QKSMS team for help setting up MMS</string> - <string name="pref_markdown_enabled">Text formatting</string> - <string name="pref_markdown_enabled_summary">Use markdown syntax to get bold, underline, and italics in your messages</string> - <string name="want_read_indicators">Want read indicators?</string> - <string name="color_swatch_description">Color %1$d</string> - <string name="color_swatch_description_selected">Color %1$d selected</string> - <string name="color_picker_default_title">Select a Color</string> - <string name="message_delivered">Message Delivered</string> - <string name="message_not_delivered">Message Not Delivered</string> - <string name="error">Error</string> - <string name="invalid_destination">Invalid destination address.</string> - <string name="service_not_activated">Service not activated on network.</string> - <string name="service_message_not_found">Message expired or not available.</string> - <string name="service_network_problem">Couldn\'t send due to network problem.</string> - <string name="message_queued">Currently can\'t send your message. It will be sent when the service becomes available.</string> - <string name="download_later">Can\'t download right now. Try again later.</string> - <string name="no_apn">No APN specified for the app, you need to set it up in settings!</string> - <string name="no_subject">(No subject)</string> - <string name="unknown_sender">Unknown sender</string> - <string name="dl_failure_notification">Couldn\'t download message <xliff:g id="subject">%1$s</xliff:g> from <xliff:g id="from">%2$s</xliff:g>.</string> - <string name="auto_select_multiple_apns">Multiple different configurations have been found. Try one now. If it doesn\'t work, you can try a new one by going to Settings > Advanced > Load default APNs.</string> - <string name="auto_select_apn">Automatically Select APNs</string> - <string name="auto_select_failed_title">Automatic configuration failed</string> - <string name="auto_select_failed">Try searching for your carrier\'s APN settings (MMSC, Port, and Proxy) and entering them in Settings > Advanced.</string> - <string name="date_yesterday">Yesterday</string> - <string name="date_just_now">Just now</string> - <string name="compose_loading_attachment">Loading attachment</string> - <string name="hint_no_messages">No messages yet.\nClick the + to send one!</string> - <string-array name="resend_menu"> - <item>Persiųsti</item> - <item>Redaguoti</item> - <item>Ištrinti</item> - </string-array> - <string-array name="message_menu"> - <item>Persiųsti žinutę</item> - <item>Kopijuoti tekstą</item> - <item>Išsamiau</item> - <item>Ištrinti žinutę</item> - </string-array> - <string-array name="background_titles"> - <item>Material Light</item> - <item>Material Dark</item> - <item>Black</item> - </string-array> - <string-array name="font_sizes"> - <item>Mažas</item> - <item>Vidutinis</item> - <item>Didelis</item> - <item>Didžiausias</item> - </string-array> - <string-array name="font_families"> - <item>Roboto Regular</item> - <item>Roboto Condensed</item> - <item>System font</item> - </string-array> - <string-array name="font_weights"> - <item>Plonesnis</item> - <item>Įprastas</item> - </string-array> - <!-- String to match as no subject and filter out as a subject. For example, if the - subject string is "no subject", we won't display that. We'll pretend - no subject string was delivered. --> - <string-array name="empty_subject_strings"> - <item>nėra temos</item> - </string-array> - <string-array name="qk_responses"> - <item>Gerai</item> - <item>Duokite minutę</item> - <item>On my way</item> - <item>Ačiū</item> - <item>Sounds good</item> - <item>What\'s up?</item> - <item>Agreed</item> - <item>No</item> - <item>Love you</item> - <item>Sorry</item> - <item>LOL</item> - <item>That\'s okay</item> - </string-array> - <string-array name="enter_button_options"> - <item>Show emoji</item> - <item>New line</item> - <item>Send message</item> - </string-array> - <string-array name="notification_private_options"> - <item>Show all</item> - <item>Hide message</item> - <item>Hide message and sender</item> - </string-array> - <!-- Max MMS attachment sizes. I.e. will compress pictures that are larger than 300 KB down to - under 300KB. --> - <string-array name="max_mms_attachment_sizes"> - <item>300 KB</item> - <item>600 KB</item> - <item>1 MB</item> - <item>Neribotas</item> - </string-array> -</resources> diff --git a/QKSMS/src/main/res/values-ne/strings.xml b/QKSMS/src/main/res/values-ne/strings.xml deleted file mode 100644 index 8d2987d96..000000000 --- a/QKSMS/src/main/res/values-ne/strings.xml +++ /dev/null @@ -1,768 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!--Generated by crowdin.com--> -<resources xmlns:xliff="http://schemas.android.com/apk/res-auto"> - <!--Slogan--> - <string name="slogan">Love texting again.</string> - <!--Text shown when a phone number cannot be found--> - <string name="unknown_number">नचिनिने नम्बर</string> - <!--Content description for photos--> - <string name="popup_photo_CD">फोटो</string> - <!--Text to be displayed while content is loading--> - <string name="loading">लोड हुदैछ...</string> - <!--Test string--> - <string name="test">शब्‍द परीक्षण...</string> - <!--Hint for contacts text field--> - <string name="hint_contacts">प्राप्तकर्ता हाल्नुहोस्</string> - <!--Hint for search text field--> - <string name="hint_search">Search something</string> - <!--Hint for message reply text field--> - <string name="hint_reply">सन्देश प्रविष्ट गर्नुहोस्</string> - <!--Hint for code redemption--> - <string name="hint_redeem">Enter code</string> - <string name="hint_hex">Hex</string> - <!--Text shown for single new message in notification--> - <string name="new_message">नयाँ सन्देश</string> - <!--Text shown after number of unread messages in notification (ex. 3 new messages)--> - <string name="new_messages">नयाँ सन्देशहरू</string> - <!--Text shown for single failed message in notification--> - <string name="failed_message">सन्देश पठाउन असफल भयो</string> - <!--Text shown after number of failed messages in notification (ex. 3 messages failed to send)--> - <string name="failed_messages">सन्देशहरू पठाउन असफल भयो</string> - <!--Text shown under failed message count--> - <string name="failed_messages_summary">हेर्न ट्याप गर्नुहोस्</string> - <!--QuickCompose notification title--> - <string name="quickcompose">QK Compose</string> - <!--QuickCompose notification text--> - <string name="quickcompose_detail">सन्देश पठाउन क्लिक गर्नुहोस्</string> - <!--Welcome screen intro button--> - <string name="welcome_start">Let\'s get started!</string> - <!--Allows user to skip welcome screen--> - <string name="welcome_skip">SKIP</string> - <!--Allows user to finish the welcome screen--> - <string name="welcome_finish">FINISH</string> - <!--Indicates to user they can pick a color--> - <string name="welcome_theme_title">Pick a color</string> - <!--Indicates to user they can pick any colors--> - <string name="welcome_theme_description">Any color.</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_night_description">Easy on the eyes.</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_night_hint">Toggle me</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_quickreply_title">QK Reply</string> - <!--QK Reply explanation--> - <string name="welcome_quickreply_description">Reply to messages faster than ever.</string> - <!--Prompts user to try QK Reply--> - <string name="welcome_quickreply_hint">Try it!</string> - <!--QK Reply demo message--> - <string name="welcome_quickreply_message_1">Wow! Now wasn\'t that awesome? You can view your entire conversation at a glance. Tap outside the popup or press the checkmark to dismiss it.</string> - <!--QK Reply demo message--> - <string name="welcome_quickreply_message_2">This is QK Reply. Now you can reply to messages from anywhere. Tap the expand button to see what happens next :)</string> - <!--Settings option in menu--> - <string name="menu_settings">सेटिङहरु</string> - <!--Search option in menu--> - <string name="menu_search">Search</string> - <!--Show full conversation in QuickReply--> - <string name="menu_show_all">Show all messages</string> - <!--Show only unread messages in QuickReply--> - <string name="menu_show_unread">Show unread messages</string> - <!--Open conversation option in menu (shown in QuickReply)--> - <string name="menu_open_thread">बार्तालाभ खोल्नहोस्</string> - <!--Forward message option in menu--> - <string name="menu_forward">सन्देश अरुलाई पठाउनुहोस्</string> - <!--Call contact option in menu--> - <string name="menu_call">सम्पर्क</string> - <!--Mark a message/conversation as read option in menu--> - <string name="menu_read">पढेको चिन्ह लगाउनुहोस्</string> - <!--Delete a message option in menu--> - <string name="menu_delete">Delete</string> - <!--Donate option in menu--> - <string name="menu_billing">Donate</string> - <!--Copy text option in menu--> - <string name="menu_copy">प्रतिलिपि बनाउनुहोस्</string> - <!--Changelog option in menu--> - <string name="menu_changelog">"के छ नयाँ"</string> - <!--Expand settings option in menu--> - <string name="menu_show_all_prefs">Show all</string> - <!--Show less settings option in menu--> - <string name="menu_show_fewer_prefs">Show fewer</string> - <!--Title for message details popup--> - <string name="details_title">विवरण</string> - <!--Title for address that message is being sent to in message details popup--> - <string name="details_to">कसलाई</string> - <!--Title for address that message is sent from in message details popup--> - <string name="details_from">बाट</string> - <!--Title for text of a message in message details popup--> - <string name="details_body">मुख्य निकाय</string> - <!--Title for date sent of a message in message details popup--> - <string name="details_date_sent">पठाईएको मिति</string> - <!--Title for date received of a message in message details popup--> - <string name="details_date_received">प्राप्त मिति</string> - <!--Title for rate snackbar--> - <string name="rate_title">Like QKSMS?</string> - <!--Title for rate button--> - <string name="rate_action">Rate</string> - <string name="pref_category_appearance">Appearance</string> - <string name="pref_category_summary_appearance">Themes, fonts, colors, avatars, and more</string> - <string name="pref_category_general">सामान्य</string> - <string name="pref_category_summary_general">Delivery, message sending, formatting</string> - <string name="pref_category_blocking">Message blocking</string> - <string name="pref_category_notifications">सूचनाहरू</string> - <string name="pref_category_summary_notifications">Sounds, LED, privacy</string> - <string name="pref_category_mms">MMS</string> - <string name="pref_category_summary_mms">Configure MMS (APNs), max size, group messaging</string> - <string name="pref_category_quickreply">QK Reply</string> - <string name="pref_category_summary_quickreply">QK Reply, popup options</string> - <string name="pref_category_quickcompose">QK Compose</string> - <string name="pref_category_summary_quickcompose">QK Compose, starred contacts</string> - <string name="pref_category_about">About</string> - <string name="pref_category_summary_about">Version, changelog, authors, thanks</string> - <string name="pref_theme">Theme color</string> - <string name="pref_theme_summary_alt">Tap to change theme</string> - <string name="pref_icon">Icon color</string> - <string name="pref_icon_summary">Tap to change the QKSMS icon color</string> - <string name="pref_status_tint">तिन्तेद स्त्याटस बार</string> - <string name="pref_navigation_tint">तिन्तेद न्याभिगेसन बार</string> - <string name="pref_background">Background color</string> - <string name="pref_background_summary">Tap to change background color</string> - <string name="pref_bubbles">Message bubbles</string> - <string name="pref_bubbles_summary">Tap to change message bubble preferences</string> - <string name="pref_night">रात्रि शैली</string> - <string name="pref_night_summary">Save battery and reduce eye strain</string> - <string name="pref_night_amoled">शुद्ध कालो पृष्ठभूमि</string> - <string name="pref_night_amoled_summary">एमोलेद प्रदर्शित उपकरणहरूमा अतिरिक्त ब्याट्रि बचत गर्नुहोस्</string> - <string name="pref_bubble_style_new">Use new bubble style</string> - <string name="pref_color_sent">Color sent messages</string> - <string name="pref_color_sent_summary">Color the background bubbles for outgoing messages</string> - <string name="pref_color_received">Color received messages</string> - <string name="pref_color_received_summary">Color the background bubbles for incoming messages</string> - <string name="pref_hide_avatar_conversations">Hide conversation avatars</string> - <string name="pref_hide_avatar_conversations_summary">Hide avatars for contacts in conversation list</string> - <string name="pref_hide_avatar_sent">Hide sent message avatars</string> - <string name="pref_hide_avatar_sent_summary">Hide your avatar for outgoing messages</string> - <string name="pref_hide_avatar_received">Hide received message avatars</string> - <string name="pref_hide_avatar_received_summary">Hide contact avatar for incoming messages</string> - <string name="pref_font_family">Font family</string> - <string name="pref_font_size">फन्टको आकार</string> - <string name="pref_font_weight">Font weight</string> - <string name="pref_message_count">जम्मा सन्देश</string> - <string name="pref_message_count_summary">Show the number of messages for each conversation</string> - <string name="pref_sent_timestamps">Sent timestamps</string> - <string name="pref_sent_timestamps_summary">Show the timestamp for when a message was sent, not received</string> - <string name="pref_force_timestamps">Force timestamps</string> - <string name="pref_force_timestamps_summary">Enable timestamps for all messages</string> - <string name="pref_key_timestamp_delay">New timestamp delay</string> - <string name="pref_key_timestamp_delay_summary">The number of minutes which must elapse between two messages in order for a new timestamp to be shown.</string> - <string name="pref_compose_favorites">Starred contacts</string> - <string name="pref_compose_summary_favorites">Show your starred contacts in the QK Compose window, making them only a tap away</string> - <string name="pref_prox_sensor_call">Proximity sensor</string> - <string name="pref_prox_sensor_call_summary">While in a conversation, bring your phone to your ear to start a call</string> - <string name="pref_delivery">Delivery confirmations</string> - <string name="pref_delivery_summary">Confirm that messages were sent successfully</string> - <string name="pref_delivery_toast">Show toast</string> - <string name="pref_delivery_toast_summary">Show a short toast to indicate a message being delivered</string> - <string name="pref_delivery_vibrate">Vibrate</string> - <string name="pref_delivery_vibrate_summary">Vibrate on message delivery</string> - <string name="pref_delete_old_messages">Delete old messages</string> - <string name="pref_delete_old_messages_summary">Automatically delete messages once they\'re old enough</string> - <string name="pref_delete_old_messages_unread">Unread messages</string> - <string name="pref_delete_old_messages_unread_summary">Automatically delete unread messages after %s days</string> - <string name="pref_delete_old_messages_read">Read messages</string> - <string name="pref_delete_old_messages_read_summary">Automatically delete read messages after %s days</string> - <string name="pref_yappy">Yappy integration</string> - <string name="pref_endlessjabber_summary">Enable full support for Yappy</string> - <string name="pref_blocked_conversations">Blocked conversations</string> - <string name="pref_blocked_conversations_summary">Long-press on a conversation and block to move to blocked inbox and stop notifications</string> - <string name="pref_block_future">Block future messages</string> - <string name="pref_block_future_summary">Add additional phone numbers to block</string> - <string name="pref_should_i_answer">Should I Answer? Integration</string> - <string name="pref_should_i_answer_summary">Automatically delete incoming messages from numbers which are blocked through Should I Answer?</string> - <string name="pref_mobile_only">Mobile numbers</string> - <string name="pref_mobile_only_summary">Only show mobile numbers in contact suggestions</string> - <string name="pref_auto_emoji">Automatic emoji</string> - <string name="pref_auto_emoji_summary">Replace text with image emoji</string> - <string name="pref_enter_button">Enter button</string> - <string name="pref_enter_button_summary">Tap to change keyboard enter button behavior</string> - <string name="pref_compose_group">Group messaging</string> - <string name="pref_compose_group_summary">When composing message to multiple people, send a group message instead of individual messages</string> - <string name="pref_auto_download">Auto download MMS</string> - <string name="pref_auto_download_summary">Automatically download MMS messages when they become available</string> - <string name="pref_auto_data">Automatic data</string> - <string name="pref_auto_data_summary">Turn on data automatically when sending or receiving MMS</string> - <string name="pref_split">Split SMS</string> - <string name="pref_split_summary">Split long messages into separate messages</string> - <string name="pref_split_counter">Split counter</string> - <string name="pref_split_counter_summary">Adds a counter to the front of each split message</string> - <string name="pref_long_as_mms">Send long as MMS</string> - <string name="pref_long_as_mms_summary">Send long messages as MMS instead of splitting them</string> - <string name="pref_long_as_mms_after">Send long as MMS after</string> - <string name="pref_long_as_mms_after_summary">Send long messages as MMS when they exceed the length of a number of messages</string> - <string name="pref_return">Show return button</string> - <string name="pref_return_summary">Show return key on keyboard instead of Emoji button</string> - <string name="pref_text">Text</string> - <string name="pref_notifications">SMS notifications enabled</string> - <string name="pref_led">Notification LED</string> - <string name="pref_theme_led">Notification LED color</string> - <string name="pref_wake">Wake phone</string> - <string name="pref_wake_summary">Turn your screen on when you receive a new message</string> - <string name="pref_notifications_private">Private notifications</string> - <string name="pref_notifications_private_summary">Tap to change what should be hidden in notfication</string> - <string name="pref_ringtone">Notification sound</string> - <string name="pref_ringtone_summary">Select a notification sound</string> - <string name="pref_ticker">Show ticker</string> - <string name="pref_ticker_summary">Shows snippet of new message in notification bar</string> - <string name="pref_vibration">Vibration</string> - <string name="pref_vibration_summary">Vibrate when new messages are received</string> - <string name="pref_notification_call">Call button</string> - <string name="pref_notification_call_summary">Call the sender of a message right from the notification</string> - <string name="pref_dimiss_read">Mark as read</string> - <string name="pref_dismiss_read_summary">Mark message as read when notification is cleared</string> - <string name="pref_delayed">Delayed messaging</string> - <string name="pref_delayed_summary">Wait before sending your messages, so you have a chance to review them</string> - <string name="pref_delayed_duration">Delay length (seconds)</string> - <string name="pref_delayed_duration_summary">Time to wait before sending your message</string> - <string name="pref_night_auto">Automatic night mode</string> - <string name="pref_night_auto_summary">Enable night mode automatically based on the time</string> - <string name="pref_day_start">Day time begins</string> - <string name="pref_night_start">Night time begins</string> - <string name="pref_qk_responses">QK Responses</string> - <string name="pref_qk_responses_summary">Modify your preset responses to be used from your Android Wear device</string> - <string name="pref_quickreply_enabled">QK Reply enabled</string> - <string name="pref_quickreply_enabled_summary">Show QK Reply window whenever a new message is received</string> - <string name="pref_tap_to_quit">Tap to dismiss</string> - <string name="pref_tap_to_quit_summary">Tap anywhere outside of the window to close it</string> - <string name="pref_quickcompose">QK Compose enabled</string> - <string name="pref_quickcompose_summary">Display a notification that allows you to click on to compose a new message</string> - <string name="pref_mms_enabled">MMS enabled</string> - <string name="pref_mms_enabled_summary">Enable sending and receiving of MMS messages</string> - <string name="pref_mmsc_url">MMSC</string> - <string name="pref_mms_proxy">MMS proxy</string> - <string name="pref_mms_port">MMS port</string> - <string name="pref_apn_chooser">Load default APNs</string> - <string name="pref_strip_unicode">Strip unicode</string> - <string name="pref_strip_unicode_summary">Swap characters that are not supported in full-length messages for GSM compatible characters</string> - <string name="pref_system_bar_flat">Flat system bars</string> - <string name="pref_system_bar_flat_summary">Get rid of the gradient shown on the system UI bars on most KitKat devices</string> - <string name="pref_status_compat">Status bar fix</string> - <string name="pref_status_compat_summary">Fixes issues caused by immersive mode, Tinted Status Bar (Xposed), or custom DPI settings</string> - <string name="pref_navigation_compat">Navigation bar fix</string> - <string name="pref_navigation_compat_summary">Fixes issues caused by immersive mode, Tinted Status Bar (Xposed), or custom DPI settings</string> - <string name="pref_about_version_title">QKSMS version</string> - <string name="pref_about_authors_title">Authors</string> - <string name="pref_about_authors_summary">Moez Bhatti</string> - <string name="pref_changelog_summary">Tap to view changelog</string> - <string name="pref_about_thanks_title">Thank you</string> - <string name="pref_about_thanks_summary">Tap to view open-source contributors</string> - <string name="pref_donate_title">Donate</string> - <string name="pref_donate_summary">QKSMS is free. Help support us by donating!</string> - <string name="pref_about_gplus_title">Google+</string> - <string name="pref_about_gplus_summary">Join the QKSMS Beta Testing community on Google+</string> - <string name="pref_about_github_title">GitHub</string> - <string name="pref_about_github_summary">QKSMS is open source. Contribute and report issues on GitHub</string> - <string name="pref_about_crowdin_title">Crowdin</string> - <string name="pref_about_crowdin_summary">Join the QKSMS translation project on Crowdin</string> - <!--Preference subcategory--> - <string name="pref_subcat_theme">Theme</string> - <!--Preference subcategory--> - <string name="pref_subcat_system_bars">System bars</string> - <!--Preference subcategory--> - <string name="pref_subcat_categories">Categories</string> - <!--Preference subcategory--> - <string name="pref_subcat_font">Font</string> - <!--Preference subcategory--> - <string name="pref_subcat_messages">Messages</string> - <!--Preference subcategory--> - <string name="pref_subcat_avatars">Avatars</string> - <string name="donate_google">Donate with Google</string> - <string name="donate_google_summary">Google takes 30% of donations</string> - <string name="donate_paypal">Donate with PayPal</string> - <string name="donate_paypal_button">Donate any amount</string> - <string name="donate_paypal_button_summary">Buy me anything you want!</string> - <!--Donation product name--> - <string name="product_name_donation">Donation</string> - <!--$1 donation product name--> - <string name="product_name_donate_1">Donate $1 USD</string> - <!--$5 donation product name--> - <string name="product_name_donate_5">Donate $5 USD</string> - <!--$3 donation product name--> - <string name="product_name_donate_10">Donate $10 USD</string> - <!--$1 donation product description--> - <string name="product_description_donate_1">Buy me a Coke</string> - <!--$5 donation product description--> - <string name="product_description_donate_5">Buy me a sandwich</string> - <!--$10 donaion product description--> - <string name="product_description_donate_10">Buy me lunch</string> - <string name="title_settings">Settings</string> - <string name="title_search">Search</string> - <string name="title_compose">Compose</string> - <string name="title_conversation_list">Conversations</string> - <string name="title_blocked">Blocked</string> - <string name="title_changelog">Changelog</string> - <string name="title_picker">New messages</string> - <string name="title_donate">Donate</string> - <string name="title_qk_responses">QK Responses</string> - <string name="title_block_address">Block number</string> - <string name="title_unblock_address">Unblock number</string> - <string name="title_conversations_selected">%s selected</string> - <string name="title_palette">Palette</string> - <string name="title_rgb">RGB</string> - <!-- Menu shown in the context menu when long pressing on a message when the message contains - one or more phone numbers and/or email addresses and the number or email is new to - contacts. [CHAR LIMIT=50] --> - <string name="menu_add_address_to_contacts">Add <xliff:g id="contactEmailOrNumber">%s</xliff:g> to People</string> - <!-- Context menu item on an individual message for viewing an attached slideshow --> - <string name="view_slideshow">View slideshow</string> - <!-- Context menu item on an individual message for viewing message details such as time and date --> - <string name="view_message_details">View details</string> - <!-- Context menu item on an individual message for viewing a delivery report --> - <string name="view_delivery_report">View report</string> - <!-- Context menu item on an individual message for deleting only that message --> - <string name="delete_message">Delete</string> - <!-- Abbreviation for "kilobyte" --> - <string name="kilobyte">KB</string> - <!-- Individual message context menu item --> - <string name="copy_message_text">Copy text</string> - <!-- Header for context menu on an individual message --> - <string name="message_options">Message options</string> - <!-- Delivery Header View --> - <!-- Title of "Report" window --> - <string name="delivery_header_title">Report</string> - <!--Text for app restart confirmation dialog--> - <string name="restart_message">These changes will take effect the next time QKSMS is opened</string> - <!--Dialog title for asking if a user wants to delete a conversation--> - <string name="delete_conversation">Delete conversations</string> - <!--Dialog title for asking if a user wants to delete all failed messages--> - <string name="delete_all_failed">Delete failed messages</string> - <!--CDialog title for asking if a user wants to delete a conversation--> - <string name="delete_confirmation">Are you sure you would like to delete (%s) conversations?</string> - <!--CDialog title for asking if a user wants to delete all failed messages--> - <string name="delete_all_failed_confirmation">Are you sure you would like to delete failed messages from (%s) conversations?</string> - <!--(Unused) Dialog title shown if APNs have not been set--> - <string name="apns_not_set">APNs not set</string> - <!--(Unused) Dialog description shown if APNs have not been set--> - <string name="apns_not_set_description">It appears that your APNs have not been set. This means that MMS will not work properly. Please press okay to have QKSMS find them for you :)</string> - <!--Dialog title show if MMS hasn't been configured--> - <string name="set_up_mms_title">Set up MMS?</string> - <!--Dialog description shown if MMS hasn't yet been configured--> - <string name="set_up_mms_description">It appears that MMS hasn\'t been configured in QKSMS yet. Press okay automatically configure MMS.</string> - <!-- Dialog message text explaining that a draft message will not be saved due to invalid recipients --> - <string name="discard_message_reason">Your message will be discarded because it has no valid recipients.</string> - <string name="invalid_code">Invalid code</string> - <!--Button to restart app now instead of manually later--> - <string name="restart">Restart now</string> - <!--Notification action to reply to a message--> - <string name="reply">Reply</string> - <!--Notification action to reply to a message--> - <string name="reply_qksms">Reply via QKSMS</string> - <!--Notification action to mark a message as read--> - <string name="read">Read</string> - <!--Notification action to mark a message as read--> - <string name="mark_read">Mark as read</string> - <!--Notification action to call the sender of a message--> - <string name="call">Call</string> - <!-- Notification toast message --> - <string name="notification_mute_on">Notifications enabled</string> - <string name="notification_mute_off">Notifications disabled</string> - <!--Positive action button--> - <string name="yes">Yes</string> - <string name="add">Add</string> - <!--Positive action button--> - <string name="save">Save</string> - <!--Positive action button--> - <string name="enable">Enable</string> - <!--Positive action button--> - <string name="upgrade_now">Set now</string> - <!--Positive action button--> - <string name="okay">Okay</string> - <!--Positive action button--> - <string name="redeem">Redeem</string> - <!--Neutral action button--> - <string name="just_once">Just once</string> - <!--Neutral action button--> - <string name="later">Later</string> - <!--Neutral action button --> - <string name="cancel">Cancel</string> - <!-- Name of the local user when displaying sender of an outgoing message (personal pronoun) --> - <string name="messagelist_sender_self">Me</string> - <!-- Sender to be used if the sender address has been hidden --> - <string name="hidden_sender_address">Hidden sender address</string> - <!-- Subject to display in the conversation list if there is no subject --> - <string name="no_subject_view">(No subject)</string> - <!-- Time and date a message is due to expire --> - <string name="expire_on">"Expires: <xliff:g id="date">%s</xliff:g>"</string> - <!-- Formatting for subject displayed inline, prepended to MMS message text --> - <string name="inline_subject">"<Subject: <xliff:g id="subject">%s</xliff:g>>"</string> - <!-- Text of a button appearing for MMS messages that have not yet been downloaded, causing the message to be downloaded (imperative verb) --> - <string name="download">Download</string> - <!-- Message displayed in place of the "download message" button once it has been pressed, indicating that the download is in progress --> - <string name="downloading">Downloading</string> - <!-- Toast message while an image is being resized --> - <string name="compressing">Picture too large. Compressing\u2026</string> - <!-- Header shown above favorite contacts in QKCompose --> - <string name="favorites">Starred contacts</string> - <!-- Word represents 'self' in a conversation --> - <string name="me">Me</string> - <string name="menu_edit">Edit</string> - <string name="menu_delete_messages">Delete messages</string> - <string name="menu_delete_failed">Delete failed messages</string> - <string name="menu_lock">Lock</string> - <string name="menu_unlock">Unlock</string> - <!-- When the user tries to view message details and some error occurs while - retrieving those details, this message will be shown. --> - <string name="cannot_get_details">Can\'t get details.</string> - <!-- Title of "Message details" dialog --> - <string name="message_details_title">Message details</string> - <!-- Label in "Message details" dialog --> - <string name="message_type_label">Type\u000A</string> - <!-- "Type" value in "Message details" dialog --> - <string name="text_message">Text message</string> - <!-- "Type" value in "Message details" dialog --> - <string name="multimedia_message">Multimedia message</string> - <!-- "Type" value in "Message details" dialog --> - <string name="multimedia_notification">Multimedia message notification</string> - <!-- Label in "Message details" dialog showing who sent the message. --> - <string name="from_label">From\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="to_address_label">To\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="bcc_label">Bcc\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="sent_label">Sent\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="received_label">Received\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="saved_label">Saved\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="subject_label">Subject\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="message_size_label">Message size\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="priority_label">Priority\u000A</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_high">High</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_normal">Normal</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_low">Low</string> - <!-- Label in "Message details" dialog --> - <string name="message_class_label">Message class\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="error_code_label">Error code\u000A</string> - <!-- Alert dialog title when creating a slideshow [CHAR LIMIT=none] --> - <string name="building_slideshow_title">Building slideshow</string> - <!-- Tag appearing on conversations in the conversation list that contain a draft message --> - <string name="has_draft">Draft</string> - <!-- In conversation list items, this is the separator between a contact's name and the draft stamp [CHAR LIMIT=5] --> - <string name="draft_separator">,\u0020</string> - <!-- In conversation list items, this comes after the receipient's name and contains the number of messages in the thread [CHAR LIMIT=5] --> - <string name="message_count_format">\u00a0<xliff:g id="number" example="1">%1$s</xliff:g></string> - <!-- For debugging: Dialog box title indicating there's a situation where data has unexpectedly changed --> - <string name="error_state">Inconsistent state</string> - <!-- For debugging: Dialog box text indicating there's a situation where data has unexpectedly changed --> - <string name="error_state_text">The state of threads and recipients is inconsistent. Please capture a bug report and report it via http://go/droidanizer </string> - <!-- This is the dialog title for the "Select link" dialog, shown when the user clicks on a - chat in the chat history view if there are links in the chat message. The dialog displays the - links if there are any --> - <string name="select_link_title">Choose action</string> - <!-- In message list items, this string builds the timestamp line when the message is in a group [CHAR LIMIT=NONE] --> - <string name="message_timestamp_format"><xliff:g id="string" example="Fred Flinstone">%1$s</xliff:g>\u0020-\u0020<xliff:g id="string" example="9:39AM">%2$s</xliff:g></string> - <!--Message sending status: sending--> - <string name="status_sending">Sending…</string> - <!--Message sending status: failed--> - <!--<string name="status_failed">Failed. Tap to retry</string>--> - <!-- Delivery Report Activity --> - <!-- Status in "Report" window --> - <string name="status_none">(None)</string> - <!-- Status in "Report" window --> - <string name="status_pending">Pending</string> - <!-- Status in "Report" window --> - <string name="status_read">Read</string> - <!-- Status in "Report" window --> - <string name="status_received">Received</string> - <!-- Status in "Report" window --> - <string name="status_failed">Failed. Tap for options</string> - <!-- Status in "Report" window --> - <string name="status_unread">Unread</string> - <!-- Status in "Report" window --> - <string name="status_rejected">Rejected</string> - <!-- Label in "Report" window --> - <string name="recipient_label">Recipient:\u0020</string> - <!-- Label in "Report" window --> - <string name="status_label">Status:\u0020</string> - <!-- Label in "Report" window [CHAR LIMIT=50]--> - <string name="delivered_label">Delivered:\u0020</string> - <string name="do_something">Do something</string> - <!-- Confirm Delete --> - <!-- Delete confirmation dialog title --> - <string name="confirm_dialog_title">Delete?</string> - <!-- Delete confirmation dialog title for locked messages --> - <string name="confirm_dialog_locked_title">Delete locked message?</string> - <!-- This message is displayed in a confirmation dialog when the user selects one or more - conversations and then taps the "Delete" button. --> - <plurals name="confirm_delete_conversation"> - <!-- Case of 1 result. --> - <item quantity="one">One conversation will be deleted.</item> - <!-- Case of 0 or 2 or more results. --> - <item quantity="other"><xliff:g id="number" example="15">%1$s</xliff:g> conversations will be deleted.</item> - </plurals> - <string name="confirm_delete_conversation">The entire thread will be deleted.</string> - <!-- Delete all threads confirmation dialog message --> - <string name="confirm_delete_all_conversations">All threads will be deleted.</string> - <!-- Delete message confirmation dialog message --> - <string name="confirm_delete_message">The message will be deleted.</string> - <!-- Delete message confirmation dialog message for a locked message --> - <string name="confirm_delete_locked_message">Delete this locked message?</string> - <!-- Delete all the messages on the SIM dialog message --> - <string name="confirm_delete_all_SIM_messages">All messages on the SIM card will be deleted.</string> - <!-- Delete the selected message on the SIM dialog message --> - <string name="confirm_delete_SIM_message">This message on the SIM card will be deleted.</string> - <!-- Delete unlocked checkbox title --> - <string name="delete_unlocked">Delete locked messages</string> - <!-- Delete button title --> - <string name="delete">Delete</string> - <!-- More button title --> - <string name="more">More</string> - <!-- More button summary --> - <string name="more_summary">Tap to see more</string> - <!-- Action bar mode title when multi-selecting conversations --> - <string name="select_conversations">Choose conversations</string> - <!-- Show this in the middle of the main activity when there are no conversations [CHAR LIMIT=none] --> - <string name="no_conversations">No conversations.</string> - <!-- Show this in the middle of the main activity when loading conversations [CHAR LIMIT=none] --> - <string name="loading_conversations">Loading conversations.</string> - <!-- Tells the user that QKSMS isn't the default SMS app --> - <string name="not_default">Default SMS</string> - <!-- Tells the user they need to set QKSMS as the default app in order to use this feature --> - <string name="default_info">QKSMS needs to be your SMS app to do that</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to mark messages as read --> - <string name="not_default_mark_read">QKSMS must be your SMS app to mark messages read</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to mark messages as unread --> - <string name="not_default_mark_unread">QKSMS must be your SMS app to mark messages unread</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to send messages --> - <string name="not_default_delete">QKSMS must be your SMS app to delete messages</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to delete messages --> - <string name="not_default_send">QKSMS must be your SMS app to send messages</string> - <!-- Tells the user they should set QKSMS as the default messaging app --> - <string name="not_default_first">Some things won\'t work until QKSMS is the default SMS app</string> - <string name="delayed_messaging_info">Delayed messaging allows you to cancel messages before they send. Change the default behavior and more in Settings</string> - <string name="delayed_duration_bounds_error">Duration must be between 1 and 30 seconds</string> - <!-- Dialog title for the Read Report dialog. --> - <string name="confirm">Confirm</string> - <!-- Dialog text for the Read Report dialog. --> - <string name="message_send_read_report">A read report will be sent.</string> - <!-- Dialog title for updating app icon color --> - <string name="update_icon_title">Update icon color</string> - <!-- Dialog message for updating app icon color --> - <string name="update_icon_message">QKSMS must be restarted when changing the icon color</string> - <string name="dialog_conversation_details_title">Conversation details</string> - <string name="dialog_conversation_details_last_message_date">Last message date</string> - <string name="dialog_conversation_details_message_count">Message count</string> - <string name="dialog_conversation_details_recipients">Recipients (%s)</string> - <string name="dialog_should_i_answer_title">Should I Answer? not installed</string> - <string name="dialog_should_i_answer_message">Would you like to download the app from Google Play now?</string> - <string name="dialog_delete_old_messages">Are you sure you want to automatically delete old messages?</string> - <!-- Title for audio file picker --> - <string name="select_audio">Choose audio</string> - <!-- Menu title to copy an attachment to the shared storage [CHAR LIMIT=25] --> - <string name="copy_to_sdcard">Save attachment</string> - <!-- Toast message on successful copy to shared storage [CHAR LIMIT=30] --> - <string name="copy_to_sdcard_success">Attachment saved.</string> - <!-- Toast message on failed copy to shared storage [CHAR LIMIT=30] --> - <string name="copy_to_sdcard_fail">Couldn\'t save attachment.</string> - <!-- Menu title to save a sound as a ringtone --> - <string name="save_ringtone">Save as ringtone</string> - <!-- Toast message on successful copying ringtone to drm provider --> - <string name="saved_ringtone">Ringtone saved.</string> - <!-- Toast message on failed copying ringtone to drm provider --> - <string name="saved_ringtone_fail">Couldn\'t save ringtone.</string> - <!-- Menu item --> - <!-- Menu item [CHAR LIMIT=40] --> - <string name="menu_group_participants">Group participants</string> - <!--Toast shown when a draft is saved--> - <string name="toast_draft">Saved draft</string> - <!--Toast shown when a conversation is deleted--> - <string name="toast_conversation_deleted">Conversation deleted</string> - <!--Toast shown when device is low on storage--> - <string name="toast_low_memory">"Phone storage is full. Delete some files to free space."</string> - <!--Toast shown to tell user that forwarding messages doesn't work yet--> - <string name="toast_forward">This feature has not yet been implemented. For now please use the Copy text option and paste that in the conversation you would like to send it</string> - <!--Toast shown for unimplemented features--> - <string name="toast_unimplemented">This feature has not yet been implemented</string> - <!--Toast shown when a message fails to send--> - <string name="toast_message_failure">Message failed to send</string> - <!--Toast shown when a message is delivered--> - <string name="toast_message_delivered">Message delivered</string> - <!--Toast shown when a message is not delivered--> - <string name="toast_message_not_delivered">Message not delivered</string> - <!--Toast shown when default APNs are loaded--> - <string name="toast_default_apns_loaded">Loaded default APN settings</string> - <!--Toast shown when text is copied to the clipboard--> - <string name="toast_copy_text">Copied text to clipboard</string> - <!--Toast shown when Google Play Services is not available for purchasing a product--> - <string name="toast_billing_not_available">Purchase requires Google Play Store (billing) on your Android</string> - <!--Toast shown when Google Play Services is not available for purchasing a product--> - <string name="toast_endlessjabber_not_installed">EndlessJabber is not installed, opening Google Play</string> - <string name="toast_changelog_error">Couldn\'t load the changelog. Please try again later</string> - <string name="toast_conversation_error">Couldn\'t open conversation</string> - <string name="toast_deleting_old_messages">Your old messages will be deleted shortly</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_1">Thank you for donating! You\'re my new best friend.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_2">Thanks for the donation! I love you.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_3">Thanks for donating! You\'re helping QKSMS become the best texting app ever made.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_4">Thanks for the donation! You\'re awesome.</string> - <!--Menu option to mute conversation--> - <string name="menu_mute_conversation">Mute conversation</string> - <!--Menu option to mute conversation--> - <string name="menu_unmute_conversation">Unmute conversation</string> - <string name="menu_block_conversations">Block conversations</string> - <string name="menu_unblock_conversations">Unblock conversations</string> - <string name="menu_messages">Messages</string> - <string name="menu_blocked">Blocked</string> - <string name="menu_blocked_conversations">Blocked (%s new)</string> - <string name="menu_unblocked_conversations">Messages (%s new)</string> - <string name="menu_notifications">Notifications</string> - <string name="menu_notifications_off">Notifications off</string> - <string name="menu_notification_settings">Conversation settings</string> - <string name="menu_view_details">View details</string> - <string name="menu_mark_read">Mark read</string> - <string name="menu_mark_unread">Mark unread</string> - <string name="menu_delete_conversation">Delete conversation</string> - <string name="menu_multi_select">Select conversation</string> - <string name="menu_done">Done</string> - <string name="failed_message_title">Failed message options</string> - <!--Toast shown to tell the user that they don't have a photo attachments app, and suggests that they download one--> - <string name="attachment_app_not_found">Attachments app not found. Try installing a photo gallery app!</string> - <string name="attachment_camera_error">The camera could not be opened</string> - <string name="pref_max_mms_attachment_size">Maximum MMS attachment size</string> - <string name="error_no_recipients">Select some contacts to send this message to!</string> - <string name="error_file_not_found">QKSMS can\'t access the file you\'re trying to share!</string> - <string name="sending_blocked_welcome_screen_message">Hold up! You\'ll get to send real messages in a minute!</string> - <string name="notification_colored_icon_ready">Touch to add to your launcher from home screen.</string> - <string name="notification_title_colored_icon_ready">QKSMS colored icon is ready</string> - <string name="icon_ready">Your new icon is ready!</string> - <string name="icon_ready_message">You can now add it to your home screen again with the updated color.</string> - <string name="dont_ask_again">Don\'t ask again</string> - <string name="warning">Stagefright warning</string> - <string name="stagefright_warning">Video messages may contain a harmful exploit that can leave your phone vulnerable to attacks. Would you like to continue?</string> - <!-- MMS DIALOG SETUP STRINGS --> - <string name="mms_setup_set_up_mms_title">Set up MMS?</string> - <string name="mms_setup_set_up_mms_body">It appears that MMS isn\'t set up in QKSMS. Press okay to automatically configure MMS.</string> - <string name="mms_setup_setting_up_later_title">Setting up MMS later</string> - <string name="mms_setup_setting_up_later_body">Visit the MMS section of Settings to try automatic configuration, contact support, or enter your own configuration.</string> - <string name="mms_setup_no_configurations_found_title">No configurations found</string> - <string name="mms_setup_no_configurations_found_body">We couldn\'t find an MMS configuration for your carrier automatically. Press okay to contact support. We\'ll help you get set up! </string> - <string name="mms_setup_one_configuration_found_title">One configuration found</string> - <string name="mms_setup_one_configuration_found_body">We have found an MMS configuration for the %s carrier. Does that sound right?</string> - <string name="mms_setup_multiple_configurations_found_title">Multiple configuration found</string> - <string name="mms_setup_multiple_configurations_found_body">We have found multiple MMS configurations. Choose your carrier from the list, or press N/A if your carrier isn\'t on the list.</string> - <string name="mms_setup_next_steps_title">Next steps</string> - <string name="mms_setup_next_steps_body">Visit the MMS section of Settings to try automatic configuration again, contact support, or enter your own configuration.</string> - <string name="mms_setup_success_title">Success!</string> - <string name="mms_setup_success_body">If you encounter any issues, visit the MMS section of Settings to try automatic configuration again, contact support, or enter your own configuration.</string> - <string name="na">N/A</string> - <string name="no">No</string> - <string name="pref_automatically_configure_mms">Automatically Configure MMS</string> - <string name="pref_mms_contact_support">Contact Support</string> - <string name="pref_category_sending_mms">Sending MMS</string> - <string name="pref_category_mms_configuration">MMS Configuration</string> - <string name="pref_mms_contact_support_summary">Contact the QKSMS team for help setting up MMS</string> - <string name="pref_markdown_enabled">Text formatting</string> - <string name="pref_markdown_enabled_summary">Use markdown syntax to get bold, underline, and italics in your messages</string> - <string name="want_read_indicators">Want read indicators?</string> - <string name="color_swatch_description">Color %1$d</string> - <string name="color_swatch_description_selected">Color %1$d selected</string> - <string name="color_picker_default_title">Select a Color</string> - <string name="message_delivered">Message Delivered</string> - <string name="message_not_delivered">Message Not Delivered</string> - <string name="error">Error</string> - <string name="invalid_destination">Invalid destination address.</string> - <string name="service_not_activated">Service not activated on network.</string> - <string name="service_message_not_found">Message expired or not available.</string> - <string name="service_network_problem">Couldn\'t send due to network problem.</string> - <string name="message_queued">Currently can\'t send your message. It will be sent when the service becomes available.</string> - <string name="download_later">Can\'t download right now. Try again later.</string> - <string name="no_apn">No APN specified for the app, you need to set it up in settings!</string> - <string name="no_subject">(No subject)</string> - <string name="unknown_sender">Unknown sender</string> - <string name="dl_failure_notification">Couldn\'t download message <xliff:g id="subject">%1$s</xliff:g> from <xliff:g id="from">%2$s</xliff:g>.</string> - <string name="auto_select_multiple_apns">Multiple different configurations have been found. Try one now. If it doesn\'t work, you can try a new one by going to Settings > Advanced > Load default APNs.</string> - <string name="auto_select_apn">Automatically Select APNs</string> - <string name="auto_select_failed_title">Automatic configuration failed</string> - <string name="auto_select_failed">Try searching for your carrier\'s APN settings (MMSC, Port, and Proxy) and entering them in Settings > Advanced.</string> - <string name="date_yesterday">Yesterday</string> - <string name="date_just_now">Just now</string> - <string name="compose_loading_attachment">Loading attachment</string> - <string name="hint_no_messages">No messages yet.\nClick the + to send one!</string> - <string-array name="resend_menu"> - <item>Resend</item> - <item>Edit</item> - <item>Delete</item> - </string-array> - <string-array name="message_menu"> - <item>Forward message</item> - <item>Copy text</item> - <item>View details</item> - <item>Delete message</item> - </string-array> - <string-array name="background_titles"> - <item>Material Light</item> - <item>Material Dark</item> - <item>Black</item> - </string-array> - <string-array name="font_sizes"> - <item>Small</item> - <item>Normal</item> - <item>Large</item> - <item>Largest</item> - </string-array> - <string-array name="font_families"> - <item>Roboto Regular</item> - <item>Roboto Condensed</item> - <item>System font</item> - </string-array> - <string-array name="font_weights"> - <item>Light</item> - <item>Normal</item> - </string-array> - <!-- String to match as no subject and filter out as a subject. For example, if the - subject string is "no subject", we won't display that. We'll pretend - no subject string was delivered. --> - <string-array name="empty_subject_strings"> - <item>no subject</item> - </string-array> - <string-array name="qk_responses"> - <item>Okay</item> - <item>Give me a moment</item> - <item>On my way</item> - <item>Thanks</item> - <item>Sounds good</item> - <item>What\'s up?</item> - <item>Agreed</item> - <item>No</item> - <item>Love you</item> - <item>Sorry</item> - <item>LOL</item> - <item>That\'s okay</item> - </string-array> - <string-array name="enter_button_options"> - <item>Show emoji</item> - <item>New line</item> - <item>Send message</item> - </string-array> - <string-array name="notification_private_options"> - <item>Show all</item> - <item>Hide message</item> - <item>Hide message and sender</item> - </string-array> - <!-- Max MMS attachment sizes. I.e. will compress pictures that are larger than 300 KB down to - under 300KB. --> - <string-array name="max_mms_attachment_sizes"> - <item>300 KB</item> - <item>600 KB</item> - <item>1 MB</item> - <item>Unlimited</item> - </string-array> -</resources> diff --git a/QKSMS/src/main/res/values-nl/strings.xml b/QKSMS/src/main/res/values-nl/strings.xml deleted file mode 100644 index 02c53517e..000000000 --- a/QKSMS/src/main/res/values-nl/strings.xml +++ /dev/null @@ -1,768 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!--Generated by crowdin.com--> -<resources xmlns:xliff="http://schemas.android.com/apk/res-auto"> - <!--Slogan--> - <string name="slogan">Word opnieuw verliefd op sms\'en.</string> - <!--Text shown when a phone number cannot be found--> - <string name="unknown_number">Onbekend Nummer</string> - <!--Content description for photos--> - <string name="popup_photo_CD">Foto</string> - <!--Text to be displayed while content is loading--> - <string name="loading">Laden…</string> - <!--Test string--> - <string name="test">Test string</string> - <!--Hint for contacts text field--> - <string name="hint_contacts">Voer ontvanger in</string> - <!--Hint for search text field--> - <string name="hint_search">Zoek</string> - <!--Hint for message reply text field--> - <string name="hint_reply">Voer een bericht in</string> - <!--Hint for code redemption--> - <string name="hint_redeem">Voer code in</string> - <string name="hint_hex">Hex</string> - <!--Text shown for single new message in notification--> - <string name="new_message">Nieuw bericht</string> - <!--Text shown after number of unread messages in notification (ex. 3 new messages)--> - <string name="new_messages">Nieuwe berichten</string> - <!--Text shown for single failed message in notification--> - <string name="failed_message">Bericht niet verzonden</string> - <!--Text shown after number of failed messages in notification (ex. 3 messages failed to send)--> - <string name="failed_messages">Berichten niet verzonden</string> - <!--Text shown under failed message count--> - <string name="failed_messages_summary">Tik om te bekijken</string> - <!--QuickCompose notification title--> - <string name="quickcompose">QK Compose</string> - <!--QuickCompose notification text--> - <string name="quickcompose_detail">Klik om bericht te verzenden</string> - <!--Welcome screen intro button--> - <string name="welcome_start">Laten we beginnen!</string> - <!--Allows user to skip welcome screen--> - <string name="welcome_skip">OVERSLAAN</string> - <!--Allows user to finish the welcome screen--> - <string name="welcome_finish">EINDE</string> - <!--Indicates to user they can pick a color--> - <string name="welcome_theme_title">Kies een kleur</string> - <!--Indicates to user they can pick any colors--> - <string name="welcome_theme_description">Eender welk kleur.</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_night_description">Ziet er goed uit.</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_night_hint">Probeer me</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_quickreply_title">QK Reply</string> - <!--QK Reply explanation--> - <string name="welcome_quickreply_description">Antwoord sneller dan ooit op berichten.</string> - <!--Prompts user to try QK Reply--> - <string name="welcome_quickreply_hint">Probeer het uit!</string> - <!--QK Reply demo message--> - <string name="welcome_quickreply_message_1">Wow! Was dat niet geweldig? Je kan het volledige gesprek zien in een oogwenk. Klik buiten de popup of op het vinkje om te sluiten.</string> - <!--QK Reply demo message--> - <string name="welcome_quickreply_message_2">Dit is QK Reply. Nu kan je van overal antwoorden. Klik op de uitbreidknop om te zien wat er gebeurt.</string> - <!--Settings option in menu--> - <string name="menu_settings">Instellingen</string> - <!--Search option in menu--> - <string name="menu_search">Zoek</string> - <!--Show full conversation in QuickReply--> - <string name="menu_show_all">Toon alle berichten</string> - <!--Show only unread messages in QuickReply--> - <string name="menu_show_unread">Toon ongelezen berichten</string> - <!--Open conversation option in menu (shown in QuickReply)--> - <string name="menu_open_thread">Open gesprek</string> - <!--Forward message option in menu--> - <string name="menu_forward">Stuur bericht door</string> - <!--Call contact option in menu--> - <string name="menu_call">Bel</string> - <!--Mark a message/conversation as read option in menu--> - <string name="menu_read">Markeren als gelezen</string> - <!--Delete a message option in menu--> - <string name="menu_delete">Verwijder</string> - <!--Donate option in menu--> - <string name="menu_billing">QKSMS+</string> - <!--Copy text option in menu--> - <string name="menu_copy">Kopieer tekst</string> - <!--Changelog option in menu--> - <string name="menu_changelog">"Wat is er nieuw"</string> - <!--Expand settings option in menu--> - <string name="menu_show_all_prefs">Toon alles</string> - <!--Show less settings option in menu--> - <string name="menu_show_fewer_prefs">Toon minder</string> - <!--Title for message details popup--> - <string name="details_title">Details</string> - <!--Title for address that message is being sent to in message details popup--> - <string name="details_to">Naar</string> - <!--Title for address that message is sent from in message details popup--> - <string name="details_from">Van</string> - <!--Title for text of a message in message details popup--> - <string name="details_body">Inhoud bericht</string> - <!--Title for date sent of a message in message details popup--> - <string name="details_date_sent">Datum verzonden</string> - <!--Title for date received of a message in message details popup--> - <string name="details_date_received">Datum ontvangen</string> - <!--Title for rate snackbar--> - <string name="rate_title">Vind je QKSMS leuk?</string> - <!--Title for rate button--> - <string name="rate_action">Beoordelen</string> - <string name="pref_category_appearance">Uiterlijk</string> - <string name="pref_category_summary_appearance">Thema\'s, lettertypes, kleuren, avatars, en meer</string> - <string name="pref_category_general">Algemeen</string> - <string name="pref_category_summary_general">Bezorging, bericht verzending, opmaak</string> - <string name="pref_category_blocking">Berichten blokkeren</string> - <string name="pref_category_notifications">Meldingen</string> - <string name="pref_category_summary_notifications">Geluiden, LED, privacy</string> - <string name="pref_category_mms">MMS</string> - <string name="pref_category_summary_mms">Configureer MMS (APNs), maximum grootte, groepsgesprekken</string> - <string name="pref_category_quickreply">QK Reply</string> - <string name="pref_category_summary_quickreply">QK Reply, popup voorkeuren</string> - <string name="pref_category_quickcompose">QK Compose</string> - <string name="pref_category_summary_quickcompose">QK Compose, favoriete contacten</string> - <string name="pref_category_about">Over</string> - <string name="pref_category_summary_about">Versie, changelog, auteurs, bedankingen</string> - <string name="pref_theme">Themakleur</string> - <string name="pref_theme_summary_alt">Klik om thema te veranderen</string> - <string name="pref_icon">Icon color</string> - <string name="pref_icon_summary">Tap to change the QKSMS icon color</string> - <string name="pref_status_tint">Gekleurde statusbalk</string> - <string name="pref_navigation_tint">Gekleurde navigatiebalk</string> - <string name="pref_background">Achtergrondkleur</string> - <string name="pref_background_summary">Klik om achtergrondkleur te veranderen</string> - <string name="pref_bubbles">Tekstballonnen</string> - <string name="pref_bubbles_summary">Klik om de tekstballonnen te veranderen</string> - <string name="pref_night">Nacht modus</string> - <string name="pref_night_summary">Bespaar batterij en verminder pijn aan de ogen</string> - <string name="pref_night_amoled">Puur zwarte achtergrond</string> - <string name="pref_night_amoled_summary">Bespaar extra batterij op toestellen met AMOLED displays</string> - <string name="pref_bubble_style_new">Nieuwe tekstballonnen gebruiken</string> - <string name="pref_color_sent">Verzonden berichten inkleuren</string> - <string name="pref_color_sent_summary">Kleur de achtergrond van verzonden berichten in</string> - <string name="pref_color_received">Ontvangen berichten inkleuren</string> - <string name="pref_color_received_summary">Kleur de achtergrond van ontvangen berichten in</string> - <string name="pref_hide_avatar_conversations">Verberg gespreksavatars</string> - <string name="pref_hide_avatar_conversations_summary">Avatars van contactpersonen in gesprekslijst verbergen</string> - <string name="pref_hide_avatar_sent">Verberg avatars van verzonden berichten</string> - <string name="pref_hide_avatar_sent_summary">Verberg uw avatar van uitgaande berichten</string> - <string name="pref_hide_avatar_received">Verberg avatars van ontvangen berichten</string> - <string name="pref_hide_avatar_received_summary">Verberg contactfoto bij binnenkomende berichten</string> - <string name="pref_font_family">Lettertype</string> - <string name="pref_font_size">Tekst grootte</string> - <string name="pref_font_weight">Lettertype breedte</string> - <string name="pref_message_count">Aantal berichten</string> - <string name="pref_message_count_summary">Toon het aantal berichten voor elk gesprek</string> - <string name="pref_sent_timestamps">Sent timestamps</string> - <string name="pref_sent_timestamps_summary">Show the timestamp for when a message was sent, not received</string> - <string name="pref_force_timestamps">Force timestamps</string> - <string name="pref_force_timestamps_summary">Enable timestamps for all messages</string> - <string name="pref_key_timestamp_delay">New timestamp delay</string> - <string name="pref_key_timestamp_delay_summary">The number of minutes which must elapse between two messages in order for a new timestamp to be shown.</string> - <string name="pref_compose_favorites">Favoriete contacten</string> - <string name="pref_compose_summary_favorites">Toon uw favoriete contacten in QK Compose, zo zijn ze maar een tik van u vandaan</string> - <string name="pref_prox_sensor_call">Nabijheidssensor</string> - <string name="pref_prox_sensor_call_summary">In een gesprek, breng de telefoon naar je oor om te bellen</string> - <string name="pref_delivery">Ontvangstbevestigingen</string> - <string name="pref_delivery_summary">Bevestigen dat de berichten met succes verzonden werden</string> - <string name="pref_delivery_toast">Toon toastbericht</string> - <string name="pref_delivery_toast_summary">Toon een kort toastbericht bij ontvangstbevestiging</string> - <string name="pref_delivery_vibrate">Trillen</string> - <string name="pref_delivery_vibrate_summary">Trillen bij ontvangstbevestiging</string> - <string name="pref_delete_old_messages">Delete old messages</string> - <string name="pref_delete_old_messages_summary">Automatically delete messages once they\'re old enough</string> - <string name="pref_delete_old_messages_unread">Unread messages</string> - <string name="pref_delete_old_messages_unread_summary">Automatically delete unread messages after %s days</string> - <string name="pref_delete_old_messages_read">Read messages</string> - <string name="pref_delete_old_messages_read_summary">Automatically delete read messages after %s days</string> - <string name="pref_yappy">Yappy integratie</string> - <string name="pref_endlessjabber_summary">Schakel volledige Yappy integratie in</string> - <string name="pref_blocked_conversations">Geblokkeerde gesprekken</string> - <string name="pref_blocked_conversations_summary">Houdt een gesprek ingedrukt en blokkeer het om het naar de geblokkeerde inbox te verplaatsen en om meldingen te stoppen</string> - <string name="pref_block_future">Toekomstige berichten blokkeren</string> - <string name="pref_block_future_summary">Voeg extra telefoonnummers toe om te blokkeren</string> - <string name="pref_should_i_answer">Should I Answer? integratie</string> - <string name="pref_should_i_answer_summary">Inkomende berichten automatisch verwijderen van berichten die geblokkeerd zijn door Should I Answer?</string> - <string name="pref_mobile_only">Mobiele nummers</string> - <string name="pref_mobile_only_summary">Toon enkel mobiele nummers bij contactsuggesties</string> - <string name="pref_auto_emoji">Automatische emoji</string> - <string name="pref_auto_emoji_summary">Vervang tekst met emoji</string> - <string name="pref_enter_button">Enter-knop</string> - <string name="pref_enter_button_summary">Klik om het gedrag van de enter-knop te wijzigen</string> - <string name="pref_compose_group">Groepsgesprekken</string> - <string name="pref_compose_group_summary">Bij het sturen naar meerdere contacten, stuur een groepsbericht in plaats van individuele berichten</string> - <string name="pref_auto_download">MMS automatisch downloaden</string> - <string name="pref_auto_download_summary">MMS automatisch downloaden wanneer ze beschikbaar zijn</string> - <string name="pref_auto_data">Automatisch mobiele gegevens</string> - <string name="pref_auto_data_summary">Zet mobiele gegevens automatisch aan bij ontvangen of versturen van MMS</string> - <string name="pref_split">SMS opsplitsen</string> - <string name="pref_split_summary">Lange berichten opgesplitst in afzonderlijke berichten</string> - <string name="pref_split_counter">Teller splitsen</string> - <string name="pref_split_counter_summary">Voegt een teller voor elk geplitst bericht toe</string> - <string name="pref_long_as_mms">Verstuur lang bericht als MMS</string> - <string name="pref_long_as_mms_summary">Verstuur lang bericht als MMS in plaats van te splitsen</string> - <string name="pref_long_as_mms_after">Verstuur nadien lang bericht als MMS</string> - <string name="pref_long_as_mms_after_summary">Lange berichten als MMS versturen als ze het maximum overschrijden</string> - <string name="pref_return">Laat returnknop zien</string> - <string name="pref_return_summary">Laat returnknop op toetsenbord zien ipv Emoji knop</string> - <string name="pref_text">Tekst</string> - <string name="pref_notifications">SMS-meldingen ingeschakeld</string> - <string name="pref_led">Melding LED</string> - <string name="pref_theme_led">Kleur notificatieled</string> - <string name="pref_wake">Scherm oplichten</string> - <string name="pref_wake_summary">Laat het scherm oplichten wanneer je een bericht ontvangt</string> - <string name="pref_notifications_private">Privémeldingen</string> - <string name="pref_notifications_private_summary">Klik wat verborgen moet worden in melding</string> - <string name="pref_ringtone">Meldinggeluid</string> - <string name="pref_ringtone_summary">Selecteer een geluid voor meldingen</string> - <string name="pref_ticker">Toon ticker</string> - <string name="pref_ticker_summary">Toont fragment van nieuw bericht in hoofdding melding</string> - <string name="pref_vibration">Trillen</string> - <string name="pref_vibration_summary">Trillen wanneer nieuwe berichten worden ontvangen</string> - <string name="pref_notification_call">Belknop</string> - <string name="pref_notification_call_summary">Toon een belknop rechts op de melding</string> - <string name="pref_dimiss_read">Markeren als gelezen</string> - <string name="pref_dismiss_read_summary">Markeren als gelezen wanneer melding wordt verwijderd</string> - <string name="pref_delayed">Vertraagd verzenden</string> - <string name="pref_delayed_summary">Wachten vooraleer een bericht wordt verzonden, zodat je het kan nalezen</string> - <string name="pref_delayed_duration">Vertragingstijd (in seconden)</string> - <string name="pref_delayed_duration_summary">Vertraging vooraleer uw bericht wordt verzonden</string> - <string name="pref_night_auto">Automatische nachtmodus</string> - <string name="pref_night_auto_summary">Schakel op een bepaald tijdstip over naar nachtmodus</string> - <string name="pref_day_start">Dag begint om</string> - <string name="pref_night_start">Nacht begint om</string> - <string name="pref_qk_responses">QK Responses</string> - <string name="pref_qk_responses_summary">Wijzig de antwoorden voor Android Wear</string> - <string name="pref_quickreply_enabled">QK Reply ingeschakeld</string> - <string name="pref_quickreply_enabled_summary">Toon QK Reply popup wanneer een nieuw bericht is ontvangen</string> - <string name="pref_tap_to_quit">Tik om te negeren</string> - <string name="pref_tap_to_quit_summary">Tik buiten het venster om te negeren</string> - <string name="pref_quickcompose">QK Compose ingeschakeld</string> - <string name="pref_quickcompose_summary">Laat melding zien die u toelaat om een nieuw bericht aan te maken</string> - <string name="pref_mms_enabled">MMS ingeschakeld</string> - <string name="pref_mms_enabled_summary">Schakel verzenden en ontvangen van MMS in</string> - <string name="pref_mmsc_url">MMSC</string> - <string name="pref_mms_proxy">MMS proxy</string> - <string name="pref_mms_port">MMS poort</string> - <string name="pref_apn_chooser">Laad standaard APN’s</string> - <string name="pref_strip_unicode">Strip unicode</string> - <string name="pref_strip_unicode_summary">Wissel tekens die niet worden ondersteund in full-length berichten voor GSM compatibele tekens</string> - <string name="pref_system_bar_flat">Flat system bars</string> - <string name="pref_system_bar_flat_summary">De gradiënt verwijderen op de systeembalk op de meeste KitKat-apparaten</string> - <string name="pref_status_compat">Status bar fix</string> - <string name="pref_status_compat_summary">Corrigeert problemen veroorzaakt door immersieve modus, gekleurde statusbalk (Xposed), of aangepaste DPI-instellingen</string> - <string name="pref_navigation_compat">Navigatie balk fix</string> - <string name="pref_navigation_compat_summary">Corrigeert problemen veroorzaakt door immersieve modus, gekleurde statusbalk (Xposed), of aangepaste DPI-instellingen</string> - <string name="pref_about_version_title">QKSMS versie</string> - <string name="pref_about_authors_title">Ontwikkelaars</string> - <string name="pref_about_authors_summary">Moez Bhatti</string> - <string name="pref_changelog_summary">Tik om changelog te bekijken</string> - <string name="pref_about_thanks_title">Bedankt</string> - <string name="pref_about_thanks_summary">Tik om open source bijdragers te zien</string> - <string name="pref_donate_title">Doneren</string> - <string name="pref_donate_summary">QKSMS is vrije software. Ondersteun ons met een donatie!</string> - <string name="pref_about_gplus_title">Google+</string> - <string name="pref_about_gplus_summary">Word lid van de QKSMS Beta Testing community op Google+</string> - <string name="pref_about_github_title">GitHub</string> - <string name="pref_about_github_summary">QKSMS is open-source. Draag bij en rapporteer problemen op GitHub</string> - <string name="pref_about_crowdin_title">Crowdin</string> - <string name="pref_about_crowdin_summary">Word lid van het vertaalproject van QKSMS op Crowdin</string> - <!--Preference subcategory--> - <string name="pref_subcat_theme">Thema</string> - <!--Preference subcategory--> - <string name="pref_subcat_system_bars">Systembalk</string> - <!--Preference subcategory--> - <string name="pref_subcat_categories">Categorieën</string> - <!--Preference subcategory--> - <string name="pref_subcat_font">Lettertype</string> - <!--Preference subcategory--> - <string name="pref_subcat_messages">Berichten</string> - <!--Preference subcategory--> - <string name="pref_subcat_avatars">Avatars</string> - <string name="donate_google">Doneren via Google</string> - <string name="donate_google_summary">Google neemt 30% van de donaties</string> - <string name="donate_paypal">Doneren via PayPal</string> - <string name="donate_paypal_button">Schenk elk bedrag</string> - <string name="donate_paypal_button_summary">Trakteer me op wat je maar wilt!</string> - <!--Donation product name--> - <string name="product_name_donation">Donatie</string> - <!--$1 donation product name--> - <string name="product_name_donate_1">Schenk $1</string> - <!--$5 donation product name--> - <string name="product_name_donate_5">Schenk $5</string> - <!--$3 donation product name--> - <string name="product_name_donate_10">Schenk $10</string> - <!--$1 donation product description--> - <string name="product_description_donate_1">Trakteer me een Cola</string> - <!--$5 donation product description--> - <string name="product_description_donate_5">Trakteer me een sandwich</string> - <!--$10 donaion product description--> - <string name="product_description_donate_10">Trakteer me op een lunch</string> - <string name="title_settings">Instellingen</string> - <string name="title_search">Zoek</string> - <string name="title_compose">Schrijf</string> - <string name="title_conversation_list">Gesprekken</string> - <string name="title_blocked">Geblokkeerd</string> - <string name="title_changelog">Historiek wijzigingen</string> - <string name="title_picker">Nieuwe berichten</string> - <string name="title_donate">QKSMS+</string> - <string name="title_qk_responses">QK Responses</string> - <string name="title_block_address">Blokkeer nummer</string> - <string name="title_unblock_address">Deblokkeer nummer</string> - <string name="title_conversations_selected">%s geselecteerd</string> - <string name="title_palette">Palette</string> - <string name="title_rgb">RGB</string> - <!-- Menu shown in the context menu when long pressing on a message when the message contains - one or more phone numbers and/or email addresses and the number or email is new to - contacts. [CHAR LIMIT=50] --> - <string name="menu_add_address_to_contacts">Voeg <xliff:g id="contactEmailOrNumber">%s</xliff:g> toe aan Personen</string> - <!-- Context menu item on an individual message for viewing an attached slideshow --> - <string name="view_slideshow">Bekijk diavoorstelling</string> - <!-- Context menu item on an individual message for viewing message details such as time and date --> - <string name="view_message_details">Bekijk details</string> - <!-- Context menu item on an individual message for viewing a delivery report --> - <string name="view_delivery_report">Rapport weergeven</string> - <!-- Context menu item on an individual message for deleting only that message --> - <string name="delete_message">Verwijderen</string> - <!-- Abbreviation for "kilobyte" --> - <string name="kilobyte">KB</string> - <!-- Individual message context menu item --> - <string name="copy_message_text">Tekst kopiëren</string> - <!-- Header for context menu on an individual message --> - <string name="message_options">Berichtopties</string> - <!-- Delivery Header View --> - <!-- Title of "Report" window --> - <string name="delivery_header_title">Verslag</string> - <!--Text for app restart confirmation dialog--> - <string name="restart_message">Deze wijzigingen zullen van kracht zijn de volgende keer dat QKSMS geopend wordt</string> - <!--Dialog title for asking if a user wants to delete a conversation--> - <string name="delete_conversation">Verwijder gesprekken</string> - <!--Dialog title for asking if a user wants to delete all failed messages--> - <string name="delete_all_failed">Verwijder mislukte berichten</string> - <!--CDialog title for asking if a user wants to delete a conversation--> - <string name="delete_confirmation">Ben je zeker dat je (%s) gesprekken wilt verwijderen?</string> - <!--CDialog title for asking if a user wants to delete all failed messages--> - <string name="delete_all_failed_confirmation">Ben je zeker dat je mislukte berichten van (%s) gesprekken wilt verwijderen?</string> - <!--(Unused) Dialog title shown if APNs have not been set--> - <string name="apns_not_set">APN\'s niet ingesteld</string> - <!--(Unused) Dialog description shown if APNs have not been set--> - <string name="apns_not_set_description">Het lijkt er op dat uw APN\'s niet zijn ingesteld. De MMS-functie zal niet goed werken. Druk op ok om QKSMS ze te laten zoeken :)</string> - <!--Dialog title show if MMS hasn't been configured--> - <string name="set_up_mms_title">MMS instellen?</string> - <!--Dialog description shown if MMS hasn't yet been configured--> - <string name="set_up_mms_description">Blijkbaar is MMS nog niet ingesteld in QKSMS, tik op Oke om in te stellen.</string> - <!-- Dialog message text explaining that a draft message will not be saved due to invalid recipients --> - <string name="discard_message_reason">Geen geldige ontvanger. Bericht wordt verwijderd.</string> - <string name="invalid_code">Ongeldige code</string> - <!--Button to restart app now instead of manually later--> - <string name="restart">Herstart nu</string> - <!--Notification action to reply to a message--> - <string name="reply">Beantwoorden</string> - <!--Notification action to reply to a message--> - <string name="reply_qksms">Beantwoorden met QKSMS</string> - <!--Notification action to mark a message as read--> - <string name="read">Gelezen</string> - <!--Notification action to mark a message as read--> - <string name="mark_read">Markeer als gelezen</string> - <!--Notification action to call the sender of a message--> - <string name="call">Bel</string> - <!-- Notification toast message --> - <string name="notification_mute_on">Meldingen ingeschakeld</string> - <string name="notification_mute_off">Meldingen uitgeschakeld</string> - <!--Positive action button--> - <string name="yes">Ja</string> - <string name="add">Toevoegen</string> - <!--Positive action button--> - <string name="save">Opslaan</string> - <!--Positive action button--> - <string name="enable">Inschakelen</string> - <!--Positive action button--> - <string name="upgrade_now">Nu instellen</string> - <!--Positive action button--> - <string name="okay">Oke</string> - <!--Positive action button--> - <string name="redeem">Inwisselen</string> - <!--Neutral action button--> - <string name="just_once">Eenmalig</string> - <!--Neutral action button--> - <string name="later">Later</string> - <!--Neutral action button --> - <string name="cancel">Annuleren</string> - <!-- Name of the local user when displaying sender of an outgoing message (personal pronoun) --> - <string name="messagelist_sender_self">Ik</string> - <!-- Sender to be used if the sender address has been hidden --> - <string name="hidden_sender_address">Verborgen afzenderadres</string> - <!-- Subject to display in the conversation list if there is no subject --> - <string name="no_subject_view">(Geen onderwerp)</string> - <!-- Time and date a message is due to expire --> - <string name="expire_on">"Expires: <xliff:g id="date">%s</xliff:g>"</string> - <!-- Formatting for subject displayed inline, prepended to MMS message text --> - <string name="inline_subject">"<Subject: <xliff:g id="subject">%s</xliff:g>>"</string> - <!-- Text of a button appearing for MMS messages that have not yet been downloaded, causing the message to be downloaded (imperative verb) --> - <string name="download">Downloaden</string> - <!-- Message displayed in place of the "download message" button once it has been pressed, indicating that the download is in progress --> - <string name="downloading">Downloaden</string> - <!-- Toast message while an image is being resized --> - <string name="compressing">Afbeelding te groot. Verkleinen\u2026</string> - <!-- Header shown above favorite contacts in QKCompose --> - <string name="favorites">Favoriete contacten</string> - <!-- Word represents 'self' in a conversation --> - <string name="me">Ik</string> - <string name="menu_edit">Wijzig</string> - <string name="menu_delete_messages">Berichten verwijderen</string> - <string name="menu_delete_failed">Verwijder mislukte berichten</string> - <string name="menu_lock">Vergrendel</string> - <string name="menu_unlock">Ontgrendel</string> - <!-- When the user tries to view message details and some error occurs while - retrieving those details, this message will be shown. --> - <string name="cannot_get_details">Kan geen details opvragen.</string> - <!-- Title of "Message details" dialog --> - <string name="message_details_title">Berichtgegevens</string> - <!-- Label in "Message details" dialog --> - <string name="message_type_label">Type\u000A</string> - <!-- "Type" value in "Message details" dialog --> - <string name="text_message">Bericht</string> - <!-- "Type" value in "Message details" dialog --> - <string name="multimedia_message">Multimediabericht</string> - <!-- "Type" value in "Message details" dialog --> - <string name="multimedia_notification">MMS-notificatie</string> - <!-- Label in "Message details" dialog showing who sent the message. --> - <string name="from_label">Van\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="to_address_label">Aan\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="bcc_label">Bcc\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="sent_label">Verzonden\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="received_label">Ontvangen\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="saved_label">Opgeslaan\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="subject_label">Onderwerp\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="message_size_label">Berichtgrootte\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="priority_label">Prioriteit\u000A</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_high">Hoog</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_normal">Normaal</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_low">Laag</string> - <!-- Label in "Message details" dialog --> - <string name="message_class_label">Berichtklasse\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="error_code_label">Foutcode\u000A</string> - <!-- Alert dialog title when creating a slideshow [CHAR LIMIT=none] --> - <string name="building_slideshow_title">Diavoorstelling bouwen</string> - <!-- Tag appearing on conversations in the conversation list that contain a draft message --> - <string name="has_draft">Concept</string> - <!-- In conversation list items, this is the separator between a contact's name and the draft stamp [CHAR LIMIT=5] --> - <string name="draft_separator">,\u0020</string> - <!-- In conversation list items, this comes after the receipient's name and contains the number of messages in the thread [CHAR LIMIT=5] --> - <string name="message_count_format">\u00a0<xliff:g id="number" example="1">%1$s</xliff:g></string> - <!-- For debugging: Dialog box title indicating there's a situation where data has unexpectedly changed --> - <string name="error_state">Inconsistente toestand</string> - <!-- For debugging: Dialog box text indicating there's a situation where data has unexpectedly changed --> - <string name="error_state_text">De toestand van gesprekken en ontvangers is inconsistent. Maak alstublieft een bug rapport aan en meld het via http://go/droidanizer </string> - <!-- This is the dialog title for the "Select link" dialog, shown when the user clicks on a - chat in the chat history view if there are links in the chat message. The dialog displays the - links if there are any --> - <string name="select_link_title">Kies actie</string> - <!-- In message list items, this string builds the timestamp line when the message is in a group [CHAR LIMIT=NONE] --> - <string name="message_timestamp_format"><xliff:g id="string" example="Fred Flinstone">%1$s</xliff:g>\u0020-\u0020<xliff:g id="string" example="9:39AM">%2$s</xliff:g></string> - <!--Message sending status: sending--> - <string name="status_sending">Verzenden...</string> - <!--Message sending status: failed--> - <!--<string name="status_failed">Failed. Tap to retry</string>--> - <!-- Delivery Report Activity --> - <!-- Status in "Report" window --> - <string name="status_none">(Geen)</string> - <!-- Status in "Report" window --> - <string name="status_pending">Bezig</string> - <!-- Status in "Report" window --> - <string name="status_read">Gelezen</string> - <!-- Status in "Report" window --> - <string name="status_received">Ontvangen</string> - <!-- Status in "Report" window --> - <string name="status_failed">Mislukt. Tik voor opties</string> - <!-- Status in "Report" window --> - <string name="status_unread">Ongelezen</string> - <!-- Status in "Report" window --> - <string name="status_rejected">Afgewezen</string> - <!-- Label in "Report" window --> - <string name="recipient_label">Ontvanger:\u0020</string> - <!-- Label in "Report" window --> - <string name="status_label">Status:\u0020</string> - <!-- Label in "Report" window [CHAR LIMIT=50]--> - <string name="delivered_label">Afgeleverd:\u0020</string> - <string name="do_something">Doe iets</string> - <!-- Confirm Delete --> - <!-- Delete confirmation dialog title --> - <string name="confirm_dialog_title">Verwijderen?</string> - <!-- Delete confirmation dialog title for locked messages --> - <string name="confirm_dialog_locked_title">Vastgezette berichten verwijderen?</string> - <!-- This message is displayed in a confirmation dialog when the user selects one or more - conversations and then taps the "Delete" button. --> - <plurals name="confirm_delete_conversation"> - <!-- Case of 1 result. --> - <item quantity="one">Eén gesprek zal verwijderd worden.</item> - <!-- Case of 0 or 2 or more results. --> - <item quantity="other"><xliff:g id="number" example="15">%1$s</xliff:g> gesprekken zullen worden verwijderd.</item> - </plurals> - <string name="confirm_delete_conversation">Volledige gesprek zal verwijderd worden.</string> - <!-- Delete all threads confirmation dialog message --> - <string name="confirm_delete_all_conversations">Alle gesprekken zullen verwijderd worden..</string> - <!-- Delete message confirmation dialog message --> - <string name="confirm_delete_message">Dit bericht zal verwijderd worden.</string> - <!-- Delete message confirmation dialog message for a locked message --> - <string name="confirm_delete_locked_message">Dit vastgezet bericht verwijderen?</string> - <!-- Delete all the messages on the SIM dialog message --> - <string name="confirm_delete_all_SIM_messages">Alle berichten op de SIM-kaart zullen verwijderd worden.</string> - <!-- Delete the selected message on the SIM dialog message --> - <string name="confirm_delete_SIM_message">Dit bericht op de SIM-kaart zal verwijderd worden.</string> - <!-- Delete unlocked checkbox title --> - <string name="delete_unlocked">Verwijder vastgezette berichten</string> - <!-- Delete button title --> - <string name="delete">Verwijder</string> - <!-- More button title --> - <string name="more">Meer</string> - <!-- More button summary --> - <string name="more_summary">Tik om meer te zien</string> - <!-- Action bar mode title when multi-selecting conversations --> - <string name="select_conversations">Kies gesprekken</string> - <!-- Show this in the middle of the main activity when there are no conversations [CHAR LIMIT=none] --> - <string name="no_conversations">Geen gesprekken.</string> - <!-- Show this in the middle of the main activity when loading conversations [CHAR LIMIT=none] --> - <string name="loading_conversations">Gesprekken laden.</string> - <!-- Tells the user that QKSMS isn't the default SMS app --> - <string name="not_default">Standaard SMS app</string> - <!-- Tells the user they need to set QKSMS as the default app in order to use this feature --> - <string name="default_info">QKSMS moet uw standaard SMS-app zijn om dat te doen</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to mark messages as read --> - <string name="not_default_mark_read">QKSMS moet uw standaard SMS-app zijn om berichten als gelezen te markeren</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to mark messages as unread --> - <string name="not_default_mark_unread">QKSMS moet uw standaard SMS-app zijn om berichten als ongelezen te markeren</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to send messages --> - <string name="not_default_delete">QKSMS moet uw standaard SMS-app zijn om berichten te verwijderen</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to delete messages --> - <string name="not_default_send">QKSMS moet uw standaard SMS-app zijn om berichten te verzenden</string> - <!-- Tells the user they should set QKSMS as the default messaging app --> - <string name="not_default_first">Sommige dingen zullen niet werken totdat QKSMS uw standaard SMS-app is</string> - <string name="delayed_messaging_info">Vertraagd verzenden stelt u in staat berichten te annuleren. Meer info bij de instellingen</string> - <string name="delayed_duration_bounds_error">Duur moet 1 en 30 seconden zijn</string> - <!-- Dialog title for the Read Report dialog. --> - <string name="confirm">Bevestig</string> - <!-- Dialog text for the Read Report dialog. --> - <string name="message_send_read_report">Een leesbevestiging zal verzonden worden.</string> - <!-- Dialog title for updating app icon color --> - <string name="update_icon_title">Pictogram kleur bijwerken</string> - <!-- Dialog message for updating app icon color --> - <string name="update_icon_message">QKSMS must be restarted when changing the icon color</string> - <string name="dialog_conversation_details_title">Gespreksdetails</string> - <string name="dialog_conversation_details_last_message_date">Datum van laatste bericht</string> - <string name="dialog_conversation_details_message_count">Aantal berichten</string> - <string name="dialog_conversation_details_recipients">Ontvangers (%s)</string> - <string name="dialog_should_i_answer_title">Should I Answer? niet geïnstalleerd</string> - <string name="dialog_should_i_answer_message">Wil je de app nu downloaden van Google Play?</string> - <string name="dialog_delete_old_messages">Are you sure you want to automatically delete old messages?</string> - <!-- Title for audio file picker --> - <string name="select_audio">Kies audio</string> - <!-- Menu title to copy an attachment to the shared storage [CHAR LIMIT=25] --> - <string name="copy_to_sdcard">Bijlage opslaan</string> - <!-- Toast message on successful copy to shared storage [CHAR LIMIT=30] --> - <string name="copy_to_sdcard_success">Bijlage opgeslaan.</string> - <!-- Toast message on failed copy to shared storage [CHAR LIMIT=30] --> - <string name="copy_to_sdcard_fail">Kon bijlage niet opslaan.</string> - <!-- Menu title to save a sound as a ringtone --> - <string name="save_ringtone">Sla op als ringtone</string> - <!-- Toast message on successful copying ringtone to drm provider --> - <string name="saved_ringtone">Ringtone opgeslaan.</string> - <!-- Toast message on failed copying ringtone to drm provider --> - <string name="saved_ringtone_fail">Kon ringtone niet opslaan.</string> - <!-- Menu item --> - <!-- Menu item [CHAR LIMIT=40] --> - <string name="menu_group_participants">Groepdeelnemers</string> - <!--Toast shown when a draft is saved--> - <string name="toast_draft">Opgeslagen concept</string> - <!--Toast shown when a conversation is deleted--> - <string name="toast_conversation_deleted">Gesprek verwijderd</string> - <!--Toast shown when device is low on storage--> - <string name="toast_low_memory">"Telefoon opslag is vol. Verwijder bestanden om ruimte vrij te maken."</string> - <!--Toast shown to tell user that forwarding messages doesn't work yet--> - <string name="toast_forward">Deze functie werd nog niet geïmplementeerd. Op dit ogenblik kunt u de optie kopiëren en plakken gebruiken om de tekst in het gesprek te plakken die u zou willen verzenden</string> - <!--Toast shown for unimplemented features--> - <string name="toast_unimplemented">Deze functie werd nog niet geïmplementeerd</string> - <!--Toast shown when a message fails to send--> - <string name="toast_message_failure">Bericht verzenden mislukt</string> - <!--Toast shown when a message is delivered--> - <string name="toast_message_delivered">Bericht afgeleverd</string> - <!--Toast shown when a message is not delivered--> - <string name="toast_message_not_delivered">Bericht niet afgeleverd</string> - <!--Toast shown when default APNs are loaded--> - <string name="toast_default_apns_loaded">APN standaardinstellingen geladen</string> - <!--Toast shown when text is copied to the clipboard--> - <string name="toast_copy_text">Tekst gekopieerd naar naar Klembord</string> - <!--Toast shown when Google Play Services is not available for purchasing a product--> - <string name="toast_billing_not_available">Aankoop vereist Google Play Store (facturatie) op uw Android</string> - <!--Toast shown when Google Play Services is not available for purchasing a product--> - <string name="toast_endlessjabber_not_installed">EndlessJabber is niet geïnstalleerd, Google Play wordt geopend</string> - <string name="toast_changelog_error">Kon de changelog niet laden. Probeer later opnieuw</string> - <string name="toast_conversation_error">Couldn\'t open conversation</string> - <string name="toast_deleting_old_messages">Your old messages will be deleted shortly</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_1">Dank je voor de donatie! Je bent mijn nieuwe beste vriend.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_2">Bedankt voor de donatie! Ik hou van jou.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_3">Bedankt voor het doneren! U helpt QKSMS om de beste SMS app te worden die ooit gemaakt werd.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_4">Bedankt voor de donatie! Je bent geweldig.</string> - <!--Menu option to mute conversation--> - <string name="menu_mute_conversation">Demp gesprek</string> - <!--Menu option to mute conversation--> - <string name="menu_unmute_conversation">Gesprek niet meer dempen</string> - <string name="menu_block_conversations">Gesprekken blokkeren</string> - <string name="menu_unblock_conversations">Gesprekken deblokkeren</string> - <string name="menu_messages">Berichten</string> - <string name="menu_blocked">Geblokkeerd</string> - <string name="menu_blocked_conversations">Geblokkeerd (%s nieuw)</string> - <string name="menu_unblocked_conversations">Berichten (%s nieuw)</string> - <string name="menu_notifications">Meldingen</string> - <string name="menu_notifications_off">Meldingen uitzetten</string> - <string name="menu_notification_settings">Conversatieinstellingen</string> - <string name="menu_view_details">Bekijk details</string> - <string name="menu_mark_read">Markeer als gelezen</string> - <string name="menu_mark_unread">Markeer als ongelezen</string> - <string name="menu_delete_conversation">Verwijder gesprek</string> - <string name="menu_multi_select">Kies gesprek</string> - <string name="menu_done">Klaar</string> - <string name="failed_message_title">Opties voor mislukte berichten</string> - <!--Toast shown to tell the user that they don't have a photo attachments app, and suggests that they download one--> - <string name="attachment_app_not_found">Geen foto-app gevonden. Probeer een galerij-app te installeren!</string> - <string name="attachment_camera_error">De camera kon niet worden geopend</string> - <string name="pref_max_mms_attachment_size">Maximum grootte van MMS-bijlage</string> - <string name="error_no_recipients">Selecteer contacten om dit bericht naar te zenden!</string> - <string name="error_file_not_found">QKSMS heeft geen toegang tot dit bestand!</string> - <string name="sending_blocked_welcome_screen_message">Wacht even! Je gaat dadelijk echte berichten versturen!</string> - <string name="notification_colored_icon_ready">Klik om toe te voegen aan het startscherm.</string> - <string name="notification_title_colored_icon_ready">QKSMS gekleurd icoon is klaar</string> - <string name="icon_ready">Je nieuw icoon is klaar!</string> - <string name="icon_ready_message">Je kan het nu toevoegen aan je beginscherm met de nieuwe kleur.</string> - <string name="dont_ask_again">Niet opnieuw vragen</string> - <string name="warning">Stagefright waarschuwing</string> - <string name="stagefright_warning">Videoberichten kunnen ervoor zorgen dat je telefoon kwetsbaar is voor aanvallen. Wil je doorgaan?</string> - <!-- MMS DIALOG SETUP STRINGS --> - <string name="mms_setup_set_up_mms_title">MMS instellen?</string> - <string name="mms_setup_set_up_mms_body">Blijkbaar is MMS nog niet ingesteld. Tik op OKE om automatisch in te stellen</string> - <string name="mms_setup_setting_up_later_title">MMS later instellen</string> - <string name="mms_setup_setting_up_later_body">Ga naar de MMS-sectie in instellingen om de MMS-opties in te stellen.</string> - <string name="mms_setup_no_configurations_found_title">Geen configurtatie gevonden</string> - <string name="mms_setup_no_configurations_found_body">We vonden geen MMS-instellingen. Tik OKE om hulp te vragen. We helpen je op weg! </string> - <string name="mms_setup_one_configuration_found_title">Eén configuratie gevonden</string> - <string name="mms_setup_one_configuration_found_body">We vonden een configuratie voor %s. Klinkt dat juist?</string> - <string name="mms_setup_multiple_configurations_found_title">Meerder configuraties gevonden</string> - <string name="mms_setup_multiple_configurations_found_body">We hebben meerdere MMS-configuraties gevonden! Kies uw provider uit de lijst of tik op n.v.t. indien deze niet in de lijst staat.</string> - <string name="mms_setup_next_steps_title">Volgende stappen</string> - <string name="mms_setup_next_steps_body">Ga naar de MMS-instellingen om deze verder aan te passen</string> - <string name="mms_setup_success_title">Gelukt!</string> - <string name="mms_setup_success_body">Bij problemen, ga naar de MMS-instellingen om opnieuw te configureren.</string> - <string name="na">n.v.t.</string> - <string name="no">Nee</string> - <string name="pref_automatically_configure_mms">MMS automatch configureren</string> - <string name="pref_mms_contact_support">Support contacteren</string> - <string name="pref_category_sending_mms">MMS verzenden</string> - <string name="pref_category_mms_configuration">MMS configuratie</string> - <string name="pref_mms_contact_support_summary">Contacteer het QKSMS team voor hulp om MMS werkend te krijgen</string> - <string name="pref_markdown_enabled">Tekstopmaak</string> - <string name="pref_markdown_enabled_summary">Gebruik markdown syntax om vetgedrukte, onderlijnde of schuine tekst in uw berichten te gebruiken</string> - <string name="want_read_indicators">Wil je de indicators lezen?</string> - <string name="color_swatch_description">Kleur %1$d</string> - <string name="color_swatch_description_selected">Kleur %1$d geselecteerd</string> - <string name="color_picker_default_title">Selecteer een kleur</string> - <string name="message_delivered">Bericht verzonden</string> - <string name="message_not_delivered">Bericht niet afgeleverd</string> - <string name="error">Er is een fout opgetreden</string> - <string name="invalid_destination">Ongeldig doeladres.</string> - <string name="service_not_activated">Service niet geactiveerd op netwerk.</string> - <string name="service_message_not_found">Bericht verlopen of niet beschikbaar.</string> - <string name="service_network_problem">Kon niet verzonden worden door netwerkprobleem.</string> - <string name="message_queued">Het bericht kan momenteel niet verzonden worden. Het zal verzonden worden wanneer de service besschikbaar is.</string> - <string name="download_later">Kan momenteel niet downloaden. Probeer later opnieuw.</string> - <string name="no_apn">Geen APN gespecificeerd voor de app, je moet deze instellen in de instellingen!</string> - <string name="no_subject">Geen onderwerp</string> - <string name="unknown_sender">Onbekende afzender</string> - <string name="dl_failure_notification">Kon beriche <xliff:g id="subject">%1$s</xliff:g> van <xliff:g id="from">%2$s</xliff:g> niet downloaden.</string> - <string name="auto_select_multiple_apns">Meerdere configuraties gevonden, probeer er nu één uit. Als het niet werkt kan je een nieuwe proberen bij Instellingen > Geavanceerd > Laad standaard APNs.</string> - <string name="auto_select_apn">Automatisch APNs kiezen</string> - <string name="auto_select_failed_title">Automatische configuratie mislukt</string> - <string name="auto_select_failed">Zoek naar de APN-instellingen voor je operator (MMSC, poort en proxy) en voer ze in bij Instellingen > Geavanceerd.</string> - <string name="date_yesterday">Gisteren</string> - <string name="date_just_now">Zojuist</string> - <string name="compose_loading_attachment">Bijlage laden</string> - <string name="hint_no_messages">Nog geen berichten.\nKlik + om er één te verzenden!</string> - <string-array name="resend_menu"> - <item>Opnieuw verzenden</item> - <item>Bewerken</item> - <item>Verwijderen</item> - </string-array> - <string-array name="message_menu"> - <item>Stuur bericht door</item> - <item>Kopieer tekst</item> - <item>Weergave details</item> - <item>Bericht verwijderen</item> - </string-array> - <string-array name="background_titles"> - <item>Material Light</item> - <item>Material Dark</item> - <item>Zwart</item> - </string-array> - <string-array name="font_sizes"> - <item>Klein</item> - <item>Normaal</item> - <item>Groot</item> - <item>Grootste</item> - </string-array> - <string-array name="font_families"> - <item>Roboto Regular</item> - <item>Roboto Condensed</item> - <item>Systeemlettertype</item> - </string-array> - <string-array name="font_weights"> - <item>Licht</item> - <item>Normaal</item> - </string-array> - <!-- String to match as no subject and filter out as a subject. For example, if the - subject string is "no subject", we won't display that. We'll pretend - no subject string was delivered. --> - <string-array name="empty_subject_strings"> - <item>Geen onderwerp</item> - </string-array> - <string-array name="qk_responses"> - <item>Oké</item> - <item>Wacht even</item> - <item>Onderweg</item> - <item>Bedankt</item> - <item>Klinkt goed</item> - <item>Alles goed?</item> - <item>Ik ga akkoord</item> - <item>Nee</item> - <item>Hou van je</item> - <item>Sorry</item> - <item>LOL</item> - <item>Dat is oke</item> - </string-array> - <string-array name="enter_button_options"> - <item>Toon emoji</item> - <item>Nieuwe regel</item> - <item>Bericht verzenden</item> - </string-array> - <string-array name="notification_private_options"> - <item>Alles tonen</item> - <item>Verberg bericht</item> - <item>Bericht en afzender verbergen</item> - </string-array> - <!-- Max MMS attachment sizes. I.e. will compress pictures that are larger than 300 KB down to - under 300KB. --> - <string-array name="max_mms_attachment_sizes"> - <item>300 KB</item> - <item>600 KB</item> - <item>1 MB</item> - <item>Ongelimiteerd</item> - </string-array> -</resources> diff --git a/QKSMS/src/main/res/values-no/strings.xml b/QKSMS/src/main/res/values-no/strings.xml deleted file mode 100644 index 8fb0ff268..000000000 --- a/QKSMS/src/main/res/values-no/strings.xml +++ /dev/null @@ -1,768 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!--Generated by crowdin.com--> -<resources xmlns:xliff="http://schemas.android.com/apk/res-auto"> - <!--Slogan--> - <string name="slogan">Elsker å tekste igjen.</string> - <!--Text shown when a phone number cannot be found--> - <string name="unknown_number">Ukjent nummer</string> - <!--Content description for photos--> - <string name="popup_photo_CD">Bilde</string> - <!--Text to be displayed while content is loading--> - <string name="loading">Laster... </string> - <!--Test string--> - <string name="test">Test</string> - <!--Hint for contacts text field--> - <string name="hint_contacts">Mottakere </string> - <!--Hint for search text field--> - <string name="hint_search">Søk</string> - <!--Hint for message reply text field--> - <string name="hint_reply">Melding</string> - <!--Hint for code redemption--> - <string name="hint_redeem">Angi kode</string> - <string name="hint_hex">Hex</string> - <!--Text shown for single new message in notification--> - <string name="new_message">Ny melding </string> - <!--Text shown after number of unread messages in notification (ex. 3 new messages)--> - <string name="new_messages">nye meldinger</string> - <!--Text shown for single failed message in notification--> - <string name="failed_message">Meldingen ble ikke sendt</string> - <!--Text shown after number of failed messages in notification (ex. 3 messages failed to send)--> - <string name="failed_messages">Meldingene ble ikke sendt</string> - <!--Text shown under failed message count--> - <string name="failed_messages_summary">Trykk for å vise</string> - <!--QuickCompose notification title--> - <string name="quickcompose">Hurtigsvar</string> - <!--QuickCompose notification text--> - <string name="quickcompose_detail">Trykk for å sende melding</string> - <!--Welcome screen intro button--> - <string name="welcome_start">La oss komme i gang!</string> - <!--Allows user to skip welcome screen--> - <string name="welcome_skip">HOPP OVER</string> - <!--Allows user to finish the welcome screen--> - <string name="welcome_finish">FULLFØR</string> - <!--Indicates to user they can pick a color--> - <string name="welcome_theme_title">Velge en farge</string> - <!--Indicates to user they can pick any colors--> - <string name="welcome_theme_description">Alle farger.</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_night_description">Behagelig for øynene.</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_night_hint">Nattmodus</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_quickreply_title">Hurtigsvar</string> - <!--QK Reply explanation--> - <string name="welcome_quickreply_description">Svare på meldinger raskere enn noensinne.</string> - <!--Prompts user to try QK Reply--> - <string name="welcome_quickreply_hint">Prøv det!</string> - <!--QK Reply demo message--> - <string name="welcome_quickreply_message_1">Wow! Var ikke det fantastisk? Du kan se hele samtalen raskt. Trykk utenfor popup eller trykk haken å avvise det.</string> - <!--QK Reply demo message--> - <string name="welcome_quickreply_message_2">Dette er hurtigsvar. Nå kan du svare på meldinger fra hvor som helst. Trykk på Vis for å se hva som skjer videre :)</string> - <!--Settings option in menu--> - <string name="menu_settings">Innstillinger</string> - <!--Search option in menu--> - <string name="menu_search">Søk</string> - <!--Show full conversation in QuickReply--> - <string name="menu_show_all">Vis alle meldinger</string> - <!--Show only unread messages in QuickReply--> - <string name="menu_show_unread">Vis uleste meldinger</string> - <!--Open conversation option in menu (shown in QuickReply)--> - <string name="menu_open_thread">Åpne samtale</string> - <!--Forward message option in menu--> - <string name="menu_forward">Videresend melding</string> - <!--Call contact option in menu--> - <string name="menu_call">Ring</string> - <!--Mark a message/conversation as read option in menu--> - <string name="menu_read">Marker som lest</string> - <!--Delete a message option in menu--> - <string name="menu_delete">Slett</string> - <!--Donate option in menu--> - <string name="menu_billing">Donèr</string> - <!--Copy text option in menu--> - <string name="menu_copy">Kopier tekst</string> - <!--Changelog option in menu--> - <string name="menu_changelog">"Hva er nytt"</string> - <!--Expand settings option in menu--> - <string name="menu_show_all_prefs">Vis alle</string> - <!--Show less settings option in menu--> - <string name="menu_show_fewer_prefs">Vis færre</string> - <!--Title for message details popup--> - <string name="details_title">Detaljer</string> - <!--Title for address that message is being sent to in message details popup--> - <string name="details_to">Til</string> - <!--Title for address that message is sent from in message details popup--> - <string name="details_from">Fra</string> - <!--Title for text of a message in message details popup--> - <string name="details_body">Innhold</string> - <!--Title for date sent of a message in message details popup--> - <string name="details_date_sent">Dato sendt</string> - <!--Title for date received of a message in message details popup--> - <string name="details_date_received">Dato mottatt</string> - <!--Title for rate snackbar--> - <string name="rate_title">Liker du QKSMS?</string> - <!--Title for rate button--> - <string name="rate_action">Gi poeng</string> - <string name="pref_category_appearance">Utseende</string> - <string name="pref_category_summary_appearance">Temaer, skrifter, farger, avatarer og mer</string> - <string name="pref_category_general">Generelt</string> - <string name="pref_category_summary_general">Levering, sending, formatering</string> - <string name="pref_category_blocking">Message blocking</string> - <string name="pref_category_notifications">Varsler</string> - <string name="pref_category_summary_notifications">Lyder, LED, personvern</string> - <string name="pref_category_mms">MMS</string> - <string name="pref_category_summary_mms">Konfigurere MMS (APNer), maks størrelse, gruppemeldinger</string> - <string name="pref_category_quickreply">Hurtigsvar</string> - <string name="pref_category_summary_quickreply">Hurtigsvar, popup-alternativer</string> - <string name="pref_category_quickcompose">Hurtig- komposisjon</string> - <string name="pref_category_summary_quickcompose">Hurtig-komposisjon, favoritt-kontakter</string> - <string name="pref_category_about">Om</string> - <string name="pref_category_summary_about">Versjon, endringslogg, forfattere, takk</string> - <string name="pref_theme">Theme color</string> - <string name="pref_theme_summary_alt">Trykk for å endre tema</string> - <string name="pref_icon">Icon color</string> - <string name="pref_icon_summary">Tap to change the QKSMS icon color</string> - <string name="pref_status_tint">Gjennomsiktig status linje</string> - <string name="pref_navigation_tint">Gjennomsiktig navigasjons linje</string> - <string name="pref_background">Bakgrunnsfarge</string> - <string name="pref_background_summary">Trykk for å endre bakgrunnsfarge</string> - <string name="pref_bubbles">Meldings-bobler</string> - <string name="pref_bubbles_summary">Trykk for å endre meldings-boble</string> - <string name="pref_night">Nattmodus</string> - <string name="pref_night_summary">Spare batteriet og gjør det behagelig å se</string> - <string name="pref_night_amoled">Helsvart bakgrunn</string> - <string name="pref_night_amoled_summary">Spar batteri på enheter med AMOLED-display</string> - <string name="pref_bubble_style_new">Bruke nytt utseende</string> - <string name="pref_color_sent">Farge for sendte meldinger</string> - <string name="pref_color_sent_summary">Farg boble-bakgrunnen for utgående meldinger</string> - <string name="pref_color_received">Farge mottatte meldinger</string> - <string name="pref_color_received_summary">Farg bakgrunnen for innkommende meldinger</string> - <string name="pref_hide_avatar_conversations">Skjul avatarer i samtaler</string> - <string name="pref_hide_avatar_conversations_summary">Skjule avatarer for kontakter i samtale-liste</string> - <string name="pref_hide_avatar_sent">Skjul avatar for sendt melding</string> - <string name="pref_hide_avatar_sent_summary">Skjule din avatar for utgående meldinger</string> - <string name="pref_hide_avatar_received">Skjul avatar for mottatte meldinger</string> - <string name="pref_hide_avatar_received_summary">Skjul avatar for innkommende meldinger</string> - <string name="pref_font_family">Skrift-type</string> - <string name="pref_font_size">Skrift størrelse</string> - <string name="pref_font_weight">Skrifttykkelse</string> - <string name="pref_message_count">Antall meldinger</string> - <string name="pref_message_count_summary">Vis antall meldinger for hver samtale</string> - <string name="pref_sent_timestamps">Sent timestamps</string> - <string name="pref_sent_timestamps_summary">Show the timestamp for when a message was sent, not received</string> - <string name="pref_force_timestamps">Force timestamps</string> - <string name="pref_force_timestamps_summary">Enable timestamps for all messages</string> - <string name="pref_key_timestamp_delay">New timestamp delay</string> - <string name="pref_key_timestamp_delay_summary">The number of minutes which must elapse between two messages in order for a new timestamp to be shown.</string> - <string name="pref_compose_favorites">Favoritt-kontakter</string> - <string name="pref_compose_summary_favorites">Vis favoritter i hurtigsvar og spar tastetrykk</string> - <string name="pref_prox_sensor_call">Proximity sensor</string> - <string name="pref_prox_sensor_call_summary">I en samtale, ta telefonen til øret for å starte en samtale</string> - <string name="pref_delivery">Leveringsbekreftelse</string> - <string name="pref_delivery_summary">Bekrefte at meldinger ble sendt</string> - <string name="pref_delivery_toast">Vis varsel</string> - <string name="pref_delivery_toast_summary">Vis et kort varsel for å vise at meldinger er levert</string> - <string name="pref_delivery_vibrate">Vibrer</string> - <string name="pref_delivery_vibrate_summary">Vibrer når melding leveres</string> - <string name="pref_delete_old_messages">Delete old messages</string> - <string name="pref_delete_old_messages_summary">Automatically delete messages once they\'re old enough</string> - <string name="pref_delete_old_messages_unread">Unread messages</string> - <string name="pref_delete_old_messages_unread_summary">Automatically delete unread messages after %s days</string> - <string name="pref_delete_old_messages_read">Read messages</string> - <string name="pref_delete_old_messages_read_summary">Automatically delete read messages after %s days</string> - <string name="pref_yappy">Yappy integrering</string> - <string name="pref_endlessjabber_summary">Aktivere full støtte for Yappy</string> - <string name="pref_blocked_conversations">Blokkerte samtaler</string> - <string name="pref_blocked_conversations_summary">Lang-Trykk på en samtale og blokker for å flytte til blokkerte meldinger og stoppe varslinger</string> - <string name="pref_block_future">Blokkere fremtidige meldinger</string> - <string name="pref_block_future_summary">Legge til flere telefonnumre for blokkering</string> - <string name="pref_should_i_answer">Should I Answer? Integration</string> - <string name="pref_should_i_answer_summary">Automatically delete incoming messages from numbers which are blocked through Should I Answer?</string> - <string name="pref_mobile_only">Mobilnumre</string> - <string name="pref_mobile_only_summary">Vis bare mobilnumre for kontaktene</string> - <string name="pref_auto_emoji">Automatisk emoji</string> - <string name="pref_auto_emoji_summary">Erstatt tekst med emoji</string> - <string name="pref_enter_button">Enter-knappen</string> - <string name="pref_enter_button_summary">Trykk for å endre hva enter-knappen gjør</string> - <string name="pref_compose_group">Gruppe-meldinger</string> - <string name="pref_compose_group_summary">Når du oppretter melding til flere personer, send en gruppe-melding i stedet for enkeltmeldinger</string> - <string name="pref_auto_download">Automatisk nedlasting MMS</string> - <string name="pref_auto_download_summary">Laste ned MMS-meldinger automatisk når de blir tilgjengelige</string> - <string name="pref_auto_data">Automatisk data</string> - <string name="pref_auto_data_summary">Slå på data automatisk ved sending eller mottak av MMS</string> - <string name="pref_split">Del opp SMS</string> - <string name="pref_split_summary">Del lange meldinger i separate meldinger</string> - <string name="pref_split_counter">Del teller</string> - <string name="pref_split_counter_summary">Legger til en teller på forsiden av hver melding som er delt</string> - <string name="pref_long_as_mms">Send lang MMS</string> - <string name="pref_long_as_mms_summary">Send lange meldinger som MMS fremfor å dele de i flere meldinger</string> - <string name="pref_long_as_mms_after">Send lang som MMS i etterkant</string> - <string name="pref_long_as_mms_after_summary">Sende lange meldinger som MMS</string> - <string name="pref_return">Vis tilbake-knappen</string> - <string name="pref_return_summary">Vis tilbake-knappen på tastaturet fremfor Emoji-knappen</string> - <string name="pref_text">Tekst</string> - <string name="pref_notifications">SMS-varsler er aktivert</string> - <string name="pref_led">Notifikasjonslys</string> - <string name="pref_theme_led">Varsling LED-farge</string> - <string name="pref_wake">Vekk telefon</string> - <string name="pref_wake_summary">Slå skjermen på når du mottar en ny melding</string> - <string name="pref_notifications_private">Private meldinger</string> - <string name="pref_notifications_private_summary">Trykk for å endre hva som skal skjules i varsel</string> - <string name="pref_ringtone">Notifikasjonslyd</string> - <string name="pref_ringtone_summary">Velg en notifikasjonslyd</string> - <string name="pref_ticker">Vis merkelapp</string> - <string name="pref_ticker_summary">Viser tekstutdrag av ny melding i varslingslinjen</string> - <string name="pref_vibration">Vibrasjon</string> - <string name="pref_vibration_summary">Vibrer når melding mottas</string> - <string name="pref_notification_call">Ring-knapp</string> - <string name="pref_notification_call_summary">Ringe avsenderen av en melding direkte fra meldingen</string> - <string name="pref_dimiss_read">Marker som lest</string> - <string name="pref_dismiss_read_summary">Markere melding som lest når meldingen fjernes</string> - <string name="pref_delayed">Forsinkede meldinger</string> - <string name="pref_delayed_summary">Vent før du sender meldingene, så du har en sjanse til å vurdere dem</string> - <string name="pref_delayed_duration">Forsinkelses-lengde (sekunder)</string> - <string name="pref_delayed_duration_summary">Ventetid før du sender meldingen</string> - <string name="pref_night_auto">Automatisk nattmodus</string> - <string name="pref_night_auto_summary">Aktiver nattmodus automatisk basert på tiden</string> - <string name="pref_day_start">Dagen begynner</string> - <string name="pref_night_start">Natten begynner</string> - <string name="pref_qk_responses">Hurtigsvar</string> - <string name="pref_qk_responses_summary">Endre de forhåndsinnstilte svarene som skal brukes fra Android Wear enheten</string> - <string name="pref_quickreply_enabled">Hurtigsvar aktivert</string> - <string name="pref_quickreply_enabled_summary">Vis hurigsvar-vinduet når en melding mottas</string> - <string name="pref_tap_to_quit">Trykk for å forkaste</string> - <string name="pref_tap_to_quit_summary">Trykk hvor som helst utenfor vinduet for å lukke det</string> - <string name="pref_quickcompose">Komponere hurtigsvar aktivert</string> - <string name="pref_quickcompose_summary">Vis en notifikasjon som gjør det mulig å trykke \"lag ny melding\"</string> - <string name="pref_mms_enabled">MMS aktivert</string> - <string name="pref_mms_enabled_summary">Aktiver sending og mottak av MMS-meldinger</string> - <string name="pref_mmsc_url">MMSC</string> - <string name="pref_mms_proxy">MMS proxy</string> - <string name="pref_mms_port">MMS port</string> - <string name="pref_apn_chooser">Last inn standard APNer</string> - <string name="pref_strip_unicode">Strip unicode</string> - <string name="pref_strip_unicode_summary">Skift tegn som ikke støttes i full lengde-meldinger for GSM kompatible tegn</string> - <string name="pref_system_bar_flat">Flat system barer</string> - <string name="pref_system_bar_flat_summary">Get rid of the gradient shown on the system UI bars on most KitKat devices</string> - <string name="pref_status_compat">Fiks for status linje</string> - <string name="pref_status_compat_summary">Løser feil som blir forårsaket av \"Immersive mode\", \"Tinted Status Bar\" (Xposed) eller egendefinert PPT-instillinger/DPI-instillinger</string> - <string name="pref_navigation_compat">Fiks for navigasjons linje</string> - <string name="pref_navigation_compat_summary">Løser feil som blir forårsaket av \"Immersive mode\", \"Tinted Status Bar\" (Xposed) eller egendefinert PPT-instillinger/DPI-instillinger</string> - <string name="pref_about_version_title">QKSMS versjon</string> - <string name="pref_about_authors_title">Forfattere</string> - <string name="pref_about_authors_summary">Moez Bhatti</string> - <string name="pref_changelog_summary">Trykk for å vise endringsloggen</string> - <string name="pref_about_thanks_title">Tusen takk</string> - <string name="pref_about_thanks_summary">Trykk for å vise åpen kildekodes bidragsytere</string> - <string name="pref_donate_title">Donasjon</string> - <string name="pref_donate_summary">QKSMS er gratis. Hjelp støtte oss ved å donere!</string> - <string name="pref_about_gplus_title">Google+</string> - <string name="pref_about_gplus_summary">Join the QKSMS Beta Testing community on Google+</string> - <string name="pref_about_github_title">GitHub</string> - <string name="pref_about_github_summary">QKSMS is open source. Contribute and report issues on GitHub</string> - <string name="pref_about_crowdin_title">Crowdin</string> - <string name="pref_about_crowdin_summary">Join the QKSMS translation project on Crowdin</string> - <!--Preference subcategory--> - <string name="pref_subcat_theme">Tema</string> - <!--Preference subcategory--> - <string name="pref_subcat_system_bars">System bars</string> - <!--Preference subcategory--> - <string name="pref_subcat_categories">Kategorier</string> - <!--Preference subcategory--> - <string name="pref_subcat_font">Skrift</string> - <!--Preference subcategory--> - <string name="pref_subcat_messages">Meldinger</string> - <!--Preference subcategory--> - <string name="pref_subcat_avatars">Avatarer</string> - <string name="donate_google">Donere via Google</string> - <string name="donate_google_summary">Google tar 30% av donasjoner</string> - <string name="donate_paypal">Donere med PayPal</string> - <string name="donate_paypal_button">Donere et beløp</string> - <string name="donate_paypal_button_summary">Donèr hva du vil!</string> - <!--Donation product name--> - <string name="product_name_donation">Donasjon</string> - <!--$1 donation product name--> - <string name="product_name_donate_1">Donere $1 USD</string> - <!--$5 donation product name--> - <string name="product_name_donate_5">Donere $5 dollar</string> - <!--$3 donation product name--> - <string name="product_name_donate_10">Donere $10 USD</string> - <!--$1 donation product description--> - <string name="product_description_donate_1">Kjøpe meg en Cola</string> - <!--$5 donation product description--> - <string name="product_description_donate_5">Kjøpe meg en sandwich</string> - <!--$10 donaion product description--> - <string name="product_description_donate_10">Kjøpe meg lunsj</string> - <string name="title_settings">Innstillinger</string> - <string name="title_search">Søk</string> - <string name="title_compose">Komponere</string> - <string name="title_conversation_list">Samtaler</string> - <string name="title_blocked">Blokkert</string> - <string name="title_changelog">Endringslogg</string> - <string name="title_picker">Nye meldinger</string> - <string name="title_donate">Donèr</string> - <string name="title_qk_responses">Hurtigsvar</string> - <string name="title_block_address">Blokkèr nummer</string> - <string name="title_unblock_address">Avblokker nummer</string> - <string name="title_conversations_selected">%s valgt</string> - <string name="title_palette">Palette</string> - <string name="title_rgb">RGB</string> - <!-- Menu shown in the context menu when long pressing on a message when the message contains - one or more phone numbers and/or email addresses and the number or email is new to - contacts. [CHAR LIMIT=50] --> - <string name="menu_add_address_to_contacts">Add <xliff:g id="contactEmailOrNumber">%s</xliff:g> to People</string> - <!-- Context menu item on an individual message for viewing an attached slideshow --> - <string name="view_slideshow">Vis lysbildefremvisning</string> - <!-- Context menu item on an individual message for viewing message details such as time and date --> - <string name="view_message_details">Vis deltaljer</string> - <!-- Context menu item on an individual message for viewing a delivery report --> - <string name="view_delivery_report">Vis rapport</string> - <!-- Context menu item on an individual message for deleting only that message --> - <string name="delete_message">Slette</string> - <!-- Abbreviation for "kilobyte" --> - <string name="kilobyte">KB</string> - <!-- Individual message context menu item --> - <string name="copy_message_text">Kopier tekst</string> - <!-- Header for context menu on an individual message --> - <string name="message_options">Meldingsalternativer</string> - <!-- Delivery Header View --> - <!-- Title of "Report" window --> - <string name="delivery_header_title">Rapport</string> - <!--Text for app restart confirmation dialog--> - <string name="restart_message">Disse endringene vil tre i kraft neste gang QKSMS er åpnet</string> - <!--Dialog title for asking if a user wants to delete a conversation--> - <string name="delete_conversation">Slett samtaler</string> - <!--Dialog title for asking if a user wants to delete all failed messages--> - <string name="delete_all_failed">Slette mislykkede meldinger</string> - <!--CDialog title for asking if a user wants to delete a conversation--> - <string name="delete_confirmation">Er du sikker på at du vil slette (%s) samtalen?</string> - <!--CDialog title for asking if a user wants to delete all failed messages--> - <string name="delete_all_failed_confirmation">Er du sikker på at du vil slette mislykkede meldinger fra (%s) samtaler?</string> - <!--(Unused) Dialog title shown if APNs have not been set--> - <string name="apns_not_set">APNer ikke angitt</string> - <!--(Unused) Dialog description shown if APNs have not been set--> - <string name="apns_not_set_description">Din APN har ikke blitt angitt. Dette betyr at MMS ikke vil fungere skikkelig. Trykk OK for å la QKSMS finne APN :)</string> - <!--Dialog title show if MMS hasn't been configured--> - <string name="set_up_mms_title">Sett opp MMS?</string> - <!--Dialog description shown if MMS hasn't yet been configured--> - <string name="set_up_mms_description">MMS er ikke konfigurert i QKSMS ennå. Trykk OK for automatisk å konfigurere MMS.</string> - <!-- Dialog message text explaining that a draft message will not be saved due to invalid recipients --> - <string name="discard_message_reason">Meldingen forkastes fordi den har ingen gyldig mottakere.</string> - <string name="invalid_code">Ugyldig kode</string> - <!--Button to restart app now instead of manually later--> - <string name="restart">Starte på nytt nå</string> - <!--Notification action to reply to a message--> - <string name="reply">Svar</string> - <!--Notification action to reply to a message--> - <string name="reply_qksms">Svar via QKSMS</string> - <!--Notification action to mark a message as read--> - <string name="read">Lest</string> - <!--Notification action to mark a message as read--> - <string name="mark_read">Marker som lest</string> - <!--Notification action to call the sender of a message--> - <string name="call">Ring</string> - <!-- Notification toast message --> - <string name="notification_mute_on">Notifications enabled</string> - <string name="notification_mute_off">Notifications disabled</string> - <!--Positive action button--> - <string name="yes">Ja</string> - <string name="add">Legg til</string> - <!--Positive action button--> - <string name="save">Lagre</string> - <!--Positive action button--> - <string name="enable">Aktiver</string> - <!--Positive action button--> - <string name="upgrade_now">Gjør nå</string> - <!--Positive action button--> - <string name="okay">Ok</string> - <!--Positive action button--> - <string name="redeem">Løse inn</string> - <!--Neutral action button--> - <string name="just_once">Bare én gang</string> - <!--Neutral action button--> - <string name="later">Senere</string> - <!--Neutral action button --> - <string name="cancel">Avbryt</string> - <!-- Name of the local user when displaying sender of an outgoing message (personal pronoun) --> - <string name="messagelist_sender_self">Meg</string> - <!-- Sender to be used if the sender address has been hidden --> - <string name="hidden_sender_address">Skjult avsender adresse</string> - <!-- Subject to display in the conversation list if there is no subject --> - <string name="no_subject_view">(Uten emne)</string> - <!-- Time and date a message is due to expire --> - <string name="expire_on">"Expires: <xliff:g id="date">%s</xliff:g>"</string> - <!-- Formatting for subject displayed inline, prepended to MMS message text --> - <string name="inline_subject">"<Subject: <xliff:g id="subject">%s</xliff:g>>"</string> - <!-- Text of a button appearing for MMS messages that have not yet been downloaded, causing the message to be downloaded (imperative verb) --> - <string name="download">Last ned</string> - <!-- Message displayed in place of the "download message" button once it has been pressed, indicating that the download is in progress --> - <string name="downloading">Laster ned</string> - <!-- Toast message while an image is being resized --> - <string name="compressing">Bildet er for stort. Compressing\u2026</string> - <!-- Header shown above favorite contacts in QKCompose --> - <string name="favorites">Favoritt-kontakter</string> - <!-- Word represents 'self' in a conversation --> - <string name="me">Jeg</string> - <string name="menu_edit">Rediger</string> - <string name="menu_delete_messages">Slett meldinger</string> - <string name="menu_delete_failed">Slette mislykkede meldinger</string> - <string name="menu_lock">Lås</string> - <string name="menu_unlock">Låse opp</string> - <!-- When the user tries to view message details and some error occurs while - retrieving those details, this message will be shown. --> - <string name="cannot_get_details">Kan ikke hente detaljer.</string> - <!-- Title of "Message details" dialog --> - <string name="message_details_title">Meldingsinformasjon</string> - <!-- Label in "Message details" dialog --> - <string name="message_type_label">Skriv\u000A</string> - <!-- "Type" value in "Message details" dialog --> - <string name="text_message">Skriv melding</string> - <!-- "Type" value in "Message details" dialog --> - <string name="multimedia_message">Multimediemelding</string> - <!-- "Type" value in "Message details" dialog --> - <string name="multimedia_notification">Multimedia Meldingsvarsel</string> - <!-- Label in "Message details" dialog showing who sent the message. --> - <string name="from_label">Fra\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="to_address_label">Til\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="bcc_label">Bcc\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="sent_label">Sent\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="received_label">Mottatt\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="saved_label">Lagret\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="subject_label">Emne\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="message_size_label">Meldingsstørrelse\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="priority_label">Prioritet\u000A</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_high">Høy</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_normal">Normal</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_low">Lav</string> - <!-- Label in "Message details" dialog --> - <string name="message_class_label">Meldingsklasse\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="error_code_label">Feil kode\u000A</string> - <!-- Alert dialog title when creating a slideshow [CHAR LIMIT=none] --> - <string name="building_slideshow_title">Lager slideshow</string> - <!-- Tag appearing on conversations in the conversation list that contain a draft message --> - <string name="has_draft">Utkast</string> - <!-- In conversation list items, this is the separator between a contact's name and the draft stamp [CHAR LIMIT=5] --> - <string name="draft_separator">,\u0020</string> - <!-- In conversation list items, this comes after the receipient's name and contains the number of messages in the thread [CHAR LIMIT=5] --> - <string name="message_count_format">\u00a0<xliff:g id="number" example="1">%1$s</xliff:g></string> - <!-- For debugging: Dialog box title indicating there's a situation where data has unexpectedly changed --> - <string name="error_state">Inkonsekvent tilstand</string> - <!-- For debugging: Dialog box text indicating there's a situation where data has unexpectedly changed --> - <string name="error_state_text">The state of threads and recipients is inconsistent. Please capture a bug report and report it via http://go/droidanizer </string> - <!-- This is the dialog title for the "Select link" dialog, shown when the user clicks on a - chat in the chat history view if there are links in the chat message. The dialog displays the - links if there are any --> - <string name="select_link_title">Velg handling</string> - <!-- In message list items, this string builds the timestamp line when the message is in a group [CHAR LIMIT=NONE] --> - <string name="message_timestamp_format"><xliff:g id="string" example="Fred Flinstone">%1$s</xliff:g>\u0020-\u0020<xliff:g id="string" example="9:39AM">%2$s</xliff:g></string> - <!--Message sending status: sending--> - <string name="status_sending">Sender...</string> - <!--Message sending status: failed--> - <!--<string name="status_failed">Failed. Tap to retry</string>--> - <!-- Delivery Report Activity --> - <!-- Status in "Report" window --> - <string name="status_none">(Ingen)</string> - <!-- Status in "Report" window --> - <string name="status_pending">Ventende</string> - <!-- Status in "Report" window --> - <string name="status_read">Lest</string> - <!-- Status in "Report" window --> - <string name="status_received">Mottatt</string> - <!-- Status in "Report" window --> - <string name="status_failed">Mislyktes. Trykk for alternativer</string> - <!-- Status in "Report" window --> - <string name="status_unread">Ulest</string> - <!-- Status in "Report" window --> - <string name="status_rejected">Avvist</string> - <!-- Label in "Report" window --> - <string name="recipient_label">Mottaker: \u0020</string> - <!-- Label in "Report" window --> - <string name="status_label">Status: \u0020</string> - <!-- Label in "Report" window [CHAR LIMIT=50]--> - <string name="delivered_label">Levert: \u0020</string> - <string name="do_something">Gjøre noe</string> - <!-- Confirm Delete --> - <!-- Delete confirmation dialog title --> - <string name="confirm_dialog_title">Slette?</string> - <!-- Delete confirmation dialog title for locked messages --> - <string name="confirm_dialog_locked_title">Slette låste meldinger?</string> - <!-- This message is displayed in a confirmation dialog when the user selects one or more - conversations and then taps the "Delete" button. --> - <plurals name="confirm_delete_conversation"> - <!-- Case of 1 result. --> - <item quantity="one">En samtale vil bli slettet.</item> - <!-- Case of 0 or 2 or more results. --> - <item quantity="other"><xliff:g id="number" example="15">%1$s </xliff:g> samtalene vil bli slettet.</item> - </plurals> - <string name="confirm_delete_conversation">Hele tråden vil bli slettet.</string> - <!-- Delete all threads confirmation dialog message --> - <string name="confirm_delete_all_conversations">Alle samtaler blir slettet.</string> - <!-- Delete message confirmation dialog message --> - <string name="confirm_delete_message">Meldingen slettes.</string> - <!-- Delete message confirmation dialog message for a locked message --> - <string name="confirm_delete_locked_message">Slette denne låste meldingen?</string> - <!-- Delete all the messages on the SIM dialog message --> - <string name="confirm_delete_all_SIM_messages">Alle meldinger på SIM-kortet vil bli slettet.</string> - <!-- Delete the selected message on the SIM dialog message --> - <string name="confirm_delete_SIM_message">Denne meldingen på SIM-kortet vil bli slettet.</string> - <!-- Delete unlocked checkbox title --> - <string name="delete_unlocked">Slette låste meldinger</string> - <!-- Delete button title --> - <string name="delete">Slette</string> - <!-- More button title --> - <string name="more">Mer</string> - <!-- More button summary --> - <string name="more_summary">Trykk for å se mer</string> - <!-- Action bar mode title when multi-selecting conversations --> - <string name="select_conversations">Velg samtaler</string> - <!-- Show this in the middle of the main activity when there are no conversations [CHAR LIMIT=none] --> - <string name="no_conversations">Ingen samtaler.</string> - <!-- Show this in the middle of the main activity when loading conversations [CHAR LIMIT=none] --> - <string name="loading_conversations">Laster inn samtaler.</string> - <!-- Tells the user that QKSMS isn't the default SMS app --> - <string name="not_default">Standard SMS</string> - <!-- Tells the user they need to set QKSMS as the default app in order to use this feature --> - <string name="default_info">QKSMS må være standard SMS app for å gjøre det</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to mark messages as read --> - <string name="not_default_mark_read">QKSMS må være standard SMS app for å markere meldinger som lest</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to mark messages as unread --> - <string name="not_default_mark_unread">QKSMS må være standard SMS app for å merke meldinger som ulest</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to send messages --> - <string name="not_default_delete">QKSMS må være standard SMS app å slette meldinger</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to delete messages --> - <string name="not_default_send">QKSMS må være standard SMS app for å sende meldinger</string> - <!-- Tells the user they should set QKSMS as the default messaging app --> - <string name="not_default_first">Noen ting vil ikke fungere før QKSMS er standard SMS app</string> - <string name="delayed_messaging_info">Forsinkede meldinger gjør kan du avbryte meldinger før de er sendt. Endre standardvirkemåte og mer i innstillinger</string> - <string name="delayed_duration_bounds_error">Varigheten må være mellom 1 og 30 sekunder</string> - <!-- Dialog title for the Read Report dialog. --> - <string name="confirm">Bekrefte</string> - <!-- Dialog text for the Read Report dialog. --> - <string name="message_send_read_report">En leserapport sendes.</string> - <!-- Dialog title for updating app icon color --> - <string name="update_icon_title">Oppdatere ikonfarge</string> - <!-- Dialog message for updating app icon color --> - <string name="update_icon_message">QKSMS must be restarted when changing the icon color</string> - <string name="dialog_conversation_details_title">Samtaledetaljer</string> - <string name="dialog_conversation_details_last_message_date">Dato for siste melding</string> - <string name="dialog_conversation_details_message_count">Antall meldinger</string> - <string name="dialog_conversation_details_recipients">Mottakere (%s)</string> - <string name="dialog_should_i_answer_title">Should I Answer? not installed</string> - <string name="dialog_should_i_answer_message">Would you like to download the app from Google Play now?</string> - <string name="dialog_delete_old_messages">Are you sure you want to automatically delete old messages?</string> - <!-- Title for audio file picker --> - <string name="select_audio">Velg lydfil</string> - <!-- Menu title to copy an attachment to the shared storage [CHAR LIMIT=25] --> - <string name="copy_to_sdcard">Lagre vedlegg</string> - <!-- Toast message on successful copy to shared storage [CHAR LIMIT=30] --> - <string name="copy_to_sdcard_success">Vedlegg lagret.</string> - <!-- Toast message on failed copy to shared storage [CHAR LIMIT=30] --> - <string name="copy_to_sdcard_fail">Kunne ikke lagre vedlegg.</string> - <!-- Menu title to save a sound as a ringtone --> - <string name="save_ringtone">Lagre som ringetone</string> - <!-- Toast message on successful copying ringtone to drm provider --> - <string name="saved_ringtone">Ringetone lagret.</string> - <!-- Toast message on failed copying ringtone to drm provider --> - <string name="saved_ringtone_fail">Kunne ikke lagre ringetone.</string> - <!-- Menu item --> - <!-- Menu item [CHAR LIMIT=40] --> - <string name="menu_group_participants">Gruppe deltakere</string> - <!--Toast shown when a draft is saved--> - <string name="toast_draft">Lagret utkast</string> - <!--Toast shown when a conversation is deleted--> - <string name="toast_conversation_deleted">Samtale slettet</string> - <!--Toast shown when device is low on storage--> - <string name="toast_low_memory">"Telefon lagring er full. Slett noen filer for å frigjøre plass."</string> - <!--Toast shown to tell user that forwarding messages doesn't work yet--> - <string name="toast_forward">Denne funksjonen er ikke implementert ennå. I mellomtiden vær vennlig å bruke kopier tekst-alternativet og lim det inn i samtalen du ønsker å sende</string> - <!--Toast shown for unimplemented features--> - <string name="toast_unimplemented">Denne funksjonen er ikke implementert ennå</string> - <!--Toast shown when a message fails to send--> - <string name="toast_message_failure">Meldingen mislykkes</string> - <!--Toast shown when a message is delivered--> - <string name="toast_message_delivered">Melding levert</string> - <!--Toast shown when a message is not delivered--> - <string name="toast_message_not_delivered">Meldingen kunne ikke leveres</string> - <!--Toast shown when default APNs are loaded--> - <string name="toast_default_apns_loaded">Lastet inn standard APN instillinger</string> - <!--Toast shown when text is copied to the clipboard--> - <string name="toast_copy_text">Kopierte teksten til utklippstavlen</string> - <!--Toast shown when Google Play Services is not available for purchasing a product--> - <string name="toast_billing_not_available">Kjøp krever Google Play Store (fakturering) på din Android</string> - <!--Toast shown when Google Play Services is not available for purchasing a product--> - <string name="toast_endlessjabber_not_installed">EndlessJabber ikke installert, åpner Google Play</string> - <string name="toast_changelog_error">Kunne ikke laste endringslogg. Prøv igjen senere</string> - <string name="toast_conversation_error">Couldn\'t open conversation</string> - <string name="toast_deleting_old_messages">Your old messages will be deleted shortly</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_1">Takk for at du støttet meg! Du er min nye bestevenn.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_2">Takk for at du støttet meg! Jeg elsker deg.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_3">Takk for at du støttet meg! Du hjelper QKSMS å bli den beste meldings-appen som noen sinne er laget.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_4">Takk for at du støttet meg! Du eier.</string> - <!--Menu option to mute conversation--> - <string name="menu_mute_conversation">Demp samtale</string> - <!--Menu option to mute conversation--> - <string name="menu_unmute_conversation">Slå på samtale</string> - <string name="menu_block_conversations">Blokkere samtaler</string> - <string name="menu_unblock_conversations">Oppheve samtaler</string> - <string name="menu_messages">Meldinger</string> - <string name="menu_blocked">Blokkert</string> - <string name="menu_blocked_conversations">Blokkerte (%s nye)</string> - <string name="menu_unblocked_conversations">Meldinger (%s nye)</string> - <string name="menu_notifications">Varsel</string> - <string name="menu_notifications_off">Varsel av</string> - <string name="menu_notification_settings">Conversation settings</string> - <string name="menu_view_details">Vis deltaljer</string> - <string name="menu_mark_read">Marker som lest</string> - <string name="menu_mark_unread">Marker som ulest</string> - <string name="menu_delete_conversation">Slett samtale</string> - <string name="menu_multi_select">Velg samtale</string> - <string name="menu_done">Ferdig</string> - <string name="failed_message_title">Mislyktede Meldingsalternativer</string> - <!--Toast shown to tell the user that they don't have a photo attachments app, and suggests that they download one--> - <string name="attachment_app_not_found">Finner ingen galleri-app. Innstaller en galleri-app!</string> - <string name="attachment_camera_error">Kameraet kan ikke åpnes</string> - <string name="pref_max_mms_attachment_size">Maksimal vedleggsstørrelse for MMS</string> - <string name="error_no_recipients">Velg noen kontakter å sende denne meldingen til!</string> - <string name="error_file_not_found">QKSMS finner ikke filen du prøver å dele!</string> - <string name="sending_blocked_welcome_screen_message">Hold ut! Du får sende ekte meldinger hvert øyeblikk!</string> - <string name="notification_colored_icon_ready">Trykk for å legge til på hjemskjerm.</string> - <string name="notification_title_colored_icon_ready">QKSMS ikon er klart</string> - <string name="icon_ready">Det nye ikonet er klar!</string> - <string name="icon_ready_message">Du kan nå legge til på hjemskjermen med oppdatert farge.</string> - <string name="dont_ask_again">Ikke spør igjen</string> - <string name="warning">Stagefright advarsel</string> - <string name="stagefright_warning">Video-meldinger kan inneholde virus som kan gjøre telefonen sårbar for angrep. Vil du fortsette?</string> - <!-- MMS DIALOG SETUP STRINGS --> - <string name="mms_setup_set_up_mms_title">Sett opp MMS?</string> - <string name="mms_setup_set_up_mms_body">MMS ikke er definert i QKSMS. Trykk OK for å automatisk konfigurere MMS.</string> - <string name="mms_setup_setting_up_later_title">Konfigurere MMS senere</string> - <string name="mms_setup_setting_up_later_body">Besøk MMS-delen i innstillinger å konfigurere automatisk, kontakt kundestøtte eller angi din egen konfigurasjon.</string> - <string name="mms_setup_no_configurations_found_title">Ingen konfigurasjoner finnes</string> - <string name="mms_setup_no_configurations_found_body">Vi kunne ikke finne en MMS-konfigurasjon for teleoperatøren. Trykk OK for å kontakte brukerstøtte. Vi vil hjelpe deg å få satt opp! </string> - <string name="mms_setup_one_configuration_found_title">Én konfigurasjon funnet</string> - <string name="mms_setup_one_configuration_found_body">Vi har funnet en MMS-konfigurasjon for %s leverandør. Ser det riktig ut?</string> - <string name="mms_setup_multiple_configurations_found_title">Flere konfigurasjon funnet</string> - <string name="mms_setup_multiple_configurations_found_body">Vi har funnet flere MMS-konfigurasjoner. Velg din operatør fra listen, eller trykk N/A Hvis teleoperatøren ikke er på listen.</string> - <string name="mms_setup_next_steps_title">Neste trinn</string> - <string name="mms_setup_next_steps_body">Besøk MMS delen i innstillinger for å automatisk konfigurere igjen, kontakt kundestøtte eller angi din egen konfigurasjon.</string> - <string name="mms_setup_success_title">Suksess!</string> - <string name="mms_setup_success_body">Hvis det oppstår problemer, besøk MMS-delen i innstillinger for å automatisk konfigurere igjen, kontakt kundestøtte eller angi din egen konfigurasjon.</string> - <string name="na">Ikke tilgjengelig</string> - <string name="no">Nei</string> - <string name="pref_automatically_configure_mms">Automatisk konfigurere MMS</string> - <string name="pref_mms_contact_support">Kontakt kundestøtte</string> - <string name="pref_category_sending_mms">Sender MMS</string> - <string name="pref_category_mms_configuration">MMS-konfigurasjon</string> - <string name="pref_mms_contact_support_summary">Kontakte QKSMS teamet for hjelp til MMS</string> - <string name="pref_markdown_enabled">Tekstformatering</string> - <string name="pref_markdown_enabled_summary">Use markdown syntax to get bold, underline, and italics in your messages</string> - <string name="want_read_indicators">Want read indicators?</string> - <string name="color_swatch_description">Farge %1$d</string> - <string name="color_swatch_description_selected">Farge %1$d valgt</string> - <string name="color_picker_default_title">Velg en farge</string> - <string name="message_delivered">Melding levert</string> - <string name="message_not_delivered">Meldingen kunne ikke leveres</string> - <string name="error">Feil</string> - <string name="invalid_destination">Ugyldig adresse.</string> - <string name="service_not_activated">Tjenesten ikke er aktivert på nettverket.</string> - <string name="service_message_not_found">Melding utløpt eller ikke tilgjengelig.</string> - <string name="service_network_problem">Kunne ikke sende på grunn av nettverksproblemer.</string> - <string name="message_queued">Kan ikke sende meldingen. Det vil bli sendt når tjenesten blir tilgjengelig.</string> - <string name="download_later">Kan ikke laste ned akkurat nå. Prøv igjen senere.</string> - <string name="no_apn">Ingen APN angitt for appen, må du sette den opp i innstillinger!</string> - <string name="no_subject">(Uten emne)</string> - <string name="unknown_sender">Ukjent avsender</string> - <string name="dl_failure_notification">Kunne ikke laste ned meldingen <xliff:g id="subject">%1$s </xliff:g> fra <xliff:g id="from">%2$s </xliff:g>.</string> - <string name="auto_select_multiple_apns">Flere forskjellige konfigurasjoner er funnet. Prøv en nå. Hvis det ikke fungerer, kan du prøve en ny ved å gå til Innstillinger > Avansert > laste standard APNs.</string> - <string name="auto_select_apn">Velg APNer automatisk</string> - <string name="auto_select_failed_title">Automatisk konfigurasjon mislyktes</string> - <string name="auto_select_failed">Prøv å søke etter teleoperatøren\'s APN innstillinger (MMSC, Port og Proxy) og skrive dem i Innstillinger > Avansert.</string> - <string name="date_yesterday">I går</string> - <string name="date_just_now">Akkurat nå</string> - <string name="compose_loading_attachment">Henter vedlegg</string> - <string name="hint_no_messages">Ingen meldinger ennå. \nTrykk + å sende én!</string> - <string-array name="resend_menu"> - <item>Send på nytt</item> - <item>Rediger</item> - <item>Slette</item> - </string-array> - <string-array name="message_menu"> - <item>Videresend beskjed</item> - <item>Kopier tekst</item> - <item>Vis deltaljer</item> - <item>Slett melding</item> - </string-array> - <string-array name="background_titles"> - <item>Material Light</item> - <item>Material Dark</item> - <item>Black</item> - </string-array> - <string-array name="font_sizes"> - <item>Liten</item> - <item>Normal</item> - <item>Stor</item> - <item>Største</item> - </string-array> - <string-array name="font_families"> - <item>Roboto regular</item> - <item>Roboto Condensed</item> - <item>Systemskrift</item> - </string-array> - <string-array name="font_weights"> - <item>Lett</item> - <item>Normal</item> - </string-array> - <!-- String to match as no subject and filter out as a subject. For example, if the - subject string is "no subject", we won't display that. We'll pretend - no subject string was delivered. --> - <string-array name="empty_subject_strings"> - <item>ingen emne</item> - </string-array> - <string-array name="qk_responses"> - <item>Ok</item> - <item>Gi meg et øyeblikk</item> - <item>På vei</item> - <item>Takk</item> - <item>Høres bra ut</item> - <item>Hva skjer?</item> - <item>Enig</item> - <item>Nei</item> - <item>Elsker deg</item> - <item>Unnskyld</item> - <item>LOL</item> - <item>Det er greit</item> - </string-array> - <string-array name="enter_button_options"> - <item>Vis emoji</item> - <item>Ny linje</item> - <item>Send melding</item> - </string-array> - <string-array name="notification_private_options"> - <item>Vis alle</item> - <item>Skjul melding</item> - <item>Skjule meldingen og avsender</item> - </string-array> - <!-- Max MMS attachment sizes. I.e. will compress pictures that are larger than 300 KB down to - under 300KB. --> - <string-array name="max_mms_attachment_sizes"> - <item>300 KB</item> - <item>600 KB</item> - <item>1 MB</item> - <item>Ubegrenset</item> - </string-array> -</resources> diff --git a/QKSMS/src/main/res/values-pl/strings.xml b/QKSMS/src/main/res/values-pl/strings.xml deleted file mode 100644 index 385007264..000000000 --- a/QKSMS/src/main/res/values-pl/strings.xml +++ /dev/null @@ -1,769 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!--Generated by crowdin.com--> -<resources xmlns:xliff="http://schemas.android.com/apk/res-auto"> - <!--Slogan--> - <string name="slogan">Rozkochaj się w pisaniu wiadomości.</string> - <!--Text shown when a phone number cannot be found--> - <string name="unknown_number">Nieznany numer</string> - <!--Content description for photos--> - <string name="popup_photo_CD">Zdjęcie</string> - <!--Text to be displayed while content is loading--> - <string name="loading">Ładowanie...</string> - <!--Test string--> - <string name="test">Testowa wartość</string> - <!--Hint for contacts text field--> - <string name="hint_contacts">Dodaj odbiorców</string> - <!--Hint for search text field--> - <string name="hint_search">Szukaj czegoś</string> - <!--Hint for message reply text field--> - <string name="hint_reply">Wpisz wiadomość</string> - <!--Hint for code redemption--> - <string name="hint_redeem">Wprowadź kod</string> - <string name="hint_hex">Hex</string> - <!--Text shown for single new message in notification--> - <string name="new_message">Nowa wiadomość</string> - <!--Text shown after number of unread messages in notification (ex. 3 new messages)--> - <string name="new_messages">Nowe wiadomości</string> - <!--Text shown for single failed message in notification--> - <string name="failed_message">Nie udało się wysłać wiadomości</string> - <!--Text shown after number of failed messages in notification (ex. 3 messages failed to send)--> - <string name="failed_messages">wiadomości nie udało się wysłać</string> - <!--Text shown under failed message count--> - <string name="failed_messages_summary">Dotknij, aby wyświetlić</string> - <!--QuickCompose notification title--> - <string name="quickcompose">Komponuj QK</string> - <!--QuickCompose notification text--> - <string name="quickcompose_detail">Kliknij, aby wysłać wiadomość</string> - <!--Welcome screen intro button--> - <string name="welcome_start">Zaczynamy!</string> - <!--Allows user to skip welcome screen--> - <string name="welcome_skip">POMIŃ</string> - <!--Allows user to finish the welcome screen--> - <string name="welcome_finish">ZAKOŃCZ</string> - <!--Indicates to user they can pick a color--> - <string name="welcome_theme_title">Wybierz kolor</string> - <!--Indicates to user they can pick any colors--> - <string name="welcome_theme_description">Dowolny kolor.</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_night_description">Łagodny dla oczu.</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_night_hint">Przełącz mnie</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_quickreply_title">Odpowiedź QK</string> - <!--QK Reply explanation--> - <string name="welcome_quickreply_description">Odpowiadaj na wiadomości szybciej niż kiedykolwiek.</string> - <!--Prompts user to try QK Reply--> - <string name="welcome_quickreply_hint">Wypróbuj!</string> - <!--QK Reply demo message--> - <string name="welcome_quickreply_message_1">Łał! Czy to nie było niesamowite? Możesz teraz podejrzeć całą konwersację. Dotknij poza powiadomieniem lub naciśnij symbol fajki, aby zamknąć.</string> - <!--QK Reply demo message--> - <string name="welcome_quickreply_message_2">Przedstawiamy Odpowiedź QK. Od teraz możesz odpisać na wiadomość, cokolwiek robisz. Dotknij przycisk \"rozszerz\", aby zobaczyć co się stanie :)</string> - <!--Settings option in menu--> - <string name="menu_settings">Ustawienia</string> - <!--Search option in menu--> - <string name="menu_search">Szukaj</string> - <!--Show full conversation in QuickReply--> - <string name="menu_show_all">Pokaż wszystkie wiadomości</string> - <!--Show only unread messages in QuickReply--> - <string name="menu_show_unread">Pokaż nieprzeczytane wiadomości</string> - <!--Open conversation option in menu (shown in QuickReply)--> - <string name="menu_open_thread">Otwórz rozmowę</string> - <!--Forward message option in menu--> - <string name="menu_forward">Prześlij dalej</string> - <!--Call contact option in menu--> - <string name="menu_call">Zadzwoń</string> - <!--Mark a message/conversation as read option in menu--> - <string name="menu_read">Oznacz jako przeczytane</string> - <!--Delete a message option in menu--> - <string name="menu_delete">Usuń</string> - <!--Donate option in menu--> - <string name="menu_billing">Wspomóż</string> - <!--Copy text option in menu--> - <string name="menu_copy">Skopiuj treść</string> - <!--Changelog option in menu--> - <string name="menu_changelog">"Dziennik zmian"</string> - <!--Expand settings option in menu--> - <string name="menu_show_all_prefs">Pokaż wszystkie</string> - <!--Show less settings option in menu--> - <string name="menu_show_fewer_prefs">Pokaż mniej</string> - <!--Title for message details popup--> - <string name="details_title">Szczegóły</string> - <!--Title for address that message is being sent to in message details popup--> - <string name="details_to">Do</string> - <!--Title for address that message is sent from in message details popup--> - <string name="details_from">Od</string> - <!--Title for text of a message in message details popup--> - <string name="details_body">Zawartość</string> - <!--Title for date sent of a message in message details popup--> - <string name="details_date_sent">Data wysłania</string> - <!--Title for date received of a message in message details popup--> - <string name="details_date_received">Data doręczenia</string> - <!--Title for rate snackbar--> - <string name="rate_title">Lubisz QKSMS?</string> - <!--Title for rate button--> - <string name="rate_action">Oceń</string> - <string name="pref_category_appearance">Wygląd</string> - <string name="pref_category_summary_appearance">Motywy, czcionki, kolory, awatary i więcej</string> - <string name="pref_category_general">Ogólne</string> - <string name="pref_category_summary_general">Dostarczanie, wysyłanie wiadomości, formatowanie</string> - <string name="pref_category_blocking">Blokowanie wiadomości</string> - <string name="pref_category_notifications">Powiadomienia</string> - <string name="pref_category_summary_notifications">Dźwięki, LED, prywatność</string> - <string name="pref_category_mms">MMS</string> - <string name="pref_category_summary_mms">Konfiguracja MMS (APN-y), maksymalny rozmiar, wiadomości grupowe</string> - <string name="pref_category_quickreply">Odpowiedź QK</string> - <string name="pref_category_summary_quickreply">Odpowiedź QK, ustawienia wyskakującego okienka</string> - <string name="pref_category_quickcompose">Komponuj QK</string> - <string name="pref_category_summary_quickcompose">Komponuj QK, ulubione kontakty</string> - <string name="pref_category_about">O aplikacji</string> - <string name="pref_category_summary_about">Wersja, lista zmian, autorzy, podziękowania</string> - <string name="pref_theme">Kolor motywu</string> - <string name="pref_theme_summary_alt">Dotknij, aby zmienić motyw</string> - <string name="pref_icon">Icon color</string> - <string name="pref_icon_summary">Tap to change the QKSMS icon color</string> - <string name="pref_status_tint">Kolorowy pasek powiadomień</string> - <string name="pref_navigation_tint">Kolorowy pasek nawigacyjny</string> - <string name="pref_background">Kolor tła</string> - <string name="pref_background_summary">Dotknij, aby zmienić kolor tła</string> - <string name="pref_bubbles">Dymki wiadomości</string> - <string name="pref_bubbles_summary">Dotknij, aby zmienić ustawienia dymków wiadomości</string> - <string name="pref_night">Tryb nocny</string> - <string name="pref_night_summary">Oszczędzaj baterię i zmniejsz uczucie zmęczenia oczu</string> - <string name="pref_night_amoled">Czarne tło</string> - <string name="pref_night_amoled_summary">Dodatkowo oszczędza baterię na urządzeniach z wyświetlaczem AMOLED</string> - <string name="pref_bubble_style_new">Nowy wygląd</string> - <string name="pref_color_sent">Pokoloruj wysłane</string> - <string name="pref_color_sent_summary">Pokoloruj wysłane</string> - <string name="pref_color_received">Pokoloruj odebrane</string> - <string name="pref_color_received_summary">Pokoloruj tła dymków wiadomości przychodzących</string> - <string name="pref_hide_avatar_conversations">Ukryj awatary</string> - <string name="pref_hide_avatar_conversations_summary">Ukryj awatary kontaktów na liście rozmów</string> - <string name="pref_hide_avatar_sent">Ukryj awatary przy wysłanych wiadomościach</string> - <string name="pref_hide_avatar_sent_summary">Ukryj swój awatar przy wiadomościach wychodzących</string> - <string name="pref_hide_avatar_received">Ukryj awatary kontaktów przy wiadomościach odebranych</string> - <string name="pref_hide_avatar_received_summary">Ukryj awatary kontaktów przy wiadomościach przychodzących</string> - <string name="pref_font_family">Rodzaj czcionki</string> - <string name="pref_font_size">Rozmiar czcionki</string> - <string name="pref_font_weight">Grubość czcionki</string> - <string name="pref_message_count">Liczba wiadomości</string> - <string name="pref_message_count_summary">Pokazuj liczbę wiadomości dla każdej rozmowy</string> - <string name="pref_sent_timestamps">Sygnatury czasowe wysłanych</string> - <string name="pref_sent_timestamps_summary">Pokaż sygnaturę czasową wysłania wiadomości, a nie otrzymania</string> - <string name="pref_force_timestamps">Wymuś sygnatury czasowe</string> - <string name="pref_force_timestamps_summary">Włącz sygnatury czasowe dla wszystkich wiadomości</string> - <string name="pref_key_timestamp_delay">Nowe opóźnienie sygnatury czasowej</string> - <string name="pref_key_timestamp_delay_summary">Ilość minut, które muszą upłynąć między dwoma wiadomościami, aby wyświetlić nową sygnaturę czasową.</string> - <string name="pref_compose_favorites">Ulubione kontakty</string> - <string name="pref_compose_summary_favorites">Pokaż ulubione kontakty w oknie Komponowania QK, aby je wybrać jednym kliknięciem</string> - <string name="pref_prox_sensor_call">Czujnik zbliżeniowy</string> - <string name="pref_prox_sensor_call_summary">Zbliż telefon do ucha, aby rozpocząć rozmowę podczas pisania wiadomości</string> - <string name="pref_delivery">Potwierdzenie dostarczenia</string> - <string name="pref_delivery_summary">Potwierdzaj dostarczenie każdej wysłanej wiadomości</string> - <string name="pref_delivery_toast">Pokaż dymek</string> - <string name="pref_delivery_toast_summary">Pokazuj mały wyskakujący dymek z potwierdzeniem odbioru wiadomości</string> - <string name="pref_delivery_vibrate">Wibracje</string> - <string name="pref_delivery_vibrate_summary">Wibracje po dostarczeniu wiadomości</string> - <string name="pref_delete_old_messages">Usuń stare wiadomości</string> - <string name="pref_delete_old_messages_summary">Automatycznie usuń wystarczająco stare wiadomości</string> - <string name="pref_delete_old_messages_unread">Nieprzeczytane wiadomości</string> - <string name="pref_delete_old_messages_unread_summary">Automatycznie usuń nieprzeczytane wiadomości po %s dniach</string> - <string name="pref_delete_old_messages_read">Przeczytane wiadomości</string> - <string name="pref_delete_old_messages_read_summary">Automatycznie usuń przeczytane wiadomości po %s dniach</string> - <string name="pref_yappy">Pełna integracja z Yappy</string> - <string name="pref_endlessjabber_summary">Włącz integrację z Yappy</string> - <string name="pref_blocked_conversations">Zablokowane rozmowy</string> - <string name="pref_blocked_conversations_summary">Przytrzymaj rozmowę i zablokuj, aby przenieść do zablokowanych i wstrzymać powiadomienia</string> - <string name="pref_block_future">Zablokuj kolejne wiadomości</string> - <string name="pref_block_future_summary">Dodaj więcej numerów do blokowania</string> - <string name="pref_should_i_answer">Integracja z \"Odebrać telefon?\"</string> - <string name="pref_should_i_answer_summary">Automatycznie usuwaj wiadomości przychodzące od numerów zablokowanych w aplikacji \"Odebrać telefon?\"</string> - <string name="pref_mobile_only">Numery komórkowe</string> - <string name="pref_mobile_only_summary">Pokazuj tylko numery komórkowe w podpowiedziach kontaków</string> - <string name="pref_auto_emoji">Ustawienia emoji</string> - <string name="pref_auto_emoji_summary">Podmieniaj tekst na emoji</string> - <string name="pref_enter_button">Przycisk enter</string> - <string name="pref_enter_button_summary">Dotknij, aby zmienić zachowanie przycisku enter</string> - <string name="pref_compose_group">Wiadomości grupowe</string> - <string name="pref_compose_group_summary">Wysyłając wiadomość do wielu odbiorców, wyślij wiadomość grupową zamiast pojedynczych wiadomości</string> - <string name="pref_auto_download">Automatyczne pobieranie MMS</string> - <string name="pref_auto_download_summary">Automatycznie pobieraj MMS, kiedy tylko będą dostępne</string> - <string name="pref_auto_data">Ustawienia danych pakietowych</string> - <string name="pref_auto_data_summary">Włącz dane pakietowe automatycznie przy odbieraniu i wysyłaniu MMS</string> - <string name="pref_split">Podziel SMS-y</string> - <string name="pref_split_summary">Podziel długie wiadomości na kilka krótszych</string> - <string name="pref_split_counter">Licznik podzielonych wiadomości</string> - <string name="pref_split_counter_summary">Dodaje licznik do każdej podzielonej wiadomości</string> - <string name="pref_long_as_mms">Wysyłaj długie wiadomości jako MMS-y</string> - <string name="pref_long_as_mms_summary">Wyślij długie wiadomości jako MMS zamiast dzielenia ich</string> - <string name="pref_long_as_mms_after">Licznik długich wiadomości</string> - <string name="pref_long_as_mms_after_summary">Wysyłaj długie wiadomości jako MMS-y, jeśli przekroczą określoną ilość wiadomości</string> - <string name="pref_return">Pokaż przycisk enter</string> - <string name="pref_return_summary">Pokaż przycisk Enter zamiast przycisku Emoji</string> - <string name="pref_text">Tekst</string> - <string name="pref_notifications">Powiadomienia SMS</string> - <string name="pref_led">Powiadomienia LED</string> - <string name="pref_theme_led">Kolor diody powiadomień</string> - <string name="pref_wake">Wybudź telefon</string> - <string name="pref_wake_summary">Włącz ekran po otrzymaniu nowej wiadomości</string> - <string name="pref_notifications_private">Prywatne powiadomienia</string> - <string name="pref_notifications_private_summary">Dotknij, aby zmienić co powinno być ukryte w powiadomieniu</string> - <string name="pref_ringtone">Dźwięk powiadomienia</string> - <string name="pref_ringtone_summary">Wybierz dźwięk powiadomienia</string> - <string name="pref_ticker">Pokaż fragment wiadomości</string> - <string name="pref_ticker_summary">Pokazuje fragment nowej wiadomości w pasku powiadomień</string> - <string name="pref_vibration">Wibracja</string> - <string name="pref_vibration_summary">Wibruj po otrzymaniu wiadomości</string> - <string name="pref_notification_call">Przycisk dzwonienia</string> - <string name="pref_notification_call_summary">Zadzwoń do nadawcy wiadomości bezpośrednio z powiadomienia</string> - <string name="pref_dimiss_read">Oznacz jako przeczytane</string> - <string name="pref_dismiss_read_summary">Oznacz wiadomość jako przeczytaną po usunięciu powiadomienia</string> - <string name="pref_delayed">Opóźnione wysyłanie</string> - <string name="pref_delayed_summary">Dodaj opóźnienie, aby mieć możliwość wglądu do wiadomości przed wysłaniem</string> - <string name="pref_delayed_duration">Czas opóźnienia (sekundy)</string> - <string name="pref_delayed_duration_summary">Czas oczekiwania przed wysłaniem wiadomości</string> - <string name="pref_night_auto">Automatyczny tryb nocny</string> - <string name="pref_night_auto_summary">Tryb nocny uruchamiany automatycznie na podstawie ustalonych godzin</string> - <string name="pref_day_start">Dzień zaczyna się</string> - <string name="pref_night_start">Noc zaczyna się</string> - <string name="pref_qk_responses">Odpowiedzi QK</string> - <string name="pref_qk_responses_summary">Modyfikuj gotowe odpowiedzi do wykorzystania na urządzeniu z Android Wear</string> - <string name="pref_quickreply_enabled">Odpowiedź QK</string> - <string name="pref_quickreply_enabled_summary">Pokaż okno Odpowiedzi QK po otrzymaniu nowej wiadomości</string> - <string name="pref_tap_to_quit">Dotknij, aby odrzucić</string> - <string name="pref_tap_to_quit_summary">Dotknij gdziekolwiek, aby zamknąć okno</string> - <string name="pref_quickcompose">Komponuj QK</string> - <string name="pref_quickcompose_summary">Wyświetla powiadomienie, które umożliwia stworzenie nowej wiadomości</string> - <string name="pref_mms_enabled">MMS-y włączone</string> - <string name="pref_mms_enabled_summary">Włącz wysyłanie i odbieranie MMS-ów</string> - <string name="pref_mmsc_url">MMSC</string> - <string name="pref_mms_proxy">Proxy MMS</string> - <string name="pref_mms_port">Port MMS</string> - <string name="pref_apn_chooser">Wczytaj domyślne APN-y</string> - <string name="pref_strip_unicode">Pomiń znaki unicode</string> - <string name="pref_strip_unicode_summary">Zamień znaki, które nie są wspierane w wiadomościach pełnej długości na odpowiednie znaki GSM</string> - <string name="pref_system_bar_flat">Płaskie paski systemu</string> - <string name="pref_system_bar_flat_summary">Wyłącz gradient systemowego paska na większości urządzeń z KitKat-em</string> - <string name="pref_status_compat">Poprawka paska powiadomień</string> - <string name="pref_status_compat_summary">Rozwiązuje problemy spowodowane przez rozszerzony pulpit, Tinted Status Bar (Xposed) lub niestandardowe ustawienia DPI</string> - <string name="pref_navigation_compat">Poprawka paska nawigacji</string> - <string name="pref_navigation_compat_summary">Rozwiązuje problemy spowodowane przez rozszerzony pulpit, Tinted Status Bar (Xposed) lub niestandardowe ustawienia DPI</string> - <string name="pref_about_version_title">Wersja QKSMS</string> - <string name="pref_about_authors_title">Autorzy</string> - <string name="pref_about_authors_summary">Moez Bhatti</string> - <string name="pref_changelog_summary">Dotknij, aby wyświetlić listę zmian</string> - <string name="pref_about_thanks_title">Dziękujemy</string> - <string name="pref_about_thanks_summary">Dotknij, aby zobaczyć listę współautorów open-source</string> - <string name="pref_donate_title">Wspomóż</string> - <string name="pref_donate_summary">QKSMS jest bezpłatne. Wspomóż nas przekazując darowiznę!</string> - <string name="pref_about_gplus_title">Google+</string> - <string name="pref_about_gplus_summary">Dołącz do społeczności beta testerów QKSMS na Google+</string> - <string name="pref_about_github_title">GitHub</string> - <string name="pref_about_github_summary">QKSMS ma otwarte źródło. Współtwórz i zgłaszaj błędy na GitHub</string> - <string name="pref_about_crowdin_title">Crowdin</string> - <string name="pref_about_crowdin_summary">Pomóż tłumaczyć QKSMS na Crowdin</string> - <!--Preference subcategory--> - <string name="pref_subcat_theme">Motyw</string> - <!--Preference subcategory--> - <string name="pref_subcat_system_bars">Paski systemu</string> - <!--Preference subcategory--> - <string name="pref_subcat_categories">Kategorie</string> - <!--Preference subcategory--> - <string name="pref_subcat_font">Krój czcionki</string> - <!--Preference subcategory--> - <string name="pref_subcat_messages">Wiadomości</string> - <!--Preference subcategory--> - <string name="pref_subcat_avatars">Awatary</string> - <string name="donate_google">Wesprzyj używając Google</string> - <string name="donate_google_summary">Google pobiera 30% prowizji</string> - <string name="donate_paypal">Wesprzyj używając PayPal</string> - <string name="donate_paypal_button">Wesprzyj dowolną sumą</string> - <string name="donate_paypal_button_summary">Kup mi cokolwiek zechcesz!</string> - <!--Donation product name--> - <string name="product_name_donation">Darowizna</string> - <!--$1 donation product name--> - <string name="product_name_donate_1">Podaruj 1$</string> - <!--$5 donation product name--> - <string name="product_name_donate_5">Podaruj 5$</string> - <!--$3 donation product name--> - <string name="product_name_donate_10">Podaruj 10$</string> - <!--$1 donation product description--> - <string name="product_description_donate_1">Postaw mi colę</string> - <!--$5 donation product description--> - <string name="product_description_donate_5">Postaw mi kanapkę</string> - <!--$10 donaion product description--> - <string name="product_description_donate_10">Postaw mi obiad</string> - <string name="title_settings">Ustawienia</string> - <string name="title_search">Szukaj</string> - <string name="title_compose">Nowa wiadomość</string> - <string name="title_conversation_list">Rozmowy</string> - <string name="title_blocked">Zablokowane</string> - <string name="title_changelog">Zmiany</string> - <string name="title_picker">Nowe wiadomości</string> - <string name="title_donate">QKSMS+</string> - <string name="title_qk_responses">Odpowiedzi QK</string> - <string name="title_block_address">Zablokuj numer</string> - <string name="title_unblock_address">Odblokuj numer</string> - <string name="title_conversations_selected">%s wybranych</string> - <string name="title_palette">Paleta</string> - <string name="title_rgb">RGB</string> - <!-- Menu shown in the context menu when long pressing on a message when the message contains - one or more phone numbers and/or email addresses and the number or email is new to - contacts. [CHAR LIMIT=50] --> - <string name="menu_add_address_to_contacts">Dodaj <xliff:g id="contactEmailOrNumber">%s</xliff:g> do kontaktów</string> - <!-- Context menu item on an individual message for viewing an attached slideshow --> - <string name="view_slideshow">Uruchom pokaz slajdów</string> - <!-- Context menu item on an individual message for viewing message details such as time and date --> - <string name="view_message_details">Pokaż szczegóły</string> - <!-- Context menu item on an individual message for viewing a delivery report --> - <string name="view_delivery_report">Wyświetl raport</string> - <!-- Context menu item on an individual message for deleting only that message --> - <string name="delete_message">Usuń</string> - <!-- Abbreviation for "kilobyte" --> - <string name="kilobyte">KB</string> - <!-- Individual message context menu item --> - <string name="copy_message_text">Skopiuj treść</string> - <!-- Header for context menu on an individual message --> - <string name="message_options">Opcje wiadomości</string> - <!-- Delivery Header View --> - <!-- Title of "Report" window --> - <string name="delivery_header_title">Raport</string> - <!--Text for app restart confirmation dialog--> - <string name="restart_message">Zmiany zostaną wprowadzone przy następnym uruchomieniu QKSMS</string> - <!--Dialog title for asking if a user wants to delete a conversation--> - <string name="delete_conversation">Usuń rozmowy</string> - <!--Dialog title for asking if a user wants to delete all failed messages--> - <string name="delete_all_failed">Usuń niewysłane wiadomości</string> - <!--CDialog title for asking if a user wants to delete a conversation--> - <string name="delete_confirmation">Czy na pewno chcesz usunąć (%s) rozmów?</string> - <!--CDialog title for asking if a user wants to delete all failed messages--> - <string name="delete_all_failed_confirmation">Czy na pewno chcesz usunąć niewysłane wiadomości z (%s) rozmów?</string> - <!--(Unused) Dialog title shown if APNs have not been set--> - <string name="apns_not_set">APN-y nie zostały ustawione</string> - <!--(Unused) Dialog description shown if APNs have not been set--> - <string name="apns_not_set_description">Okazało się, że Twoje APN-y nie zostały ustawione. Oznacza to, że wiadomości MMS nie będą działały prawidłowo. Naciśnij OK, aby QKSMS znalazł je za Ciebie.</string> - <!--Dialog title show if MMS hasn't been configured--> - <string name="set_up_mms_title">Skonfigurować MMS?</string> - <!--Dialog description shown if MMS hasn't yet been configured--> - <string name="set_up_mms_description">Wygląda na to, że MMS nie są jeszcze skonfigurowane w QKSMS. Naciśnij OK, aby je automatycznie skonfigurować.</string> - <!-- Dialog message text explaining that a draft message will not be saved due to invalid recipients --> - <string name="discard_message_reason">Wiadomość nie zostanie wysłana ze względu na brak prawidłowych odbiorców</string> - <string name="invalid_code">Błędny kod</string> - <!--Button to restart app now instead of manually later--> - <string name="restart">Uruchom ponownie</string> - <!--Notification action to reply to a message--> - <string name="reply">Odpowiedz</string> - <!--Notification action to reply to a message--> - <string name="reply_qksms">Odpowiedz przez QKSMS</string> - <!--Notification action to mark a message as read--> - <string name="read">Przeczytane</string> - <!--Notification action to mark a message as read--> - <string name="mark_read">Oznacz jako przeczytane</string> - <!--Notification action to call the sender of a message--> - <string name="call">Zadzwoń</string> - <!-- Notification toast message --> - <string name="notification_mute_on">Powiadomienia włączone</string> - <string name="notification_mute_off">Powiadomienia wyłączone</string> - <!--Positive action button--> - <string name="yes">Tak</string> - <string name="add">Dodaj</string> - <!--Positive action button--> - <string name="save">Zapisz</string> - <!--Positive action button--> - <string name="enable">Włącz</string> - <!--Positive action button--> - <string name="upgrade_now">Ustaw</string> - <!--Positive action button--> - <string name="okay">OK</string> - <!--Positive action button--> - <string name="redeem">Wprowadź kod</string> - <!--Neutral action button--> - <string name="just_once">Tylko raz</string> - <!--Neutral action button--> - <string name="later">Później</string> - <!--Neutral action button --> - <string name="cancel">Anuluj</string> - <!-- Name of the local user when displaying sender of an outgoing message (personal pronoun) --> - <string name="messagelist_sender_self">Ja</string> - <!-- Sender to be used if the sender address has been hidden --> - <string name="hidden_sender_address">Ukryty adres nadawcy</string> - <!-- Subject to display in the conversation list if there is no subject --> - <string name="no_subject_view">(Bez tematu)</string> - <!-- Time and date a message is due to expire --> - <string name="expire_on">"Kończy się: <xliff:g id="date">%s</xliff:g>"</string> - <!-- Formatting for subject displayed inline, prepended to MMS message text --> - <string name="inline_subject">"<Temat: <xliff:g id="subject">%s</xliff:g>>"</string> - <!-- Text of a button appearing for MMS messages that have not yet been downloaded, causing the message to be downloaded (imperative verb) --> - <string name="download">Pobierz</string> - <!-- Message displayed in place of the "download message" button once it has been pressed, indicating that the download is in progress --> - <string name="downloading">Pobieranie</string> - <!-- Toast message while an image is being resized --> - <string name="compressing">Obraz jest zbyt duży. Kompresowanie\u2026</string> - <!-- Header shown above favorite contacts in QKCompose --> - <string name="favorites">Ulubione kontakty</string> - <!-- Word represents 'self' in a conversation --> - <string name="me">Ja</string> - <string name="menu_edit">Edytuj</string> - <string name="menu_delete_messages">Usuń wiadomości</string> - <string name="menu_delete_failed">Usuń niewysłane wiadomości</string> - <string name="menu_lock">Zablokuj</string> - <string name="menu_unlock">Odblokuj</string> - <!-- When the user tries to view message details and some error occurs while - retrieving those details, this message will be shown. --> - <string name="cannot_get_details">Nie można uzyskać szczegółowych informacji</string> - <!-- Title of "Message details" dialog --> - <string name="message_details_title">Szczegóły wiadomości</string> - <!-- Label in "Message details" dialog --> - <string name="message_type_label">Typ\u000A</string> - <!-- "Type" value in "Message details" dialog --> - <string name="text_message">Wiadomość tekstowa</string> - <!-- "Type" value in "Message details" dialog --> - <string name="multimedia_message">Wiadomość multimedialna</string> - <!-- "Type" value in "Message details" dialog --> - <string name="multimedia_notification">Powiadomienie wiadomości multimedialnych</string> - <!-- Label in "Message details" dialog showing who sent the message. --> - <string name="from_label">Od\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="to_address_label">Do\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="bcc_label">UDW\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="sent_label">Wysłane\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="received_label">Otrzymane\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="saved_label">Zapisane\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="subject_label">Temat\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="message_size_label">Rozmiar wiadomości\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="priority_label">Priorytet\u000A</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_high">Wysoki</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_normal">Normalny</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_low">Niski</string> - <!-- Label in "Message details" dialog --> - <string name="message_class_label">Klasa wiadomości\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="error_code_label">Kod błędu\u000A</string> - <!-- Alert dialog title when creating a slideshow [CHAR LIMIT=none] --> - <string name="building_slideshow_title">Tworzenie pokazu slajdów</string> - <!-- Tag appearing on conversations in the conversation list that contain a draft message --> - <string name="has_draft">Szkic</string> - <!-- In conversation list items, this is the separator between a contact's name and the draft stamp [CHAR LIMIT=5] --> - <string name="draft_separator">,\u0020</string> - <!-- In conversation list items, this comes after the receipient's name and contains the number of messages in the thread [CHAR LIMIT=5] --> - <string name="message_count_format">\u00a0<xliff:g id="number" example="1">%1$s</xliff:g></string> - <!-- For debugging: Dialog box title indicating there's a situation where data has unexpectedly changed --> - <string name="error_state">Stan niezgodny</string> - <!-- For debugging: Dialog box text indicating there's a situation where data has unexpectedly changed --> - <string name="error_state_text">Stan rozmów i odbiorców jest niespójny. Proszę sporządzić raport błędów i wysłać go na http://go/droidanizer </string> - <!-- This is the dialog title for the "Select link" dialog, shown when the user clicks on a - chat in the chat history view if there are links in the chat message. The dialog displays the - links if there are any --> - <string name="select_link_title">Wybierz akcję</string> - <!-- In message list items, this string builds the timestamp line when the message is in a group [CHAR LIMIT=NONE] --> - <string name="message_timestamp_format"><xliff:g id="string" example="Fred Flinstone">%1$s</xliff:g>\u0020-\u0020<xliff:g id="string" example="9:39AM">%2$s</xliff:g></string> - <!--Message sending status: sending--> - <string name="status_sending">Wysyłanie…</string> - <!--Message sending status: failed--> - <!--<string name="status_failed">Failed. Tap to retry</string>--> - <!-- Delivery Report Activity --> - <!-- Status in "Report" window --> - <string name="status_none">(Brak)</string> - <!-- Status in "Report" window --> - <string name="status_pending">Oczekujące</string> - <!-- Status in "Report" window --> - <string name="status_read">Przeczytane</string> - <!-- Status in "Report" window --> - <string name="status_received">Otrzymane</string> - <!-- Status in "Report" window --> - <string name="status_failed">Nie powiodło się. Dotknij, aby zobaczyć opcje</string> - <!-- Status in "Report" window --> - <string name="status_unread">Nieprzeczytane</string> - <!-- Status in "Report" window --> - <string name="status_rejected">Odrzucone</string> - <!-- Label in "Report" window --> - <string name="recipient_label">Odbiorca:\u0020</string> - <!-- Label in "Report" window --> - <string name="status_label">Stan:\u0020</string> - <!-- Label in "Report" window [CHAR LIMIT=50]--> - <string name="delivered_label">Dostarczone:\u0020</string> - <string name="do_something">Zrób coś</string> - <!-- Confirm Delete --> - <!-- Delete confirmation dialog title --> - <string name="confirm_dialog_title">Usunąć?</string> - <!-- Delete confirmation dialog title for locked messages --> - <string name="confirm_dialog_locked_title">Usunąć zablokowane wiadomości?</string> - <!-- This message is displayed in a confirmation dialog when the user selects one or more - conversations and then taps the "Delete" button. --> - <plurals name="confirm_delete_conversation"> - <!-- Case of 1 result. --> - <item quantity="one">Jedna rozmowa zostanie usunięta.</item> - <item quantity="few"><xliff:g id="number" example="15">%1$s</xliff:g> rozmowy zostaną usunięte.</item> - <!-- Case of 0 or 2 or more results. --> - <item quantity="other"><xliff:g id="number" example="15">%1$s</xliff:g> rozmów zostanie usuniętych.</item> - </plurals> - <string name="confirm_delete_conversation">Cały wątek zostanie usunięty</string> - <!-- Delete all threads confirmation dialog message --> - <string name="confirm_delete_all_conversations">Wszystkie wątki zostaną usunięte</string> - <!-- Delete message confirmation dialog message --> - <string name="confirm_delete_message">Wiadomość zostanie usunięta</string> - <!-- Delete message confirmation dialog message for a locked message --> - <string name="confirm_delete_locked_message">Usunąć tę zablokowaną wiadomość?</string> - <!-- Delete all the messages on the SIM dialog message --> - <string name="confirm_delete_all_SIM_messages">Wszystkie wiadomości na karcie SIM zostaną usunięte</string> - <!-- Delete the selected message on the SIM dialog message --> - <string name="confirm_delete_SIM_message">Ta wadomość na karcie SIM zostanie usunięta</string> - <!-- Delete unlocked checkbox title --> - <string name="delete_unlocked">Usuń zablokowane wiadomości</string> - <!-- Delete button title --> - <string name="delete">Usuń</string> - <!-- More button title --> - <string name="more">Więcej</string> - <!-- More button summary --> - <string name="more_summary">Dotknij, aby zobaczyć więcej</string> - <!-- Action bar mode title when multi-selecting conversations --> - <string name="select_conversations">Wybierz rozmowy</string> - <!-- Show this in the middle of the main activity when there are no conversations [CHAR LIMIT=none] --> - <string name="no_conversations">Brak rozmów.</string> - <!-- Show this in the middle of the main activity when loading conversations [CHAR LIMIT=none] --> - <string name="loading_conversations">Ładowanie rozmowy</string> - <!-- Tells the user that QKSMS isn't the default SMS app --> - <string name="not_default">Domyślna aplikacja SMS</string> - <!-- Tells the user they need to set QKSMS as the default app in order to use this feature --> - <string name="default_info">Ustaw QKSMS jako domyślną aplikację SMS, aby to zrobić</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to mark messages as read --> - <string name="not_default_mark_read">Ustaw QKSMS jako domyślną aplikację, aby zaznaczyć rozmowy jako przeczytane</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to mark messages as unread --> - <string name="not_default_mark_unread">Ustaw QKSMS jako domyślną aplikację, aby zaznaczyć rozmowy jako nieprzeczytane</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to send messages --> - <string name="not_default_delete">Ustaw QKSMS jako domyślną aplikację SMS, aby móc usuwać wiadomości</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to delete messages --> - <string name="not_default_send">Ustaw QKSMS jako domyślną aplikację, aby wysyłać wiadomości</string> - <!-- Tells the user they should set QKSMS as the default messaging app --> - <string name="not_default_first">Niektóre funkcje nie będą działać dopóki QKSMS nie będzie domyślną aplikacją do SMS</string> - <string name="delayed_messaging_info">Opóźnione wysyłanie wiadomości pozwala Ci anulować wiadomość zanim zostanie wysłana. Dowiedz się więcej w ustawieniach QKSMS+</string> - <string name="delayed_duration_bounds_error">Ustaw wartość pomiędzy 1 a 30 sekundami.</string> - <!-- Dialog title for the Read Report dialog. --> - <string name="confirm">Potwierdź</string> - <!-- Dialog text for the Read Report dialog. --> - <string name="message_send_read_report">Raport odczytania wiadomości zostanie wysłany.</string> - <!-- Dialog title for updating app icon color --> - <string name="update_icon_title">Zmień kolor ikony</string> - <!-- Dialog message for updating app icon color --> - <string name="update_icon_message">Przy zmianie koloru ikony QKSMS musi zostać uruchomiony ponownie</string> - <string name="dialog_conversation_details_title">Szczegóły rozmowy</string> - <string name="dialog_conversation_details_last_message_date">Data ostatniej wiadomości</string> - <string name="dialog_conversation_details_message_count">Ilość wiadomości</string> - <string name="dialog_conversation_details_recipients">Odbiorcy (%s)</string> - <string name="dialog_should_i_answer_title">Aplikacja \"Odebrać telefon?\" nie jest zainstalowana</string> - <string name="dialog_should_i_answer_message">Czy pobrać aplikację ze Sklepu Play?</string> - <string name="dialog_delete_old_messages">Czy na pewno chcesz usunąć automatycznie stare wiadomości?</string> - <!-- Title for audio file picker --> - <string name="select_audio">Wybierz dźwięk</string> - <!-- Menu title to copy an attachment to the shared storage [CHAR LIMIT=25] --> - <string name="copy_to_sdcard">Zapisz załącznik</string> - <!-- Toast message on successful copy to shared storage [CHAR LIMIT=30] --> - <string name="copy_to_sdcard_success">Załącznik zapisany</string> - <!-- Toast message on failed copy to shared storage [CHAR LIMIT=30] --> - <string name="copy_to_sdcard_fail">Nie można zapisać załącznika</string> - <!-- Menu title to save a sound as a ringtone --> - <string name="save_ringtone">Zapisz jako dzwonek</string> - <!-- Toast message on successful copying ringtone to drm provider --> - <string name="saved_ringtone">Dzwonek zapisany</string> - <!-- Toast message on failed copying ringtone to drm provider --> - <string name="saved_ringtone_fail">Nie można zapisać dzwonka</string> - <!-- Menu item --> - <!-- Menu item [CHAR LIMIT=40] --> - <string name="menu_group_participants">Grupa odbiorców</string> - <!--Toast shown when a draft is saved--> - <string name="toast_draft">Zapisano szkic</string> - <!--Toast shown when a conversation is deleted--> - <string name="toast_conversation_deleted">Usunięto rozmowę</string> - <!--Toast shown when device is low on storage--> - <string name="toast_low_memory">"Pamięć telefonu jest pełna. Usuń niektóre pliki, żeby zwolnić miejsce."</string> - <!--Toast shown to tell user that forwarding messages doesn't work yet--> - <string name="toast_forward">Ta funkcja nie została jeszcze wprowadzona. W chwili obecnej należy skopiować tekst i wkleić w rozmowie, w której chcesz go wysłać</string> - <!--Toast shown for unimplemented features--> - <string name="toast_unimplemented">Ta funkcja nie została jeszcze wprowadzona</string> - <!--Toast shown when a message fails to send--> - <string name="toast_message_failure">Nie udało się wysłać wiadomości</string> - <!--Toast shown when a message is delivered--> - <string name="toast_message_delivered">Wiadomość dostarczona</string> - <!--Toast shown when a message is not delivered--> - <string name="toast_message_not_delivered">Wiadomość nie została dostarczona</string> - <!--Toast shown when default APNs are loaded--> - <string name="toast_default_apns_loaded">Wczytano domyślne ustawienia APN</string> - <!--Toast shown when text is copied to the clipboard--> - <string name="toast_copy_text">Skopiowano tekst do schowka</string> - <!--Toast shown when Google Play Services is not available for purchasing a product--> - <string name="toast_billing_not_available">Zakup wymaga Google Play Store (rachunek) na Twoim urządzeniu z Androidem</string> - <!--Toast shown when Google Play Services is not available for purchasing a product--> - <string name="toast_endlessjabber_not_installed">EndlessJabber nie jest zainstalowany, otwórz Google Play</string> - <string name="toast_changelog_error">Nie można załadować dziennika zmian. Spróbuj ponownie później</string> - <string name="toast_conversation_error">Nie można otworzyć rozmowy</string> - <string name="toast_deleting_old_messages">Twoje stare wiadomości zostaną wkrótce usunięte</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_1">Dziękuję za dotację! Jesteś moim nowym najlepszym przyjacielem.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_2">Dzięki za dotację! Kocham Cię.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_3">Dzięki za dotację! Pomagasz QKSMS stać się najlepszą aplikacją do wiadomości SMS w historii.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_4">Dzięki za dotację! Jesteś niesamowitą osobą.</string> - <!--Menu option to mute conversation--> - <string name="menu_mute_conversation">Wycisz rozmowę</string> - <!--Menu option to mute conversation--> - <string name="menu_unmute_conversation">Wyłącz wyciszenie rozmowy</string> - <string name="menu_block_conversations">Zablokuj rozmowy</string> - <string name="menu_unblock_conversations">Odblokuj rozmowy</string> - <string name="menu_messages">Wiadomości</string> - <string name="menu_blocked">Zablokowane</string> - <string name="menu_blocked_conversations">Zablokowane (%s nowych)</string> - <string name="menu_unblocked_conversations">Wiadomości (%s nowych)</string> - <string name="menu_notifications">Powiadomienia</string> - <string name="menu_notifications_off">Powiadomienia wyłączone</string> - <string name="menu_notification_settings">Ustawienia rozmowy</string> - <string name="menu_view_details">Wyświetl szczegóły</string> - <string name="menu_mark_read">Oznacz jako przeczytane</string> - <string name="menu_mark_unread">Oznacz jako nieprzeczytane</string> - <string name="menu_delete_conversation">Usuń rozmowę</string> - <string name="menu_multi_select">Wycisz rozmowę</string> - <string name="menu_done">Gotowe</string> - <string name="failed_message_title">Opcje wiadomości, których nie uda się wysłać</string> - <!--Toast shown to tell the user that they don't have a photo attachments app, and suggests that they download one--> - <string name="attachment_app_not_found">Nie znaleziono aplikacji dodającej załączniki. Spróbuj zainstalować aplikację Galeria!</string> - <string name="attachment_camera_error">Nie udało się otworzyć Aparatu</string> - <string name="pref_max_mms_attachment_size">Maksymalny rozmiar załącznika MMS</string> - <string name="error_no_recipients">Wybierz kontakty do wysłania im tej wiadomości!</string> - <string name="error_file_not_found">QKSMS nie może uzyskać dostępu do pliku, który chcesz udostępnić!</string> - <string name="sending_blocked_welcome_screen_message">Bez pośpiechu! Już za chwilę będziesz mógł wysyłać SMS-y!</string> - <string name="notification_colored_icon_ready">Naciśnij, aby dodać skrót do ekranu głównego.</string> - <string name="notification_title_colored_icon_ready">Kolorowa ikona QKSMS jest już gotowa</string> - <string name="icon_ready">Twoja nowa ikona jest gotowa!</string> - <string name="icon_ready_message">Możesz ją teraz ponownie dodać do ekranu głównego z nowym kolorem.</string> - <string name="dont_ask_again">Nie pytaj ponownie</string> - <string name="warning">Ostrzeżenie Stagefright</string> - <string name="stagefright_warning">Wiadomości wideo mogą zawierać szkodliwy kod, który jest w stanie zaatakować Twój telefon. Czy chcesz kontynuować?</string> - <!-- MMS DIALOG SETUP STRINGS --> - <string name="mms_setup_set_up_mms_title">Skonfigurować MMS?</string> - <string name="mms_setup_set_up_mms_body">Wygląda na to, że nie masz skonfigurowanych MMS w QKSMS. Naciśnij OK, aby automatycznie skonfigurować MMS.</string> - <string name="mms_setup_setting_up_later_title">Skonfiguruj ustawienia MMS później.</string> - <string name="mms_setup_setting_up_later_body">Przejdź do sekcji MMS w ustawieniach programu, aby spróbować automatycznej konfiguracji, skontaktować się ze wsparciem lub wprowadzić własne ustawienia.</string> - <string name="mms_setup_no_configurations_found_title">Nie znaleziono konfiguracji</string> - <string name="mms_setup_no_configurations_found_body">Nie byliśmy w stanie znaleźć konfiguracji MMS dla Twojego operatora. Naciśnij OK, aby skontaktować się ze wsparciem. Pomożemy Ci to naprawić!</string> - <string name="mms_setup_one_configuration_found_title">Znaleziono konfigurację</string> - <string name="mms_setup_one_configuration_found_body">Znaleziono konfigurację dla operatora %s. Wygląda w porządku?</string> - <string name="mms_setup_multiple_configurations_found_title">Znaleziono wiele konfiguracji</string> - <string name="mms_setup_multiple_configurations_found_body">Znaleziono kilka konfiguracji MMS. Wybierz swojego operatora lub naciśnij Brak, jeśli nie znajdziesz go na liście.</string> - <string name="mms_setup_next_steps_title">Następne kroki</string> - <string name="mms_setup_next_steps_body">Przejdź do sekcji MMS w ustawieniach programu, aby ponownie spróbować automatycznej konfiguracji, skontaktować się ze wsparciem lub wprowadzić własne ustawienia.</string> - <string name="mms_setup_success_title">Udało się!</string> - <string name="mms_setup_success_body">Jeśli napotkasz błędy, przejdź do sekcji MMS w ustawieniach programu, aby ponownie spróbować automatycznej konfiguracji, skontaktować się ze wsparciem lub wprowadzić własne ustawienia.</string> - <string name="na">Brak</string> - <string name="no">Nie</string> - <string name="pref_automatically_configure_mms">Ustawienia konfiguracji MMS</string> - <string name="pref_mms_contact_support">Skontaktuj się ze Wsparciem</string> - <string name="pref_category_sending_mms">Wysyłanie MMS</string> - <string name="pref_category_mms_configuration">Konfiguracja MMS</string> - <string name="pref_mms_contact_support_summary">Skontaktuj się z QKSMS, aby uzyskać pomoc w konfiguracji MMS</string> - <string name="pref_markdown_enabled">Formatowanie tekstu</string> - <string name="pref_markdown_enabled_summary">Używaj formatowania Markdown, aby pogrubić, podkreślić oraz pisać kursywą w wiadomościach</string> - <string name="want_read_indicators">Pokazywać wskaźnik przeczytanych wiadomości?</string> - <string name="color_swatch_description">Kolor %1$d</string> - <string name="color_swatch_description_selected">Wybrano %1$d kolor</string> - <string name="color_picker_default_title">Wybierz kolor</string> - <string name="message_delivered">Wiadomość Dostarczona</string> - <string name="message_not_delivered">Nie dostarczono wiadomości</string> - <string name="error">Wystąpił błąd</string> - <string name="invalid_destination">Błędny adres docelowy.</string> - <string name="service_not_activated">Usługa nie jest aktywna w sieci.</string> - <string name="service_message_not_found">Wiadomość utraciła ważność lub jest niedostępna.</string> - <string name="service_network_problem">Nie udało się wysłać z powodu problemu z siecią.</string> - <string name="message_queued">Nie można teraz wysłać wiadomości. Zostanie ona wysłana, gdy usługa zostanie wznowiona.</string> - <string name="download_later">Nie da się teraz tego pobrać. Spróbuj ponownie później.</string> - <string name="no_apn">Nie wybrano APN-ów w aplikacji. Popraw to w ustawieniach!</string> - <string name="no_subject">(Brak tematu)</string> - <string name="unknown_sender">Nieznany nadawca</string> - <string name="dl_failure_notification">Nie udało się pobrać wiadomości </string> - <string name="auto_select_multiple_apns">Znaleziono wiele konfiguracji APN-ów - wypróbuj jeden z nich. Jeśli nie zadziała, wybierz inny w Ustawienia > Zaawansowane > Załaduj domyślne APN-y.</string> - <string name="auto_select_apn">Automatycznie wybieraj APN-y</string> - <string name="auto_select_failed_title">Automatyczna konfiguracja nie powiodła się</string> - <string name="auto_select_failed">Spróbuj wyszukać ustawienia APN-ów Twojego operatora (MMSC, Port i Proxy) </string> - <string name="date_yesterday">Wczoraj</string> - <string name="date_just_now">Przed chwilą</string> - <string name="compose_loading_attachment">Ładowanie załącznika</string> - <string name="hint_no_messages">Brak wiadomości.\nKliknij +, aby wysłać!</string> - <string-array name="resend_menu"> - <item>Wyślij ponownie</item> - <item>Edytuj</item> - <item>Usuń</item> - </string-array> - <string-array name="message_menu"> - <item>Prześlij dalej</item> - <item>Skopiuj treść</item> - <item>Pokaż szczegóły</item> - <item>Usuń wiadomość</item> - </string-array> - <string-array name="background_titles"> - <item>Material Light</item> - <item>Material Dark</item> - <item>Czarny</item> - </string-array> - <string-array name="font_sizes"> - <item>Mały</item> - <item>Normalny</item> - <item>Duży</item> - <item>Największy</item> - </string-array> - <string-array name="font_families"> - <item>Roboto Regular</item> - <item>Roboto Condensed</item> - <item>Czcionka systemowa</item> - </string-array> - <string-array name="font_weights"> - <item>Cienka</item> - <item>Normalna</item> - </string-array> - <!-- String to match as no subject and filter out as a subject. For example, if the - subject string is "no subject", we won't display that. We'll pretend - no subject string was delivered. --> - <string-array name="empty_subject_strings"> - <item>bez tematu</item> - </string-array> - <string-array name="qk_responses"> - <item>OK</item> - <item>Daj mi chwilę</item> - <item>Jestem w drodze</item> - <item>Dzięki</item> - <item>Brzmi nieźle</item> - <item>Co tam?</item> - <item>Zgoda</item> - <item>Nie</item> - <item>Kocham Cię</item> - <item>Przepraszam</item> - <item>LOL</item> - <item>W porządku</item> - </string-array> - <string-array name="enter_button_options"> - <item>Pokaż emoji</item> - <item>Nowa linia</item> - <item>Wyślij wiadomość</item> - </string-array> - <string-array name="notification_private_options"> - <item>Pokaż wszystkie</item> - <item>Ukryj wiadomość</item> - <item>Ukryj wiadomość i nadawcę</item> - </string-array> - <!-- Max MMS attachment sizes. I.e. will compress pictures that are larger than 300 KB down to - under 300KB. --> - <string-array name="max_mms_attachment_sizes"> - <item>300 KB</item> - <item>600 KB</item> - <item>1 MB</item> - <item>Nieograniczony</item> - </string-array> -</resources> diff --git a/QKSMS/src/main/res/values-pt-rBR/strings.xml b/QKSMS/src/main/res/values-pt-rBR/strings.xml deleted file mode 100644 index 3dd3d9372..000000000 --- a/QKSMS/src/main/res/values-pt-rBR/strings.xml +++ /dev/null @@ -1,770 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!--Generated by crowdin.com--> -<resources xmlns:xliff="http://schemas.android.com/apk/res-auto"> - <!--Slogan--> - <string name="slogan">Ame mandar mensagens novamente.</string> - <!--Text shown when a phone number cannot be found--> - <string name="unknown_number">Número desconhecido</string> - <!--Content description for photos--> - <string name="popup_photo_CD">Foto</string> - <!--Text to be displayed while content is loading--> - <string name="loading">Carregando…</string> - <!--Test string--> - <string name="test">String de teste</string> - <!--Hint for contacts text field--> - <string name="hint_contacts">Inserir destinatários</string> - <!--Hint for search text field--> - <string name="hint_search">Buscar algo</string> - <!--Hint for message reply text field--> - <string name="hint_reply">Digite uma mensagem</string> - <!--Hint for code redemption--> - <string name="hint_redeem">Insira o código</string> - <string name="hint_hex">Hex</string> - <!--Text shown for single new message in notification--> - <string name="new_message">Nova mensagem</string> - <!--Text shown after number of unread messages in notification (ex. 3 new messages)--> - <string name="new_messages">novas mensagens</string> - <!--Text shown for single failed message in notification--> - <string name="failed_message">Falha no envio da mensagem</string> - <!--Text shown after number of failed messages in notification (ex. 3 messages failed to send)--> - <string name="failed_messages">Falha no envio das mensagens</string> - <!--Text shown under failed message count--> - <string name="failed_messages_summary">Toque para ver</string> - <!--QuickCompose notification title--> - <string name="quickcompose">Composição rápida</string> - <!--QuickCompose notification text--> - <string name="quickcompose_detail">Clique para enviar uma mensagem</string> - <!--Welcome screen intro button--> - <string name="welcome_start">Vamos começar!</string> - <!--Allows user to skip welcome screen--> - <string name="welcome_skip">Pular</string> - <!--Allows user to finish the welcome screen--> - <string name="welcome_finish">Terminar</string> - <!--Indicates to user they can pick a color--> - <string name="welcome_theme_title">Escolha uma cor</string> - <!--Indicates to user they can pick any colors--> - <string name="welcome_theme_description">Qualquer cor.</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_night_description">Suave para seus olhos.</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_night_hint">Me alterne</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_quickreply_title">Resposta rápida</string> - <!--QK Reply explanation--> - <string name="welcome_quickreply_description">Responda as mensagens mais rápido do que nunca.</string> - <!--Prompts user to try QK Reply--> - <string name="welcome_quickreply_hint">Tente!</string> - <!--QK Reply demo message--> - <string name="welcome_quickreply_message_1">Wow! Isso não foi incrível? Você pode ver sua conversa inteira de relance. Toque fora da notificação ou pressione o botão para retira-la.</string> - <!--QK Reply demo message--> - <string name="welcome_quickreply_message_2">Esta é a resposta de QK. Agora você pode responder a mensagens de qualquer lugar. Toque no botão de expandir para ver o que acontece a seguir :)</string> - <!--Settings option in menu--> - <string name="menu_settings">Configurações</string> - <!--Search option in menu--> - <string name="menu_search">Procurar</string> - <!--Show full conversation in QuickReply--> - <string name="menu_show_all">Mostrar todas as mensagens</string> - <!--Show only unread messages in QuickReply--> - <string name="menu_show_unread">Mostrar mensagens não lidas</string> - <!--Open conversation option in menu (shown in QuickReply)--> - <string name="menu_open_thread">Abrir conversa</string> - <!--Forward message option in menu--> - <string name="menu_forward">Reencaminhar mensagem</string> - <!--Call contact option in menu--> - <string name="menu_call">Ligar</string> - <!--Mark a message/conversation as read option in menu--> - <string name="menu_read">Marcar como lida</string> - <!--Delete a message option in menu--> - <string name="menu_delete">Deletar</string> - <!--Donate option in menu--> - <string name="menu_billing">Doar</string> - <!--Copy text option in menu--> - <string name="menu_copy">Copiar texto</string> - <!--Changelog option in menu--> - <string name="menu_changelog">"Novidades"</string> - <!--Expand settings option in menu--> - <string name="menu_show_all_prefs">Mostrar tudo</string> - <!--Show less settings option in menu--> - <string name="menu_show_fewer_prefs">Mostrar menos</string> - <!--Title for message details popup--> - <string name="details_title">Detalhes</string> - <!--Title for address that message is being sent to in message details popup--> - <string name="details_to">Para</string> - <!--Title for address that message is sent from in message details popup--> - <string name="details_from">De</string> - <!--Title for text of a message in message details popup--> - <string name="details_body">Corpo</string> - <!--Title for date sent of a message in message details popup--> - <string name="details_date_sent">Data de envio</string> - <!--Title for date received of a message in message details popup--> - <string name="details_date_received">Data recebida</string> - <!--Title for rate snackbar--> - <string name="rate_title">Gostou do QKSMS?</string> - <!--Title for rate button--> - <string name="rate_action">Avalie</string> - <string name="pref_category_appearance">Aparência</string> - <string name="pref_category_summary_appearance">Temas, fontes, cores, avatares, e muito mais</string> - <string name="pref_category_general">Geral</string> - <string name="pref_category_summary_general">Entre, envio de mensagem, formatação</string> - <string name="pref_category_blocking">Bloqueio de mensagens</string> - <string name="pref_category_notifications">Notificações</string> - <string name="pref_category_summary_notifications">Sons, LED, privacidade</string> - <string name="pref_category_mms">MMS</string> - <string name="pref_category_summary_mms">Configurar MMS (APNs), tamanho máximo, mensagens de grupo</string> - <string name="pref_category_quickreply">Resposta rápida</string> - <string name="pref_category_summary_quickreply">Resposta rápida, opções de pop-up</string> - <string name="pref_category_quickcompose">Composição rápida</string> - <string name="pref_category_summary_quickcompose">Composição rápida, contatos favoritos</string> - <string name="pref_category_about">Sobre</string> - <string name="pref_category_summary_about">Versão, changelog, autores, obrigado</string> - <string name="pref_theme">Cor do tema</string> - <string name="pref_theme_summary_alt">Toque para mudar o tema</string> - <string name="pref_icon">Icon color</string> - <string name="pref_icon_summary">Tap to change the QKSMS icon color</string> - <string name="pref_status_tint">Barra de status matizada</string> - <string name="pref_navigation_tint">Barra de navegação matizada</string> - <string name="pref_background">Cor do fundo</string> - <string name="pref_background_summary">Toque para alterar a cor de fundo</string> - <string name="pref_bubbles">Message bubbles</string> - <string name="pref_bubbles_summary">Toque para alterar as preferências de mensagem de bolha</string> - <string name="pref_night">Modo noturno</string> - <string name="pref_night_summary">Save battery and reduce eye strain</string> - <string name="pref_night_amoled">Fundo preto puro</string> - <string name="pref_night_amoled_summary">Economizar bateria extra em dispositivos com ecrãs AMOLED</string> - <string name="pref_bubble_style_new">Usar novo estilo de bolha</string> - <string name="pref_color_sent">Colora as mensagens enviadas</string> - <string name="pref_color_sent_summary">Colorir as bolhas de fundo para mensagens enviadas</string> - <string name="pref_color_received">Colora as mensagens recebidas</string> - <string name="pref_color_received_summary">Colorir as bolhas de fundo para mensagens recebidas</string> - <string name="pref_hide_avatar_conversations">Ocultar imagens de contatos</string> - <string name="pref_hide_avatar_conversations_summary">Ocultar imagem de contatos na lista de conversas</string> - <string name="pref_hide_avatar_sent">Ocultar imagem de contatos em mensagens enviadas</string> - <string name="pref_hide_avatar_sent_summary">Ocultar imagem de contatos para caixa de saída</string> - <string name="pref_hide_avatar_received">Ocultar imagem de contatos em mensagens recebidas</string> - <string name="pref_hide_avatar_received_summary">Ocultar imagem de contatos em caixa de entrada</string> - <string name="pref_font_family">Família de fontes</string> - <string name="pref_font_size">Tamanho da fonte</string> - <string name="pref_font_weight">Peso da fonte</string> - <string name="pref_message_count">Contagem de mensagens</string> - <string name="pref_message_count_summary">Mostrar o número de mensagens de cada conversa</string> - <string name="pref_sent_timestamps">Sent timestamps</string> - <string name="pref_sent_timestamps_summary">Show the timestamp for when a message was sent, not received</string> - <string name="pref_force_timestamps">Force timestamps</string> - <string name="pref_force_timestamps_summary">Enable timestamps for all messages</string> - <string name="pref_key_timestamp_delay">New timestamp delay</string> - <string name="pref_key_timestamp_delay_summary">The number of minutes which must elapse between two messages in order for a new timestamp to be shown.</string> - <string name="pref_compose_favorites">Contatos favoritos</string> - <string name="pref_compose_summary_favorites">Show your starred contacts in the QK Compose window, making them only a tap away</string> - <string name="pref_prox_sensor_call">Sensor de proximidade</string> - <string name="pref_prox_sensor_call_summary">While in a conversation, bring your phone to your ear to start a call</string> - <string name="pref_delivery">Relatório de entrega</string> - <string name="pref_delivery_summary">Confirmar se a mensagem foi enviada com sucesso</string> - <string name="pref_delivery_toast">Show toast</string> - <string name="pref_delivery_toast_summary">Show a short toast to indicate a message being delivered</string> - <string name="pref_delivery_vibrate">Vibrar</string> - <string name="pref_delivery_vibrate_summary">Vibrar na entrega de mensagens</string> - <string name="pref_delete_old_messages">Delete old messages</string> - <string name="pref_delete_old_messages_summary">Automatically delete messages once they\'re old enough</string> - <string name="pref_delete_old_messages_unread">Unread messages</string> - <string name="pref_delete_old_messages_unread_summary">Automatically delete unread messages after %s days</string> - <string name="pref_delete_old_messages_read">Read messages</string> - <string name="pref_delete_old_messages_read_summary">Automatically delete read messages after %s days</string> - <string name="pref_yappy">Yappy integration</string> - <string name="pref_endlessjabber_summary">Enable full support for Yappy</string> - <string name="pref_blocked_conversations">Blocked conversations</string> - <string name="pref_blocked_conversations_summary">Long-press on a conversation and block to move to blocked inbox and stop notifications</string> - <string name="pref_block_future">Bloquear mensagens futuras</string> - <string name="pref_block_future_summary">Add additional phone numbers to block</string> - <string name="pref_should_i_answer">Should I Answer? Integration</string> - <string name="pref_should_i_answer_summary">Automatically delete incoming messages from numbers which are blocked through Should I Answer?</string> - <string name="pref_mobile_only">Números de celular</string> - <string name="pref_mobile_only_summary">Only show mobile numbers in contact suggestions</string> - <string name="pref_auto_emoji">Emoji automático</string> - <string name="pref_auto_emoji_summary">Replace text with image emoji</string> - <string name="pref_enter_button">Botão enter</string> - <string name="pref_enter_button_summary">Tap to change keyboard enter button behavior</string> - <string name="pref_compose_group">Mensagens em grupo</string> - <string name="pref_compose_group_summary">Quando compor um mensagem para múltiplas pessoas, mandar uma mensagem de grupo em vez de mensagens individuais</string> - <string name="pref_auto_download">Baixar MMS automaticamente</string> - <string name="pref_auto_download_summary">Baixar MMS automaticamente quando estiver disponível</string> - <string name="pref_auto_data">Ligar internet móvel automaticamente</string> - <string name="pref_auto_data_summary">Ligar internet móvel automaticamente quando mandar ou receber MMS</string> - <string name="pref_split">Dividir SMS</string> - <string name="pref_split_summary">Dividir mensagens longas em mensagens separadas</string> - <string name="pref_split_counter">Contador de divisões</string> - <string name="pref_split_counter_summary">Adiciona um contador à frente de cada mensagem dividida</string> - <string name="pref_long_as_mms">Enviar mensagens longas como MMS</string> - <string name="pref_long_as_mms_summary">Enviar mensagens longas como MMS em vez de dividi-las</string> - <string name="pref_long_as_mms_after">Enviar mensagem longa como MMS após</string> - <string name="pref_long_as_mms_after_summary">Enviar mensagens longas como MMS quando exceder o comprimento de um número de mensagens</string> - <string name="pref_return">Mostrar tecla \"voltar\"</string> - <string name="pref_return_summary">Exibir tecla \"voltar\" no teclado ao invés da tecla Emoji</string> - <string name="pref_text">Conversar</string> - <string name="pref_notifications">Notificações de SMS ativas</string> - <string name="pref_led">Notificação LED</string> - <string name="pref_theme_led">Cor do LED de notificação</string> - <string name="pref_wake">Acordar telefone</string> - <string name="pref_wake_summary">Ligar sua tela quando receber uma nova mensagem</string> - <string name="pref_notifications_private">Notificações privadas</string> - <string name="pref_notifications_private_summary">Toque para mudar o que deveria ser escondido na notificação</string> - <string name="pref_ringtone">Som de notificação</string> - <string name="pref_ringtone_summary">Selecione um som de notificação</string> - <string name="pref_ticker">Mostrar relógio</string> - <string name="pref_ticker_summary">Mostra partes de novas mensagens na barra de notificações</string> - <string name="pref_vibration">Vibração</string> - <string name="pref_vibration_summary">Vibrar quando novas mensagens são recebidas</string> - <string name="pref_notification_call">Botão de chamada</string> - <string name="pref_notification_call_summary">Chamar ao remetente de uma mensagem diretamente da notificação</string> - <string name="pref_dimiss_read">Marcar como lida</string> - <string name="pref_dismiss_read_summary">Marcar mensagem como lida quando a notificação for deletada</string> - <string name="pref_delayed">Mandar mensagem com atraso</string> - <string name="pref_delayed_summary">Esperar antes de mandar suas mensagens, para que você tenha a chance de revisa-las</string> - <string name="pref_delayed_duration">Comprimento do atraso (segundos)</string> - <string name="pref_delayed_duration_summary">Tempo de espera ante de enviar sua mensagem</string> - <string name="pref_night_auto">Modo noturno automático</string> - <string name="pref_night_auto_summary">Ativar o modo noturno automaticamente baseado na hora</string> - <string name="pref_day_start">Dia começa</string> - <string name="pref_night_start">Noite começa</string> - <string name="pref_qk_responses">Respostas rápidas</string> - <string name="pref_qk_responses_summary">Modify your preset responses to be used from your Android Wear device</string> - <string name="pref_quickreply_enabled">QK Reply enabled</string> - <string name="pref_quickreply_enabled_summary">Show QK Reply window whenever a new message is received</string> - <string name="pref_tap_to_quit">Toque para fechar</string> - <string name="pref_tap_to_quit_summary">Toque em qualquer lugar fora da janela para fechá-la</string> - <string name="pref_quickcompose">Composição rápida habilitada</string> - <string name="pref_quickcompose_summary">Exibir atalho na Barra de Notificação para compor uma nova mensagem</string> - <string name="pref_mms_enabled">MMS habilitado</string> - <string name="pref_mms_enabled_summary">Habilitar o envio e recebimento de mensagens MMS</string> - <string name="pref_mmsc_url">MMSC</string> - <string name="pref_mms_proxy">Proxy de MMS</string> - <string name="pref_mms_port">Porta de MMS</string> - <string name="pref_apn_chooser">Carregar APNs de origem</string> - <string name="pref_strip_unicode">Tirar unicode</string> - <string name="pref_strip_unicode_summary">Trocar caracteres que não são suportados em mensagens longas para caracteres compatíveis GSM</string> - <string name="pref_system_bar_flat">Barras de sistema planas</string> - <string name="pref_system_bar_flat_summary">Get rid of the gradient shown on the system UI bars on most KitKat devices</string> - <string name="pref_status_compat">Correção de barra de status</string> - <string name="pref_status_compat_summary">Corrige problemas causados pelo modo imersivo, Tinted Status Bar (Xposed) ou configurações de DPI personalizadas</string> - <string name="pref_navigation_compat">Correção de barra de navegação</string> - <string name="pref_navigation_compat_summary">Corrige problemas causados pelo modo imersivo, Tinted Status Bar (Xposed) ou configurações de DPI personalizadas</string> - <string name="pref_about_version_title">Versão do QKSMS</string> - <string name="pref_about_authors_title">Autores</string> - <string name="pref_about_authors_summary">Moez Bhatti</string> - <string name="pref_changelog_summary">Toca para ver o changelog</string> - <string name="pref_about_thanks_title">Obrigado</string> - <string name="pref_about_thanks_summary">Toque para ver os contribuidores de código aberto</string> - <string name="pref_donate_title">Doar</string> - <string name="pref_donate_summary">QKSMS is free. Help support us by donating!</string> - <string name="pref_about_gplus_title">Google+</string> - <string name="pref_about_gplus_summary">Join the QKSMS Beta Testing community on Google+</string> - <string name="pref_about_github_title">GitHub</string> - <string name="pref_about_github_summary">QKSMS is open source. Contribute and report issues on GitHub</string> - <string name="pref_about_crowdin_title">Crowdin</string> - <string name="pref_about_crowdin_summary">Join the QKSMS translation project on Crowdin</string> - <!--Preference subcategory--> - <string name="pref_subcat_theme">Tema</string> - <!--Preference subcategory--> - <string name="pref_subcat_system_bars">Barras do sistema</string> - <!--Preference subcategory--> - <string name="pref_subcat_categories">Categorias</string> - <!--Preference subcategory--> - <string name="pref_subcat_font">Fonte</string> - <!--Preference subcategory--> - <string name="pref_subcat_messages">Mensagens</string> - <!--Preference subcategory--> - <string name="pref_subcat_avatars">Avatares</string> - <string name="donate_google">Doe com Google</string> - <string name="donate_google_summary">Google recebe 30% das doações</string> - <string name="donate_paypal">Doe com PayPal</string> - <string name="donate_paypal_button">Doe qualquer quantia</string> - <string name="donate_paypal_button_summary">Me compre qualquer coisa que você queira!</string> - <!--Donation product name--> - <string name="product_name_donation">Doação</string> - <!--$1 donation product name--> - <string name="product_name_donate_1">Doar $1 USD</string> - <!--$5 donation product name--> - <string name="product_name_donate_5">Doar $5 USD</string> - <!--$3 donation product name--> - <string name="product_name_donate_10">Doar $10 USD</string> - <!--$1 donation product description--> - <string name="product_description_donate_1">Compre-me uma coca-cola</string> - <!--$5 donation product description--> - <string name="product_description_donate_5">Compre-me um sanduíche</string> - <!--$10 donaion product description--> - <string name="product_description_donate_10">Pague-me um almoço</string> - <string name="title_settings">Configurações</string> - <string name="title_search">Procurar</string> - <string name="title_compose">Nova Mensagem</string> - <string name="title_conversation_list">Conversas</string> - <string name="title_blocked">Bloqueado</string> - <string name="title_changelog">Changelog</string> - <string name="title_picker">Novas mensagens</string> - <string name="title_donate">Doar</string> - <string name="title_qk_responses">QK Responses</string> - <string name="title_block_address">Bloquear número</string> - <string name="title_unblock_address">Desbloquear número</string> - <string name="title_conversations_selected">%s selecionados</string> - <string name="title_palette">Palette</string> - <string name="title_rgb">RGB</string> - <!-- Menu shown in the context menu when long pressing on a message when the message contains - one or more phone numbers and/or email addresses and the number or email is new to - contacts. [CHAR LIMIT=50] --> - <string name="menu_add_address_to_contacts">Adicionar <xliff:g id="contactEmailOrNumber">%s</xliff:g> aos contatos</string> - <!-- Context menu item on an individual message for viewing an attached slideshow --> - <string name="view_slideshow">Ver apresentação</string> - <!-- Context menu item on an individual message for viewing message details such as time and date --> - <string name="view_message_details">Ver detalhes</string> - <!-- Context menu item on an individual message for viewing a delivery report --> - <string name="view_delivery_report">Exibir relatório</string> - <!-- Context menu item on an individual message for deleting only that message --> - <string name="delete_message">Excluir</string> - <!-- Abbreviation for "kilobyte" --> - <string name="kilobyte">KB</string> - <!-- Individual message context menu item --> - <string name="copy_message_text">Copiar texto</string> - <!-- Header for context menu on an individual message --> - <string name="message_options">Opções de mensagem</string> - <!-- Delivery Header View --> - <!-- Title of "Report" window --> - <string name="delivery_header_title">Relatório</string> - <!--Text for app restart confirmation dialog--> - <string name="restart_message">Estas alterações serão aplicadas da próxima vez que iniciar o QKSMS</string> - <!--Dialog title for asking if a user wants to delete a conversation--> - <string name="delete_conversation">Deletar conversas</string> - <!--Dialog title for asking if a user wants to delete all failed messages--> - <string name="delete_all_failed">Deletar mensagens falhadas</string> - <!--CDialog title for asking if a user wants to delete a conversation--> - <string name="delete_confirmation">Are you sure you would like to delete (%s) conversations?</string> - <!--CDialog title for asking if a user wants to delete all failed messages--> - <string name="delete_all_failed_confirmation">Are you sure you would like to delete failed messages from (%s) conversations?</string> - <!--(Unused) Dialog title shown if APNs have not been set--> - <string name="apns_not_set">APNs não definidos</string> - <!--(Unused) Dialog description shown if APNs have not been set--> - <string name="apns_not_set_description">Parece que os APNs não foram definidos. Isto significa que o MMS não funcionará corretamente. Por favor, pressione ok para que o QKSMS os possa encontrar por você :)</string> - <!--Dialog title show if MMS hasn't been configured--> - <string name="set_up_mms_title">Configurar MMS?</string> - <!--Dialog description shown if MMS hasn't yet been configured--> - <string name="set_up_mms_description">It appears that MMS hasn\'t been configured in QKSMS yet. Press okay automatically configure MMS.</string> - <!-- Dialog message text explaining that a draft message will not be saved due to invalid recipients --> - <string name="discard_message_reason">Sua mensagem será descartada porque não tem nenhum destinatário válido.</string> - <string name="invalid_code">Código inválido</string> - <!--Button to restart app now instead of manually later--> - <string name="restart">Reiniciar agora</string> - <!--Notification action to reply to a message--> - <string name="reply">Responder</string> - <!--Notification action to reply to a message--> - <string name="reply_qksms">Reply via QKSMS</string> - <!--Notification action to mark a message as read--> - <string name="read">Lida</string> - <!--Notification action to mark a message as read--> - <string name="mark_read">Marcar como lida</string> - <!--Notification action to call the sender of a message--> - <string name="call">Ligar</string> - <!-- Notification toast message --> - <string name="notification_mute_on">Notifications enabled</string> - <string name="notification_mute_off">Notifications disabled</string> - <!--Positive action button--> - <string name="yes">Sim</string> - <string name="add">Adicionar</string> - <!--Positive action button--> - <string name="save">Salvar</string> - <!--Positive action button--> - <string name="enable">Ativar</string> - <!--Positive action button--> - <string name="upgrade_now">Configurar agora</string> - <!--Positive action button--> - <string name="okay">Ok</string> - <!--Positive action button--> - <string name="redeem">Redeem</string> - <!--Neutral action button--> - <string name="just_once">Apenas uma vez</string> - <!--Neutral action button--> - <string name="later">Mais tarde</string> - <!--Neutral action button --> - <string name="cancel">Cancelar</string> - <!-- Name of the local user when displaying sender of an outgoing message (personal pronoun) --> - <string name="messagelist_sender_self">Eu</string> - <!-- Sender to be used if the sender address has been hidden --> - <string name="hidden_sender_address">Endereço de remetente oculto</string> - <!-- Subject to display in the conversation list if there is no subject --> - <string name="no_subject_view">(Nenhum assunto)</string> - <!-- Time and date a message is due to expire --> - <string name="expire_on">"Expires: <xliff:g id="date">%s</xliff:g>"</string> - <!-- Formatting for subject displayed inline, prepended to MMS message text --> - <string name="inline_subject">"<Subject: <xliff:g id="subject">%s</xliff:g>>"</string> - <!-- Text of a button appearing for MMS messages that have not yet been downloaded, causing the message to be downloaded (imperative verb) --> - <string name="download">Baixar</string> - <!-- Message displayed in place of the "download message" button once it has been pressed, indicating that the download is in progress --> - <string name="downloading">Baixando</string> - <!-- Toast message while an image is being resized --> - <string name="compressing">Imagem muito grande. Comprimindo\u2026</string> - <!-- Header shown above favorite contacts in QKCompose --> - <string name="favorites">Contatos favoritos</string> - <!-- Word represents 'self' in a conversation --> - <string name="me">Eu</string> - <string name="menu_edit">Editar</string> - <string name="menu_delete_messages">Excluir mensagens</string> - <string name="menu_delete_failed">Delete failed messages</string> - <string name="menu_lock">Bloquear</string> - <string name="menu_unlock">Desbloquear</string> - <!-- When the user tries to view message details and some error occurs while - retrieving those details, this message will be shown. --> - <string name="cannot_get_details">Não é possível obter detalhes.</string> - <!-- Title of "Message details" dialog --> - <string name="message_details_title">Detalhes da mensagem</string> - <!-- Label in "Message details" dialog --> - <string name="message_type_label">Tipo\u000A</string> - <!-- "Type" value in "Message details" dialog --> - <string name="text_message">Mensagem de texto</string> - <!-- "Type" value in "Message details" dialog --> - <string name="multimedia_message">Mensagem multimídia</string> - <!-- "Type" value in "Message details" dialog --> - <string name="multimedia_notification">Notificação de mensagem multimídia</string> - <!-- Label in "Message details" dialog showing who sent the message. --> - <string name="from_label">De\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="to_address_label">Para\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="bcc_label">Bcc\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="sent_label">Enviado\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="received_label">Recebido\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="saved_label">Salvo\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="subject_label">Assunto\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="message_size_label">Tamanho da mensagem\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="priority_label">Prioridade\u000A</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_high">Alta</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_normal">Normal</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_low">Baixa</string> - <!-- Label in "Message details" dialog --> - <string name="message_class_label">Tipo de mensagem\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="error_code_label">Código de erro\u000A</string> - <!-- Alert dialog title when creating a slideshow [CHAR LIMIT=none] --> - <string name="building_slideshow_title">Criando apresentação</string> - <!-- Tag appearing on conversations in the conversation list that contain a draft message --> - <string name="has_draft">Rascunho</string> - <!-- In conversation list items, this is the separator between a contact's name and the draft stamp [CHAR LIMIT=5] --> - <string name="draft_separator">,\u0020</string> - <!-- In conversation list items, this comes after the receipient's name and contains the number of messages in the thread [CHAR LIMIT=5] --> - <string name="message_count_format">\u00a0<xliff:g id="number" example="1">%1$s</xliff:g></string> - <!-- For debugging: Dialog box title indicating there's a situation where data has unexpectedly changed --> - <string name="error_state">Estado inconsistente</string> - <!-- For debugging: Dialog box text indicating there's a situation where data has unexpectedly changed --> - <string name="error_state_text">O estado da conversa e os destinatários são inconsistentes. Por favor, guarde um relatório de bugs e relate-o através de http://go/droidanizer </string> - <!-- This is the dialog title for the "Select link" dialog, shown when the user clicks on a - chat in the chat history view if there are links in the chat message. The dialog displays the - links if there are any --> - <string name="select_link_title">Escolha a ação</string> - <!-- In message list items, this string builds the timestamp line when the message is in a group [CHAR LIMIT=NONE] --> - <string name="message_timestamp_format"><xliff:g id="string" example="Fred Flinstone">%1$s</xliff:g>\u0020-\u0020<xliff:g id="string" example="9:39AM">%2$s</xliff:g></string> - <!--Message sending status: sending--> - <string name="status_sending">Enviando…</string> - <!--Message sending status: failed--> - <!--<string name="status_failed">Failed. Tap to retry</string>--> - <!-- Delivery Report Activity --> - <!-- Status in "Report" window --> - <string name="status_none">(Nenhum)</string> - <!-- Status in "Report" window --> - <string name="status_pending">Pendente</string> - <!-- Status in "Report" window --> - <string name="status_read">Lido</string> - <!-- Status in "Report" window --> - <string name="status_received">Recebido</string> - <!-- Status in "Report" window --> - <string name="status_failed">Falhou. Toque para opções</string> - <!-- Status in "Report" window --> - <string name="status_unread">Não lida</string> - <!-- Status in "Report" window --> - <string name="status_rejected">Rejeitada</string> - <!-- Label in "Report" window --> - <string name="recipient_label">Destinatário:\u0020</string> - <!-- Label in "Report" window --> - <string name="status_label">Estado:\u0020</string> - <!-- Label in "Report" window [CHAR LIMIT=50]--> - <string name="delivered_label">Entregue:\u0020</string> - <string name="do_something">Fazer algo</string> - <!-- Confirm Delete --> - <!-- Delete confirmation dialog title --> - <string name="confirm_dialog_title">Excluir?</string> - <!-- Delete confirmation dialog title for locked messages --> - <string name="confirm_dialog_locked_title">Excluir mensagem bloqueada?</string> - <!-- This message is displayed in a confirmation dialog when the user selects one or more - conversations and then taps the "Delete" button. --> - <plurals name="confirm_delete_conversation"> - <!-- Case of 1 result. --> - <item quantity="one">Singular form: Uma conversa será excluída. -Plural form: Conversas serão excluídas.</item> - <!-- Case of 0 or 2 or more results. --> - <item quantity="other">Uma conversa será excluída. -<xliff:g id="number" example="15">%1$s</xliff:g> Conversas serão excluídas.</item> - </plurals> - <string name="confirm_delete_conversation">O tópico inteiro será excluído.</string> - <!-- Delete all threads confirmation dialog message --> - <string name="confirm_delete_all_conversations">Todos os tópicos serão excluídos.</string> - <!-- Delete message confirmation dialog message --> - <string name="confirm_delete_message">A mensagem será excluída.</string> - <!-- Delete message confirmation dialog message for a locked message --> - <string name="confirm_delete_locked_message">Excluir esta mensagem bloqueada?</string> - <!-- Delete all the messages on the SIM dialog message --> - <string name="confirm_delete_all_SIM_messages">Todas as mensagens no cartão SIM serão excluídas.</string> - <!-- Delete the selected message on the SIM dialog message --> - <string name="confirm_delete_SIM_message">Esta mensagem no cartão SIM será excluída.</string> - <!-- Delete unlocked checkbox title --> - <string name="delete_unlocked">Excluir mensagens bloqueadas</string> - <!-- Delete button title --> - <string name="delete">Excluir</string> - <!-- More button title --> - <string name="more">Mais</string> - <!-- More button summary --> - <string name="more_summary">Toque para ver mais</string> - <!-- Action bar mode title when multi-selecting conversations --> - <string name="select_conversations">Escolher as conversas</string> - <!-- Show this in the middle of the main activity when there are no conversations [CHAR LIMIT=none] --> - <string name="no_conversations">Não há conversas.</string> - <!-- Show this in the middle of the main activity when loading conversations [CHAR LIMIT=none] --> - <string name="loading_conversations">Carregando conversas.</string> - <!-- Tells the user that QKSMS isn't the default SMS app --> - <string name="not_default">Padrão SMS</string> - <!-- Tells the user they need to set QKSMS as the default app in order to use this feature --> - <string name="default_info">QKSMS precisa ser seu aplicativo padrão para fazer isso</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to mark messages as read --> - <string name="not_default_mark_read">QKSMS deve ser o seu aplicativo padrão para marcar mensagens como lidas</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to mark messages as unread --> - <string name="not_default_mark_unread">QKSMS deve ser o seu aplicativo padrão para marcar as mensagens não lidas</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to send messages --> - <string name="not_default_delete">QKSMS deve ser o seu aplicativo padrão para excluir mensagens</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to delete messages --> - <string name="not_default_send">QKSMS must be your SMS app to send messages</string> - <!-- Tells the user they should set QKSMS as the default messaging app --> - <string name="not_default_first">Some things won\'t work until QKSMS is the default SMS app</string> - <string name="delayed_messaging_info">Delayed messaging allows you to cancel messages before they send. Change the default behavior and more in Settings</string> - <string name="delayed_duration_bounds_error">Duration must be between 1 and 30 seconds</string> - <!-- Dialog title for the Read Report dialog. --> - <string name="confirm">Confirmar</string> - <!-- Dialog text for the Read Report dialog. --> - <string name="message_send_read_report">Um relatório de leitura será enviado.</string> - <!-- Dialog title for updating app icon color --> - <string name="update_icon_title">Atualizar cor de ícone</string> - <!-- Dialog message for updating app icon color --> - <string name="update_icon_message">QKSMS must be restarted when changing the icon color</string> - <string name="dialog_conversation_details_title">Conversation details</string> - <string name="dialog_conversation_details_last_message_date">Last message date</string> - <string name="dialog_conversation_details_message_count">Message count</string> - <string name="dialog_conversation_details_recipients">Recipients (%s)</string> - <string name="dialog_should_i_answer_title">Should I Answer? not installed</string> - <string name="dialog_should_i_answer_message">Would you like to download the app from Google Play now?</string> - <string name="dialog_delete_old_messages">Are you sure you want to automatically delete old messages?</string> - <!-- Title for audio file picker --> - <string name="select_audio">Escolher audio</string> - <!-- Menu title to copy an attachment to the shared storage [CHAR LIMIT=25] --> - <string name="copy_to_sdcard">Salvar anexo</string> - <!-- Toast message on successful copy to shared storage [CHAR LIMIT=30] --> - <string name="copy_to_sdcard_success">Anexo salvo.</string> - <!-- Toast message on failed copy to shared storage [CHAR LIMIT=30] --> - <string name="copy_to_sdcard_fail">Falha ao salvar o anexo.</string> - <!-- Menu title to save a sound as a ringtone --> - <string name="save_ringtone">Salvar como toque</string> - <!-- Toast message on successful copying ringtone to drm provider --> - <string name="saved_ringtone">Toque salvo.</string> - <!-- Toast message on failed copying ringtone to drm provider --> - <string name="saved_ringtone_fail">Falha ao salvar toque.</string> - <!-- Menu item --> - <!-- Menu item [CHAR LIMIT=40] --> - <string name="menu_group_participants">Participantes no grupo</string> - <!--Toast shown when a draft is saved--> - <string name="toast_draft">Rascunho salvo</string> - <!--Toast shown when a conversation is deleted--> - <string name="toast_conversation_deleted">Conversa excluída</string> - <!--Toast shown when device is low on storage--> - <string name="toast_low_memory">"O armazenamento do telefone está cheio. Exclua alguns arquivos para liberar espaço."</string> - <!--Toast shown to tell user that forwarding messages doesn't work yet--> - <string name="toast_forward">Este recurso ainda não foi implementado. Por enquanto, por favor, use a opção Copiar Texto e cole na conversa que você gostaria de enviar</string> - <!--Toast shown for unimplemented features--> - <string name="toast_unimplemented">Este recurso ainda não foi implementado</string> - <!--Toast shown when a message fails to send--> - <string name="toast_message_failure">Falha no envio da mensagem</string> - <!--Toast shown when a message is delivered--> - <string name="toast_message_delivered">Mensagem entregue</string> - <!--Toast shown when a message is not delivered--> - <string name="toast_message_not_delivered">Mensagem não entregue</string> - <!--Toast shown when default APNs are loaded--> - <string name="toast_default_apns_loaded">Configurações APN padrão carregadas com sucesso</string> - <!--Toast shown when text is copied to the clipboard--> - <string name="toast_copy_text">Texto copiado para a área de transferência</string> - <!--Toast shown when Google Play Services is not available for purchasing a product--> - <string name="toast_billing_not_available">A compra requer o Google Play Store (pagamento) no seu dispositivo</string> - <!--Toast shown when Google Play Services is not available for purchasing a product--> - <string name="toast_endlessjabber_not_installed">EndlessJabber não está instalado, abrindo o Google Play</string> - <string name="toast_changelog_error">Couldn\'t load the changelog. Please try again later</string> - <string name="toast_conversation_error">Couldn\'t open conversation</string> - <string name="toast_deleting_old_messages">Your old messages will be deleted shortly</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_1">Obrigado pela doação! Você é meu novo melhor amigo.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_2">Obrigado pela doação! Eu te amo.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_3">Obrigado por doar! Você está ajudando QKSMS a se tornar o melhor aplicativo de mensagem já criado.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_4">Obrigado pela doação! Você é demais.</string> - <!--Menu option to mute conversation--> - <string name="menu_mute_conversation">Mute conversation</string> - <!--Menu option to mute conversation--> - <string name="menu_unmute_conversation">Unmute conversation</string> - <string name="menu_block_conversations">Bloquear conversas</string> - <string name="menu_unblock_conversations">Desbloquear conversas</string> - <string name="menu_messages">Mensagens</string> - <string name="menu_blocked">Bloqueado</string> - <string name="menu_blocked_conversations">Bloqueado (%s novo)</string> - <string name="menu_unblocked_conversations">Mensagens (%s novas)</string> - <string name="menu_notifications">Notificações</string> - <string name="menu_notifications_off">Notificações desligadas</string> - <string name="menu_notification_settings">Conversation settings</string> - <string name="menu_view_details">Exibir detalhes</string> - <string name="menu_mark_read">Marcar como lida</string> - <string name="menu_mark_unread">Marcar como não lida</string> - <string name="menu_delete_conversation">Excluir conversa</string> - <string name="menu_multi_select">Selecionar conversa</string> - <string name="menu_done">Concluído</string> - <string name="failed_message_title">Opções de mensagem falhadas</string> - <!--Toast shown to tell the user that they don't have a photo attachments app, and suggests that they download one--> - <string name="attachment_app_not_found">Attachments app not found. Try installing a photo gallery app!</string> - <string name="attachment_camera_error">A câmera não pôde ser aberta</string> - <string name="pref_max_mms_attachment_size">Tamanho máximo de anexo de MMS</string> - <string name="error_no_recipients">Selecione alguns contatos para enviar esta mensagem!</string> - <string name="error_file_not_found">QKSMS can\'t access the file you\'re trying to share!</string> - <string name="sending_blocked_welcome_screen_message">Espera aí! Você começa a enviar mensagens reais em um minuto!</string> - <string name="notification_colored_icon_ready">Toque para adicionar seu lançador da tela inicial.</string> - <string name="notification_title_colored_icon_ready">Ícone colorido QKSMS está pronto</string> - <string name="icon_ready">Seu novo ícone está pronto!</string> - <string name="icon_ready_message">Você agora pode adicioná-lo à sua tela inicial novamente com as cores atualizadas.</string> - <string name="dont_ask_again">Não pergunte novamente</string> - <string name="warning">Stagefright warning</string> - <string name="stagefright_warning">Mensagens de vídeo podem conter uma falha prejudicial que pode deixar seu telefone vulnerável a ataques. Gostaria de continuar?</string> - <!-- MMS DIALOG SETUP STRINGS --> - <string name="mms_setup_set_up_mms_title">Configurar MMS?</string> - <string name="mms_setup_set_up_mms_body">It appears that MMS isn\'t set up in QKSMS. Press okay to automatically configure MMS.</string> - <string name="mms_setup_setting_up_later_title">Configurando MMS mais tarde</string> - <string name="mms_setup_setting_up_later_body">Visit the MMS section of Settings to try automatic configuration, contact support, or enter your own configuration.</string> - <string name="mms_setup_no_configurations_found_title">Não há configurações encontradas</string> - <string name="mms_setup_no_configurations_found_body">Não pudemos encontrar uma configuração de MMS para sua operadora automaticamente. Pressione ok para contatar o suporte. Nós ajudaremos você a configurar! </string> - <string name="mms_setup_one_configuration_found_title">Uma configuração encontrada</string> - <string name="mms_setup_one_configuration_found_body">Encontramos uma configuração de MMS para o portador de %s. Isso está certo?</string> - <string name="mms_setup_multiple_configurations_found_title">Múltiplas configurações encontradas</string> - <string name="mms_setup_multiple_configurations_found_body">Encontramos várias configurações de MMS. Escolha a sua operadora na lista, ou pressione N/A se sua operadora não estiver na lista.</string> - <string name="mms_setup_next_steps_title">Próximos passos</string> - <string name="mms_setup_next_steps_body">Visite a seção de configurações de MMS para tentar novamente a configuração automática, contacte o suporte ou insira a sua própria configuração.</string> - <string name="mms_setup_success_title">Sucesso!</string> - <string name="mms_setup_success_body">Se você encontrar quaisquer problemas, visite a seção de configurações de MMS para tentar novamente a configuração automática, contacte o suporte ou insira a sua própria configuração.</string> - <string name="na">N/A</string> - <string name="no">Não</string> - <string name="pref_automatically_configure_mms">Configurar automaticamente MMS</string> - <string name="pref_mms_contact_support">Contato de suporte</string> - <string name="pref_category_sending_mms">Enviando MMS</string> - <string name="pref_category_mms_configuration">Configuração de MMS</string> - <string name="pref_mms_contact_support_summary">Entrar em contato com a equipe QKSMS para ajudar a configurar MMS</string> - <string name="pref_markdown_enabled">Formatação de texto</string> - <string name="pref_markdown_enabled_summary">Use a sintaxe do markdown para ficar em negrito, sublinhado e itálico em suas mensagens</string> - <string name="want_read_indicators">Quero indicadores de leitura?</string> - <string name="color_swatch_description">Cor %1$d</string> - <string name="color_swatch_description_selected">%1$d cor selecionada</string> - <string name="color_picker_default_title">Selecione uma cor</string> - <string name="message_delivered">Mensagem entregue</string> - <string name="message_not_delivered">Mensagem não entregue</string> - <string name="error">Erro</string> - <string name="invalid_destination">Endereço de destino inválido.</string> - <string name="service_not_activated">Serviço não ativado na rede.</string> - <string name="service_message_not_found">Mensagem expirada ou não disponível.</string> - <string name="service_network_problem">Não foi possível enviar devido a problema de rede.</string> - <string name="message_queued">Atualmente não é possível enviar sua mensagem. Ela será enviada quando o serviço estiver disponível.</string> - <string name="download_later">Não é possível baixar agora. Tente novamente mais tarde.</string> - <string name="no_apn">No APN specified for the app, you need to set it up in settings!</string> - <string name="no_subject">(Nenhum assunto)</string> - <string name="unknown_sender">Remetente desconhecido</string> - <string name="dl_failure_notification">Não foi possível baixar mensagem <xliff:g id="subject">%1$s </xliff:g> de <xliff:g id="from">%2$s </xliff:g>.</string> - <string name="auto_select_multiple_apns">Foram encontradas várias configurações diferentes. Experimente uma agora. Se não funcionar, você pode tentar uma nova indo em Configurações > Avançado > Carregar padrão APNs.</string> - <string name="auto_select_apn">Selecionar automaticamente APNs</string> - <string name="auto_select_failed_title">Configuração automática falhou</string> - <string name="auto_select_failed">Tente procurar pelas configurações de sua operadora APN (MMSC, Porte, e Proxy) e inseri-la em Configurações > avançado.</string> - <string name="date_yesterday">Ontem</string> - <string name="date_just_now">Apenas agora</string> - <string name="compose_loading_attachment">Carregando acessório</string> - <string name="hint_no_messages">Sem mensagens ainda.\nAperte no + para enviar uma!</string> - <string-array name="resend_menu"> - <item>Reenviar</item> - <item>Editar</item> - <item>Deletar</item> - </string-array> - <string-array name="message_menu"> - <item>Encaminhar mensagem</item> - <item>Copiar texto</item> - <item>Exibir detalhes</item> - <item>Excluir mensagem</item> - </string-array> - <string-array name="background_titles"> - <item>Material Light</item> - <item>Material Dark</item> - <item>Preto</item> - </string-array> - <string-array name="font_sizes"> - <item>Pequeno</item> - <item>Normal</item> - <item>Grande</item> - <item>Maior</item> - </string-array> - <string-array name="font_families"> - <item>Roboto Regular</item> - <item>Roboto Condensed</item> - <item>Fonte do sistema</item> - </string-array> - <string-array name="font_weights"> - <item>Leve</item> - <item>Normal</item> - </string-array> - <!-- String to match as no subject and filter out as a subject. For example, if the - subject string is "no subject", we won't display that. We'll pretend - no subject string was delivered. --> - <string-array name="empty_subject_strings"> - <item>sem assunto</item> - </string-array> - <string-array name="qk_responses"> - <item>Ok</item> - <item>Me dê um momento</item> - <item>Estou a caminho</item> - <item>Obrigado</item> - <item>Parece bom</item> - <item>Tudo bem?</item> - <item>De acordo</item> - <item>Não</item> - <item>Te amo</item> - <item>Desculpa</item> - <item>LOL</item> - <item>Está bem</item> - </string-array> - <string-array name="enter_button_options"> - <item>Mostrar emoji</item> - <item>Nova linha</item> - <item>Enviar mensagem</item> - </string-array> - <string-array name="notification_private_options"> - <item>Mostrar tudo</item> - <item>Esconder mensagem</item> - <item>Esconder mensagem e remetente</item> - </string-array> - <!-- Max MMS attachment sizes. I.e. will compress pictures that are larger than 300 KB down to - under 300KB. --> - <string-array name="max_mms_attachment_sizes"> - <item>300 KB</item> - <item>600 KB</item> - <item>1 MB</item> - <item>Ilimitado</item> - </string-array> -</resources> diff --git a/QKSMS/src/main/res/values-pt/strings.xml b/QKSMS/src/main/res/values-pt/strings.xml deleted file mode 100644 index 76f1beaca..000000000 --- a/QKSMS/src/main/res/values-pt/strings.xml +++ /dev/null @@ -1,768 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!--Generated by crowdin.com--> -<resources xmlns:xliff="http://schemas.android.com/apk/res-auto"> - <!--Slogan--> - <string name="slogan">Voltar a amar SMS.</string> - <!--Text shown when a phone number cannot be found--> - <string name="unknown_number">Número desconhecido</string> - <!--Content description for photos--> - <string name="popup_photo_CD">Foto</string> - <!--Text to be displayed while content is loading--> - <string name="loading">A carregar…</string> - <!--Test string--> - <string name="test">String de teste</string> - <!--Hint for contacts text field--> - <string name="hint_contacts">Introduza os destinatários</string> - <!--Hint for search text field--> - <string name="hint_search">Pesquisar algo</string> - <!--Hint for message reply text field--> - <string name="hint_reply">Escrever mensagem</string> - <!--Hint for code redemption--> - <string name="hint_redeem">Digite o código</string> - <string name="hint_hex">Hex</string> - <!--Text shown for single new message in notification--> - <string name="new_message">Nova mensagem</string> - <!--Text shown after number of unread messages in notification (ex. 3 new messages)--> - <string name="new_messages">novas mensagens</string> - <!--Text shown for single failed message in notification--> - <string name="failed_message">Falha no envio da mensagem</string> - <!--Text shown after number of failed messages in notification (ex. 3 messages failed to send)--> - <string name="failed_messages">mensagens não foram enviadas</string> - <!--Text shown under failed message count--> - <string name="failed_messages_summary">Toque para ver</string> - <!--QuickCompose notification title--> - <string name="quickcompose">QK Compose</string> - <!--QuickCompose notification text--> - <string name="quickcompose_detail">Toca para enviar uma mensagem</string> - <!--Welcome screen intro button--> - <string name="welcome_start">Vamos começar!</string> - <!--Allows user to skip welcome screen--> - <string name="welcome_skip">Ignorar</string> - <!--Allows user to finish the welcome screen--> - <string name="welcome_finish">Terminar</string> - <!--Indicates to user they can pick a color--> - <string name="welcome_theme_title">Escolha uma cor</string> - <!--Indicates to user they can pick any colors--> - <string name="welcome_theme_description">Qualquer cor.</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_night_description">Visual apelativo.</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_night_hint">Alternar</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_quickreply_title">QK Reply</string> - <!--QK Reply explanation--> - <string name="welcome_quickreply_description">Responda às mensagens mais rápido do que nunca.</string> - <!--Prompts user to try QK Reply--> - <string name="welcome_quickreply_hint">Experimenta!</string> - <!--QK Reply demo message--> - <string name="welcome_quickreply_message_1">Uau! Não foi espetacular? Pode ver uma conversa rapidamente. Clique fora da janela ou na marca para sair.</string> - <!--QK Reply demo message--> - <string name="welcome_quickreply_message_2">Isto é o QK Reply. Agora, pode responder às mensagens de qualquer lado. Toque no botão de expansão para ver o que acontece :)</string> - <!--Settings option in menu--> - <string name="menu_settings">Definições</string> - <!--Search option in menu--> - <string name="menu_search">Pesquisar</string> - <!--Show full conversation in QuickReply--> - <string name="menu_show_all">Mostrar todas as mensagens</string> - <!--Show only unread messages in QuickReply--> - <string name="menu_show_unread">Mostrar mensagens não lidas</string> - <!--Open conversation option in menu (shown in QuickReply)--> - <string name="menu_open_thread">Abrir conversa</string> - <!--Forward message option in menu--> - <string name="menu_forward">Reencaminhar mensagem</string> - <!--Call contact option in menu--> - <string name="menu_call">Ligar</string> - <!--Mark a message/conversation as read option in menu--> - <string name="menu_read">Marcar como lida</string> - <!--Delete a message option in menu--> - <string name="menu_delete">Apagar</string> - <!--Donate option in menu--> - <string name="menu_billing">Donativos</string> - <!--Copy text option in menu--> - <string name="menu_copy">Copiar texto</string> - <!--Changelog option in menu--> - <string name="menu_changelog">"Novidades"</string> - <!--Expand settings option in menu--> - <string name="menu_show_all_prefs">Mostrar todas</string> - <!--Show less settings option in menu--> - <string name="menu_show_fewer_prefs">Mostrar menos</string> - <!--Title for message details popup--> - <string name="details_title">Detalhes</string> - <!--Title for address that message is being sent to in message details popup--> - <string name="details_to">Para</string> - <!--Title for address that message is sent from in message details popup--> - <string name="details_from">De</string> - <!--Title for text of a message in message details popup--> - <string name="details_body">Texto</string> - <!--Title for date sent of a message in message details popup--> - <string name="details_date_sent">Data de envio</string> - <!--Title for date received of a message in message details popup--> - <string name="details_date_received">Data de receção</string> - <!--Title for rate snackbar--> - <string name="rate_title">Gosta do QKSMS?</string> - <!--Title for rate button--> - <string name="rate_action">Avaliar</string> - <string name="pref_category_appearance">Aparência</string> - <string name="pref_category_summary_appearance">Temas, fontes, cores, avatares e mais</string> - <string name="pref_category_general">Geral</string> - <string name="pref_category_summary_general">Entrega, envio e formatação de mensagens</string> - <string name="pref_category_blocking">Bloqueio de mensagens</string> - <string name="pref_category_notifications">Notificações</string> - <string name="pref_category_summary_notifications">Sons, privacidade e LED</string> - <string name="pref_category_mms">MMS</string> - <string name="pref_category_summary_mms">Configurar MMS (APN), tamanho máximo e grupos</string> - <string name="pref_category_quickreply">QK Reply</string> - <string name="pref_category_summary_quickreply">QK Reply, opções de pop-up</string> - <string name="pref_category_quickcompose">QK Compose</string> - <string name="pref_category_summary_quickcompose">QK Compose, contactos favoritos</string> - <string name="pref_category_about">Sobre</string> - <string name="pref_category_summary_about">Versão, alterações, autores e agradecimentos</string> - <string name="pref_theme">Cor do tema</string> - <string name="pref_theme_summary_alt">Toque para mudar de tema</string> - <string name="pref_icon">Icon color</string> - <string name="pref_icon_summary">Tap to change the QKSMS icon color</string> - <string name="pref_status_tint">Barra de estado colorida</string> - <string name="pref_navigation_tint">Barra de navegação colorida</string> - <string name="pref_background">Cor de fundo</string> - <string name="pref_background_summary">Toque para alterar a cor de fundo</string> - <string name="pref_bubbles">Bolhas das mensagens</string> - <string name="pref_bubbles_summary">Toque para alterar as preferências das bolhas</string> - <string name="pref_night">Modo noturno</string> - <string name="pref_night_summary">Poupar bateria e reduzir cansaço da vista</string> - <string name="pref_night_amoled">Fundo preto puro</string> - <string name="pref_night_amoled_summary">Poupa bateria extra em dispositivos com ecrãs AMOLED</string> - <string name="pref_bubble_style_new">Utilizar novo estilo de bolhas</string> - <string name="pref_color_sent">Colorir mensagens enviadas</string> - <string name="pref_color_sent_summary">Colorir o fundo das bolhas das mensagens enviadas</string> - <string name="pref_color_received">Colorir mensagens recebidas</string> - <string name="pref_color_received_summary">Colorir o fundo das bolhas das mensagens recebidas</string> - <string name="pref_hide_avatar_conversations">Ocultar avatares nas conversas</string> - <string name="pref_hide_avatar_conversations_summary">Ocultar avatares de contactos na lista de conversas</string> - <string name="pref_hide_avatar_sent">Ocultar avatares em mensagens enviadas</string> - <string name="pref_hide_avatar_sent_summary">Ocultar o seu avatar nas mensagens enviadas</string> - <string name="pref_hide_avatar_received">Ocultar avatares de mensagens recebidas</string> - <string name="pref_hide_avatar_received_summary">Ocultar avatares de contactos nas mensagens enviadas</string> - <string name="pref_font_family">Tipo de fonte</string> - <string name="pref_font_size">Tamanho da fonte</string> - <string name="pref_font_weight">Espessura da fonte</string> - <string name="pref_message_count">Número de mensagens</string> - <string name="pref_message_count_summary">Mostrar o número de mensagens em cada conversa</string> - <string name="pref_sent_timestamps">Data/hora de envio</string> - <string name="pref_sent_timestamps_summary">Mostrar data/hora do envio da mensagem e não da receção</string> - <string name="pref_force_timestamps">Impor data/hora</string> - <string name="pref_force_timestamps_summary">Mostrar data/hora para todas as mensagens</string> - <string name="pref_key_timestamp_delay">Atraso para data/hora</string> - <string name="pref_key_timestamp_delay_summary">O número de minutos que deve decorrer entre duas mensagens para poder mostrar a nova marca temporal.</string> - <string name="pref_compose_favorites">Contactos favoritos</string> - <string name="pref_compose_summary_favorites">Mostrar contactos favoritos na janela QK Compose, apenas a um toque de distância</string> - <string name="pref_prox_sensor_call">Sensor de proximidade</string> - <string name="pref_prox_sensor_call_summary">Durante uma conversa, encostar o telefone à orelha para fazer uma chamada</string> - <string name="pref_delivery">Confirmações de entrega</string> - <string name="pref_delivery_summary">Confirma se as mensagens foram enviadas com sucesso</string> - <string name="pref_delivery_toast">Mostrar notificação</string> - <string name="pref_delivery_toast_summary">Mostra uma pequena notificação que indica a entrega da mensagem</string> - <string name="pref_delivery_vibrate">Vibrar</string> - <string name="pref_delivery_vibrate_summary">Vibrar na entrega de mensagens</string> - <string name="pref_delete_old_messages">Apagar mensagens antigas</string> - <string name="pref_delete_old_messages_summary">Apagar mensagens antigas assim que se tornem mesmo antigas</string> - <string name="pref_delete_old_messages_unread">Mensagens não lidas</string> - <string name="pref_delete_old_messages_unread_summary">Apagar automaticamente mensagens não lidas após %s dias</string> - <string name="pref_delete_old_messages_read">Mensagens lidas</string> - <string name="pref_delete_old_messages_read_summary">Apagar automaticamente mensagens lidas após %s dias</string> - <string name="pref_yappy">Integração com Yappy</string> - <string name="pref_endlessjabber_summary">Ativar suporte ao Yappy</string> - <string name="pref_blocked_conversations">Conversas bloqueadas</string> - <string name="pref_blocked_conversations_summary">Toque longo na conversa para a bloquear e mover para a caixa de mensagens bloqueadas e parar as notificações</string> - <string name="pref_block_future">Bloquear mensagens futuras</string> - <string name="pref_block_future_summary">Adicionar números de telefone a bloquear</string> - <string name="pref_should_i_answer">Integração com \"Should I Answer?\"</string> - <string name="pref_should_i_answer_summary">Remover automaticamente mensagens recebidas de números que foram bloqueados pelo Should I Answer?</string> - <string name="pref_mobile_only">Números móveis</string> - <string name="pref_mobile_only_summary">Apenas sugerir contactos com número de telemóvel</string> - <string name="pref_auto_emoji">Emoji automático</string> - <string name="pref_auto_emoji_summary">Substituir texto pelas imagens emoji</string> - <string name="pref_enter_button">Botão Enter</string> - <string name="pref_enter_button_summary">Toque para alterar o comportamento do botão Enter</string> - <string name="pref_compose_group">Mensagens de grupo</string> - <string name="pref_compose_group_summary">Ao escrever a mensagem para várias pessoas, enviar uma mensagem de grupo em vez de mensagens individuais</string> - <string name="pref_auto_download">Transferir MMS automaticamente</string> - <string name="pref_auto_download_summary">Assim que estiverem disponíveis, transferir MMS automaticamente</string> - <string name="pref_auto_data">Dados automáticos</string> - <string name="pref_auto_data_summary">Ativar automaticamente os dados ao enviar ou receber MMS</string> - <string name="pref_split">Separar SMS</string> - <string name="pref_split_summary">Dividir mensagens longas em mensagens separadas</string> - <string name="pref_split_counter">Contador de divisões</string> - <string name="pref_split_counter_summary">Adiciona um contador à frente de cada mensagem separada</string> - <string name="pref_long_as_mms">Enviar mensagens longas como MMS</string> - <string name="pref_long_as_mms_summary">Enviar mensagens longas como MMS em vez de as separar</string> - <string name="pref_long_as_mms_after">Enviar mensagens longas como MMS após</string> - <string name="pref_long_as_mms_after_summary">Enviar mensagens longas como MMS, se excederem o tamanho do número de mensagens</string> - <string name="pref_return">Mostrar botão de retorno</string> - <string name="pref_return_summary">Mostrar botão de retorno em vez de botão emoji</string> - <string name="pref_text">Texto</string> - <string name="pref_notifications">Notificações SMS ativadas</string> - <string name="pref_led">Notificação LED</string> - <string name="pref_theme_led">Cor do LED de notificação</string> - <string name="pref_wake">Acordar telefone</string> - <string name="pref_wake_summary">Ligar o ecrã ao receber uma nova mensagem</string> - <string name="pref_notifications_private">Notificações privadas</string> - <string name="pref_notifications_private_summary">Toque para alterar o que deve ser ocultado na notificação</string> - <string name="pref_ringtone">Som de notificação</string> - <string name="pref_ringtone_summary">Selecione o som de notificação</string> - <string name="pref_ticker">Mostrar excertos</string> - <string name="pref_ticker_summary">Mostra parte da nova mensagem na barra de notificações</string> - <string name="pref_vibration">Vibração</string> - <string name="pref_vibration_summary">Vibrar quando novas mensagens são recebidas</string> - <string name="pref_notification_call">Botão de chamada</string> - <string name="pref_notification_call_summary">Telefonar ao remetente de uma mensagem diretamente da notificação</string> - <string name="pref_dimiss_read">Marcar como lida</string> - <string name="pref_dismiss_read_summary">Marcar mensagem como lida ao remover a notificação</string> - <string name="pref_delayed">Atraso no envio</string> - <string name="pref_delayed_summary">Esperar antes de enviar a mensagem, para ter tempo de a rever</string> - <string name="pref_delayed_duration">Duração do atraso (segundos)</string> - <string name="pref_delayed_duration_summary">Tempo a aguardar antes de enviar a mensagem</string> - <string name="pref_night_auto">Modo noturno automático</string> - <string name="pref_night_auto_summary">Ativar o modo noturno automaticamente com base na hora</string> - <string name="pref_day_start">Dia começa</string> - <string name="pref_night_start">Noite começa</string> - <string name="pref_qk_responses">QK Responses</string> - <string name="pref_qk_responses_summary">Modificar respostas pré-definidas a utilizar no seu dispositivo Android Wear</string> - <string name="pref_quickreply_enabled">QK Reply ativa</string> - <string name="pref_quickreply_enabled_summary">Mostrar a janela do QK Reply ao receber uma nova mensagem</string> - <string name="pref_tap_to_quit">Toque para fechar</string> - <string name="pref_tap_to_quit_summary">Toque fora da janela para a fechar</string> - <string name="pref_quickcompose">QK Compose ativa</string> - <string name="pref_quickcompose_summary">Mostrar uma notificação para permitir a criação rápida de uma mensagem</string> - <string name="pref_mms_enabled">MMS ativas</string> - <string name="pref_mms_enabled_summary">Ativa o envio e receção de mensagens MMS</string> - <string name="pref_mmsc_url">MMSC</string> - <string name="pref_mms_proxy">Proxy de MMS</string> - <string name="pref_mms_port">Porta de MMS</string> - <string name="pref_apn_chooser">Carregar APNs de origem</string> - <string name="pref_strip_unicode">Tirar unicode</string> - <string name="pref_strip_unicode_summary">Trocar caracteres que não são suportados em mensagens longas para caracteres compatíveis GSM</string> - <string name="pref_system_bar_flat">Barras de sistema simples</string> - <string name="pref_system_bar_flat_summary">Mostrar barras do sistema simples em vez de barras em gradiente nos dispositivos KitKat</string> - <string name="pref_status_compat">Correção da barra de estado</string> - <string name="pref_status_compat_summary">Corrige problemas causados pelo modo imersivo, Tinted Status Bar (Xposed) ou configurações de DPI personalizadas</string> - <string name="pref_navigation_compat">Correção de barra de navegação</string> - <string name="pref_navigation_compat_summary">Corrige problemas causados pelo modo imersivo, Tinted Status Bar (Xposed) ou configurações de DPI personalizadas</string> - <string name="pref_about_version_title">Versão do QKSMS</string> - <string name="pref_about_authors_title">Autores</string> - <string name="pref_about_authors_summary">Moez Bhatti</string> - <string name="pref_changelog_summary">Toque para ver as alterações</string> - <string name="pref_about_thanks_title">Obrigado</string> - <string name="pref_about_thanks_summary">Toque para ver os colaboradores open source</string> - <string name="pref_donate_title">Donativos</string> - <string name="pref_donate_summary">O QKSMS é gratuito. Ajude-nos com um donativo!</string> - <string name="pref_about_gplus_title">Google+</string> - <string name="pref_about_gplus_summary">Participe na comunidade QKSMS Beta Testing do Google +</string> - <string name="pref_about_github_title">GitHub</string> - <string name="pref_about_github_summary">O QKSMS é open source. participe e reporte os erros no GitHub</string> - <string name="pref_about_crowdin_title">Crowdin</string> - <string name="pref_about_crowdin_summary">Participe na tradução do QKSMS através do Crowdin</string> - <!--Preference subcategory--> - <string name="pref_subcat_theme">Tema</string> - <!--Preference subcategory--> - <string name="pref_subcat_system_bars">Barras do sistema</string> - <!--Preference subcategory--> - <string name="pref_subcat_categories">Categorias</string> - <!--Preference subcategory--> - <string name="pref_subcat_font">Fonte</string> - <!--Preference subcategory--> - <string name="pref_subcat_messages">Mensagens</string> - <!--Preference subcategory--> - <string name="pref_subcat_avatars">Avatares</string> - <string name="donate_google">Doar via Google</string> - <string name="donate_google_summary">A Google retém 30% dos donativos</string> - <string name="donate_paypal">Doar via PayPal</string> - <string name="donate_paypal_button">Doar uma quantia</string> - <string name="donate_paypal_button_summary">Ofereça-me o que quiser!</string> - <!--Donation product name--> - <string name="product_name_donation">Donativo</string> - <!--$1 donation product name--> - <string name="product_name_donate_1">Doar $1 USD</string> - <!--$5 donation product name--> - <string name="product_name_donate_5">Doar $5 USD</string> - <!--$3 donation product name--> - <string name="product_name_donate_10">Doar $10 USD</string> - <!--$1 donation product description--> - <string name="product_description_donate_1">Pague-me uma coca-cola</string> - <!--$5 donation product description--> - <string name="product_description_donate_5">Pague-me uma sandes</string> - <!--$10 donaion product description--> - <string name="product_description_donate_10">Pague-me um almoço</string> - <string name="title_settings">Definições</string> - <string name="title_search">Pesquisar</string> - <string name="title_compose">Nova mensagem</string> - <string name="title_conversation_list">Conversas</string> - <string name="title_blocked">Bloqueado</string> - <string name="title_changelog">Registo de alterações</string> - <string name="title_picker">Novas mensagens</string> - <string name="title_donate">Donativos</string> - <string name="title_qk_responses">QK Responses</string> - <string name="title_block_address">Bloquear número</string> - <string name="title_unblock_address">Desbloquear número</string> - <string name="title_conversations_selected">%s selecionada(s)</string> - <string name="title_palette">Paleta</string> - <string name="title_rgb">RGB</string> - <!-- Menu shown in the context menu when long pressing on a message when the message contains - one or more phone numbers and/or email addresses and the number or email is new to - contacts. [CHAR LIMIT=50] --> - <string name="menu_add_address_to_contacts">Adicionar <xliff:g id="contactEmailOrNumber">%s</xliff:g> aos contactos</string> - <!-- Context menu item on an individual message for viewing an attached slideshow --> - <string name="view_slideshow">Ver apresentação</string> - <!-- Context menu item on an individual message for viewing message details such as time and date --> - <string name="view_message_details">Ver detalhes</string> - <!-- Context menu item on an individual message for viewing a delivery report --> - <string name="view_delivery_report">Ver relatório</string> - <!-- Context menu item on an individual message for deleting only that message --> - <string name="delete_message">Apagar</string> - <!-- Abbreviation for "kilobyte" --> - <string name="kilobyte">KB</string> - <!-- Individual message context menu item --> - <string name="copy_message_text">Copiar texto</string> - <!-- Header for context menu on an individual message --> - <string name="message_options">Opções da mensagem</string> - <!-- Delivery Header View --> - <!-- Title of "Report" window --> - <string name="delivery_header_title">Relatório</string> - <!--Text for app restart confirmation dialog--> - <string name="restart_message">Estas alterações serão aplicadas da próxima vez que iniciar QKSMS</string> - <!--Dialog title for asking if a user wants to delete a conversation--> - <string name="delete_conversation">Apagar conversa(s)</string> - <!--Dialog title for asking if a user wants to delete all failed messages--> - <string name="delete_all_failed">Apagar mensagens falhadas</string> - <!--CDialog title for asking if a user wants to delete a conversation--> - <string name="delete_confirmation">Tem certeza de que deseja apagar %s conversa(s)?</string> - <!--CDialog title for asking if a user wants to delete all failed messages--> - <string name="delete_all_failed_confirmation">Tem a certeza de que deseja apagar as mensagens falhadas de %s conversas?</string> - <!--(Unused) Dialog title shown if APNs have not been set--> - <string name="apns_not_set">APN não definidas</string> - <!--(Unused) Dialog description shown if APNs have not been set--> - <string name="apns_not_set_description">Parece que as APN não foram definidas. Isto significa que as MMS não funcionarão corretamente. Prima OK para que o QKSMS defina as APN por si :)</string> - <!--Dialog title show if MMS hasn't been configured--> - <string name="set_up_mms_title">Configurar MMS?</string> - <!--Dialog description shown if MMS hasn't yet been configured--> - <string name="set_up_mms_description">Parece que ainda não configurou as MMS no QKSMS. Prima OK para configurar as MMS automaticamente.</string> - <!-- Dialog message text explaining that a draft message will not be saved due to invalid recipients --> - <string name="discard_message_reason">A mensagem será descartada porque não possui um destinatário válido.</string> - <string name="invalid_code">Código inválido</string> - <!--Button to restart app now instead of manually later--> - <string name="restart">Reiniciar agora</string> - <!--Notification action to reply to a message--> - <string name="reply">Responder</string> - <!--Notification action to reply to a message--> - <string name="reply_qksms">Responder via QKSMS</string> - <!--Notification action to mark a message as read--> - <string name="read">Lida</string> - <!--Notification action to mark a message as read--> - <string name="mark_read">Marcar como lida</string> - <!--Notification action to call the sender of a message--> - <string name="call">Ligar</string> - <!-- Notification toast message --> - <string name="notification_mute_on">Notificações ativadas</string> - <string name="notification_mute_off">Notificações desativadas</string> - <!--Positive action button--> - <string name="yes">Sim</string> - <string name="add">Adicionar</string> - <!--Positive action button--> - <string name="save">Guardar</string> - <!--Positive action button--> - <string name="enable">Ativar</string> - <!--Positive action button--> - <string name="upgrade_now">Definir agora</string> - <!--Positive action button--> - <string name="okay">Ok</string> - <!--Positive action button--> - <string name="redeem">Resgatar</string> - <!--Neutral action button--> - <string name="just_once">Apenas uma vez</string> - <!--Neutral action button--> - <string name="later">Mais tarde</string> - <!--Neutral action button --> - <string name="cancel">Cancelar</string> - <!-- Name of the local user when displaying sender of an outgoing message (personal pronoun) --> - <string name="messagelist_sender_self">Eu</string> - <!-- Sender to be used if the sender address has been hidden --> - <string name="hidden_sender_address">Endereço de remetente oculto</string> - <!-- Subject to display in the conversation list if there is no subject --> - <string name="no_subject_view">(Nenhum assunto)</string> - <!-- Time and date a message is due to expire --> - <string name="expire_on">"Expira: <xliff:g id="date"> %s </xliff:g>"</string> - <!-- Formatting for subject displayed inline, prepended to MMS message text --> - <string name="inline_subject">"< assunto: <xliff:g id="subject"> %s </xliff:g> >"</string> - <!-- Text of a button appearing for MMS messages that have not yet been downloaded, causing the message to be downloaded (imperative verb) --> - <string name="download">Transferir</string> - <!-- Message displayed in place of the "download message" button once it has been pressed, indicating that the download is in progress --> - <string name="downloading">A transferir</string> - <!-- Toast message while an image is being resized --> - <string name="compressing">Imagem muito grande. A comprimir\u2026</string> - <!-- Header shown above favorite contacts in QKCompose --> - <string name="favorites">Contactos favoritos</string> - <!-- Word represents 'self' in a conversation --> - <string name="me">Eu</string> - <string name="menu_edit">Editar</string> - <string name="menu_delete_messages">Apagar mensagens</string> - <string name="menu_delete_failed">Apagar mensagens falhadas</string> - <string name="menu_lock">Bloquear</string> - <string name="menu_unlock">Desbloquear</string> - <!-- When the user tries to view message details and some error occurs while - retrieving those details, this message will be shown. --> - <string name="cannot_get_details">Não é possível obter detalhes.</string> - <!-- Title of "Message details" dialog --> - <string name="message_details_title">Detalhes da mensagem</string> - <!-- Label in "Message details" dialog --> - <string name="message_type_label">Tipo\u000A</string> - <!-- "Type" value in "Message details" dialog --> - <string name="text_message">Mensagem de texto</string> - <!-- "Type" value in "Message details" dialog --> - <string name="multimedia_message">Mensagem multimédia</string> - <!-- "Type" value in "Message details" dialog --> - <string name="multimedia_notification">Notificação de mensagem multimédia</string> - <!-- Label in "Message details" dialog showing who sent the message. --> - <string name="from_label">De\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="to_address_label">Para\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="bcc_label">Bcc\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="sent_label">Enviada\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="received_label">Recebida\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="saved_label">Guardada\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="subject_label">Assunto\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="message_size_label">Tamanho\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="priority_label">Prioridade\u000A</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_high">Alta</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_normal">Normal</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_low">Baixa</string> - <!-- Label in "Message details" dialog --> - <string name="message_class_label">Classe da mensagem\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="error_code_label">Código de erro\u000A</string> - <!-- Alert dialog title when creating a slideshow [CHAR LIMIT=none] --> - <string name="building_slideshow_title">A construir apresentação</string> - <!-- Tag appearing on conversations in the conversation list that contain a draft message --> - <string name="has_draft">Rascunho</string> - <!-- In conversation list items, this is the separator between a contact's name and the draft stamp [CHAR LIMIT=5] --> - <string name="draft_separator">, \u0020</string> - <!-- In conversation list items, this comes after the receipient's name and contains the number of messages in the thread [CHAR LIMIT=5] --> - <string name="message_count_format">\u00A0 <xliff:g id="number" example="1"> %1$s </xliff:g></string> - <!-- For debugging: Dialog box title indicating there's a situation where data has unexpectedly changed --> - <string name="error_state">Estado inconsistente</string> - <!-- For debugging: Dialog box text indicating there's a situation where data has unexpectedly changed --> - <string name="error_state_text">O estado da mensagem e dos destinatários é inconsistente. Obtenha um relatório de erro e envie-nos o relatório via http://go/droidanizer </string> - <!-- This is the dialog title for the "Select link" dialog, shown when the user clicks on a - chat in the chat history view if there are links in the chat message. The dialog displays the - links if there are any --> - <string name="select_link_title">Escolha a ação</string> - <!-- In message list items, this string builds the timestamp line when the message is in a group [CHAR LIMIT=NONE] --> - <string name="message_timestamp_format">\u0020-\u0020 <xliff:g id="string" example="Fred Flinstone"> %1$s </xliff:g> <xliff:g id="string" example="9:39AM"> %2$s </xliff:g></string> - <!--Message sending status: sending--> - <string name="status_sending">A enviar…</string> - <!--Message sending status: failed--> - <!--<string name="status_failed">Failed. Tap to retry</string>--> - <!-- Delivery Report Activity --> - <!-- Status in "Report" window --> - <string name="status_none">(Nenhum)</string> - <!-- Status in "Report" window --> - <string name="status_pending">Pendente</string> - <!-- Status in "Report" window --> - <string name="status_read">Lida</string> - <!-- Status in "Report" window --> - <string name="status_received">Recebida</string> - <!-- Status in "Report" window --> - <string name="status_failed">Falha. Toque para opções.</string> - <!-- Status in "Report" window --> - <string name="status_unread">Não lida</string> - <!-- Status in "Report" window --> - <string name="status_rejected">Rejeitada</string> - <!-- Label in "Report" window --> - <string name="recipient_label">Destinatário:\u0020</string> - <!-- Label in "Report" window --> - <string name="status_label">Estado:\u0020</string> - <!-- Label in "Report" window [CHAR LIMIT=50]--> - <string name="delivered_label">Entregue:\u0020</string> - <string name="do_something">Fazer algo</string> - <!-- Confirm Delete --> - <!-- Delete confirmation dialog title --> - <string name="confirm_dialog_title">Apagar?</string> - <!-- Delete confirmation dialog title for locked messages --> - <string name="confirm_dialog_locked_title">Apagar mensagem bloqueada?</string> - <!-- This message is displayed in a confirmation dialog when the user selects one or more - conversations and then taps the "Delete" button. --> - <plurals name="confirm_delete_conversation"> - <!-- Case of 1 result. --> - <item quantity="one">Uma conversa será apagada.</item> - <!-- Case of 0 or 2 or more results. --> - <item quantity="other"><xliff:g id="number" example="15">%1$s</xliff:g> conversas serão apagadas.</item> - </plurals> - <string name="confirm_delete_conversation">Todo o tópico será apagado.</string> - <!-- Delete all threads confirmation dialog message --> - <string name="confirm_delete_all_conversations">Todos os tópicos serão apagados.</string> - <!-- Delete message confirmation dialog message --> - <string name="confirm_delete_message">A mensagem será apagada.</string> - <!-- Delete message confirmation dialog message for a locked message --> - <string name="confirm_delete_locked_message">Apagar esta mensagem bloqueada?</string> - <!-- Delete all the messages on the SIM dialog message --> - <string name="confirm_delete_all_SIM_messages">Todas as mensagens no cartão SIM serão apagadas.</string> - <!-- Delete the selected message on the SIM dialog message --> - <string name="confirm_delete_SIM_message">Esta mensagem no cartão SIM será apagada.</string> - <!-- Delete unlocked checkbox title --> - <string name="delete_unlocked">Apagar mensagens bloqueadas</string> - <!-- Delete button title --> - <string name="delete">Apagar</string> - <!-- More button title --> - <string name="more">Mais</string> - <!-- More button summary --> - <string name="more_summary">Toque para ver mais</string> - <!-- Action bar mode title when multi-selecting conversations --> - <string name="select_conversations">Escolha as conversas</string> - <!-- Show this in the middle of the main activity when there are no conversations [CHAR LIMIT=none] --> - <string name="no_conversations">Não há conversas.</string> - <!-- Show this in the middle of the main activity when loading conversations [CHAR LIMIT=none] --> - <string name="loading_conversations">A carregar conversas.</string> - <!-- Tells the user that QKSMS isn't the default SMS app --> - <string name="not_default">Aplicação SMS padrão</string> - <!-- Tells the user they need to set QKSMS as the default app in order to use this feature --> - <string name="default_info">O QKSMS tem de ser a aplicação padrão para o fazer</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to mark messages as read --> - <string name="not_default_mark_read">O QKSMS tem de ser a aplicação padrão para marcar as mensagens como lidas</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to mark messages as unread --> - <string name="not_default_mark_unread">O QKSMS tem de ser a aplicação padrão para marcar as mensagens como não lidas</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to send messages --> - <string name="not_default_delete">O QKSMS tem de ser a aplicação padrão para poder apagar mensagens</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to delete messages --> - <string name="not_default_send">O QKSMS tem de ser a aplicação padrão para poder enviar mensagens</string> - <!-- Tells the user they should set QKSMS as the default messaging app --> - <string name="not_default_first">Algumas funções não estão disponíveis se o QKSMS não for a aplicação padrão</string> - <string name="delayed_messaging_info">O atraso no envio das mensagens permite-lhe cancelar o envio. Pode alterar o comportamento pré-definido nas definições.</string> - <string name="delayed_duration_bounds_error">A duração tem que estar no intervalo 1-30 segundos</string> - <!-- Dialog title for the Read Report dialog. --> - <string name="confirm">Confirmação</string> - <!-- Dialog text for the Read Report dialog. --> - <string name="message_send_read_report">Será enviado um relatório de leitura.</string> - <!-- Dialog title for updating app icon color --> - <string name="update_icon_title">Atualizar cor do ícone</string> - <!-- Dialog message for updating app icon color --> - <string name="update_icon_message">Tem que reiniciar o QKSMS para aplicar a cor do ícone</string> - <string name="dialog_conversation_details_title">Detalhes da conversa</string> - <string name="dialog_conversation_details_last_message_date">Data da última mensagem</string> - <string name="dialog_conversation_details_message_count">Número de mensagens</string> - <string name="dialog_conversation_details_recipients">Destinatários (%s)</string> - <string name="dialog_should_i_answer_title">Should I Answer? não está instalado</string> - <string name="dialog_should_i_answer_message">Obter a aplicação agora através do Google Play?</string> - <string name="dialog_delete_old_messages">Tem a certeza de que deseja apagar as mensagens antigas?</string> - <!-- Title for audio file picker --> - <string name="select_audio">Escolha o áudio</string> - <!-- Menu title to copy an attachment to the shared storage [CHAR LIMIT=25] --> - <string name="copy_to_sdcard">Guardar anexo</string> - <!-- Toast message on successful copy to shared storage [CHAR LIMIT=30] --> - <string name="copy_to_sdcard_success">Anexo guardado.</string> - <!-- Toast message on failed copy to shared storage [CHAR LIMIT=30] --> - <string name="copy_to_sdcard_fail">Falha ao guardar o anexo.</string> - <!-- Menu title to save a sound as a ringtone --> - <string name="save_ringtone">Guardar como toque</string> - <!-- Toast message on successful copying ringtone to drm provider --> - <string name="saved_ringtone">Toque guardado.</string> - <!-- Toast message on failed copying ringtone to drm provider --> - <string name="saved_ringtone_fail">Falha ao guardar toque.</string> - <!-- Menu item --> - <!-- Menu item [CHAR LIMIT=40] --> - <string name="menu_group_participants">Participantes do grupo</string> - <!--Toast shown when a draft is saved--> - <string name="toast_draft">Rascunho gravado</string> - <!--Toast shown when a conversation is deleted--> - <string name="toast_conversation_deleted">Conversa apagada</string> - <!--Toast shown when device is low on storage--> - <string name="toast_low_memory">"A memória do telefone está cheia. Apague alguns ficheiros para ganhar espaço."</string> - <!--Toast shown to tell user that forwarding messages doesn't work yet--> - <string name="toast_forward">Esta funcionalidade ainda não está implementada. Por agora, utilize a opção \'Copiar texto\' e cole a parte da conversa que gostaria de enviar.</string> - <!--Toast shown for unimplemented features--> - <string name="toast_unimplemented">Esta funcionalidade ainda não foi implementada</string> - <!--Toast shown when a message fails to send--> - <string name="toast_message_failure">Falha no envio da mensagem</string> - <!--Toast shown when a message is delivered--> - <string name="toast_message_delivered">Mensagem entregue</string> - <!--Toast shown when a message is not delivered--> - <string name="toast_message_not_delivered">Mensagem não entregue</string> - <!--Toast shown when default APNs are loaded--> - <string name="toast_default_apns_loaded">Predefinições de APN carregadas</string> - <!--Toast shown when text is copied to the clipboard--> - <string name="toast_copy_text">Texto copiado para a área de transferência</string> - <!--Toast shown when Google Play Services is not available for purchasing a product--> - <string name="toast_billing_not_available">Para comprar, tem que ter a Google Play Store (billing) no seu Android</string> - <!--Toast shown when Google Play Services is not available for purchasing a product--> - <string name="toast_endlessjabber_not_installed">EndlessJabber não instalado, a abrir o Google Play</string> - <string name="toast_changelog_error">Não foi possível carregar o registo de alterações. Tente mais tarde.</string> - <string name="toast_conversation_error">Não foi possível abrir a conversa</string> - <string name="toast_deleting_old_messages">As mensagens antigas serão apagadas brevemente</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_1">Obrigado pelo donativo! Você é o meu novo amigo.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_2">Obrigado pela doação! Adoro-te.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_3">Obrigado pela doação! Está a ajudar muito no desenvolvimento do QKSMS.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_4">Obrigado pela doação! És espetacular.</string> - <!--Menu option to mute conversation--> - <string name="menu_mute_conversation">Silenciar conversa</string> - <!--Menu option to mute conversation--> - <string name="menu_unmute_conversation">Restaurar som da conversa</string> - <string name="menu_block_conversations">Bloquear conversas</string> - <string name="menu_unblock_conversations">Desbloquear conversas</string> - <string name="menu_messages">Mensagens</string> - <string name="menu_blocked">Bloqueada</string> - <string name="menu_blocked_conversations">Bloqueadas (%s novas)</string> - <string name="menu_unblocked_conversations">Mensagens (%s novas)</string> - <string name="menu_notifications">Desativar notificações</string> - <string name="menu_notifications_off">Ativar notificações</string> - <string name="menu_notification_settings">Definições de conversação</string> - <string name="menu_view_details">Ver detalhes</string> - <string name="menu_mark_read">Marcar como lida</string> - <string name="menu_mark_unread">Marcar como não lida</string> - <string name="menu_delete_conversation">Apagar conversa</string> - <string name="menu_multi_select">Selecionar conversa</string> - <string name="menu_done">Terminado</string> - <string name="failed_message_title">Opções da mensagem falhada</string> - <!--Toast shown to tell the user that they don't have a photo attachments app, and suggests that they download one--> - <string name="attachment_app_not_found">Aplicação não encontrada. Tente instalar uma aplicação de fotos!</string> - <string name="attachment_camera_error">Não foi possível abrir a câmara</string> - <string name="pref_max_mms_attachment_size">Tamanho máximo de anexos MMS</string> - <string name="error_no_recipients">Selecione alguns contactos para enviar a mensagem!</string> - <string name="error_file_not_found">O QKSMS não consegue aceder ao ficheiro que está a tentar partilhar!</string> - <string name="sending_blocked_welcome_screen_message">Espere um pouco! Poderá enviar a mensagem brevemente!</string> - <string name="notification_colored_icon_ready">Toque para adicionar ao seu \'launcher\' a partir do ecrã.</string> - <string name="notification_title_colored_icon_ready">O ícone colorido QKSMS está pronto</string> - <string name="icon_ready">O seu novo ícone está pronto!</string> - <string name="icon_ready_message">Agora, já pode adicionar o ícone ao ecrã principal mas com a cor atualizada.</string> - <string name="dont_ask_again">Não perguntar novamente</string> - <string name="warning">Aviso Stagefright</string> - <string name="stagefright_warning">As mensagens de vídeo podem conter um \'exploit\' que pode deixar o seu dispositivo vulnerável a ataques. Continuar?</string> - <!-- MMS DIALOG SETUP STRINGS --> - <string name="mms_setup_set_up_mms_title">Configurar MMS?</string> - <string name="mms_setup_set_up_mms_body">Parece que o serviço MMS ainda não está configurado. Prima OK para o configurar.</string> - <string name="mms_setup_setting_up_later_title">Configurar MMS mais tarde</string> - <string name="mms_setup_setting_up_later_body">Aceda à secção MMS das definições para tentar a configuração automática, contactar o suporte ou introduzir a sua própria configuração.</string> - <string name="mms_setup_no_configurations_found_title">Configuração não encontrada</string> - <string name="mms_setup_no_configurations_found_body">Não foi encontrada qualquer configuração definida pela sua operadora. Prima OK para contactar o suporte. Nós ajudaremos com a configuração! </string> - <string name="mms_setup_one_configuration_found_title">Encontrada uma configuração</string> - <string name="mms_setup_one_configuration_found_body">Foi encontrada uma configuração para a operadora %s. Parece-lhe correto?</string> - <string name="mms_setup_multiple_configurations_found_title">Encontradas diversas configurações</string> - <string name="mms_setup_multiple_configurations_found_body">Foram encontradas diversas configurações MMS. Escolha a sua operadora da lista ou prima N/D se a sua operadora não estiver na lista.</string> - <string name="mms_setup_next_steps_title">Próximos passos</string> - <string name="mms_setup_next_steps_body">Aceda à secção MMS das definições para tentar novamente a configuração automática, contactar o suporte ou introduzir a sua própria configuração.</string> - <string name="mms_setup_success_title">Sucesso!</string> - <string name="mms_setup_success_body">Se encontrar algum erro, aceda à secção MMS das definições para tentar novamente a configuração automática, contactar o suporte ou introduzir a sua própria configuração.</string> - <string name="na">N/D</string> - <string name="no">Não</string> - <string name="pref_automatically_configure_mms">Configurar MMS automaticamente</string> - <string name="pref_mms_contact_support">Contactar suporte</string> - <string name="pref_category_sending_mms">Envio de MMS</string> - <string name="pref_category_mms_configuration">Configuração MMS</string> - <string name="pref_mms_contact_support_summary">Contacte a equipa do QKSMS para o ajudar a configurar as MMS</string> - <string name="pref_markdown_enabled">Formatação de texto</string> - <string name="pref_markdown_enabled_summary">Utilize a sintaxe \'markdown\' para escrever texto em negrito, itálico e sublinhado</string> - <string name="want_read_indicators">Gostaria de ler os indicadores?</string> - <string name="color_swatch_description">Cor %1$d</string> - <string name="color_swatch_description_selected">Cor %1$d selecionada</string> - <string name="color_picker_default_title">Selecione uma cor</string> - <string name="message_delivered">Mensagem entregue</string> - <string name="message_not_delivered">Mensagem não entregue</string> - <string name="error">Erro</string> - <string name="invalid_destination">Endereço de destino inválido.</string> - <string name="service_not_activated">Serviço não ativado na rede.</string> - <string name="service_message_not_found">Mensagem expirada ou indisponível.</string> - <string name="service_network_problem">Não foi enviada devido a erros de rede.</string> - <string name="message_queued">Neste momento, não pode enviar mensagens. A mensagem será enviada quando o serviço estiver disponível.</string> - <string name="download_later">Neste momento, não é possível transferir. Tente mais tarde.</string> - <string name="no_apn">APN não definida para a aplicação. Configure a APN nas definições!</string> - <string name="no_subject">(Sem assunto)</string> - <string name="unknown_sender">Remetente desconhecido</string> - <string name="dl_failure_notification">Não foi possível transferir a mensagem <xliff:g id="subject">%1$s</xliff:g> de <xliff:g id="from">%2$s</xliff:g>.</string> - <string name="auto_select_multiple_apns">Foram encontradas diversas configurações. Experimente uma delas. Se não funcionar, pode experimentar outra, em Definições -> Avançado -> Carregar APNs de origem.</string> - <string name="auto_select_apn">Selecionar APN automaticamente</string> - <string name="auto_select_failed_title">Falha ao configurar</string> - <string name="auto_select_failed">Tente descobrir as definições APN da sua operadora (MMSC, porta e proxy) e introduza-as em Definições -> Avançado.</string> - <string name="date_yesterday">Ontem</string> - <string name="date_just_now">Mesmo agora</string> - <string name="compose_loading_attachment">A carregar anexo</string> - <string name="hint_no_messages">Não existem mensagens.\nClique no ícone + para criar!</string> - <string-array name="resend_menu"> - <item>Reenviar</item> - <item>Editar</item> - <item>Apagar</item> - </string-array> - <string-array name="message_menu"> - <item>Reencaminhar mensagem</item> - <item>Copiar texto</item> - <item>Ver detalhes</item> - <item>Apagar mensagem</item> - </string-array> - <string-array name="background_titles"> - <item>Claro</item> - <item>Escuro</item> - <item>Preto</item> - </string-array> - <string-array name="font_sizes"> - <item>Pequeno</item> - <item>Normal</item> - <item>Grande</item> - <item>Enorme</item> - </string-array> - <string-array name="font_families"> - <item>Roboto Regular</item> - <item>Roboto Condensed</item> - <item>Fonte do sistema</item> - </string-array> - <string-array name="font_weights"> - <item>Leve</item> - <item>Normal</item> - </string-array> - <!-- String to match as no subject and filter out as a subject. For example, if the - subject string is "no subject", we won't display that. We'll pretend - no subject string was delivered. --> - <string-array name="empty_subject_strings"> - <item>sem assunto</item> - </string-array> - <string-array name="qk_responses"> - <item>Ok</item> - <item>Espera um momento</item> - <item>Estou a caminho</item> - <item>Obrigado</item> - <item>Parece-me bem</item> - <item>Novidades?</item> - <item>Concordo</item> - <item>Não</item> - <item>Amo-te</item> - <item>Desculpa</item> - <item>LOL</item> - <item>Tudo bem</item> - </string-array> - <string-array name="enter_button_options"> - <item>Mostrar emoji</item> - <item>Nova linha</item> - <item>Enviar mensagem</item> - </string-array> - <string-array name="notification_private_options"> - <item>Mostrar tudo</item> - <item>Ocultar mensagem</item> - <item>Ocultar mensagem e remetente</item> - </string-array> - <!-- Max MMS attachment sizes. I.e. will compress pictures that are larger than 300 KB down to - under 300KB. --> - <string-array name="max_mms_attachment_sizes"> - <item>300 KB</item> - <item>600 KB</item> - <item>1 MB</item> - <item>Ilimitado</item> - </string-array> -</resources> diff --git a/QKSMS/src/main/res/values-ro/strings.xml b/QKSMS/src/main/res/values-ro/strings.xml deleted file mode 100644 index 744c147d6..000000000 --- a/QKSMS/src/main/res/values-ro/strings.xml +++ /dev/null @@ -1,769 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!--Generated by crowdin.com--> -<resources xmlns:xliff="http://schemas.android.com/apk/res-auto"> - <!--Slogan--> - <string name="slogan">Iubesc sa trimit mesaje din nou.</string> - <!--Text shown when a phone number cannot be found--> - <string name="unknown_number">Număr necunoscut</string> - <!--Content description for photos--> - <string name="popup_photo_CD">Fotografie</string> - <!--Text to be displayed while content is loading--> - <string name="loading">Se încarcă...</string> - <!--Test string--> - <string name="test">Şir de testare</string> - <!--Hint for contacts text field--> - <string name="hint_contacts">Introduceţi destinatari</string> - <!--Hint for search text field--> - <string name="hint_search">Caută ceva</string> - <!--Hint for message reply text field--> - <string name="hint_reply">Introduceţi un mesaj</string> - <!--Hint for code redemption--> - <string name="hint_redeem">Enter code</string> - <string name="hint_hex">Hex</string> - <!--Text shown for single new message in notification--> - <string name="new_message">Mesaj nou</string> - <!--Text shown after number of unread messages in notification (ex. 3 new messages)--> - <string name="new_messages">Mesaje noi</string> - <!--Text shown for single failed message in notification--> - <string name="failed_message">Mesajul nu a fost trimis</string> - <!--Text shown after number of failed messages in notification (ex. 3 messages failed to send)--> - <string name="failed_messages">mesajul nu a fost trimis</string> - <!--Text shown under failed message count--> - <string name="failed_messages_summary">Atingeţi pentru a vizualiza</string> - <!--QuickCompose notification title--> - <string name="quickcompose">QK Compose</string> - <!--QuickCompose notification text--> - <string name="quickcompose_detail">Faceţi clic pentru a trimite un mesaj</string> - <!--Welcome screen intro button--> - <string name="welcome_start">Let\'s get started!</string> - <!--Allows user to skip welcome screen--> - <string name="welcome_skip">SKIP</string> - <!--Allows user to finish the welcome screen--> - <string name="welcome_finish">FINISH</string> - <!--Indicates to user they can pick a color--> - <string name="welcome_theme_title">Alege o culoare</string> - <!--Indicates to user they can pick any colors--> - <string name="welcome_theme_description">Orice culoare.</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_night_description">Easy on the eyes.</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_night_hint">Toggle me</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_quickreply_title">QK Reply</string> - <!--QK Reply explanation--> - <string name="welcome_quickreply_description">Reply to messages faster than ever.</string> - <!--Prompts user to try QK Reply--> - <string name="welcome_quickreply_hint">Try it!</string> - <!--QK Reply demo message--> - <string name="welcome_quickreply_message_1">Wow! Now wasn\'t that awesome? You can view your entire conversation at a glance. Tap outside the popup or press the checkmark to dismiss it.</string> - <!--QK Reply demo message--> - <string name="welcome_quickreply_message_2">This is QK Reply. Now you can reply to messages from anywhere. Tap the expand button to see what happens next :)</string> - <!--Settings option in menu--> - <string name="menu_settings">Setări</string> - <!--Search option in menu--> - <string name="menu_search">Caută</string> - <!--Show full conversation in QuickReply--> - <string name="menu_show_all">Arată toate mesajele</string> - <!--Show only unread messages in QuickReply--> - <string name="menu_show_unread">Arată mesajele necitite</string> - <!--Open conversation option in menu (shown in QuickReply)--> - <string name="menu_open_thread">Conversaţie deschisă</string> - <!--Forward message option in menu--> - <string name="menu_forward">Transmite mesaj</string> - <!--Call contact option in menu--> - <string name="menu_call">Apel</string> - <!--Mark a message/conversation as read option in menu--> - <string name="menu_read">Marcați ca citit</string> - <!--Delete a message option in menu--> - <string name="menu_delete">Ştergeţi</string> - <!--Donate option in menu--> - <string name="menu_billing">Donați</string> - <!--Copy text option in menu--> - <string name="menu_copy">Copiere text</string> - <!--Changelog option in menu--> - <string name="menu_changelog">"Ce mai e nou"</string> - <!--Expand settings option in menu--> - <string name="menu_show_all_prefs">Arată toate</string> - <!--Show less settings option in menu--> - <string name="menu_show_fewer_prefs">Arată mai puţine</string> - <!--Title for message details popup--> - <string name="details_title">Detalii</string> - <!--Title for address that message is being sent to in message details popup--> - <string name="details_to">Pentru a</string> - <!--Title for address that message is sent from in message details popup--> - <string name="details_from">La</string> - <!--Title for text of a message in message details popup--> - <string name="details_body">Conținutul mesajului</string> - <!--Title for date sent of a message in message details popup--> - <string name="details_date_sent">Data trimiterii</string> - <!--Title for date received of a message in message details popup--> - <string name="details_date_received">Data primirii</string> - <!--Title for rate snackbar--> - <string name="rate_title">Like QKSMS?</string> - <!--Title for rate button--> - <string name="rate_action">Rate</string> - <string name="pref_category_appearance">Aparență</string> - <string name="pref_category_summary_appearance">Themes, fonts, colors, avatars, and more</string> - <string name="pref_category_general">General</string> - <string name="pref_category_summary_general">Delivery, message sending, formatting</string> - <string name="pref_category_blocking">Message blocking</string> - <string name="pref_category_notifications">Notificări</string> - <string name="pref_category_summary_notifications">Sounds, LED, privacy</string> - <string name="pref_category_mms">MMS</string> - <string name="pref_category_summary_mms">Configure MMS (APNs), max size, group messaging</string> - <string name="pref_category_quickreply">QK Reply</string> - <string name="pref_category_summary_quickreply">QK Reply, popup options</string> - <string name="pref_category_quickcompose">QK Compose</string> - <string name="pref_category_summary_quickcompose">QK Compose, starred contacts</string> - <string name="pref_category_about">Despre</string> - <string name="pref_category_summary_about">Version, changelog, authors, thanks</string> - <string name="pref_theme">Theme color</string> - <string name="pref_theme_summary_alt">Tap to change theme</string> - <string name="pref_icon">Icon color</string> - <string name="pref_icon_summary">Tap to change the QKSMS icon color</string> - <string name="pref_status_tint">Nuanțați bara de stare</string> - <string name="pref_navigation_tint">Nuanțați bara de navigare</string> - <string name="pref_background">Background color</string> - <string name="pref_background_summary">Tap to change background color</string> - <string name="pref_bubbles">Message bubbles</string> - <string name="pref_bubbles_summary">Tap to change message bubble preferences</string> - <string name="pref_night">Modul de noapte</string> - <string name="pref_night_summary">Save battery and reduce eye strain</string> - <string name="pref_night_amoled">Fundal negru pur</string> - <string name="pref_night_amoled_summary">Salvați mai multă baterie pe dispozitivele cu expunere AMOLED</string> - <string name="pref_bubble_style_new">Use new bubble style</string> - <string name="pref_color_sent">Culoarea mesajelor trimise</string> - <string name="pref_color_sent_summary">Color the background bubbles for outgoing messages</string> - <string name="pref_color_received">Culoarea mesajului primit</string> - <string name="pref_color_received_summary">Color the background bubbles for incoming messages</string> - <string name="pref_hide_avatar_conversations">Ascude avatarele conversației</string> - <string name="pref_hide_avatar_conversations_summary">Ascunde avatarele contactelor din lista de conversație</string> - <string name="pref_hide_avatar_sent">Ascunde avatarele mesajelor trimise</string> - <string name="pref_hide_avatar_sent_summary">Ascunde avatarul pentru mesajele expediate</string> - <string name="pref_hide_avatar_received">Ascunde avatarul mesajelor primite</string> - <string name="pref_hide_avatar_received_summary">Ascunde avatarul contactului pentru mesajele primite</string> - <string name="pref_font_family">Fonturi</string> - <string name="pref_font_size">Dimensiunea fontului</string> - <string name="pref_font_weight">Greutatea fontului</string> - <string name="pref_message_count">Numărul mesajelor</string> - <string name="pref_message_count_summary">Show the number of messages for each conversation</string> - <string name="pref_sent_timestamps">Sent timestamps</string> - <string name="pref_sent_timestamps_summary">Show the timestamp for when a message was sent, not received</string> - <string name="pref_force_timestamps">Force timestamps</string> - <string name="pref_force_timestamps_summary">Enable timestamps for all messages</string> - <string name="pref_key_timestamp_delay">New timestamp delay</string> - <string name="pref_key_timestamp_delay_summary">The number of minutes which must elapse between two messages in order for a new timestamp to be shown.</string> - <string name="pref_compose_favorites">Starred contacts</string> - <string name="pref_compose_summary_favorites">Show your starred contacts in the QK Compose window, making them only a tap away</string> - <string name="pref_prox_sensor_call">Proximity sensor</string> - <string name="pref_prox_sensor_call_summary">While in a conversation, bring your phone to your ear to start a call</string> - <string name="pref_delivery">Confirmare de livrare</string> - <string name="pref_delivery_summary">Confirmaţi că mesajele au fost trimise cu succes</string> - <string name="pref_delivery_toast">Show toast</string> - <string name="pref_delivery_toast_summary">Show a short toast to indicate a message being delivered</string> - <string name="pref_delivery_vibrate">Vibrează</string> - <string name="pref_delivery_vibrate_summary">Vibrează la trimiterea mesajului</string> - <string name="pref_delete_old_messages">Delete old messages</string> - <string name="pref_delete_old_messages_summary">Automatically delete messages once they\'re old enough</string> - <string name="pref_delete_old_messages_unread">Unread messages</string> - <string name="pref_delete_old_messages_unread_summary">Automatically delete unread messages after %s days</string> - <string name="pref_delete_old_messages_read">Read messages</string> - <string name="pref_delete_old_messages_read_summary">Automatically delete read messages after %s days</string> - <string name="pref_yappy">Yappy integration</string> - <string name="pref_endlessjabber_summary">Enable full support for Yappy</string> - <string name="pref_blocked_conversations">Blocked conversations</string> - <string name="pref_blocked_conversations_summary">Long-press on a conversation and block to move to blocked inbox and stop notifications</string> - <string name="pref_block_future">Block future messages</string> - <string name="pref_block_future_summary">Add additional phone numbers to block</string> - <string name="pref_should_i_answer">Should I Answer? Integration</string> - <string name="pref_should_i_answer_summary">Automatically delete incoming messages from numbers which are blocked through Should I Answer?</string> - <string name="pref_mobile_only">Mobile numbers</string> - <string name="pref_mobile_only_summary">Only show mobile numbers in contact suggestions</string> - <string name="pref_auto_emoji">Automatic emoji</string> - <string name="pref_auto_emoji_summary">Replace text with image emoji</string> - <string name="pref_enter_button">Enter button</string> - <string name="pref_enter_button_summary">Tap to change keyboard enter button behavior</string> - <string name="pref_compose_group">Group messaging</string> - <string name="pref_compose_group_summary">When composing message to multiple people, send a group message instead of individual messages</string> - <string name="pref_auto_download">Auto download MMS</string> - <string name="pref_auto_download_summary">Automatically download MMS messages when they become available</string> - <string name="pref_auto_data">Automatic data</string> - <string name="pref_auto_data_summary">Turn on data automatically when sending or receiving MMS</string> - <string name="pref_split">Împarte SMS</string> - <string name="pref_split_summary">Împărțiți mesajele lungi in mesaje separate</string> - <string name="pref_split_counter">Contor împărțire</string> - <string name="pref_split_counter_summary">Adaugă un contor în partea din faţă a fiecărui mesaj împartit</string> - <string name="pref_long_as_mms">Trimite mesajele lungi ca MMS</string> - <string name="pref_long_as_mms_summary">Trimite mesaje lungi ca MMS in loc de divizarea lor</string> - <string name="pref_long_as_mms_after">Trimite mesajele lungi ca MMS după</string> - <string name="pref_long_as_mms_after_summary">Send long messages as MMS when they exceed the length of a number of messages</string> - <string name="pref_return">Afișeaza butonul de înapoi</string> - <string name="pref_return_summary">Afișează tasta de înapoi pe tastatură în loc de butonul de Emoji</string> - <string name="pref_text">Text</string> - <string name="pref_notifications">Activează notificările SMS</string> - <string name="pref_led">Notificare LED</string> - <string name="pref_theme_led">Notification LED color</string> - <string name="pref_wake">Wake phone</string> - <string name="pref_wake_summary">Turn your screen on when you receive a new message</string> - <string name="pref_notifications_private">Notificări private</string> - <string name="pref_notifications_private_summary">Tap to change what should be hidden in notfication</string> - <string name="pref_ringtone">Sunet notificare</string> - <string name="pref_ringtone_summary">Selectați un sunet de notificare</string> - <string name="pref_ticker">Afișeaza bifa</string> - <string name="pref_ticker_summary">Afișeaza o parte din mesajul nou in bara de notificări</string> - <string name="pref_vibration">Vibraţii</string> - <string name="pref_vibration_summary">Vibrează cand sunt primite mesaje noi</string> - <string name="pref_notification_call">Butonul de apel</string> - <string name="pref_notification_call_summary">Apelează expeditorul unui mesaj direct de la notificare</string> - <string name="pref_dimiss_read">Mark as read</string> - <string name="pref_dismiss_read_summary">Mark message as read when notification is cleared</string> - <string name="pref_delayed">Delayed messaging</string> - <string name="pref_delayed_summary">Wait before sending your messages, so you have a chance to review them</string> - <string name="pref_delayed_duration">Delay length (seconds)</string> - <string name="pref_delayed_duration_summary">Time to wait before sending your message</string> - <string name="pref_night_auto">Mod noapte automat</string> - <string name="pref_night_auto_summary">Activează modul de noapte automat bazat pe timp</string> - <string name="pref_day_start">Timp de zi începe</string> - <string name="pref_night_start">Timp de noapte începe</string> - <string name="pref_qk_responses">QK Responses</string> - <string name="pref_qk_responses_summary">Modify your preset responses to be used from your Android Wear device</string> - <string name="pref_quickreply_enabled">QK Reply enabled</string> - <string name="pref_quickreply_enabled_summary">Show QK Reply window whenever a new message is received</string> - <string name="pref_tap_to_quit">Atingeţi pentru a respinge</string> - <string name="pref_tap_to_quit_summary">Tap anywhere outside of the window to close it</string> - <string name="pref_quickcompose">QK Compose enabled</string> - <string name="pref_quickcompose_summary">Afișează o notificare care vă permite să faceţi clic pe pentru a compune un nou mesaj</string> - <string name="pref_mms_enabled">MMS enabled</string> - <string name="pref_mms_enabled_summary">Enable sending and receiving of MMS messages</string> - <string name="pref_mmsc_url">MMSC</string> - <string name="pref_mms_proxy">Proxy MMS</string> - <string name="pref_mms_port">Acces MMS</string> - <string name="pref_apn_chooser">Încărcare implicită APNs</string> - <string name="pref_strip_unicode">Benzi unicode</string> - <string name="pref_strip_unicode_summary">Schimbă caracterele ce nu sunt suportate in mărimea întreaga pentru caracterele compatibile GSM</string> - <string name="pref_system_bar_flat">Flat system bars</string> - <string name="pref_system_bar_flat_summary">Get rid of the gradient shown on the system UI bars on most KitKat devices</string> - <string name="pref_status_compat">Repară bara de stare</string> - <string name="pref_status_compat_summary">Rezolvă problemele cauzate de modul de captivanta, Tinted Status Bar (Xposed), sau setari particulare a DPI-ului</string> - <string name="pref_navigation_compat">Repară bara de navigare</string> - <string name="pref_navigation_compat_summary">Rezolvă problemele cauzate de modul de captivanta, Tinted Status Bar (Xposed), sau setari particulare a DPI-ului</string> - <string name="pref_about_version_title">QKSMS version</string> - <string name="pref_about_authors_title">Authors</string> - <string name="pref_about_authors_summary">Moez Bhatti</string> - <string name="pref_changelog_summary">Tap to view changelog</string> - <string name="pref_about_thanks_title">Thank you</string> - <string name="pref_about_thanks_summary">Tap to view open-source contributors</string> - <string name="pref_donate_title">Donate</string> - <string name="pref_donate_summary">QKSMS is free. Help support us by donating!</string> - <string name="pref_about_gplus_title">Google+</string> - <string name="pref_about_gplus_summary">Join the QKSMS Beta Testing community on Google+</string> - <string name="pref_about_github_title">GitHub</string> - <string name="pref_about_github_summary">QKSMS is open source. Contribute and report issues on GitHub</string> - <string name="pref_about_crowdin_title">Crowdin</string> - <string name="pref_about_crowdin_summary">Join the QKSMS translation project on Crowdin</string> - <!--Preference subcategory--> - <string name="pref_subcat_theme">Theme</string> - <!--Preference subcategory--> - <string name="pref_subcat_system_bars">System bars</string> - <!--Preference subcategory--> - <string name="pref_subcat_categories">Categories</string> - <!--Preference subcategory--> - <string name="pref_subcat_font">Font</string> - <!--Preference subcategory--> - <string name="pref_subcat_messages">Messages</string> - <!--Preference subcategory--> - <string name="pref_subcat_avatars">Avatars</string> - <string name="donate_google">Donate with Google</string> - <string name="donate_google_summary">Google takes 30% of donations</string> - <string name="donate_paypal">Donate with PayPal</string> - <string name="donate_paypal_button">Donate any amount</string> - <string name="donate_paypal_button_summary">Buy me anything you want!</string> - <!--Donation product name--> - <string name="product_name_donation">Donation</string> - <!--$1 donation product name--> - <string name="product_name_donate_1">Donate $1 USD</string> - <!--$5 donation product name--> - <string name="product_name_donate_5">Donate $5 USD</string> - <!--$3 donation product name--> - <string name="product_name_donate_10">Donate $10 USD</string> - <!--$1 donation product description--> - <string name="product_description_donate_1">Cumpără-mi o Cola</string> - <!--$5 donation product description--> - <string name="product_description_donate_5">Cumpără-mi un sandviş</string> - <!--$10 donaion product description--> - <string name="product_description_donate_10">Cumpără-mi prânzul</string> - <string name="title_settings">Setări</string> - <string name="title_search">Caută</string> - <string name="title_compose">Compune</string> - <string name="title_conversation_list">Conversaţii</string> - <string name="title_blocked">Blocked</string> - <string name="title_changelog">Istoria schimbărilor</string> - <string name="title_picker">Mesaje noi</string> - <string name="title_donate">Donate</string> - <string name="title_qk_responses">QK Responses</string> - <string name="title_block_address">Block number</string> - <string name="title_unblock_address">Unblock number</string> - <string name="title_conversations_selected">%s selected</string> - <string name="title_palette">Palette</string> - <string name="title_rgb">RGB</string> - <!-- Menu shown in the context menu when long pressing on a message when the message contains - one or more phone numbers and/or email addresses and the number or email is new to - contacts. [CHAR LIMIT=50] --> - <string name="menu_add_address_to_contacts">Adaugă <xliff:g id="contactEmailOrNumber"> %s </xliff:g> la contacte</string> - <!-- Context menu item on an individual message for viewing an attached slideshow --> - <string name="view_slideshow">Vezi diapozitive</string> - <!-- Context menu item on an individual message for viewing message details such as time and date --> - <string name="view_message_details">Vezi detalii</string> - <!-- Context menu item on an individual message for viewing a delivery report --> - <string name="view_delivery_report">Vizualizare raport</string> - <!-- Context menu item on an individual message for deleting only that message --> - <string name="delete_message">Ştergeţi</string> - <!-- Abbreviation for "kilobyte" --> - <string name="kilobyte">KB</string> - <!-- Individual message context menu item --> - <string name="copy_message_text">Copiere text</string> - <!-- Header for context menu on an individual message --> - <string name="message_options">Opțiuni mesaj</string> - <!-- Delivery Header View --> - <!-- Title of "Report" window --> - <string name="delivery_header_title">Raportați</string> - <!--Text for app restart confirmation dialog--> - <string name="restart_message">Aceste schimbări vor avea efect data viitoare cand QKSMS va fi deschis</string> - <!--Dialog title for asking if a user wants to delete a conversation--> - <string name="delete_conversation">Delete conversations</string> - <!--Dialog title for asking if a user wants to delete all failed messages--> - <string name="delete_all_failed">Delete failed messages</string> - <!--CDialog title for asking if a user wants to delete a conversation--> - <string name="delete_confirmation">Are you sure you would like to delete (%s) conversations?</string> - <!--CDialog title for asking if a user wants to delete all failed messages--> - <string name="delete_all_failed_confirmation">Are you sure you would like to delete failed messages from (%s) conversations?</string> - <!--(Unused) Dialog title shown if APNs have not been set--> - <string name="apns_not_set">APN-urile nu au fost setate</string> - <!--(Unused) Dialog description shown if APNs have not been set--> - <string name="apns_not_set_description">Se pare că APN-urile dumneavoastră nu au fost setate. Acest lucru înseamnă ca funcția MMS nu va funcționa corect. Vă rugăm sa apăsați ok pentru a lăsa aplicația QKSMS sa le găsească pentru dumneavoastră :)</string> - <!--Dialog title show if MMS hasn't been configured--> - <string name="set_up_mms_title">Set up MMS?</string> - <!--Dialog description shown if MMS hasn't yet been configured--> - <string name="set_up_mms_description">It appears that MMS hasn\'t been configured in QKSMS yet. Press okay automatically configure MMS.</string> - <!-- Dialog message text explaining that a draft message will not be saved due to invalid recipients --> - <string name="discard_message_reason">Mesajul dumneavoastră va fi anulat deoarece nu există nici un contact valid.</string> - <string name="invalid_code">Invalid code</string> - <!--Button to restart app now instead of manually later--> - <string name="restart">Reporniţi acum</string> - <!--Notification action to reply to a message--> - <string name="reply">Răspuns</string> - <!--Notification action to reply to a message--> - <string name="reply_qksms">Reply via QKSMS</string> - <!--Notification action to mark a message as read--> - <string name="read">Citește</string> - <!--Notification action to mark a message as read--> - <string name="mark_read">Mark as read</string> - <!--Notification action to call the sender of a message--> - <string name="call">Apel</string> - <!-- Notification toast message --> - <string name="notification_mute_on">Notifications enabled</string> - <string name="notification_mute_off">Notifications disabled</string> - <!--Positive action button--> - <string name="yes">Da</string> - <string name="add">Add</string> - <!--Positive action button--> - <string name="save">Save</string> - <!--Positive action button--> - <string name="enable">Enable</string> - <!--Positive action button--> - <string name="upgrade_now">Set now</string> - <!--Positive action button--> - <string name="okay">Ok</string> - <!--Positive action button--> - <string name="redeem">Redeem</string> - <!--Neutral action button--> - <string name="just_once">Just once</string> - <!--Neutral action button--> - <string name="later">Mai târziu</string> - <!--Neutral action button --> - <string name="cancel">Revocare</string> - <!-- Name of the local user when displaying sender of an outgoing message (personal pronoun) --> - <string name="messagelist_sender_self">Eu</string> - <!-- Sender to be used if the sender address has been hidden --> - <string name="hidden_sender_address">Adresa expeditorului ascunsă</string> - <!-- Subject to display in the conversation list if there is no subject --> - <string name="no_subject_view">(Fără subiect)</string> - <!-- Time and date a message is due to expire --> - <string name="expire_on">"Expiră: <xliff:g id="date"> %s </xliff:g>"</string> - <!-- Formatting for subject displayed inline, prepended to MMS message text --> - <string name="inline_subject">"< Subiect: <xliff:g id="Subiect"> %s </xliff:g> >"</string> - <!-- Text of a button appearing for MMS messages that have not yet been downloaded, causing the message to be downloaded (imperative verb) --> - <string name="download">Descarcă</string> - <!-- Message displayed in place of the "download message" button once it has been pressed, indicating that the download is in progress --> - <string name="downloading">În curs de descărcare</string> - <!-- Toast message while an image is being resized --> - <string name="compressing">Poza prea mare. Compressing\u2026</string> - <!-- Header shown above favorite contacts in QKCompose --> - <string name="favorites">Starred contacts</string> - <!-- Word represents 'self' in a conversation --> - <string name="me">Me</string> - <string name="menu_edit">Editare</string> - <string name="menu_delete_messages">Ştergeţi mesajele</string> - <string name="menu_delete_failed">Delete failed messages</string> - <string name="menu_lock">Blocare</string> - <string name="menu_unlock">Deblocare</string> - <!-- When the user tries to view message details and some error occurs while - retrieving those details, this message will be shown. --> - <string name="cannot_get_details">Nu pot obţine detalii.</string> - <!-- Title of "Message details" dialog --> - <string name="message_details_title">Detalii mesaj</string> - <!-- Label in "Message details" dialog --> - <string name="message_type_label">Type\u000A</string> - <!-- "Type" value in "Message details" dialog --> - <string name="text_message">Mesaj text</string> - <!-- "Type" value in "Message details" dialog --> - <string name="multimedia_message">Mesaj multimedia</string> - <!-- "Type" value in "Message details" dialog --> - <string name="multimedia_notification">Notificarea de mesaj multimedia</string> - <!-- Label in "Message details" dialog showing who sent the message. --> - <string name="from_label">From\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="to_address_label">To\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="bcc_label">Bcc\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="sent_label">Sent\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="received_label">Received\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="saved_label">Saved\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="subject_label">Subject\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="message_size_label">Message size\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="priority_label">Priority\u000A</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_high">Mare</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_normal">Normal</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_low">Mic</string> - <!-- Label in "Message details" dialog --> - <string name="message_class_label">Message class\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="error_code_label">Error code\u000A</string> - <!-- Alert dialog title when creating a slideshow [CHAR LIMIT=none] --> - <string name="building_slideshow_title">Construiește slideshow</string> - <!-- Tag appearing on conversations in the conversation list that contain a draft message --> - <string name="has_draft">Proiect</string> - <!-- In conversation list items, this is the separator between a contact's name and the draft stamp [CHAR LIMIT=5] --> - <string name="draft_separator">, \u0020</string> - <!-- In conversation list items, this comes after the receipient's name and contains the number of messages in the thread [CHAR LIMIT=5] --> - <string name="message_count_format">\u00a0 <xliff:g id="number" example="1"> %1$s </xliff:g></string> - <!-- For debugging: Dialog box title indicating there's a situation where data has unexpectedly changed --> - <string name="error_state">Stare inconsistentă</string> - <!-- For debugging: Dialog box text indicating there's a situation where data has unexpectedly changed --> - <string name="error_state_text">Starea mesajelor şi destinatarilor este incompatibilă. Vă rugăm să capturati un raport şi raportaţi-l prin intermediul http://go/droidanizer </string> - <!-- This is the dialog title for the "Select link" dialog, shown when the user clicks on a - chat in the chat history view if there are links in the chat message. The dialog displays the - links if there are any --> - <string name="select_link_title">Alege acţiunea</string> - <!-- In message list items, this string builds the timestamp line when the message is in a group [CHAR LIMIT=NONE] --> - <string name="message_timestamp_format">\u0020-\u0020 <xliff:g id="string" example="Fred Flinstone"> %1$s </xliff:g> <xliff:g id="string" example="9:39AM"> %2$s </xliff:g></string> - <!--Message sending status: sending--> - <string name="status_sending">Se trimite...</string> - <!--Message sending status: failed--> - <!--<string name="status_failed">Failed. Tap to retry</string>--> - <!-- Delivery Report Activity --> - <!-- Status in "Report" window --> - <string name="status_none">(Nici unul)</string> - <!-- Status in "Report" window --> - <string name="status_pending">În aşteptare</string> - <!-- Status in "Report" window --> - <string name="status_read">Citește</string> - <!-- Status in "Report" window --> - <string name="status_received">Primit</string> - <!-- Status in "Report" window --> - <string name="status_failed">Failed. Tap for options</string> - <!-- Status in "Report" window --> - <string name="status_unread">Necitit</string> - <!-- Status in "Report" window --> - <string name="status_rejected">Respins</string> - <!-- Label in "Report" window --> - <string name="recipient_label">Destinatar:\u0020</string> - <!-- Label in "Report" window --> - <string name="status_label">Stare:\u0020</string> - <!-- Label in "Report" window [CHAR LIMIT=50]--> - <string name="delivered_label">Livrată:\u0020</string> - <string name="do_something">Do something</string> - <!-- Confirm Delete --> - <!-- Delete confirmation dialog title --> - <string name="confirm_dialog_title">Ştergeţi?</string> - <!-- Delete confirmation dialog title for locked messages --> - <string name="confirm_dialog_locked_title">Şterge mesajul blocat?</string> - <!-- This message is displayed in a confirmation dialog when the user selects one or more - conversations and then taps the "Delete" button. --> - <plurals name="confirm_delete_conversation"> - <!-- Case of 1 result. --> - <item quantity="one">O conversație va fi ștearsă.</item> - <item quantity="few"><xliff:g id="number" example="15">%1$s</xliff:g> Conversațiile vor fi șterse.</item> - <!-- Case of 0 or 2 or more results. --> - <item quantity="other"><xliff:g id="number" example="15">%1$s</xliff:g> Conversațiile vor fii șterse.</item> - </plurals> - <string name="confirm_delete_conversation">Întregul fir va fi șters.</string> - <!-- Delete all threads confirmation dialog message --> - <string name="confirm_delete_all_conversations">Toate subiectele vor fi şterse.</string> - <!-- Delete message confirmation dialog message --> - <string name="confirm_delete_message">Mesajul va fi şters.</string> - <!-- Delete message confirmation dialog message for a locked message --> - <string name="confirm_delete_locked_message">Şterge acest mesaj blocat?</string> - <!-- Delete all the messages on the SIM dialog message --> - <string name="confirm_delete_all_SIM_messages">Toate mesajele de pe cartela SIM vor fi şterse.</string> - <!-- Delete the selected message on the SIM dialog message --> - <string name="confirm_delete_SIM_message">Acest mesaj de pe cartela SIM va fi şters.</string> - <!-- Delete unlocked checkbox title --> - <string name="delete_unlocked">Şterge mesajul blocat</string> - <!-- Delete button title --> - <string name="delete">Ştergeţi</string> - <!-- More button title --> - <string name="more">More</string> - <!-- More button summary --> - <string name="more_summary">Tap to see more</string> - <!-- Action bar mode title when multi-selecting conversations --> - <string name="select_conversations">Selectaţi conversaţiile</string> - <!-- Show this in the middle of the main activity when there are no conversations [CHAR LIMIT=none] --> - <string name="no_conversations">Nu exista conversaţii.</string> - <!-- Show this in the middle of the main activity when loading conversations [CHAR LIMIT=none] --> - <string name="loading_conversations">Încărcare conversaţii.</string> - <!-- Tells the user that QKSMS isn't the default SMS app --> - <string name="not_default">Default SMS</string> - <!-- Tells the user they need to set QKSMS as the default app in order to use this feature --> - <string name="default_info">QKSMS needs to be your SMS app to do that</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to mark messages as read --> - <string name="not_default_mark_read">QKSMS must be your SMS app to mark messages read</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to mark messages as unread --> - <string name="not_default_mark_unread">QKSMS must be your SMS app to mark messages unread</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to send messages --> - <string name="not_default_delete">QKSMS must be your SMS app to delete messages</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to delete messages --> - <string name="not_default_send">QKSMS must be your SMS app to send messages</string> - <!-- Tells the user they should set QKSMS as the default messaging app --> - <string name="not_default_first">Some things won\'t work until QKSMS is the default SMS app</string> - <string name="delayed_messaging_info">Delayed messaging allows you to cancel messages before they send. Change the default behavior and more in Settings</string> - <string name="delayed_duration_bounds_error">Duration must be between 1 and 30 seconds</string> - <!-- Dialog title for the Read Report dialog. --> - <string name="confirm">Confirmă</string> - <!-- Dialog text for the Read Report dialog. --> - <string name="message_send_read_report">Un raport de citire va fi trimis.</string> - <!-- Dialog title for updating app icon color --> - <string name="update_icon_title">Update icon color</string> - <!-- Dialog message for updating app icon color --> - <string name="update_icon_message">QKSMS must be restarted when changing the icon color</string> - <string name="dialog_conversation_details_title">Conversation details</string> - <string name="dialog_conversation_details_last_message_date">Last message date</string> - <string name="dialog_conversation_details_message_count">Message count</string> - <string name="dialog_conversation_details_recipients">Recipients (%s)</string> - <string name="dialog_should_i_answer_title">Should I Answer? not installed</string> - <string name="dialog_should_i_answer_message">Would you like to download the app from Google Play now?</string> - <string name="dialog_delete_old_messages">Are you sure you want to automatically delete old messages?</string> - <!-- Title for audio file picker --> - <string name="select_audio">Alege audio</string> - <!-- Menu title to copy an attachment to the shared storage [CHAR LIMIT=25] --> - <string name="copy_to_sdcard">Salvaţi ataşamentul</string> - <!-- Toast message on successful copy to shared storage [CHAR LIMIT=30] --> - <string name="copy_to_sdcard_success">Atașament salvat.</string> - <!-- Toast message on failed copy to shared storage [CHAR LIMIT=30] --> - <string name="copy_to_sdcard_fail">Atașamentul nu a putut fii salvat.</string> - <!-- Menu title to save a sound as a ringtone --> - <string name="save_ringtone">Salvare ca ton de apel</string> - <!-- Toast message on successful copying ringtone to drm provider --> - <string name="saved_ringtone">Ton de apel salvate.</string> - <!-- Toast message on failed copying ringtone to drm provider --> - <string name="saved_ringtone_fail">Nu s-a putut salva ton de apel.</string> - <!-- Menu item --> - <!-- Menu item [CHAR LIMIT=40] --> - <string name="menu_group_participants">Participanti ai grupului</string> - <!--Toast shown when a draft is saved--> - <string name="toast_draft">Ciornă salvată</string> - <!--Toast shown when a conversation is deleted--> - <string name="toast_conversation_deleted">Conversaţie ştearsă</string> - <!--Toast shown when device is low on storage--> - <string name="toast_low_memory">"Spațiul de stocare este plin. Ştergeţi unele fişiere pentru a elibera spaţiu."</string> - <!--Toast shown to tell user that forwarding messages doesn't work yet--> - <string name="toast_forward">Această caracteristică nu a fost încă implementată. De acum vă rugăm să utilizaţi opţiunea de copiere text şi lipiți în conversaţia pe care doriţi să o trimiteți</string> - <!--Toast shown for unimplemented features--> - <string name="toast_unimplemented">Această caracteristică nu a fost încă implementată</string> - <!--Toast shown when a message fails to send--> - <string name="toast_message_failure">Trimiterea mesajului a eșuat</string> - <!--Toast shown when a message is delivered--> - <string name="toast_message_delivered">Mesajul a fost trimis</string> - <!--Toast shown when a message is not delivered--> - <string name="toast_message_not_delivered">Mesajul nu a fost trimis</string> - <!--Toast shown when default APNs are loaded--> - <string name="toast_default_apns_loaded">Încarca setările implicite APN</string> - <!--Toast shown when text is copied to the clipboard--> - <string name="toast_copy_text">Text copiat în clipboard</string> - <!--Toast shown when Google Play Services is not available for purchasing a product--> - <string name="toast_billing_not_available">Cumpărarea necesită Google Play Store (factura) pe telefonul tău Android</string> - <!--Toast shown when Google Play Services is not available for purchasing a product--> - <string name="toast_endlessjabber_not_installed">EndlessJabber nu este instalat, se deschide Google Play</string> - <string name="toast_changelog_error">Couldn\'t load the changelog. Please try again later</string> - <string name="toast_conversation_error">Couldn\'t open conversation</string> - <string name="toast_deleting_old_messages">Your old messages will be deleted shortly</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_1">Îți mulțumesc pentru donare! Ești noul meu cel mai bun prieten.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_2">Îti mulțumesc pentru donaţie! Te iubesc.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_3">Îti mulțumesc pentru donare! Tocmai ai ajutat QKSMS sa devină cea mai bună aplicație mesageră făcuta vreodată.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_4">Mulțumesc pentru donație! Ești cel mai tare.</string> - <!--Menu option to mute conversation--> - <string name="menu_mute_conversation">Mute conversation</string> - <!--Menu option to mute conversation--> - <string name="menu_unmute_conversation">Unmute conversation</string> - <string name="menu_block_conversations">Block conversations</string> - <string name="menu_unblock_conversations">Unblock conversations</string> - <string name="menu_messages">Messages</string> - <string name="menu_blocked">Blocked</string> - <string name="menu_blocked_conversations">Blocked (%s new)</string> - <string name="menu_unblocked_conversations">Messages (%s new)</string> - <string name="menu_notifications">Notifications</string> - <string name="menu_notifications_off">Notifications off</string> - <string name="menu_notification_settings">Conversation settings</string> - <string name="menu_view_details">View details</string> - <string name="menu_mark_read">Mark read</string> - <string name="menu_mark_unread">Mark unread</string> - <string name="menu_delete_conversation">Delete conversation</string> - <string name="menu_multi_select">Select conversation</string> - <string name="menu_done">Done</string> - <string name="failed_message_title">Failed message options</string> - <!--Toast shown to tell the user that they don't have a photo attachments app, and suggests that they download one--> - <string name="attachment_app_not_found">Attachments app not found. Try installing a photo gallery app!</string> - <string name="attachment_camera_error">The camera could not be opened</string> - <string name="pref_max_mms_attachment_size">Maximum MMS attachment size</string> - <string name="error_no_recipients">Select some contacts to send this message to!</string> - <string name="error_file_not_found">QKSMS can\'t access the file you\'re trying to share!</string> - <string name="sending_blocked_welcome_screen_message">Hold up! You\'ll get to send real messages in a minute!</string> - <string name="notification_colored_icon_ready">Touch to add to your launcher from home screen.</string> - <string name="notification_title_colored_icon_ready">QKSMS colored icon is ready</string> - <string name="icon_ready">Your new icon is ready!</string> - <string name="icon_ready_message">You can now add it to your home screen again with the updated color.</string> - <string name="dont_ask_again">Don\'t ask again</string> - <string name="warning">Stagefright warning</string> - <string name="stagefright_warning">Video messages may contain a harmful exploit that can leave your phone vulnerable to attacks. Would you like to continue?</string> - <!-- MMS DIALOG SETUP STRINGS --> - <string name="mms_setup_set_up_mms_title">Set up MMS?</string> - <string name="mms_setup_set_up_mms_body">It appears that MMS isn\'t set up in QKSMS. Press okay to automatically configure MMS.</string> - <string name="mms_setup_setting_up_later_title">Setting up MMS later</string> - <string name="mms_setup_setting_up_later_body">Visit the MMS section of Settings to try automatic configuration, contact support, or enter your own configuration.</string> - <string name="mms_setup_no_configurations_found_title">No configurations found</string> - <string name="mms_setup_no_configurations_found_body">We couldn\'t find an MMS configuration for your carrier automatically. Press okay to contact support. We\'ll help you get set up! </string> - <string name="mms_setup_one_configuration_found_title">One configuration found</string> - <string name="mms_setup_one_configuration_found_body">We have found an MMS configuration for the %s carrier. Does that sound right?</string> - <string name="mms_setup_multiple_configurations_found_title">Multiple configuration found</string> - <string name="mms_setup_multiple_configurations_found_body">We have found multiple MMS configurations. Choose your carrier from the list, or press N/A if your carrier isn\'t on the list.</string> - <string name="mms_setup_next_steps_title">Next steps</string> - <string name="mms_setup_next_steps_body">Visit the MMS section of Settings to try automatic configuration again, contact support, or enter your own configuration.</string> - <string name="mms_setup_success_title">Success!</string> - <string name="mms_setup_success_body">If you encounter any issues, visit the MMS section of Settings to try automatic configuration again, contact support, or enter your own configuration.</string> - <string name="na">N/A</string> - <string name="no">No</string> - <string name="pref_automatically_configure_mms">Automatically Configure MMS</string> - <string name="pref_mms_contact_support">Contact Support</string> - <string name="pref_category_sending_mms">Sending MMS</string> - <string name="pref_category_mms_configuration">MMS Configuration</string> - <string name="pref_mms_contact_support_summary">Contact the QKSMS team for help setting up MMS</string> - <string name="pref_markdown_enabled">Text formatting</string> - <string name="pref_markdown_enabled_summary">Use markdown syntax to get bold, underline, and italics in your messages</string> - <string name="want_read_indicators">Want read indicators?</string> - <string name="color_swatch_description">Color %1$d</string> - <string name="color_swatch_description_selected">Color %1$d selected</string> - <string name="color_picker_default_title">Select a Color</string> - <string name="message_delivered">Message Delivered</string> - <string name="message_not_delivered">Message Not Delivered</string> - <string name="error">Error</string> - <string name="invalid_destination">Invalid destination address.</string> - <string name="service_not_activated">Service not activated on network.</string> - <string name="service_message_not_found">Message expired or not available.</string> - <string name="service_network_problem">Couldn\'t send due to network problem.</string> - <string name="message_queued">Currently can\'t send your message. It will be sent when the service becomes available.</string> - <string name="download_later">Can\'t download right now. Try again later.</string> - <string name="no_apn">No APN specified for the app, you need to set it up in settings!</string> - <string name="no_subject">(No subject)</string> - <string name="unknown_sender">Unknown sender</string> - <string name="dl_failure_notification">Couldn\'t download message <xliff:g id="subject">%1$s</xliff:g> from <xliff:g id="from">%2$s</xliff:g>.</string> - <string name="auto_select_multiple_apns">Multiple different configurations have been found. Try one now. If it doesn\'t work, you can try a new one by going to Settings > Advanced > Load default APNs.</string> - <string name="auto_select_apn">Automatically Select APNs</string> - <string name="auto_select_failed_title">Automatic configuration failed</string> - <string name="auto_select_failed">Try searching for your carrier\'s APN settings (MMSC, Port, and Proxy) and entering them in Settings > Advanced.</string> - <string name="date_yesterday">Yesterday</string> - <string name="date_just_now">Just now</string> - <string name="compose_loading_attachment">Loading attachment</string> - <string name="hint_no_messages">No messages yet.\nClick the + to send one!</string> - <string-array name="resend_menu"> - <item>Resend</item> - <item>Edit</item> - <item>Delete</item> - </string-array> - <string-array name="message_menu"> - <item>înaintare mesaj</item> - <item>Copiere text</item> - <item>Vezi detalii</item> - <item>Ştergeţi mesajul</item> - </string-array> - <string-array name="background_titles"> - <item>Material Light</item> - <item>Material Dark</item> - <item>Black</item> - </string-array> - <string-array name="font_sizes"> - <item>Mic</item> - <item>Normal</item> - <item>Mare</item> - <item>Cel mai mare</item> - </string-array> - <string-array name="font_families"> - <item>Roboto Regular</item> - <item>Roboto Condensed</item> - <item>System font</item> - </string-array> - <string-array name="font_weights"> - <item>Slab</item> - <item>Normal</item> - </string-array> - <!-- String to match as no subject and filter out as a subject. For example, if the - subject string is "no subject", we won't display that. We'll pretend - no subject string was delivered. --> - <string-array name="empty_subject_strings"> - <item>fără subiect</item> - </string-array> - <string-array name="qk_responses"> - <item>Okay</item> - <item>Give me a moment</item> - <item>On my way</item> - <item>Thanks</item> - <item>Sounds good</item> - <item>What\'s up?</item> - <item>Agreed</item> - <item>No</item> - <item>Love you</item> - <item>Sorry</item> - <item>LOL</item> - <item>That\'s okay</item> - </string-array> - <string-array name="enter_button_options"> - <item>Show emoji</item> - <item>New line</item> - <item>Send message</item> - </string-array> - <string-array name="notification_private_options"> - <item>Show all</item> - <item>Hide message</item> - <item>Hide message and sender</item> - </string-array> - <!-- Max MMS attachment sizes. I.e. will compress pictures that are larger than 300 KB down to - under 300KB. --> - <string-array name="max_mms_attachment_sizes"> - <item>300 KB</item> - <item>600 KB</item> - <item>1 MB</item> - <item>Unlimited</item> - </string-array> -</resources> diff --git a/QKSMS/src/main/res/values-ru/strings.xml b/QKSMS/src/main/res/values-ru/strings.xml deleted file mode 100644 index 43155debc..000000000 --- a/QKSMS/src/main/res/values-ru/strings.xml +++ /dev/null @@ -1,770 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!--Generated by crowdin.com--> -<resources xmlns:xliff="http://schemas.android.com/apk/res-auto"> - <!--Slogan--> - <string name="slogan">Вы снова полюбите переписываться.</string> - <!--Text shown when a phone number cannot be found--> - <string name="unknown_number">Неизвестный номер</string> - <!--Content description for photos--> - <string name="popup_photo_CD">Фото</string> - <!--Text to be displayed while content is loading--> - <string name="loading">Загрузка…</string> - <!--Test string--> - <string name="test">Тестовая строка</string> - <!--Hint for contacts text field--> - <string name="hint_contacts">Укажите получателей</string> - <!--Hint for search text field--> - <string name="hint_search">что ищем?</string> - <!--Hint for message reply text field--> - <string name="hint_reply">Сообщение</string> - <!--Hint for code redemption--> - <string name="hint_redeem">Введите код</string> - <string name="hint_hex">Hex</string> - <!--Text shown for single new message in notification--> - <string name="new_message">Новое сообщение</string> - <!--Text shown after number of unread messages in notification (ex. 3 new messages)--> - <string name="new_messages">новые сообщения</string> - <!--Text shown for single failed message in notification--> - <string name="failed_message">Не удалось отправить сообщение</string> - <!--Text shown after number of failed messages in notification (ex. 3 messages failed to send)--> - <string name="failed_messages">сообщений не удалось отправить</string> - <!--Text shown under failed message count--> - <string name="failed_messages_summary">Нажмите для просмотра</string> - <!--QuickCompose notification title--> - <string name="quickcompose">QK Написать</string> - <!--QuickCompose notification text--> - <string name="quickcompose_detail">Отправить сообщение</string> - <!--Welcome screen intro button--> - <string name="welcome_start">Давайте начнем!</string> - <!--Allows user to skip welcome screen--> - <string name="welcome_skip">ПРОПУСТИТЬ</string> - <!--Allows user to finish the welcome screen--> - <string name="welcome_finish">ЗАКОНЧИТЬ</string> - <!--Indicates to user they can pick a color--> - <string name="welcome_theme_title">Выбрать цвет</string> - <!--Indicates to user they can pick any colors--> - <string name="welcome_theme_description">Любой цвет.</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_night_description">Легче для глаз.</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_night_hint">Нажми меня</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_quickreply_title">QK Ответ</string> - <!--QK Reply explanation--> - <string name="welcome_quickreply_description">Ответить на сообщение можно быстрее чем обычно.</string> - <!--Prompts user to try QK Reply--> - <string name="welcome_quickreply_hint">Попробуйте это!</string> - <!--QK Reply demo message--> - <string name="welcome_quickreply_message_1">Вау! Теперь не удивляет? Вы можете просмотреть весь разговор с первого взгляда. Нажмите за пределами всплывающего окна или нажмите галочку, чтобы закрыть его.</string> - <!--QK Reply demo message--> - <string name="welcome_quickreply_message_2">Это быстрый ответ. Теперь вы можете ответить на сообщения везде. Нажмите кнопку \"развернуть\", чтобы увидеть, что произойдет дальше :)</string> - <!--Settings option in menu--> - <string name="menu_settings">Настройки</string> - <!--Search option in menu--> - <string name="menu_search">Поиск</string> - <!--Show full conversation in QuickReply--> - <string name="menu_show_all">Показывать все сообщения</string> - <!--Show only unread messages in QuickReply--> - <string name="menu_show_unread">Показать непрочитанные сообщения</string> - <!--Open conversation option in menu (shown in QuickReply)--> - <string name="menu_open_thread">Открыть переписку</string> - <!--Forward message option in menu--> - <string name="menu_forward">Переслать сообщение</string> - <!--Call contact option in menu--> - <string name="menu_call">Позвонить</string> - <!--Mark a message/conversation as read option in menu--> - <string name="menu_read">Пометить как прочитанное</string> - <!--Delete a message option in menu--> - <string name="menu_delete">Удалить</string> - <!--Donate option in menu--> - <string name="menu_billing">Пожертвовать</string> - <!--Copy text option in menu--> - <string name="menu_copy">Скопировать текст</string> - <!--Changelog option in menu--> - <string name="menu_changelog">"Новые возможности"</string> - <!--Expand settings option in menu--> - <string name="menu_show_all_prefs">все</string> - <!--Show less settings option in menu--> - <string name="menu_show_fewer_prefs">основные</string> - <!--Title for message details popup--> - <string name="details_title">Подробности</string> - <!--Title for address that message is being sent to in message details popup--> - <string name="details_to">Кому</string> - <!--Title for address that message is sent from in message details popup--> - <string name="details_from">От</string> - <!--Title for text of a message in message details popup--> - <string name="details_body">Сообщение</string> - <!--Title for date sent of a message in message details popup--> - <string name="details_date_sent">Отправлено</string> - <!--Title for date received of a message in message details popup--> - <string name="details_date_received">Получено</string> - <!--Title for rate snackbar--> - <string name="rate_title">Нравиться QKSMS?</string> - <!--Title for rate button--> - <string name="rate_action">Оценить</string> - <string name="pref_category_appearance">Внешний вид</string> - <string name="pref_category_summary_appearance">Темы, шрифты, цвета, аватары и многое другое</string> - <string name="pref_category_general">Общие</string> - <string name="pref_category_summary_general">Доставка, отправка сообщений, форматирование</string> - <string name="pref_category_blocking">Блокировка сообщений</string> - <string name="pref_category_notifications">Уведомления</string> - <string name="pref_category_summary_notifications">Звуки, индикатор, конфиденциальность</string> - <string name="pref_category_mms">MMS</string> - <string name="pref_category_summary_mms">Настройка MMS (APN), Макс. размер, групповые сообщения</string> - <string name="pref_category_quickreply">QK Ответ</string> - <string name="pref_category_summary_quickreply">быстрый ответ, всплывающие опции</string> - <string name="pref_category_quickcompose">QK Написать</string> - <string name="pref_category_summary_quickcompose">быстрый набор, помеченные контакты</string> - <string name="pref_category_about">О приложении</string> - <string name="pref_category_summary_about">Версия, список изменений, авторы, благодарности</string> - <string name="pref_theme">Цвет темы</string> - <string name="pref_theme_summary_alt">Нажмите, чтобы изменить тему</string> - <string name="pref_icon">Icon color</string> - <string name="pref_icon_summary">Tap to change the QKSMS icon color</string> - <string name="pref_status_tint">Прозрачная строка состояния</string> - <string name="pref_navigation_tint">Прозрачная панель навигации</string> - <string name="pref_background">Цвет фона</string> - <string name="pref_background_summary">Нажмите, чтобы изменить цвет фона</string> - <string name="pref_bubbles">Пузыри сообщений</string> - <string name="pref_bubbles_summary">Нажмите, чтобы изменить предпочтения пузыря сообщения</string> - <string name="pref_night">Ночной режим</string> - <string name="pref_night_summary">Сохранить заряд аккумулятора и уменьшить напряжение глаз</string> - <string name="pref_night_amoled">Настоящий черный фон</string> - <string name="pref_night_amoled_summary">Экономит энергию на устройствах с AMOLED-экранами</string> - <string name="pref_bubble_style_new">Использовать новый стиль пузыря</string> - <string name="pref_color_sent">Отправленные сообщения в цвет темы</string> - <string name="pref_color_sent_summary">Цвет фона пузыря для исходящих сообщений</string> - <string name="pref_color_received">Полученные сообщения в цвет</string> - <string name="pref_color_received_summary">Цвет фона пузыря для входящих сообщений</string> - <string name="pref_hide_avatar_conversations">Скрыть фото в списке бесед</string> - <string name="pref_hide_avatar_conversations_summary">Скрыть аватары контактов в списке разговоров</string> - <string name="pref_hide_avatar_sent">Скрыть ваш аватар</string> - <string name="pref_hide_avatar_sent_summary">Скрыть ваш аватар в исходящих сообщениях</string> - <string name="pref_hide_avatar_received">Скрыть аватары контактов</string> - <string name="pref_hide_avatar_received_summary">Скрыть аватары контактов во входящих сообщениях</string> - <string name="pref_font_family">Семейство шрифтов</string> - <string name="pref_font_size">Размер шрифта</string> - <string name="pref_font_weight">Толщина шрифта</string> - <string name="pref_message_count">Количество сообщений</string> - <string name="pref_message_count_summary">Показать количество сообщений для каждой переписки</string> - <string name="pref_sent_timestamps">Показывать время отправки</string> - <string name="pref_sent_timestamps_summary">Показывать временную отметку, когда сообщение было отправлено (не получено)</string> - <string name="pref_force_timestamps">Включить отметки времени</string> - <string name="pref_force_timestamps_summary">Включение отметок времени для всех сообщений</string> - <string name="pref_key_timestamp_delay">Задержка новой отметки времени</string> - <string name="pref_key_timestamp_delay_summary">Количество минут с последнего сообщения до показа новой отметки времени</string> - <string name="pref_compose_favorites">Помеченные контакты</string> - <string name="pref_compose_summary_favorites">Показать ваши помеченные контакты в окне быстрого сообщения, убрать их можно будет касанием</string> - <string name="pref_prox_sensor_call">Датчик приближения</string> - <string name="pref_prox_sensor_call_summary">Во время переписки, поднесите телефон к уху, чтобы позвонить</string> - <string name="pref_delivery">Отчеты о доставке</string> - <string name="pref_delivery_summary">Запрашивать отчет о доставке для всех отправленных SMS</string> - <string name="pref_delivery_toast">Показывать toast-уведомление</string> - <string name="pref_delivery_toast_summary">Показать короткий тост для обозначения что сообщения отправляються</string> - <string name="pref_delivery_vibrate">Вибрация</string> - <string name="pref_delivery_vibrate_summary">Вибрировать при получении сообщения</string> - <string name="pref_delete_old_messages">Удалить старые сообщения</string> - <string name="pref_delete_old_messages_summary">Автоматически удалять достаточно старые сообщения</string> - <string name="pref_delete_old_messages_unread">Непрочитанные сообщения</string> - <string name="pref_delete_old_messages_unread_summary">Автоматически удалить непрочитанные сообщения после %s дней</string> - <string name="pref_delete_old_messages_read">Прочитанные сообщения</string> - <string name="pref_delete_old_messages_read_summary">Автоматически удалять прочитанные сообщения после %s дней</string> - <string name="pref_yappy">поддержка Yappy</string> - <string name="pref_endlessjabber_summary">Включить полную поддержку приложения Yappy</string> - <string name="pref_blocked_conversations">Заблокированные переписки</string> - <string name="pref_blocked_conversations_summary">длительным нажатием можно будет перенести в заблокированные входящие и отключить уведомления</string> - <string name="pref_block_future">заблокировать будущие сообщения</string> - <string name="pref_block_future_summary">Добавить дополнительные номера телефонов для блокирования</string> - <string name="pref_should_i_answer">Поддержка приложения \"Небери трубку\"</string> - <string name="pref_should_i_answer_summary">Автоматически удалять входящие сообщения с номеров, которые блокируются через Небери трубку</string> - <string name="pref_mobile_only">Номера телефонов</string> - <string name="pref_mobile_only_summary">Показывать только мобильные номера в предложениях контактов</string> - <string name="pref_auto_emoji">Автоматические emoji</string> - <string name="pref_auto_emoji_summary">Заменить текст изображениями emoji</string> - <string name="pref_enter_button">Кнопка \"Enter\"</string> - <string name="pref_enter_button_summary">нажмите чтобы указать что делать при нажатии \"enter\"</string> - <string name="pref_compose_group">Групповое сообщение</string> - <string name="pref_compose_group_summary">При создании сообщения нескольким людям, отправлять групповое сообщение вместо индивидуальных сообщений</string> - <string name="pref_auto_download">Автоматическая загрузка MMS</string> - <string name="pref_auto_download_summary">Автоматическая загрузка MMS-сообщений, когда они станут доступны</string> - <string name="pref_auto_data">Автоматическая передача данных</string> - <string name="pref_auto_data_summary">Включать передачу данных автоматически при отправке или получении MMS</string> - <string name="pref_split">Разделять SMS</string> - <string name="pref_split_summary">Разделять длинные сообщения на несколько отдельных</string> - <string name="pref_split_counter">Счетчик сообщений</string> - <string name="pref_split_counter_summary">Показывать номер каждого разделенного сообщения</string> - <string name="pref_long_as_mms">Отправка длинных сообщений в MMS</string> - <string name="pref_long_as_mms_summary">Отправлять длинные сообщения в виде MMS вместо разделения на несколько сообщений</string> - <string name="pref_long_as_mms_after">Отправлять длинные сообщения как MMS после</string> - <string name="pref_long_as_mms_after_summary">Отправлять длинные сообщения как MMS, когда они превышают длину нескольких сообщений</string> - <string name="pref_return">Показать кнопку Возврата</string> - <string name="pref_return_summary">Показывать кнопку Возврата строки вместо кнопки смайликов</string> - <string name="pref_text">Текст</string> - <string name="pref_notifications">SMS-уведомления</string> - <string name="pref_led">LED-уведомление</string> - <string name="pref_theme_led">Цвет LED-уведомления</string> - <string name="pref_wake">разбудить устройство</string> - <string name="pref_wake_summary">включать экран когда приходит новое сообщение</string> - <string name="pref_notifications_private">Частные уведомления</string> - <string name="pref_notifications_private_summary">Нажмите, чтобы скрыть то что не должно отображаться</string> - <string name="pref_ringtone">Звук уведомления</string> - <string name="pref_ringtone_summary">Выберите звук уведомления</string> - <string name="pref_ticker">Показывать тикер</string> - <string name="pref_ticker_summary">Показывать фрагмент нового сообщения в панели уведомлений</string> - <string name="pref_vibration">Вибросигнал</string> - <string name="pref_vibration_summary">Вибрировать при получении новых сообщений</string> - <string name="pref_notification_call">Кнопка вызова</string> - <string name="pref_notification_call_summary">Вызов отправителя сообщения прямо из уведомления</string> - <string name="pref_dimiss_read">Пометить как прочитанное</string> - <string name="pref_dismiss_read_summary">Пометить сообщение как прочитанное, когда уведомление снято</string> - <string name="pref_delayed">Обмен сообщениями с задержкой</string> - <string name="pref_delayed_summary">Задержка перед отправкой сообщений, чтобы у вас была возможность перечитать</string> - <string name="pref_delayed_duration">Продолжительность задержки (в секундах)</string> - <string name="pref_delayed_duration_summary">Время ожидания перед отправкой сообщения</string> - <string name="pref_night_auto">Автоматический ночной режим</string> - <string name="pref_night_auto_summary">Включать ночной режим автоматически на основе времени</string> - <string name="pref_day_start">День начинается</string> - <string name="pref_night_start">Ночь начинается</string> - <string name="pref_qk_responses">быстрые ответы</string> - <string name="pref_qk_responses_summary">Измените ваши настройки ответов для использования в Android Wear устройствах</string> - <string name="pref_quickreply_enabled">быстрые ответы включены</string> - <string name="pref_quickreply_enabled_summary">Показать окно быстрых ответов когда приходит новое сообщение</string> - <string name="pref_tap_to_quit">Нажатие на экране чтобы закрыть QuickReply</string> - <string name="pref_tap_to_quit_summary">Касание любого места за пределами окна, закроет его</string> - <string name="pref_quickcompose">быстрые сообщения включены</string> - <string name="pref_quickcompose_summary">Отображать уведомление, которое позволит быстро написать новое сообщение</string> - <string name="pref_mms_enabled">MMS включено</string> - <string name="pref_mms_enabled_summary">Включение отправки и получения MMS-сообщений</string> - <string name="pref_mmsc_url">MMSC</string> - <string name="pref_mms_proxy">Прокси MMS</string> - <string name="pref_mms_port">Порт MMS</string> - <string name="pref_apn_chooser">Загрузка стандартных настроек APN</string> - <string name="pref_strip_unicode">Преобразовать в Unicode</string> - <string name="pref_strip_unicode_summary">Преобразовать несовместимые символы, которые не поддерживаются в длинных сообщениях для GSM</string> - <string name="pref_system_bar_flat">плоская системная панель</string> - <string name="pref_system_bar_flat_summary">Чтобы избавиться от градиента на панели пользовательского интерфейса системы на большинстве устройств KitKat</string> - <string name="pref_status_compat">Исправление проблем со строкой состояния</string> - <string name="pref_status_compat_summary">Устраняет проблемы, вызванные режимом \"Погружение\", модулем Tinted Status Bar (Xposed) или пользовательскими настройками DPI</string> - <string name="pref_navigation_compat">Исправление проблем со строкой навигации</string> - <string name="pref_navigation_compat_summary">Устраняет проблемы, вызванные режимом \"Погружение\", модулем Tinted Status Bar (Xposed) или пользовательскими настройками DPI</string> - <string name="pref_about_version_title">Версия QKSMS</string> - <string name="pref_about_authors_title">Авторы</string> - <string name="pref_about_authors_summary">Moez Bhatti</string> - <string name="pref_changelog_summary">Нажмите для просмотра изменений</string> - <string name="pref_about_thanks_title">Спасибо</string> - <string name="pref_about_thanks_summary">Нажмите для просмотра разработчиков открытого исходного кода</string> - <string name="pref_donate_title">Пожертвования</string> - <string name="pref_donate_summary">QKSMS является бесплатным. Поддержите нас, материально!</string> - <string name="pref_about_gplus_title">Google+</string> - <string name="pref_about_gplus_summary">Присоединяйтесь к бета-тестированию QKSMS в Google+</string> - <string name="pref_about_github_title">GitHub</string> - <string name="pref_about_github_summary">QKSMS это открытый проект, сообщать о проблемах и вносить изменения можно на GitHub</string> - <string name="pref_about_crowdin_title">Crowdin</string> - <string name="pref_about_crowdin_summary">Присоединяйтесь к проекту перевода QKSMS на другие языки на Crowdin</string> - <!--Preference subcategory--> - <string name="pref_subcat_theme">Тема</string> - <!--Preference subcategory--> - <string name="pref_subcat_system_bars">системные панели</string> - <!--Preference subcategory--> - <string name="pref_subcat_categories">Категории</string> - <!--Preference subcategory--> - <string name="pref_subcat_font">Шрифт</string> - <!--Preference subcategory--> - <string name="pref_subcat_messages">Сообщения</string> - <!--Preference subcategory--> - <string name="pref_subcat_avatars">Аватары</string> - <string name="donate_google">Пожертвовать с помощью Google</string> - <string name="donate_google_summary">Google берёт 30% от пожертвований</string> - <string name="donate_paypal">Пожертвовать через PayPal</string> - <string name="donate_paypal_button">Пожертвовать любую сумму</string> - <string name="donate_paypal_button_summary">Купите мне что-нибудь, что вы хотите!</string> - <!--Donation product name--> - <string name="product_name_donation">Пожертвование</string> - <!--$1 donation product name--> - <string name="product_name_donate_1">Пожертвовать $1 USD</string> - <!--$5 donation product name--> - <string name="product_name_donate_5">Пожертвовать $5 USD</string> - <!--$3 donation product name--> - <string name="product_name_donate_10">Пожертвовать $10 USD</string> - <!--$1 donation product description--> - <string name="product_description_donate_1">Купить мне колы</string> - <!--$5 donation product description--> - <string name="product_description_donate_5">Купить мне сэндвич</string> - <!--$10 donaion product description--> - <string name="product_description_donate_10">Купить мне обед</string> - <string name="title_settings">Настройки</string> - <string name="title_search">Поиск</string> - <string name="title_compose">Написать</string> - <string name="title_conversation_list">Переписки</string> - <string name="title_blocked">Заблокирован</string> - <string name="title_changelog">История изменений</string> - <string name="title_picker">Новые сообщения</string> - <string name="title_donate">Пожертвовать</string> - <string name="title_qk_responses">быстрые ответы</string> - <string name="title_block_address">заблокировать номер</string> - <string name="title_unblock_address">Разблокировать номер</string> - <string name="title_conversations_selected">%s выбран</string> - <string name="title_palette">Палитра</string> - <string name="title_rgb">RGB</string> - <!-- Menu shown in the context menu when long pressing on a message when the message contains - one or more phone numbers and/or email addresses and the number or email is new to - contacts. [CHAR LIMIT=50] --> - <string name="menu_add_address_to_contacts">Добавить <xliff:g id="contactEmailOrNumber"> %s </xliff:g> в контакты</string> - <!-- Context menu item on an individual message for viewing an attached slideshow --> - <string name="view_slideshow">Просмотр слайд-шоу</string> - <!-- Context menu item on an individual message for viewing message details such as time and date --> - <string name="view_message_details">Показать подробности</string> - <!-- Context menu item on an individual message for viewing a delivery report --> - <string name="view_delivery_report">Просмотреть отчет</string> - <!-- Context menu item on an individual message for deleting only that message --> - <string name="delete_message">Удалить</string> - <!-- Abbreviation for "kilobyte" --> - <string name="kilobyte">КБ</string> - <!-- Individual message context menu item --> - <string name="copy_message_text">Скопировать текст</string> - <!-- Header for context menu on an individual message --> - <string name="message_options">Параметры сообщения</string> - <!-- Delivery Header View --> - <!-- Title of "Report" window --> - <string name="delivery_header_title">Отчет</string> - <!--Text for app restart confirmation dialog--> - <string name="restart_message">Эти изменения вступят в силу при следующем открытии QKSMS</string> - <!--Dialog title for asking if a user wants to delete a conversation--> - <string name="delete_conversation">Удалить переписку</string> - <!--Dialog title for asking if a user wants to delete all failed messages--> - <string name="delete_all_failed">Удалить сбойные сообщения</string> - <!--CDialog title for asking if a user wants to delete a conversation--> - <string name="delete_confirmation">Вы уверены, что хотите удалить (%s) переписок?</string> - <!--CDialog title for asking if a user wants to delete all failed messages--> - <string name="delete_all_failed_confirmation">Вы уверены, что хотите удалить все сбойные сообщения из (%s) диалогов?</string> - <!--(Unused) Dialog title shown if APNs have not been set--> - <string name="apns_not_set">APN не задано</string> - <!--(Unused) Dialog description shown if APNs have not been set--> - <string name="apns_not_set_description">Похоже, что ваша точка доступа APN для MMS не была настроена. Это означает, что MMS не будет работать должным образом. Нажмите пожалуйста ОК, чтобы QKSMS нашел их для вас :)</string> - <!--Dialog title show if MMS hasn't been configured--> - <string name="set_up_mms_title">Настроить MMS?</string> - <!--Dialog description shown if MMS hasn't yet been configured--> - <string name="set_up_mms_description">Похоже, что MMS еще не был настроен в QKSMS. Нажмите ok чтобы автоматически настроить MMS.</string> - <!-- Dialog message text explaining that a draft message will not be saved due to invalid recipients --> - <string name="discard_message_reason">Ваше сообщение не будет сохранено, поскольку оно не имеет верного получателя.</string> - <string name="invalid_code">Неверный код</string> - <!--Button to restart app now instead of manually later--> - <string name="restart">Перезапустить сейчас</string> - <!--Notification action to reply to a message--> - <string name="reply">Ответить</string> - <!--Notification action to reply to a message--> - <string name="reply_qksms">Ответить через QKSMS</string> - <!--Notification action to mark a message as read--> - <string name="read">Читать</string> - <!--Notification action to mark a message as read--> - <string name="mark_read">Пометить как прочитанное</string> - <!--Notification action to call the sender of a message--> - <string name="call">Позвонить</string> - <!-- Notification toast message --> - <string name="notification_mute_on">Уведомления включены</string> - <string name="notification_mute_off">Уведомления выключены</string> - <!--Positive action button--> - <string name="yes">Да</string> - <string name="add">Добавить</string> - <!--Positive action button--> - <string name="save">Сохранить</string> - <!--Positive action button--> - <string name="enable">Включить</string> - <!--Positive action button--> - <string name="upgrade_now">Установить сейчас</string> - <!--Positive action button--> - <string name="okay">ОК</string> - <!--Positive action button--> - <string name="redeem">Вернуть</string> - <!--Neutral action button--> - <string name="just_once">Только один раз</string> - <!--Neutral action button--> - <string name="later">Позже</string> - <!--Neutral action button --> - <string name="cancel">Отмена</string> - <!-- Name of the local user when displaying sender of an outgoing message (personal pronoun) --> - <string name="messagelist_sender_self">Я</string> - <!-- Sender to be used if the sender address has been hidden --> - <string name="hidden_sender_address">Скрытый адрес отправителя</string> - <!-- Subject to display in the conversation list if there is no subject --> - <string name="no_subject_view">(Тема не указана)</string> - <!-- Time and date a message is due to expire --> - <string name="expire_on">"Срок действия: <xliff:g id="date"> %s </xliff:g>"</string> - <!-- Formatting for subject displayed inline, prepended to MMS message text --> - <string name="inline_subject">"<Subject: <xliff:g id="subject">%s</xliff:g>>"</string> - <!-- Text of a button appearing for MMS messages that have not yet been downloaded, causing the message to be downloaded (imperative verb) --> - <string name="download">Скачать</string> - <!-- Message displayed in place of the "download message" button once it has been pressed, indicating that the download is in progress --> - <string name="downloading">Загрузка</string> - <!-- Toast message while an image is being resized --> - <string name="compressing">Картинка слишком большая. Сжатие\u2026</string> - <!-- Header shown above favorite contacts in QKCompose --> - <string name="favorites">Помеченные контакты</string> - <!-- Word represents 'self' in a conversation --> - <string name="me">Я</string> - <string name="menu_edit">Редактировать</string> - <string name="menu_delete_messages">Удалить сообщения</string> - <string name="menu_delete_failed">Удалить неотправленые сообщения</string> - <string name="menu_lock">Заблокировать</string> - <string name="menu_unlock">Разблокировать</string> - <!-- When the user tries to view message details and some error occurs while - retrieving those details, this message will be shown. --> - <string name="cannot_get_details">Не удается получить сведения.</string> - <!-- Title of "Message details" dialog --> - <string name="message_details_title">Детали сообщения</string> - <!-- Label in "Message details" dialog --> - <string name="message_type_label">Тип сообщения\u000A</string> - <!-- "Type" value in "Message details" dialog --> - <string name="text_message">Текстовое сообщение</string> - <!-- "Type" value in "Message details" dialog --> - <string name="multimedia_message">Мультимедийное сообщение</string> - <!-- "Type" value in "Message details" dialog --> - <string name="multimedia_notification">Уведомление мультимедийного сообщения</string> - <!-- Label in "Message details" dialog showing who sent the message. --> - <string name="from_label">От\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="to_address_label">Для\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="bcc_label">Скрытая копия\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="sent_label">Отправлено\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="received_label">Принято\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="saved_label">Сохранённые\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="subject_label">Тема\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="message_size_label">Размер сообщения\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="priority_label">Важность\u000A</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_high">Высокий</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_normal">Обычный</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_low">Низкий</string> - <!-- Label in "Message details" dialog --> - <string name="message_class_label">Уровень сообщения\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="error_code_label">Код ошибки\u000A</string> - <!-- Alert dialog title when creating a slideshow [CHAR LIMIT=none] --> - <string name="building_slideshow_title">Создание слайд-шоу</string> - <!-- Tag appearing on conversations in the conversation list that contain a draft message --> - <string name="has_draft">Черновик</string> - <!-- In conversation list items, this is the separator between a contact's name and the draft stamp [CHAR LIMIT=5] --> - <string name="draft_separator">,\u0020</string> - <!-- In conversation list items, this comes after the receipient's name and contains the number of messages in the thread [CHAR LIMIT=5] --> - <string name="message_count_format">\u00a0<xliff:g id="number" example="1">%1$s</xliff:g></string> - <!-- For debugging: Dialog box title indicating there's a situation where data has unexpectedly changed --> - <string name="error_state">Неконсистентное состояние</string> - <!-- For debugging: Dialog box text indicating there's a situation where data has unexpectedly changed --> - <string name="error_state_text">Некорректное состояние переписок и получателей. Пожалуйста отправьте сообщение об ошибке и сообщите об этом через http://go/droidanizer </string> - <!-- This is the dialog title for the "Select link" dialog, shown when the user clicks on a - chat in the chat history view if there are links in the chat message. The dialog displays the - links if there are any --> - <string name="select_link_title">Выбор действий</string> - <!-- In message list items, this string builds the timestamp line when the message is in a group [CHAR LIMIT=NONE] --> - <string name="message_timestamp_format"><xliff:g id="string" example="Fred Flinstone">%1$s</xliff:g>\u0020-\u0020<xliff:g id="string" example="9:39AM">%2$s</xliff:g></string> - <!--Message sending status: sending--> - <string name="status_sending">Отправка…</string> - <!--Message sending status: failed--> - <!--<string name="status_failed">Failed. Tap to retry</string>--> - <!-- Delivery Report Activity --> - <!-- Status in "Report" window --> - <string name="status_none">(Нет)</string> - <!-- Status in "Report" window --> - <string name="status_pending">Ожидающие</string> - <!-- Status in "Report" window --> - <string name="status_read">Прочитано</string> - <!-- Status in "Report" window --> - <string name="status_received">Полученные</string> - <!-- Status in "Report" window --> - <string name="status_failed">ошибка. Нажмите для выбора вариантов</string> - <!-- Status in "Report" window --> - <string name="status_unread">Непрочитанные</string> - <!-- Status in "Report" window --> - <string name="status_rejected">Отклоненные</string> - <!-- Label in "Report" window --> - <string name="recipient_label">Получатель:\u0020</string> - <!-- Label in "Report" window --> - <string name="status_label">Статус:\u0020</string> - <!-- Label in "Report" window [CHAR LIMIT=50]--> - <string name="delivered_label">Доставлено:\u0020</string> - <string name="do_something">сделать что-нибудь</string> - <!-- Confirm Delete --> - <!-- Delete confirmation dialog title --> - <string name="confirm_dialog_title">Удалить?</string> - <!-- Delete confirmation dialog title for locked messages --> - <string name="confirm_dialog_locked_title">Удалить заблокированное сообщение?</string> - <!-- This message is displayed in a confirmation dialog when the user selects one or more - conversations and then taps the "Delete" button. --> - <plurals name="confirm_delete_conversation"> - <!-- Case of 1 result. --> - <item quantity="one">Одна переписка будет удалена.</item> - <item quantity="few"><xliff:g id="number" example="15">%1$s</xliff:g> переписок будет удалено.</item> - <!-- Case of 0 or 2 or more results. --> - <item quantity="other"><xliff:g id="number" example="15">%1$s</xliff:g> переписок будет удалено.</item> - </plurals> - <string name="confirm_delete_conversation">Переписка будет удалена целиком.</string> - <!-- Delete all threads confirmation dialog message --> - <string name="confirm_delete_all_conversations">Все переписки будут удалены.</string> - <!-- Delete message confirmation dialog message --> - <string name="confirm_delete_message">Сообщение будет удалено.</string> - <!-- Delete message confirmation dialog message for a locked message --> - <string name="confirm_delete_locked_message">Удалить это заблокированное сообщение?</string> - <!-- Delete all the messages on the SIM dialog message --> - <string name="confirm_delete_all_SIM_messages">Все сообщения на SIM-карте будут удалены.</string> - <!-- Delete the selected message on the SIM dialog message --> - <string name="confirm_delete_SIM_message">Это сообщение на SIM-карте будет удалено.</string> - <!-- Delete unlocked checkbox title --> - <string name="delete_unlocked">Удалить заблокированные сообщения</string> - <!-- Delete button title --> - <string name="delete">Удалить</string> - <!-- More button title --> - <string name="more">дополнительно</string> - <!-- More button summary --> - <string name="more_summary">Нажмите, чтобы увидеть больше</string> - <!-- Action bar mode title when multi-selecting conversations --> - <string name="select_conversations">Выберите переписку</string> - <!-- Show this in the middle of the main activity when there are no conversations [CHAR LIMIT=none] --> - <string name="no_conversations">нет разговоров.</string> - <!-- Show this in the middle of the main activity when loading conversations [CHAR LIMIT=none] --> - <string name="loading_conversations">Загрузка разговоров.</string> - <!-- Tells the user that QKSMS isn't the default SMS app --> - <string name="not_default">приложение SMS по умолчанию</string> - <!-- Tells the user they need to set QKSMS as the default app in order to use this feature --> - <string name="default_info">QKSMS должен быть приложением по умолчанию для SMS чтобы использовать эту функцию</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to mark messages as read --> - <string name="not_default_mark_read">QKSMS должен быть приложением по умолчанию для SMS чтобы отметить сообщения прочитанными</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to mark messages as unread --> - <string name="not_default_mark_unread">QKSMS должен быть приложением по умолчанию для SMS чтобы отметить сообщения НЕпрочитанными</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to send messages --> - <string name="not_default_delete">QKSMS должен быть приложением по умолчанию для SMS чтобы удалять сообщения</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to delete messages --> - <string name="not_default_send">QKSMS должен быть приложением по умолчанию для SMS чтобы отправлять сообщения</string> - <!-- Tells the user they should set QKSMS as the default messaging app --> - <string name="not_default_first">Некоторые вещи не будут работать до тех пор, пока QKSMS не будет назначен приложением по умолчанию для SMS</string> - <string name="delayed_messaging_info">Задержка сообщений позволяет вам отменить сообщения перед отправкой. Изменить поведение по умолчанию можно в настройках</string> - <string name="delayed_duration_bounds_error">Длительность должна быть между 1 и 30 секунд</string> - <!-- Dialog title for the Read Report dialog. --> - <string name="confirm">Подтвердить</string> - <!-- Dialog text for the Read Report dialog. --> - <string name="message_send_read_report">Отчет о прочтении будет отправлен.</string> - <!-- Dialog title for updating app icon color --> - <string name="update_icon_title">обновить цвет значка</string> - <!-- Dialog message for updating app icon color --> - <string name="update_icon_message">QKSMS должен быть перезапущен для изменения цвета значка</string> - <string name="dialog_conversation_details_title">Подробности переписки</string> - <string name="dialog_conversation_details_last_message_date">Дата последнего сообщения</string> - <string name="dialog_conversation_details_message_count">Количество сообщений</string> - <string name="dialog_conversation_details_recipients">Получатели (%s)</string> - <string name="dialog_should_i_answer_title">Небери трубку не установлено</string> - <string name="dialog_should_i_answer_message">Скачать приложение с Google Play сейчас?</string> - <string name="dialog_delete_old_messages">Вы уверены что хотите чтобы старые сообщения удалялись автоматически?</string> - <!-- Title for audio file picker --> - <string name="select_audio">Выбрать аудио</string> - <!-- Menu title to copy an attachment to the shared storage [CHAR LIMIT=25] --> - <string name="copy_to_sdcard">Сохранить вложение</string> - <!-- Toast message on successful copy to shared storage [CHAR LIMIT=30] --> - <string name="copy_to_sdcard_success">Вложение сохранено.</string> - <!-- Toast message on failed copy to shared storage [CHAR LIMIT=30] --> - <string name="copy_to_sdcard_fail">Не удается сохранить вложение.</string> - <!-- Menu title to save a sound as a ringtone --> - <string name="save_ringtone">Сохранить как рингтон</string> - <!-- Toast message on successful copying ringtone to drm provider --> - <string name="saved_ringtone">Рингтон сохранен.</string> - <!-- Toast message on failed copying ringtone to drm provider --> - <string name="saved_ringtone_fail">Не удается сохранить рингтон.</string> - <!-- Menu item --> - <!-- Menu item [CHAR LIMIT=40] --> - <string name="menu_group_participants">Участники группы</string> - <!--Toast shown when a draft is saved--> - <string name="toast_draft">Черновик сохранён</string> - <!--Toast shown when a conversation is deleted--> - <string name="toast_conversation_deleted">Переписка удалена</string> - <!--Toast shown when device is low on storage--> - <string name="toast_low_memory">"Память телефона заполнена. Удалите некоторые файлы, чтобы освободить пространство."</string> - <!--Toast shown to tell user that forwarding messages doesn't work yet--> - <string name="toast_forward">Эта функция пока не реализована. -А сейчас, пожалуйста, используйте Копировать и Вставить текст в переписку, который вы хотите переслать</string> - <!--Toast shown for unimplemented features--> - <string name="toast_unimplemented">Эта функция пока не реализована</string> - <!--Toast shown when a message fails to send--> - <string name="toast_message_failure">Не удалось отправить сообщение</string> - <!--Toast shown when a message is delivered--> - <string name="toast_message_delivered">Сообщение доставлено</string> - <!--Toast shown when a message is not delivered--> - <string name="toast_message_not_delivered">Сообщение не доставлено</string> - <!--Toast shown when default APNs are loaded--> - <string name="toast_default_apns_loaded">Загружены стандартные настройки APN</string> - <!--Toast shown when text is copied to the clipboard--> - <string name="toast_copy_text">Текст скопирован в буфер</string> - <!--Toast shown when Google Play Services is not available for purchasing a product--> - <string name="toast_billing_not_available">Для покупки требуется учетная запись магазина Google Play</string> - <!--Toast shown when Google Play Services is not available for purchasing a product--> - <string name="toast_endlessjabber_not_installed">EndlessJabber не установлен, открытие Google Play</string> - <string name="toast_changelog_error">Не удается загрузить список изменений. Пожалуйста, повторите попытку позже</string> - <string name="toast_conversation_error">Не удается открыть переписку</string> - <string name="toast_deleting_old_messages">Ваши старые сообщения скоро будут удалены</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_1">Благодарим за пожертвование! Теперь Вы наш новый лучший друг.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_2">Спасибо за пожертвование! Мы любим тебя.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_3">Спасибо за пожертвование! Вы помогаете QKSMS стать лучшим приложением для переписки когда либо сделанным.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_4">Спасибо за пожертвование! Ты классный.</string> - <!--Menu option to mute conversation--> - <string name="menu_mute_conversation">выключить звук уведомления в переписке</string> - <!--Menu option to mute conversation--> - <string name="menu_unmute_conversation">включить звук уведомлений в переписке</string> - <string name="menu_block_conversations">Заблокировать переписки</string> - <string name="menu_unblock_conversations">Разблокировать переписки</string> - <string name="menu_messages">Сообщения</string> - <string name="menu_blocked">Заблокирован</string> - <string name="menu_blocked_conversations">Заблокировано (%s новых)</string> - <string name="menu_unblocked_conversations">Сообщения (%s новых)</string> - <string name="menu_notifications">Уведомления</string> - <string name="menu_notifications_off">Отключить уведомления</string> - <string name="menu_notification_settings">Параметры переписки</string> - <string name="menu_view_details">Показать подробности</string> - <string name="menu_mark_read">Пометить прочитанным</string> - <string name="menu_mark_unread">Пометить непрочитанным</string> - <string name="menu_delete_conversation">Удалить переписку</string> - <string name="menu_multi_select">Выбрать переписку</string> - <string name="menu_done">Готово</string> - <string name="failed_message_title">Параметры ошибки сообщения</string> - <!--Toast shown to tell the user that they don't have a photo attachments app, and suggests that they download one--> - <string name="attachment_app_not_found">Приложение не найдено. Попробуйте установить приложение для просмотра Фото!</string> - <string name="attachment_camera_error">нет доступа к камере</string> - <string name="pref_max_mms_attachment_size">Максимальный размер вложения MMS</string> - <string name="error_no_recipients">Выберите несколько контактов, чтобы отправить это сообщение!</string> - <string name="error_file_not_found">QKSMS не может получить доступ к файлу, которым вы пытаетесь поделиться!</string> - <string name="sending_blocked_welcome_screen_message">вы быстро и легко сможете общаться!</string> - <string name="notification_colored_icon_ready">нажмите чтобы добавить значёк на рабочий стол.</string> - <string name="notification_title_colored_icon_ready">QKSMS цвет значка Готов</string> - <string name="icon_ready">Ваш новый значок готов!</string> - <string name="icon_ready_message">Теперь можно добавить его на домашний экран с обновлённым цветом.</string> - <string name="dont_ask_again">Не спрашивать снова</string> - <string name="warning">уязвимость Stagefright</string> - <string name="stagefright_warning">Видео сообщения могут содержать вредоносные данные которые могут открывать доступ к системе вашего устройства злоумышленникам. хотите продолжить?</string> - <!-- MMS DIALOG SETUP STRINGS --> - <string name="mms_setup_set_up_mms_title">Настроить MMS?</string> - <string name="mms_setup_set_up_mms_body">Похоже, что MMS еще не настроен в QKSMS. Нажмите ok, чтобы настроить автоматически.</string> - <string name="mms_setup_setting_up_later_title">Настроить MMS позже</string> - <string name="mms_setup_setting_up_later_body">Посетите раздел MMS настройки, чтобы попробовать автоматическую конфигурацию, обратиться в службу поддержки, или ввести собственную конфигурацию.</string> - <string name="mms_setup_no_configurations_found_title">настройки не обнаружены</string> - <string name="mms_setup_no_configurations_found_body">Мы не смогли найти настройки MMS для вашего оператора автоматически. Нажмите ok чтобы связаться со службой поддержки. Мы поможем вам настроить! </string> - <string name="mms_setup_one_configuration_found_title">обнаружена 1 настройка</string> - <string name="mms_setup_one_configuration_found_body">Мы нашли MMS настройки для оператора %s. возможно они подойдут</string> - <string name="mms_setup_multiple_configurations_found_title">обнаружено несколько конфигураций</string> - <string name="mms_setup_multiple_configurations_found_body">Мы нашли несколько конфигураций MMS. Выберите вашего оператора из списка, или если ваш оператор отсутствует в списке, нажмите н/д.</string> - <string name="mms_setup_next_steps_title">Следующий шаг</string> - <string name="mms_setup_next_steps_body">Посетите раздел MMS настройки, чтобы попробовать автоматическую конфигурацию снова, или ввести собственную конфигурацию.</string> - <string name="mms_setup_success_title">Готово!</string> - <string name="mms_setup_success_body">Если у вас возникнут вопросы, Посетите раздел MMS настройки, чтобы попробовать автоматическую конфигурацию, обратиться в службу поддержки, или ввести собственную конфигурацию.</string> - <string name="na">Н/Д</string> - <string name="no">Нет</string> - <string name="pref_automatically_configure_mms">Автоматическая настройка MMS</string> - <string name="pref_mms_contact_support">Обратится в службу поддержки</string> - <string name="pref_category_sending_mms">Отправка MMS</string> - <string name="pref_category_mms_configuration">Настройка MMS</string> - <string name="pref_mms_contact_support_summary">Связаться с командой QKSMS для помощи в настройке MMS</string> - <string name="pref_markdown_enabled">Форматирование текста</string> - <string name="pref_markdown_enabled_summary">Используйте полужирный шрифт, подчеркивание, и курсив в ваших сообщениях</string> - <string name="want_read_indicators">Хотите ли читать индикаторы?</string> - <string name="color_swatch_description">Цвет %1$d</string> - <string name="color_swatch_description_selected">%1$d цвет выбран</string> - <string name="color_picker_default_title">Выберите цвет</string> - <string name="message_delivered">Сообщение доставлено</string> - <string name="message_not_delivered">Сообщение не доставлено</string> - <string name="error">Ошибка</string> - <string name="invalid_destination">Недопустимый адрес доставки.</string> - <string name="service_not_activated">Услуга не доступна в сети.</string> - <string name="service_message_not_found">Истекло время хранения сообщения или сервис не доступен.</string> - <string name="service_network_problem">Не удалось отправить из-за проблем с сетью.</string> - <string name="message_queued">В настоящее время не удается отправить ваше сообщение. Оно будет отправлено, когда сервис станет доступным.</string> - <string name="download_later">Не удается загрузить прямо сейчас. Повторите попытку позже.</string> - <string name="no_apn">Не указан APN для приложения, необходимо задать его в настройках!</string> - <string name="no_subject">(Тема не указана)</string> - <string name="unknown_sender">Неизвестный отправитель</string> - <string name="dl_failure_notification">Не удалось загрузить сообщение <xliff:g id="subject">%1$s</xliff:g> from <xliff:g id="from">%2$s</xliff:g>.</string> - <string name="auto_select_multiple_apns">Было найдено несколько различных конфигураций. Попробуйте одну. Если она не работает, вы можете попробовать новую, перейдя в настройки > Дополнительно > Загрузить APN по умолчанию.</string> - <string name="auto_select_apn">Автоматически выбирать APN</string> - <string name="auto_select_failed_title">Ошибка автоматической конфигурации</string> - <string name="auto_select_failed">Попробуйте найти настройки APN для вашего оператора (MMSC, порт и прокси) и введите их в настройки > Дополнительно.</string> - <string name="date_yesterday">Вчера</string> - <string name="date_just_now">сейчас</string> - <string name="compose_loading_attachment">Загрузка вложений</string> - <string name="hint_no_messages">Пока нет сообщений. \nНажми + чтобы написать!</string> - <string-array name="resend_menu"> - <item>повторно отправить</item> - <item>Изменить</item> - <item>Удалить</item> - </string-array> - <string-array name="message_menu"> - <item>Переслать сообщение</item> - <item>Скопировать текст</item> - <item>Показать подробности</item> - <item>Удалить сообщение</item> - </string-array> - <string-array name="background_titles"> - <item>Светлый \"осязаемый\"</item> - <item>Тёмный \"осязаемый\"</item> - <item>Чёрный</item> - </string-array> - <string-array name="font_sizes"> - <item>Маленький</item> - <item>Обычный</item> - <item>Крупный</item> - <item>Самый крупный</item> - </string-array> - <string-array name="font_families"> - <item>Roboto обычный</item> - <item>Roboto узкий</item> - <item>Системный шрифт</item> - </string-array> - <string-array name="font_weights"> - <item>Тонкий</item> - <item>Обычный</item> - </string-array> - <!-- String to match as no subject and filter out as a subject. For example, if the - subject string is "no subject", we won't display that. We'll pretend - no subject string was delivered. --> - <string-array name="empty_subject_strings"> - <item>тема не указана</item> - </string-array> - <string-array name="qk_responses"> - <item>Хорошо</item> - <item>Дайте мне минуту</item> - <item>Мне по пути</item> - <item>Спасибо</item> - <item>Звучит заманчиво</item> - <item>Что случилось?</item> - <item>Согласен</item> - <item>Нет</item> - <item>Люблю тебя</item> - <item>Извините</item> - <item>LOL</item> - <item>Это нормально</item> - </string-array> - <string-array name="enter_button_options"> - <item>Показать emoji</item> - <item>Новая строка</item> - <item>Отправить сообщение</item> - </string-array> - <string-array name="notification_private_options"> - <item>Показывать всё</item> - <item>Скрыть сообщение</item> - <item>Скрыть отправителя и сообщение</item> - </string-array> - <!-- Max MMS attachment sizes. I.e. will compress pictures that are larger than 300 KB down to - under 300KB. --> - <string-array name="max_mms_attachment_sizes"> - <item>300 КБ</item> - <item>600 КБ</item> - <item>1 МБ</item> - <item>Неограниченный размер</item> - </string-array> -</resources> diff --git a/QKSMS/src/main/res/values-sk/strings.xml b/QKSMS/src/main/res/values-sk/strings.xml deleted file mode 100644 index 3fedb95a1..000000000 --- a/QKSMS/src/main/res/values-sk/strings.xml +++ /dev/null @@ -1,769 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!--Generated by crowdin.com--> -<resources xmlns:xliff="http://schemas.android.com/apk/res-auto"> - <!--Slogan--> - <string name="slogan">Obľubte si znova písanie.</string> - <!--Text shown when a phone number cannot be found--> - <string name="unknown_number">Neznáme číslo</string> - <!--Content description for photos--> - <string name="popup_photo_CD">Fotka</string> - <!--Text to be displayed while content is loading--> - <string name="loading">Načítavanie...</string> - <!--Test string--> - <string name="test">Testovacie vlákno</string> - <!--Hint for contacts text field--> - <string name="hint_contacts">Zadajte príjemcu</string> - <!--Hint for search text field--> - <string name="hint_search">Hľadať niečo</string> - <!--Hint for message reply text field--> - <string name="hint_reply">Zadajte správu</string> - <!--Hint for code redemption--> - <string name="hint_redeem">Zadajte kód</string> - <string name="hint_hex">Hex</string> - <!--Text shown for single new message in notification--> - <string name="new_message">Nová správa</string> - <!--Text shown after number of unread messages in notification (ex. 3 new messages)--> - <string name="new_messages">nové správy</string> - <!--Text shown for single failed message in notification--> - <string name="failed_message">Správu sa nepodarilo odoslať</string> - <!--Text shown after number of failed messages in notification (ex. 3 messages failed to send)--> - <string name="failed_messages">správy sa nepodarilo odoslať</string> - <!--Text shown under failed message count--> - <string name="failed_messages_summary">Kliknite pre zobrazenie </string> - <!--QuickCompose notification title--> - <string name="quickcompose">QK napísať</string> - <!--QuickCompose notification text--> - <string name="quickcompose_detail">Kliknite pre odoslanie správy</string> - <!--Welcome screen intro button--> - <string name="welcome_start">Začnime!</string> - <!--Allows user to skip welcome screen--> - <string name="welcome_skip">PRESKOČIŤ</string> - <!--Allows user to finish the welcome screen--> - <string name="welcome_finish">DOKONČIŤ</string> - <!--Indicates to user they can pick a color--> - <string name="welcome_theme_title">Vyberte si farbu</string> - <!--Indicates to user they can pick any colors--> - <string name="welcome_theme_description">Akákoľvek farba.</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_night_description">Šetrná k očiam.</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_night_hint">Dotkni sa</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_quickreply_title">QK odpoveď</string> - <!--QK Reply explanation--> - <string name="welcome_quickreply_description">Odpovedajte na správy rýchlejšie.</string> - <!--Prompts user to try QK Reply--> - <string name="welcome_quickreply_hint">Vyskúšajte!</string> - <!--QK Reply demo message--> - <string name="welcome_quickreply_message_1">Fíha! No nebolo to úžasné? V okamihu si môžete prezrieť celú konverzáciu. Dotykom mimo vyskakovacieho okna alebo na zaškrtnutie ju zasa môžete odmietnuť.</string> - <!--QK Reply demo message--> - <string name="welcome_quickreply_message_2">Toto je QK odpoveď. Teraz môžete odpovedať na správy zo všadiaľ. Dotknite sa rozbaľovacieho tlačidla a uvidíte čo sa stane :)</string> - <!--Settings option in menu--> - <string name="menu_settings">Nastavenia</string> - <!--Search option in menu--> - <string name="menu_search">Hľadať</string> - <!--Show full conversation in QuickReply--> - <string name="menu_show_all">Zobraziť všetky správy</string> - <!--Show only unread messages in QuickReply--> - <string name="menu_show_unread">Zobraziť neprečítané správy</string> - <!--Open conversation option in menu (shown in QuickReply)--> - <string name="menu_open_thread">Otvoriť konverzáciu</string> - <!--Forward message option in menu--> - <string name="menu_forward">Poslať ďalej</string> - <!--Call contact option in menu--> - <string name="menu_call">Volať</string> - <!--Mark a message/conversation as read option in menu--> - <string name="menu_read">Označiť ako prečítané</string> - <!--Delete a message option in menu--> - <string name="menu_delete">Vymazať</string> - <!--Donate option in menu--> - <string name="menu_billing">Príspevok</string> - <!--Copy text option in menu--> - <string name="menu_copy">Kopírovať text</string> - <!--Changelog option in menu--> - <string name="menu_changelog">"Čo je nové"</string> - <!--Expand settings option in menu--> - <string name="menu_show_all_prefs">Zobraziť všetko</string> - <!--Show less settings option in menu--> - <string name="menu_show_fewer_prefs">Zobraziť menej</string> - <!--Title for message details popup--> - <string name="details_title">Detaily</string> - <!--Title for address that message is being sent to in message details popup--> - <string name="details_to">Komu</string> - <!--Title for address that message is sent from in message details popup--> - <string name="details_from">Od</string> - <!--Title for text of a message in message details popup--> - <string name="details_body">Telo správy</string> - <!--Title for date sent of a message in message details popup--> - <string name="details_date_sent">Dátum odoslania</string> - <!--Title for date received of a message in message details popup--> - <string name="details_date_received">Dátum prijatia</string> - <!--Title for rate snackbar--> - <string name="rate_title">Páči sa vám QKSMS?</string> - <!--Title for rate button--> - <string name="rate_action">Ohodnotiť</string> - <string name="pref_category_appearance">Vzhľad</string> - <string name="pref_category_summary_appearance">Motívy vzhľadu, písma, farby, avatary a viacej</string> - <string name="pref_category_general">Všeobecné</string> - <string name="pref_category_summary_general">Doručovanie, odosielanie, formátovanie</string> - <string name="pref_category_blocking">Blokovanie správ</string> - <string name="pref_category_notifications">Oznámenia</string> - <string name="pref_category_summary_notifications">Zvuky, LED, súkromie</string> - <string name="pref_category_mms">MMS</string> - <string name="pref_category_summary_mms">Konfigurácia MMS (APN), maximálna veľkosť, skupinové správy</string> - <string name="pref_category_quickreply">QK odpoveď</string> - <string name="pref_category_summary_quickreply">QK odpoveď, nastavenie vyskakujúcich okien</string> - <string name="pref_category_quickcompose">QK napísať</string> - <string name="pref_category_summary_quickcompose">QK napísať, obľúbené kontakty</string> - <string name="pref_category_about">O aplikácií</string> - <string name="pref_category_summary_about">Verzia, zoznam zmien, autori, poďakovanie</string> - <string name="pref_theme">Farba motívu</string> - <string name="pref_theme_summary_alt">Dotykom zmeniť motív</string> - <string name="pref_icon">Icon color</string> - <string name="pref_icon_summary">Tap to change the QKSMS icon color</string> - <string name="pref_status_tint">Farebný stavový riadok</string> - <string name="pref_navigation_tint">Farebný navigačný panel</string> - <string name="pref_background">Farba pozadia</string> - <string name="pref_background_summary">Dotykom zmeníte farbu pozadia</string> - <string name="pref_bubbles">Bublinové správy</string> - <string name="pref_bubbles_summary">Dotykom zmeníte nastavenia bublinových správ</string> - <string name="pref_night">Nočný režim</string> - <string name="pref_night_summary">Šetrí batériu a znižuje podráždenie očí</string> - <string name="pref_night_amoled">Čisto čierne pozadie</string> - <string name="pref_night_amoled_summary">Extrémne šetrenie batérie pre zariadenia s AMOLED displejmi</string> - <string name="pref_bubble_style_new">Používať nový bublinový motív</string> - <string name="pref_color_sent">Farba odoslaných správ</string> - <string name="pref_color_sent_summary">Vyfarbiť pozadie bublín pre odchádzajúce správy</string> - <string name="pref_color_received">Farba prijatých správ</string> - <string name="pref_color_received_summary">Vyfarbiť pozadie bublín pre prichádzajúce správy</string> - <string name="pref_hide_avatar_conversations">Skryť avatary v konverzáciach </string> - <string name="pref_hide_avatar_conversations_summary">Skryť avatary pre kontakty v zozname konverzácií</string> - <string name="pref_hide_avatar_sent">Skryť avatar v odoslaných správach</string> - <string name="pref_hide_avatar_sent_summary">Skryť svoj avatar pre odchádzajúce správy</string> - <string name="pref_hide_avatar_received">Skryť avatar v prijatej správe</string> - <string name="pref_hide_avatar_received_summary">Skryť avatar pre prichádzajúce správy</string> - <string name="pref_font_family">Typ písma</string> - <string name="pref_font_size">Veľkosť písma</string> - <string name="pref_font_weight">Hrúbka písma</string> - <string name="pref_message_count">Počet správ</string> - <string name="pref_message_count_summary">Zobrazovať počet správ pre každú konverzáciu</string> - <string name="pref_sent_timestamps">Časové značky odoslania</string> - <string name="pref_sent_timestamps_summary">Zobraziť časové značky pre čas odoslania, nie prijatia</string> - <string name="pref_force_timestamps">Vynútiť časové značky</string> - <string name="pref_force_timestamps_summary">Zapnúť časové značky pre všetky správy</string> - <string name="pref_key_timestamp_delay">Oneskorenie novej časovej značky</string> - <string name="pref_key_timestamp_delay_summary">Počet minút, ktoré musia uplynúť mezi dvoma správami, aby sa zobrazila nová časová značka.</string> - <string name="pref_compose_favorites">Obľúbené kontakty</string> - <string name="pref_compose_summary_favorites">Ukázať vaše obľúbené kontakty pri písaní v QK, čím budú dostupné na jeden dotyk</string> - <string name="pref_prox_sensor_call">Senzor priblíženia</string> - <string name="pref_prox_sensor_call_summary">Pre zavolanie kontaktu priamo z konverzácie si priložte telefón k uchu</string> - <string name="pref_delivery">Potvrdenie o doručení</string> - <string name="pref_delivery_summary">Potvrdiť úspešné doručenie správy</string> - <string name="pref_delivery_toast">Zobraziť toast</string> - <string name="pref_delivery_toast_summary">Krátke toast oznámenie o doručení správy prijímateľovi</string> - <string name="pref_delivery_vibrate">Vibrovať</string> - <string name="pref_delivery_vibrate_summary">Vibrovať pri prijatí potvrdenia o doručení</string> - <string name="pref_delete_old_messages">Vymazať staré správy</string> - <string name="pref_delete_old_messages_summary">Automaticky vymazať dostatočne staré správy</string> - <string name="pref_delete_old_messages_unread">Neprečítané správy</string> - <string name="pref_delete_old_messages_unread_summary">Automaticky vymazať neprečítané správy po %s dňoch</string> - <string name="pref_delete_old_messages_read">Prečítané správy</string> - <string name="pref_delete_old_messages_read_summary">Automaticky vymazať prečítané správy po %s dňoch</string> - <string name="pref_yappy">Integrácia Yappy</string> - <string name="pref_endlessjabber_summary">Zapnút plnú podporu Yappy</string> - <string name="pref_blocked_conversations">Blokované konverzácie</string> - <string name="pref_blocked_conversations_summary">Dlhé podržanie prsta na konverzácií a presunutie do blokovanej schránky pre zastavenie daľsích správ</string> - <string name="pref_block_future">Blokovať budúce správy</string> - <string name="pref_block_future_summary">Pridať ďalšie čísla, ktoré budú blokované</string> - <string name="pref_should_i_answer">Integrácia Should I Answer?</string> - <string name="pref_should_i_answer_summary">Automaticky zmazať prichádzajúce správy z čisiel, ktoré sú blokované cez Should I Answer?</string> - <string name="pref_mobile_only">Čísla mobilu</string> - <string name="pref_mobile_only_summary">Pri návrhoch kontaktov zobrazovať len čisla mobilov</string> - <string name="pref_auto_emoji">Automatické emoji</string> - <string name="pref_auto_emoji_summary">Nahradiť text obrázkom emoji</string> - <string name="pref_enter_button">Tlačidlo Enter</string> - <string name="pref_enter_button_summary">Dotykom zmeniť správanie sa tlačidla Enter</string> - <string name="pref_compose_group">Skupinové správy</string> - <string name="pref_compose_group_summary">Pri písaní správy viacerým prijímateľom, poslať skupinovú správu namiesto jednotlivých správ</string> - <string name="pref_auto_download">Automatické preberanie MMS</string> - <string name="pref_auto_download_summary">Automatické preberať nové MMS správy v okamžiku keď sú dostupné</string> - <string name="pref_auto_data">Automatické mobilné dáta</string> - <string name="pref_auto_data_summary">Automaticky zapnúť mobilné dáta pri odosielaní alebo prijímaní MMS</string> - <string name="pref_split">Rozdeliť SMS</string> - <string name="pref_split_summary">Rozdeliť dlhé správy do samostatných správ</string> - <string name="pref_split_counter">Počítadlo rozdelenia správ</string> - <string name="pref_split_counter_summary">Pridať počítadlo k rozdeleným správam</string> - <string name="pref_long_as_mms">Odoslať dlhé správy ako MMS</string> - <string name="pref_long_as_mms_summary">Odoslať dlhé správy ako MMS, namiesto ich rozdelenia na menšie</string> - <string name="pref_long_as_mms_after">Od koľko menších správ poslať ako MMS</string> - <string name="pref_long_as_mms_after_summary">Odoslať dlhé správy ako MMS, ak prekročía limit počtu správ</string> - <string name="pref_return">Zobraziť tlačidlo späť</string> - <string name="pref_return_summary">Zobraziť na klávesnici tlačidlo späť namiesto tlačidla pre Emotikony</string> - <string name="pref_text">Text</string> - <string name="pref_notifications">Povoliť oznámenia</string> - <string name="pref_led">LED oznámenia</string> - <string name="pref_theme_led">Farba LED upozornenia</string> - <string name="pref_wake">Prebudiť telefón</string> - <string name="pref_wake_summary">Zapnúť obrazovku pri prijatí novej správy</string> - <string name="pref_notifications_private">Súkromné oznámenia</string> - <string name="pref_notifications_private_summary">Dotykom nastaviť, čo sa nemá zobraziť v upozorneniach</string> - <string name="pref_ringtone">Zvuk oznámenia</string> - <string name="pref_ringtone_summary">Vyberte zvuk pre oznámenie</string> - <string name="pref_ticker">Zobraziť časť správy</string> - <string name="pref_ticker_summary">Zobraziť časť správy v paneli oznámení</string> - <string name="pref_vibration">Vibrácie</string> - <string name="pref_vibration_summary">Vibrovať pri prijatí novej správy</string> - <string name="pref_notification_call">Tlačidlo pre hovor</string> - <string name="pref_notification_call_summary">Zavolať odosielateľovi správy priamo z oznámenia</string> - <string name="pref_dimiss_read">Označiť ako prečítané</string> - <string name="pref_dismiss_read_summary">Pri zatvorení oznámenia označiť správu ako prečítanú</string> - <string name="pref_delayed">Oneskorené odosielanie správ</string> - <string name="pref_delayed_summary">Počkať pred odoslaním správy, aby ste mali možnosť ju skontrolovať</string> - <string name="pref_delayed_duration">Oneskorenie (sekundy)</string> - <string name="pref_delayed_duration_summary">Oneskorenie pred odoslaním správy</string> - <string name="pref_night_auto">Automatický nočný režim</string> - <string name="pref_night_auto_summary">Zapnúť nočný režim automaticky podľa času</string> - <string name="pref_day_start">Deň začína</string> - <string name="pref_night_start">Noc začína</string> - <string name="pref_qk_responses">QK odpovede</string> - <string name="pref_qk_responses_summary">Upravte si prednastavené odpovede, používané zo zariadenia Android Wear</string> - <string name="pref_quickreply_enabled">QK odpoveď zapnutá</string> - <string name="pref_quickreply_enabled_summary">Zobraziť okno QK odpovede hneď po obdržaní novej správy</string> - <string name="pref_tap_to_quit">Ťuknúť na zrušenie</string> - <string name="pref_tap_to_quit_summary">Dotykom mimo zobrazovaného okna zavrieť okno</string> - <string name="pref_quickcompose">QK napísať zapnuté</string> - <string name="pref_quickcompose_summary">Zobraziť oznámenie, ktoré umožňuje vytvoriť novú správu</string> - <string name="pref_mms_enabled">MMS zapnuté</string> - <string name="pref_mms_enabled_summary">Povoliť odosielanie a prijímanie MMS správ</string> - <string name="pref_mmsc_url">MMSC</string> - <string name="pref_mms_proxy">MMS proxy</string> - <string name="pref_mms_port">MMS port</string> - <string name="pref_apn_chooser">Načítať predvolené názvy prístupových bodov</string> - <string name="pref_strip_unicode">Odstrániť unicode znaky</string> - <string name="pref_strip_unicode_summary">Zameniť znaky, ktoré nie sú podporované vo full-length správach za znaky kompatibilné s GSM</string> - <string name="pref_system_bar_flat">Ploché systémové lišty</string> - <string name="pref_system_bar_flat_summary">Zbavte sa gradientu v lište systémového UI na väčšine zariadení KitKat</string> - <string name="pref_status_compat">Oprava stavového riadku</string> - <string name="pref_status_compat_summary">Rieši problémy spôsobené pohlcujúcim režimom, Xposed modulom Tinted Status Bar alebo vlastným nastavením DPI</string> - <string name="pref_navigation_compat">Oprava navigačného panelu</string> - <string name="pref_navigation_compat_summary">Rieši problémy spôsobené pohlcujúcim režimom, Xposed modulom Tinted Status Bar alebo vlastným nastavením DPI</string> - <string name="pref_about_version_title">Verzia QKSMS</string> - <string name="pref_about_authors_title">Autori</string> - <string name="pref_about_authors_summary">Moez Bhatti</string> - <string name="pref_changelog_summary">Poklepaním zobraziť zoznam zmien</string> - <string name="pref_about_thanks_title">Ďakujem</string> - <string name="pref_about_thanks_summary">Poklepaním zobraziť prispievateľov do projektu</string> - <string name="pref_donate_title">Príspevok</string> - <string name="pref_donate_summary">QKSMS je zadarmo. Podporte nás a prispejte na jeho vývoj!</string> - <string name="pref_about_gplus_title">Google+</string> - <string name="pref_about_gplus_summary">Pripojte sa ku skupine QKSMS Besta Testers na Google+</string> - <string name="pref_about_github_title">GitHub</string> - <string name="pref_about_github_summary">QKSMS je open source. Zapojte sa a hláste chyby na GitHub</string> - <string name="pref_about_crowdin_title">Crowdin</string> - <string name="pref_about_crowdin_summary">Zapojta sa do prekladateľského projektu na Crowdine</string> - <!--Preference subcategory--> - <string name="pref_subcat_theme">Téma</string> - <!--Preference subcategory--> - <string name="pref_subcat_system_bars">Systémové lišty</string> - <!--Preference subcategory--> - <string name="pref_subcat_categories">Kategórie</string> - <!--Preference subcategory--> - <string name="pref_subcat_font">Písmo</string> - <!--Preference subcategory--> - <string name="pref_subcat_messages">Správy</string> - <!--Preference subcategory--> - <string name="pref_subcat_avatars">Avatary</string> - <string name="donate_google">Prispieť cez Google</string> - <string name="donate_google_summary">Google si berie 30 % z darovanej čiastky</string> - <string name="donate_paypal">Prispieť cez PayPal</string> - <string name="donate_paypal_button">Prispieť ľubovoľnou čiastkou</string> - <string name="donate_paypal_button_summary">Kúpte mi čo len chcete!</string> - <!--Donation product name--> - <string name="product_name_donation">Príspevok</string> - <!--$1 donation product name--> - <string name="product_name_donate_1">Prispejte $1 USD</string> - <!--$5 donation product name--> - <string name="product_name_donate_5">Prispejte $5 USD</string> - <!--$3 donation product name--> - <string name="product_name_donate_10">Prispejte $10 USD</string> - <!--$1 donation product description--> - <string name="product_description_donate_1">Kúpte mi kolu</string> - <!--$5 donation product description--> - <string name="product_description_donate_5">Kúpte mi sendvič</string> - <!--$10 donaion product description--> - <string name="product_description_donate_10">Kúpte mi obed</string> - <string name="title_settings">Nastavenia</string> - <string name="title_search">Hľadať</string> - <string name="title_compose">Nová správa</string> - <string name="title_conversation_list">Konverzácie</string> - <string name="title_blocked">Zablokované</string> - <string name="title_changelog">Zoznam zmien</string> - <string name="title_picker">Nové správy</string> - <string name="title_donate">Prispieť</string> - <string name="title_qk_responses">QK Odpovede</string> - <string name="title_block_address">Blokovať číslo</string> - <string name="title_unblock_address">Povoliť číslo</string> - <string name="title_conversations_selected">%s vybraných</string> - <string name="title_palette">Paleta</string> - <string name="title_rgb">RGB</string> - <!-- Menu shown in the context menu when long pressing on a message when the message contains - one or more phone numbers and/or email addresses and the number or email is new to - contacts. [CHAR LIMIT=50] --> - <string name="menu_add_address_to_contacts">Pridať <xliff:g id="contactEmailOrNumber">%s</xliff:g> do kontaktov</string> - <!-- Context menu item on an individual message for viewing an attached slideshow --> - <string name="view_slideshow">Zobraziť prezentáciu</string> - <!-- Context menu item on an individual message for viewing message details such as time and date --> - <string name="view_message_details">Zobraziť detaily</string> - <!-- Context menu item on an individual message for viewing a delivery report --> - <string name="view_delivery_report">Zobraziť potvrdenie o doručení</string> - <!-- Context menu item on an individual message for deleting only that message --> - <string name="delete_message">Odstrániť</string> - <!-- Abbreviation for "kilobyte" --> - <string name="kilobyte">KB</string> - <!-- Individual message context menu item --> - <string name="copy_message_text">Kopírovať text</string> - <!-- Header for context menu on an individual message --> - <string name="message_options">Možnosti správy</string> - <!-- Delivery Header View --> - <!-- Title of "Report" window --> - <string name="delivery_header_title">Potvrdenie o doručení</string> - <!--Text for app restart confirmation dialog--> - <string name="restart_message">Tieto zmeny sa prejavia po reštartovaní QKSMS</string> - <!--Dialog title for asking if a user wants to delete a conversation--> - <string name="delete_conversation">Odstrániť konverzáciu</string> - <!--Dialog title for asking if a user wants to delete all failed messages--> - <string name="delete_all_failed">Odstrániť nedoručené správy</string> - <!--CDialog title for asking if a user wants to delete a conversation--> - <string name="delete_confirmation">Ste si istý, že chcete odstrániť (%s) konverzáci(u/e/í)?</string> - <!--CDialog title for asking if a user wants to delete all failed messages--> - <string name="delete_all_failed_confirmation">Ste si istý, že chcete odstrániť nedoručené správy z (%s) konverzáci(e/í)?</string> - <!--(Unused) Dialog title shown if APNs have not been set--> - <string name="apns_not_set">Názvy prístupových bodov nie sú nastavené</string> - <!--(Unused) Dialog description shown if APNs have not been set--> - <string name="apns_not_set_description">Zdá sa, že vaše názvy prístupových bodov nie sú nastavené. To znamená, že MMSky nebudú fungovať správne. Po kliknutí na \"OK\" to QKSMS nastaví za vás :)</string> - <!--Dialog title show if MMS hasn't been configured--> - <string name="set_up_mms_title">Nastaviť MMS?</string> - <!--Dialog description shown if MMS hasn't yet been configured--> - <string name="set_up_mms_description">Zdá sa, že MMSky ešte neboli nakonfigurované v QKSMS. Stlačte OK pre automatickú konfiguráciu MMS.</string> - <!-- Dialog message text explaining that a draft message will not be saved due to invalid recipients --> - <string name="discard_message_reason">Vaša správa bude odstránená pretože nemá platných príjemcov.</string> - <string name="invalid_code">Neplatný kód</string> - <!--Button to restart app now instead of manually later--> - <string name="restart">Reštartovať teraz</string> - <!--Notification action to reply to a message--> - <string name="reply">Odpovedať</string> - <!--Notification action to reply to a message--> - <string name="reply_qksms">Odpovedať cez QKSMS</string> - <!--Notification action to mark a message as read--> - <string name="read">Prečítať</string> - <!--Notification action to mark a message as read--> - <string name="mark_read">Označit ako prečítané</string> - <!--Notification action to call the sender of a message--> - <string name="call">Volať</string> - <!-- Notification toast message --> - <string name="notification_mute_on">Upozornenia zapnuté</string> - <string name="notification_mute_off">Upozornenia vypnué</string> - <!--Positive action button--> - <string name="yes">Áno</string> - <string name="add">Pridať</string> - <!--Positive action button--> - <string name="save">Uložiť</string> - <!--Positive action button--> - <string name="enable">Povoliť</string> - <!--Positive action button--> - <string name="upgrade_now">Nastaviť teraz</string> - <!--Positive action button--> - <string name="okay">OK</string> - <!--Positive action button--> - <string name="redeem">Uplatniť</string> - <!--Neutral action button--> - <string name="just_once">Len raz</string> - <!--Neutral action button--> - <string name="later">Neskôr</string> - <!--Neutral action button --> - <string name="cancel">Zrušiť</string> - <!-- Name of the local user when displaying sender of an outgoing message (personal pronoun) --> - <string name="messagelist_sender_self">Ja</string> - <!-- Sender to be used if the sender address has been hidden --> - <string name="hidden_sender_address">Skrytá adresa odosielateľa</string> - <!-- Subject to display in the conversation list if there is no subject --> - <string name="no_subject_view">(Bez predmetu)</string> - <!-- Time and date a message is due to expire --> - <string name="expire_on">"Koniec platnosti: <xliff:g id="date"> %s </xliff:g>"</string> - <!-- Formatting for subject displayed inline, prepended to MMS message text --> - <string name="inline_subject">"<Subject: <xliff:g id="subject">%s</xliff:g>>"</string> - <!-- Text of a button appearing for MMS messages that have not yet been downloaded, causing the message to be downloaded (imperative verb) --> - <string name="download">Stiahnuť</string> - <!-- Message displayed in place of the "download message" button once it has been pressed, indicating that the download is in progress --> - <string name="downloading">Sťahovanie</string> - <!-- Toast message while an image is being resized --> - <string name="compressing">Obrázok je príliš veľký. Zmenšovanie\u2026</string> - <!-- Header shown above favorite contacts in QKCompose --> - <string name="favorites">Obľúbené kontakty</string> - <!-- Word represents 'self' in a conversation --> - <string name="me">Ja</string> - <string name="menu_edit">Upraviť</string> - <string name="menu_delete_messages">Odstrániť správu</string> - <string name="menu_delete_failed">Vymazať nedoručené správy</string> - <string name="menu_lock">Zamknúť</string> - <string name="menu_unlock">Odomknúť</string> - <!-- When the user tries to view message details and some error occurs while - retrieving those details, this message will be shown. --> - <string name="cannot_get_details">Nemožno získať informácie.</string> - <!-- Title of "Message details" dialog --> - <string name="message_details_title">Detaily správy</string> - <!-- Label in "Message details" dialog --> - <string name="message_type_label">Typ\u000A</string> - <!-- "Type" value in "Message details" dialog --> - <string name="text_message">Textová správa</string> - <!-- "Type" value in "Message details" dialog --> - <string name="multimedia_message">Multimediálna správa</string> - <!-- "Type" value in "Message details" dialog --> - <string name="multimedia_notification">Oznámenia multimediálnej správy</string> - <!-- Label in "Message details" dialog showing who sent the message. --> - <string name="from_label">Od\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="to_address_label">Pre\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="bcc_label">Bcc\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="sent_label">Odeslané\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="received_label">Prijaté\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="saved_label">Uložené\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="subject_label">Predmet\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="message_size_label">Veľkosť správy\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="priority_label">Priorita\u000A</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_high">Vysoká</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_normal">Normálna</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_low">Nízka</string> - <!-- Label in "Message details" dialog --> - <string name="message_class_label">Typ správy\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="error_code_label">Kód chyby\u000A</string> - <!-- Alert dialog title when creating a slideshow [CHAR LIMIT=none] --> - <string name="building_slideshow_title">Vytváranie prezentácie</string> - <!-- Tag appearing on conversations in the conversation list that contain a draft message --> - <string name="has_draft">Návrh</string> - <!-- In conversation list items, this is the separator between a contact's name and the draft stamp [CHAR LIMIT=5] --> - <string name="draft_separator">, \u0020</string> - <!-- In conversation list items, this comes after the receipient's name and contains the number of messages in the thread [CHAR LIMIT=5] --> - <string name="message_count_format">\u00a0 <xliff:g id="number" example="1"> %1$s </xliff:g></string> - <!-- For debugging: Dialog box title indicating there's a situation where data has unexpectedly changed --> - <string name="error_state">Stav nie je podporovaný</string> - <!-- For debugging: Dialog box text indicating there's a situation where data has unexpectedly changed --> - <string name="error_state_text">Stav vlákien a príjemcov sú v rozpore. Prosím zaznamenajte hlásenie o chybe a nahláste to cez http://go/droidanizer </string> - <!-- This is the dialog title for the "Select link" dialog, shown when the user clicks on a - chat in the chat history view if there are links in the chat message. The dialog displays the - links if there are any --> - <string name="select_link_title">Vybrať akciu</string> - <!-- In message list items, this string builds the timestamp line when the message is in a group [CHAR LIMIT=NONE] --> - <string name="message_timestamp_format"><xliff:g id="string" example="Fred Flinstone"> %1$s </xliff:g> \u0020-\u0020 <xliff:g id="string" example="9:39AM"> %2$s </xliff:g></string> - <!--Message sending status: sending--> - <string name="status_sending">Odosielanie...</string> - <!--Message sending status: failed--> - <!--<string name="status_failed">Failed. Tap to retry</string>--> - <!-- Delivery Report Activity --> - <!-- Status in "Report" window --> - <string name="status_none">(Žiadny)</string> - <!-- Status in "Report" window --> - <string name="status_pending">Čaká</string> - <!-- Status in "Report" window --> - <string name="status_read">Prečítať</string> - <!-- Status in "Report" window --> - <string name="status_received">Prijaté</string> - <!-- Status in "Report" window --> - <string name="status_failed">Nedoručené. Poklepaním zobraziť možnosti</string> - <!-- Status in "Report" window --> - <string name="status_unread">Neprečítané</string> - <!-- Status in "Report" window --> - <string name="status_rejected">Zamietnuté</string> - <!-- Label in "Report" window --> - <string name="recipient_label">Príjemca:\u0020</string> - <!-- Label in "Report" window --> - <string name="status_label">Stav:\u0020</string> - <!-- Label in "Report" window [CHAR LIMIT=50]--> - <string name="delivered_label">Doručené:\u0020</string> - <string name="do_something">Urobte niečo</string> - <!-- Confirm Delete --> - <!-- Delete confirmation dialog title --> - <string name="confirm_dialog_title">Odstrániť?</string> - <!-- Delete confirmation dialog title for locked messages --> - <string name="confirm_dialog_locked_title">Odstrániť zamknutú správu?</string> - <!-- This message is displayed in a confirmation dialog when the user selects one or more - conversations and then taps the "Delete" button. --> - <plurals name="confirm_delete_conversation"> - <!-- Case of 1 result. --> - <item quantity="one">Konverzácia bude odstránená.</item> - <item quantity="few"><xliff:g id="number" example="15">%1$s</xliff:g> konverzácie budú odstránené.</item> - <!-- Case of 0 or 2 or more results. --> - <item quantity="other"><xliff:g id="number" example="15">%1$s </xliff:g> konverzácií bude odstránených.</item> - </plurals> - <string name="confirm_delete_conversation">Celé vlákno bude odstránené.</string> - <!-- Delete all threads confirmation dialog message --> - <string name="confirm_delete_all_conversations">Všetky príspevky budú odstránené.</string> - <!-- Delete message confirmation dialog message --> - <string name="confirm_delete_message">Správa bude odstránená.</string> - <!-- Delete message confirmation dialog message for a locked message --> - <string name="confirm_delete_locked_message">Odstrániť zamknutú správu?</string> - <!-- Delete all the messages on the SIM dialog message --> - <string name="confirm_delete_all_SIM_messages">Všetky správy na SIM karte budú odstránené.</string> - <!-- Delete the selected message on the SIM dialog message --> - <string name="confirm_delete_SIM_message">Správa na SIM karte bude odstránená.</string> - <!-- Delete unlocked checkbox title --> - <string name="delete_unlocked">Odstrániť zamknuté správy</string> - <!-- Delete button title --> - <string name="delete">Odstrániť</string> - <!-- More button title --> - <string name="more">Viac</string> - <!-- More button summary --> - <string name="more_summary">Poklepaním zobraziť viac</string> - <!-- Action bar mode title when multi-selecting conversations --> - <string name="select_conversations">Vybrať konverzácie</string> - <!-- Show this in the middle of the main activity when there are no conversations [CHAR LIMIT=none] --> - <string name="no_conversations">Žiadne konverzácie.</string> - <!-- Show this in the middle of the main activity when loading conversations [CHAR LIMIT=none] --> - <string name="loading_conversations">Načítanie konverzácií.</string> - <!-- Tells the user that QKSMS isn't the default SMS app --> - <string name="not_default">Predvolené SMS</string> - <!-- Tells the user they need to set QKSMS as the default app in order to use this feature --> - <string name="default_info">Pre vykonanie musí byť QKSMS nastavená ako predvolená SMS aplikácia</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to mark messages as read --> - <string name="not_default_mark_read">Pre označenie správ ako prečítaných musí byť QKSMS nastavená ako predvolená SMS aplikácia</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to mark messages as unread --> - <string name="not_default_mark_unread">Pre označenie správ ako neprečítaných musí byť QKSMS nastavená ako predvolená SMS aplikácia</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to send messages --> - <string name="not_default_delete">Pre vymazanie správ musí byť QKSMS nastavená ako predvolená SMS aplikácia</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to delete messages --> - <string name="not_default_send">Pre odoslanie správ musí byť QKSMS nastavená ako predvolená SMS aplikácia</string> - <!-- Tells the user they should set QKSMS as the default messaging app --> - <string name="not_default_first">Niektoré veci nebudú fungovať, pokiaľ nebude QKSMS nastavená ako predvolená SMS aplikácia</string> - <string name="delayed_messaging_info">Oneskorené odosielanie vám umožní zrušiť správu pred odoslaním. Predvolené správanie a ďaľšie možnosti môžete zmeniť v Nastaveniach</string> - <string name="delayed_duration_bounds_error">Oneskorenie musí byť medzi 1 a 30 sekundami</string> - <!-- Dialog title for the Read Report dialog. --> - <string name="confirm">Potvrdiť</string> - <!-- Dialog text for the Read Report dialog. --> - <string name="message_send_read_report">Hlásenie o prečítaní bude odoslané.</string> - <!-- Dialog title for updating app icon color --> - <string name="update_icon_title">Aktualizovať farbu ikony</string> - <!-- Dialog message for updating app icon color --> - <string name="update_icon_message">Kvôli zmene farby ikony QKSMS je nutné aplikáciu reštartovať</string> - <string name="dialog_conversation_details_title">Podrobnosti konverzácie</string> - <string name="dialog_conversation_details_last_message_date">Dátum poslednej správy</string> - <string name="dialog_conversation_details_message_count">Počet správ</string> - <string name="dialog_conversation_details_recipients">Príjemcovia (%s)</string> - <string name="dialog_should_i_answer_title">Should I Answer? nie je nainštalovaná</string> - <string name="dialog_should_i_answer_message">Chcete aplikáciu prevziať z obchodu Google Play?</string> - <string name="dialog_delete_old_messages">Ste si istí, že chcete automaticky vymazať staré správy?</string> - <!-- Title for audio file picker --> - <string name="select_audio">Vybrať zvuk</string> - <!-- Menu title to copy an attachment to the shared storage [CHAR LIMIT=25] --> - <string name="copy_to_sdcard">Uložiť prílohu</string> - <!-- Toast message on successful copy to shared storage [CHAR LIMIT=30] --> - <string name="copy_to_sdcard_success">Príloha uložená.</string> - <!-- Toast message on failed copy to shared storage [CHAR LIMIT=30] --> - <string name="copy_to_sdcard_fail">Nemožno uložiť prílohu.</string> - <!-- Menu title to save a sound as a ringtone --> - <string name="save_ringtone">Uložiť ako zvonenie</string> - <!-- Toast message on successful copying ringtone to drm provider --> - <string name="saved_ringtone">Zvonenie uložené.</string> - <!-- Toast message on failed copying ringtone to drm provider --> - <string name="saved_ringtone_fail">Nemožno uložiť zvonenie.</string> - <!-- Menu item --> - <!-- Menu item [CHAR LIMIT=40] --> - <string name="menu_group_participants">Skupina účastníkov</string> - <!--Toast shown when a draft is saved--> - <string name="toast_draft">Koncept uložený</string> - <!--Toast shown when a conversation is deleted--> - <string name="toast_conversation_deleted">Konverzácia odstránená</string> - <!--Toast shown when device is low on storage--> - <string name="toast_low_memory">"Pamäť telefónu je plná. Odstráňte niektoré súbory pre jej uvoľnenie."</string> - <!--Toast shown to tell user that forwarding messages doesn't work yet--> - <string name="toast_forward">Táto funkcia nebola ešte implementovaná. Zatiaľ použite možnosť \"Kopírovať text\" a vložite ho do správy ktorú ste chceli poslať</string> - <!--Toast shown for unimplemented features--> - <string name="toast_unimplemented">Táto funkcia ešte nie je implementovaná</string> - <!--Toast shown when a message fails to send--> - <string name="toast_message_failure">Správu sa nepodarilo odoslať</string> - <!--Toast shown when a message is delivered--> - <string name="toast_message_delivered">Správa doručená</string> - <!--Toast shown when a message is not delivered--> - <string name="toast_message_not_delivered">Správa nebola doručená</string> - <!--Toast shown when default APNs are loaded--> - <string name="toast_default_apns_loaded">Predvolené nastavenie APN načítané</string> - <!--Toast shown when text is copied to the clipboard--> - <string name="toast_copy_text">Text bol skopírovaný do schránky</string> - <!--Toast shown when Google Play Services is not available for purchasing a product--> - <string name="toast_billing_not_available">Nákup vyžaduje nainštalovaný Obchod Play vo vašom zariadení</string> - <!--Toast shown when Google Play Services is not available for purchasing a product--> - <string name="toast_endlessjabber_not_installed">EndlessJabber nie je nainštalovaný, otváranie Obchodu Play</string> - <string name="toast_changelog_error">Nemožno načítať zoznam zmien. Skúste to prosím neskôr</string> - <string name="toast_conversation_error">Nemožno otvoriť konverzáciu</string> - <string name="toast_deleting_old_messages">Vaše staré správy budú čoskoro vymazané</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_1">Ďakujem za darovanie! Si môj nový najlepší kamarát .</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_2">Ďakujem za darovanie! Milujem ťa.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_3">Ďakujem za darovanie! Pomáhate QKSMS aby sa stala najlepšou SMS aplikáciou </string> - <!--Toast shown to thank user for donating--> - <string name="thanks_4">Ďakujem za darovanie! Si úžasný.</string> - <!--Menu option to mute conversation--> - <string name="menu_mute_conversation">Stlmiť konverzáciu</string> - <!--Menu option to mute conversation--> - <string name="menu_unmute_conversation">Obnoviť konverzáciu</string> - <string name="menu_block_conversations">Blokovať konverzáciu</string> - <string name="menu_unblock_conversations">Odblokovať konverzáciu</string> - <string name="menu_messages">Správy</string> - <string name="menu_blocked">Zablokované</string> - <string name="menu_blocked_conversations">Zablokované (%s nová/é/ých)</string> - <string name="menu_unblocked_conversations">Správy (%s nová/é/ých)</string> - <string name="menu_notifications">Oznámenia</string> - <string name="menu_notifications_off">Upozornenia vypnuté</string> - <string name="menu_notification_settings">Nastavenia konverzácií</string> - <string name="menu_view_details">Zobraziť podrobnosti</string> - <string name="menu_mark_read">Označiť ako prečítané</string> - <string name="menu_mark_unread">Označiť ako neprečítané</string> - <string name="menu_delete_conversation">Odstrániť konverzáciu</string> - <string name="menu_multi_select">Vybrať konverzáciu</string> - <string name="menu_done">Hotovo</string> - <string name="failed_message_title">Nastavenia nedoručených správ</string> - <!--Toast shown to tell the user that they don't have a photo attachments app, and suggests that they download one--> - <string name="attachment_app_not_found">Aplikácia na otvorenie príloh nenájdená. Skúste nainštalovať aplikáciu pre zobrazenie mediálnych súborov!</string> - <string name="attachment_camera_error">Nemožno spustiť fotoaparát</string> - <string name="pref_max_mms_attachment_size">Maximálna veľkosť prílohy MMS</string> - <string name="error_no_recipients">Pre odoslanie správy vyberte nejaké kontaky!</string> - <string name="error_file_not_found">QKSMS nemá prístup k súboru, ktorý chcete zdieľať!</string> - <string name="sending_blocked_welcome_screen_message">Vydržte! O chvíľu môžete posielať skutočné správy!</string> - <string name="notification_colored_icon_ready">Poklepaním pridáte na domovskú obrazovku.</string> - <string name="notification_title_colored_icon_ready">Farebná QKSMS ikona je pripravená</string> - <string name="icon_ready">Vaša nová ikona je pripravená!</string> - <string name="icon_ready_message">Teraz si ju môžete znova pridať, ale už v novej farbe, na domovskú obrazovku.</string> - <string name="dont_ask_again">Už sa nepýtať</string> - <string name="warning">Upozornenie na Stagefright</string> - <string name="stagefright_warning">Video správy môžu obsahovať škodlivý kód, pomocou ktorého zostane váš telefón vystavený útokom. Chcete pokračovať?</string> - <!-- MMS DIALOG SETUP STRINGS --> - <string name="mms_setup_set_up_mms_title">Nastaviť MMS?</string> - <string name="mms_setup_set_up_mms_body">Zdá sa, že MMSky nie sú nakonfigurované v QKSMS. Stlačte OK pre automatickú konfiguráciu MMS.</string> - <string name="mms_setup_setting_up_later_title">Nastavit MMS neskôr</string> - <string name="mms_setup_setting_up_later_body">Otvorte sekciu MMS v Nastavenicah pre automatickú konfiguráciu, kontaktuje operátora, alebo použite vlastné nastavenia.</string> - <string name="mms_setup_no_configurations_found_title">Konfigurácia nebola nájdená</string> - <string name="mms_setup_no_configurations_found_body">Automatická konfigurácia MMS nebola nájdená. Stlačením OK kontaktujte podporu. Pomôžeme vám! </string> - <string name="mms_setup_one_configuration_found_title">Jedna konfigurácia bola nájdená</string> - <string name="mms_setup_one_configuration_found_body">Našli sme jednu konfiguráciu MMS pre operátora %s. Môže byť?</string> - <string name="mms_setup_multiple_configurations_found_title">Bolo nájdených niekoľko konfigurácií</string> - <string name="mms_setup_multiple_configurations_found_body">Našli sme niekoľko MMS konfigurácií. Vyberte si operátora zo zoznamu, alebo stlačte N/A pokiaľ váš operátor nie je v zozname.</string> - <string name="mms_setup_next_steps_title">Ďaľšie kroky</string> - <string name="mms_setup_next_steps_body">Znova otvorte sekciu MMS v Nastavenicah pre automatickú konfiguráciu, kontaktuje operátora, alebo použite vlastné nastavenia.</string> - <string name="mms_setup_success_title">Hotovo!</string> - <string name="mms_setup_success_body">V prípade problémov otvorte znova sekciu MMS v Nastavenicah pre automatickú konfiguráciu, kontaktuje operátora, alebo použite vlastné nastavenia.</string> - <string name="na">N/A</string> - <string name="no">Nie</string> - <string name="pref_automatically_configure_mms">Automatické nastavenie MMS</string> - <string name="pref_mms_contact_support">Kontaktovať podporu</string> - <string name="pref_category_sending_mms">Odosielanie MMS</string> - <string name="pref_category_mms_configuration">Nastavenie MMS</string> - <string name="pref_mms_contact_support_summary">Kontaktujte QKSMS team pre pomoc pri nastavení MMS</string> - <string name="pref_markdown_enabled">Formátovanie textu</string> - <string name="pref_markdown_enabled_summary">Pre tučné, podčiarknuté a šikmé písmo v správach použite zápis markdown</string> - <string name="want_read_indicators">Chcete upozornenia na prečítané správy?</string> - <string name="color_swatch_description">Farba %1$d</string> - <string name="color_swatch_description_selected">Vybraná %1$d farba</string> - <string name="color_picker_default_title">Vyberte farbu</string> - <string name="message_delivered">Správa bola doručená</string> - <string name="message_not_delivered">Správa nebola doručená</string> - <string name="error">Chyba</string> - <string name="invalid_destination">Chybná cieľová adresa.</string> - <string name="service_not_activated">Služba nie je aktivovaná v sieti.</string> - <string name="service_message_not_found">Platnosť správy vypršala alebo nie je dostupná.</string> - <string name="service_network_problem">Nemožno odoslať pre problém v sieti.</string> - <string name="message_queued">Momentálne nie je možné odoslať správu. Bude odoslaná, keď bude služba k dispozícií.</string> - <string name="download_later">Preberanie bolo neúspešné. Skúste to neskôr.</string> - <string name="no_apn">Prístupový bod (APN) nie je nastavený. Nastavte ho v nastaveniach telefónu!</string> - <string name="no_subject">(Bez predmetu)</string> - <string name="unknown_sender">Neznámy odoselateľ</string> - <string name="dl_failure_notification">Nemožno prevziať správu <xliff:g id="subject">%1$s</xliff:g> od <xliff:g id="from">%2$s</xliff:g>.</string> - <string name="auto_select_multiple_apns">Bolo nájdených niekoľko rôznych nastavení. Jedno z nich vyskúšajte. Ak nebude fungovať, vyskúšajte nové cez Nastavenia > Prístupové body > Obnoviť predvolené.</string> - <string name="auto_select_apn">Automaticky vybrať APN</string> - <string name="auto_select_failed_title">Automatická konfigurácia zlyhala</string> - <string name="auto_select_failed">Skúste pohľadat nastavenia APN vašeho operátora (MMSC, Port, a Proxy) a použite ich v Nastavenia > Pokročilé.</string> - <string name="date_yesterday">Včera</string> - <string name="date_just_now">Práve teraz</string> - <string name="compose_loading_attachment">Načítavanie prílohy</string> - <string name="hint_no_messages">Zatiaľ nemáte žiadne správy. \nDotykom \"+\" nejakú pošlite!</string> - <string-array name="resend_menu"> - <item>Znovu odoslať</item> - <item>Upraviť</item> - <item>Vymazať</item> - </string-array> - <string-array name="message_menu"> - <item>Poslať ďalej</item> - <item>Kopírovať text</item> - <item>Zobraziť detaily</item> - <item>Odstrániť správu</item> - </string-array> - <string-array name="background_titles"> - <item>Material Light</item> - <item>Material Dark</item> - <item>Čierna</item> - </string-array> - <string-array name="font_sizes"> - <item>Malé</item> - <item>Normálne</item> - <item>Veľké</item> - <item>Obrovské</item> - </string-array> - <string-array name="font_families"> - <item>Roboto Regular</item> - <item>Roboto Condensed</item> - <item>Systémové písmo</item> - </string-array> - <string-array name="font_weights"> - <item>Tenké</item> - <item>Normálne</item> - </string-array> - <!-- String to match as no subject and filter out as a subject. For example, if the - subject string is "no subject", we won't display that. We'll pretend - no subject string was delivered. --> - <string-array name="empty_subject_strings"> - <item>Žiadny predmet</item> - </string-array> - <string-array name="qk_responses"> - <item>V poriadku</item> - <item>Ešte chvíľku</item> - <item>Som na ceste</item> - <item>Vďaka</item> - <item>Môže byť</item> - <item>Čo sa deje?</item> - <item>Súhlasím</item> - <item>Nie</item> - <item>Ľúbim ťa</item> - <item>Ospravedlňujem sa</item> - <item>LOL</item> - <item>To je v poriadku</item> - </string-array> - <string-array name="enter_button_options"> - <item>Zobraziť emoji</item> - <item>Nový riadok</item> - <item>Odoslať správu</item> - </string-array> - <string-array name="notification_private_options"> - <item>Zobraziť všetko</item> - <item>Skryť správu</item> - <item>Skryť správu a odosielateľa</item> - </string-array> - <!-- Max MMS attachment sizes. I.e. will compress pictures that are larger than 300 KB down to - under 300KB. --> - <string-array name="max_mms_attachment_sizes"> - <item>300 KB</item> - <item>600 KB</item> - <item>1 MB</item> - <item>Neobmedzená</item> - </string-array> -</resources> diff --git a/QKSMS/src/main/res/values-sr/strings.xml b/QKSMS/src/main/res/values-sr/strings.xml deleted file mode 100644 index 0caa29675..000000000 --- a/QKSMS/src/main/res/values-sr/strings.xml +++ /dev/null @@ -1,769 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!--Generated by crowdin.com--> -<resources xmlns:xliff="http://schemas.android.com/apk/res-auto"> - <!--Slogan--> - <string name="slogan">Поново заволите СМС.</string> - <!--Text shown when a phone number cannot be found--> - <string name="unknown_number">Непознат број</string> - <!--Content description for photos--> - <string name="popup_photo_CD">Слика</string> - <!--Text to be displayed while content is loading--> - <string name="loading">Учитавање…</string> - <!--Test string--> - <string name="test">Пробна линија</string> - <!--Hint for contacts text field--> - <string name="hint_contacts">Унесите примаоце</string> - <!--Hint for search text field--> - <string name="hint_search">Претражите нешто</string> - <!--Hint for message reply text field--> - <string name="hint_reply">Унесите поруку</string> - <!--Hint for code redemption--> - <string name="hint_redeem">Унесите код</string> - <string name="hint_hex">Хекс</string> - <!--Text shown for single new message in notification--> - <string name="new_message">Нова порука</string> - <!--Text shown after number of unread messages in notification (ex. 3 new messages)--> - <string name="new_messages">нових порука/е</string> - <!--Text shown for single failed message in notification--> - <string name="failed_message">Слање поруке није успело</string> - <!--Text shown after number of failed messages in notification (ex. 3 messages failed to send)--> - <string name="failed_messages">порука/е није послато</string> - <!--Text shown under failed message count--> - <string name="failed_messages_summary">Додирните да бисте приказали</string> - <!--QuickCompose notification title--> - <string name="quickcompose">QK састављач</string> - <!--QuickCompose notification text--> - <string name="quickcompose_detail">Додирните да бисте послали поруку</string> - <!--Welcome screen intro button--> - <string name="welcome_start">Хајде да почнемо!</string> - <!--Allows user to skip welcome screen--> - <string name="welcome_skip">ПРЕСКОЧИ</string> - <!--Allows user to finish the welcome screen--> - <string name="welcome_finish">ЗАВРШИ</string> - <!--Indicates to user they can pick a color--> - <string name="welcome_theme_title">Изаберите боју</string> - <!--Indicates to user they can pick any colors--> - <string name="welcome_theme_description">Било која боја.</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_night_description">Да не боле очи.</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_night_hint">Испробајте</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_quickreply_title">QK одговор</string> - <!--QK Reply explanation--> - <string name="welcome_quickreply_description">Одговарајте на поруке брже него икада.</string> - <!--Prompts user to try QK Reply--> - <string name="welcome_quickreply_hint">Испробајте!</string> - <!--QK Reply demo message--> - <string name="welcome_quickreply_message_1">Човече! Баш је добро, зар не? Једним погледом можете да прегледате цео разговор. Додирните ван прозорчета или додирните квачицу да бисте га склонили.</string> - <!--QK Reply demo message--> - <string name="welcome_quickreply_message_2">Ово је QK одговор. Сада можете одговарати на поруке са било ког места. Додирните дугме за проширивање да бисте видели шта је следеће :)</string> - <!--Settings option in menu--> - <string name="menu_settings">Подешавања</string> - <!--Search option in menu--> - <string name="menu_search">Претрага</string> - <!--Show full conversation in QuickReply--> - <string name="menu_show_all">Прикажи све поруке</string> - <!--Show only unread messages in QuickReply--> - <string name="menu_show_unread">Прикажи непрочитане поруке</string> - <!--Open conversation option in menu (shown in QuickReply)--> - <string name="menu_open_thread">Отвори разговор</string> - <!--Forward message option in menu--> - <string name="menu_forward">Проследи поруку</string> - <!--Call contact option in menu--> - <string name="menu_call">Позови</string> - <!--Mark a message/conversation as read option in menu--> - <string name="menu_read">Означи као прочитано</string> - <!--Delete a message option in menu--> - <string name="menu_delete">Избриши</string> - <!--Donate option in menu--> - <string name="menu_billing">Донирајте</string> - <!--Copy text option in menu--> - <string name="menu_copy">Копирај текст</string> - <!--Changelog option in menu--> - <string name="menu_changelog">"Шта је ново"</string> - <!--Expand settings option in menu--> - <string name="menu_show_all_prefs">Прикажи све</string> - <!--Show less settings option in menu--> - <string name="menu_show_fewer_prefs">Прикажи мање</string> - <!--Title for message details popup--> - <string name="details_title">Детаљи</string> - <!--Title for address that message is being sent to in message details popup--> - <string name="details_to">Коме</string> - <!--Title for address that message is sent from in message details popup--> - <string name="details_from">Од</string> - <!--Title for text of a message in message details popup--> - <string name="details_body">Текст поруке</string> - <!--Title for date sent of a message in message details popup--> - <string name="details_date_sent">Датум слања</string> - <!--Title for date received of a message in message details popup--> - <string name="details_date_received">Датум пријема</string> - <!--Title for rate snackbar--> - <string name="rate_title">Свиђа Вам се QKSMS?</string> - <!--Title for rate button--> - <string name="rate_action">Оцените</string> - <string name="pref_category_appearance">Изглед</string> - <string name="pref_category_summary_appearance">Теме, фонтови, боје, сличице и остало</string> - <string name="pref_category_general">Опште</string> - <string name="pref_category_summary_general">Извештаји, слање порука, форматирање</string> - <string name="pref_category_blocking">Блокирање порука</string> - <string name="pref_category_notifications">Обавештења</string> - <string name="pref_category_summary_notifications">Звуци, LED, приватност</string> - <string name="pref_category_mms">MMS</string> - <string name="pref_category_summary_mms">Подесите MMS (приступне тачке), максималну величину, групна ћаскања</string> - <string name="pref_category_quickreply">QK одговор</string> - <string name="pref_category_summary_quickreply">QK одговор, могућности искачућег прозора</string> - <string name="pref_category_quickcompose">QK састављач</string> - <string name="pref_category_summary_quickcompose">QK састављач, омиљени контакти</string> - <string name="pref_category_about">Основни подаци</string> - <string name="pref_category_summary_about">Верзија, измене, аутори, захвале</string> - <string name="pref_theme">Боја теме</string> - <string name="pref_theme_summary_alt">Додирните да бисте променили тему</string> - <string name="pref_icon">Icon color</string> - <string name="pref_icon_summary">Tap to change the QKSMS icon color</string> - <string name="pref_status_tint">Обојена статусна трака</string> - <string name="pref_navigation_tint">Обојена навигациона трака</string> - <string name="pref_background">Боја позадине</string> - <string name="pref_background_summary">Додирните да бисте променили боју позадине</string> - <string name="pref_bubbles">Облачићи порука</string> - <string name="pref_bubbles_summary">Додирните да бисте променили подешавања облачића порука</string> - <string name="pref_night">Ноћни режим</string> - <string name="pref_night_summary">Чува батерију и смањује замор очију</string> - <string name="pref_night_amoled">Потпуно црна позадина</string> - <string name="pref_night_amoled_summary">Додатно чува батерију на уређајима са AMOLED екранима</string> - <string name="pref_bubble_style_new">Нови стил облачића</string> - <string name="pref_color_sent">Бојење послатих порука</string> - <string name="pref_color_sent_summary">Боји облачиће одлазећих порука</string> - <string name="pref_color_received">Бојeње примљених порука</string> - <string name="pref_color_received_summary">Боји облачиће долазећих порука</string> - <string name="pref_hide_avatar_conversations">Сакриј сличице разговора</string> - <string name="pref_hide_avatar_conversations_summary">Сакрива сличице контаката у листи разговора</string> - <string name="pref_hide_avatar_sent">Сакриј сличице послатих порука</string> - <string name="pref_hide_avatar_sent_summary">Сакрива вашу сличицу код одлазећих порука</string> - <string name="pref_hide_avatar_received">Сакриј сличице примљених порука</string> - <string name="pref_hide_avatar_received_summary">Сакрива сличицу контакта код долазећих порука</string> - <string name="pref_font_family">Породица фонта</string> - <string name="pref_font_size">Величина фонта</string> - <string name="pref_font_weight">Дебљина фонта</string> - <string name="pref_message_count">Број порука</string> - <string name="pref_message_count_summary">Приказивање броја порука за сваки разговор</string> - <string name="pref_sent_timestamps">Ознаке времена слања</string> - <string name="pref_sent_timestamps_summary">Нека ознака времена слања буде за онда када је послата, а не испоручена</string> - <string name="pref_force_timestamps">Наметну временске ознаке</string> - <string name="pref_force_timestamps_summary">Омогућава временске ознаке за све поруке</string> - <string name="pref_key_timestamp_delay">Време до нове временске ознаке</string> - <string name="pref_key_timestamp_delay_summary">Број минута кји мора проћи између двају порука да би се појавила нова временска ознака.</string> - <string name="pref_compose_favorites">Омиљени контакти</string> - <string name="pref_compose_summary_favorites">Приказује ваше омиљене контакте у прозору QK састављача, да Вам буду на дохват руке</string> - <string name="pref_prox_sensor_call">Сензор близине</string> - <string name="pref_prox_sensor_call_summary">Док разговарате, принесите телефон увету да бисте започели позив</string> - <string name="pref_delivery">Извештаји о достави</string> - <string name="pref_delivery_summary">Потврде да су поруке достављене</string> - <string name="pref_delivery_toast">Прикажи облачић</string> - <string name="pref_delivery_toast_summary">Показује облачић да је порука достављена</string> - <string name="pref_delivery_vibrate">Вибрација</string> - <string name="pref_delivery_vibrate_summary">Вибрирај по достави поруке</string> - <string name="pref_delete_old_messages">Обриши старе поруке</string> - <string name="pref_delete_old_messages_summary">Аутоматски брише поруке после одређеног времена</string> - <string name="pref_delete_old_messages_unread">Непрочитане поруке</string> - <string name="pref_delete_old_messages_unread_summary">Аутоматски брише непрочитане поруке након %s дана</string> - <string name="pref_delete_old_messages_read">Прочитане поруке</string> - <string name="pref_delete_old_messages_read_summary">Аутоматски брише прочитане поруке након %s дана</string> - <string name="pref_yappy">Yappy интеграција</string> - <string name="pref_endlessjabber_summary">Омогући потпуну подршку за Yappy</string> - <string name="pref_blocked_conversations">Блокирани разговори</string> - <string name="pref_blocked_conversations_summary">Задржите притисак на разговор и блокирајте га како бисте га померили у сандуче блокираних порука и престали да примате обавештења</string> - <string name="pref_block_future">Блокирај будуће поруке</string> - <string name="pref_block_future_summary">Додај додатне бројеве за блокирање</string> - <string name="pref_should_i_answer">Should I Answer? интеграција</string> - <string name="pref_should_i_answer_summary">Аутоматско брисање долазећих порука од бројева који су блокирани у Should I Answer?</string> - <string name="pref_mobile_only">Само мобилни бројеви</string> - <string name="pref_mobile_only_summary">У предлозима контаката приказује само мобилне бројеве</string> - <string name="pref_auto_emoji">Аутоматски емоџији</string> - <string name="pref_auto_emoji_summary">Замењује текстуалне смешке сличицом емоџија</string> - <string name="pref_enter_button">Дугме Enter</string> - <string name="pref_enter_button_summary">Додирните да промените понашање дугмета ентер</string> - <string name="pref_compose_group">Групно дописивање</string> - <string name="pref_compose_group_summary">Кад се саставља порука за више људи, пошаљи групну поруку уместо појединачних порука</string> - <string name="pref_auto_download">Аутоматско преузимање MMS-а</string> - <string name="pref_auto_download_summary">Аутоматски преузима MMS поруке чим постану доступне</string> - <string name="pref_auto_data">Аутоматско паљење преноса података</string> - <string name="pref_auto_data_summary">Аутоматско паљење преноса података при слању или преузимању MMS-а</string> - <string name="pref_split">Подели СМС</string> - <string name="pref_split_summary">Подели дуге поруке у засебне поруке</string> - <string name="pref_split_counter">Бројач дељења</string> - <string name="pref_split_counter_summary">Додаје бројач пред свако преламање поруке</string> - <string name="pref_long_as_mms">Дугачку поруку шаљи као MMS</string> - <string name="pref_long_as_mms_summary">Уместо дељења, дуге поруке шаље као MMS</string> - <string name="pref_long_as_mms_after">Дугачку поруку шаљи као MMS након</string> - <string name="pref_long_as_mms_after_summary">Дугачку поруку шаљи као MMS када по дужини претекну одређени број порука</string> - <string name="pref_return">Прикажи дугме Enter</string> - <string name="pref_return_summary">Прикажи Enter на тастатури уместо дугмета за емоџије</string> - <string name="pref_text">Текст</string> - <string name="pref_notifications">Обавештења за поруке су омогућена</string> - <string name="pref_led">Лампица за обавештења</string> - <string name="pref_theme_led">Боја лампице за обавештења</string> - <string name="pref_wake">Упали екран</string> - <string name="pref_wake_summary">Екран ће се укључити када стигне нова порука</string> - <string name="pref_notifications_private">Приватност обавештења</string> - <string name="pref_notifications_private_summary">Додирните да измените шта би требало сакрити у обавештењу</string> - <string name="pref_ringtone">Звук обавештења</string> - <string name="pref_ringtone_summary">Изаберите звук обавештења</string> - <string name="pref_ticker">Прикажи кајрон</string> - <string name="pref_ticker_summary">Приказује делић пристигле поруке на траци обавештења</string> - <string name="pref_vibration">Вибрација</string> - <string name="pref_vibration_summary">Вибрирај за нове поруке</string> - <string name="pref_notification_call">Дугме за позив</string> - <string name="pref_notification_call_summary">Позовите пошиљаоца поруке директно из обавештења</string> - <string name="pref_dimiss_read">Означи као прочитано</string> - <string name="pref_dismiss_read_summary">Означава поруку као прочитану када се обавештење уклони</string> - <string name="pref_delayed">Одложено слање</string> - <string name="pref_delayed_summary">Прави се пауза пре слања поруке, како бисте могли да је преправите</string> - <string name="pref_delayed_duration">Дужина одлагања (у секундама)</string> - <string name="pref_delayed_duration_summary">Време чекања пре слања поруке</string> - <string name="pref_night_auto">Аутоматски ноћни режим</string> - <string name="pref_night_auto_summary">Аутоматски омогућује ноћни режим на основу времена</string> - <string name="pref_day_start">Дан почиње</string> - <string name="pref_night_start">Ноћ почиње</string> - <string name="pref_qk_responses">QK одговори</string> - <string name="pref_qk_responses_summary">Унапред подесите одговоре који ће се користити на Android Wear уређају</string> - <string name="pref_quickreply_enabled">QK одговор омогућен</string> - <string name="pref_quickreply_enabled_summary">Прикажи прозор QK одговора када пристигне нова порука</string> - <string name="pref_tap_to_quit">Одбацивање додиром</string> - <string name="pref_tap_to_quit_summary">Додирните било где ван прозора да бисте га затворили</string> - <string name="pref_quickcompose">QK састављач је омогућен</string> - <string name="pref_quickcompose_summary">Приказује обавештење путем кога можете да саставите нову поруку</string> - <string name="pref_mms_enabled">ММС омогућен</string> - <string name="pref_mms_enabled_summary">Омогућава слање и примање ММС порука</string> - <string name="pref_mmsc_url">Сервер за ММС</string> - <string name="pref_mms_proxy">Прокси за ММС</string> - <string name="pref_mms_port">Порт за ММС</string> - <string name="pref_apn_chooser">Учитај подразумевана имена приступних тачки</string> - <string name="pref_strip_unicode">Скини уникод знакове</string> - <string name="pref_strip_unicode_summary">Знакове који нису подржани у дугим порукама мења у GSM компатибилне</string> - <string name="pref_system_bar_flat">Равне системске траке</string> - <string name="pref_system_bar_flat_summary">Уклања постепену сенку на системској траци на већини KitKat уређаја</string> - <string name="pref_status_compat">Исправка за статусну траку</string> - <string name="pref_status_compat_summary">Исправља проблеме које узрокују immersive mode, Tinted Status Bar (Xposed), или произвољни DPI</string> - <string name="pref_navigation_compat">Исправка за навигациону траку</string> - <string name="pref_navigation_compat_summary">Исправља проблеме које узрокују immersive mode, Tinted Status Bar (Xposed), или произвољни DPI</string> - <string name="pref_about_version_title">Верзија QKSMS-а</string> - <string name="pref_about_authors_title">Аутори</string> - <string name="pref_about_authors_summary">Моез Бати</string> - <string name="pref_changelog_summary">Додирните да видите измене</string> - <string name="pref_about_thanks_title">Хвала Вам</string> - <string name="pref_about_thanks_summary">Додирните да видите ко доприноси отвореном коду</string> - <string name="pref_donate_title">Донирајте</string> - <string name="pref_donate_summary">QKSMS је бесплатан. Помозите нам донацијама!</string> - <string name="pref_about_gplus_title">Google+</string> - <string name="pref_about_gplus_summary">Придужите се QKSMS заједници за Бета тестирање на Google+</string> - <string name="pref_about_github_title">GitHub</string> - <string name="pref_about_github_summary">Изворни код QKSMS-а је отворен за све. МОжете допринети коду или пријавити проблеме на нашој GitHub страници</string> - <string name="pref_about_crowdin_title">Crowdin</string> - <string name="pref_about_crowdin_summary">Придрузжите се пројетку превођења QKSMS-а на Crowdin-у</string> - <!--Preference subcategory--> - <string name="pref_subcat_theme">Тема</string> - <!--Preference subcategory--> - <string name="pref_subcat_system_bars">Системске траке</string> - <!--Preference subcategory--> - <string name="pref_subcat_categories">Категорије</string> - <!--Preference subcategory--> - <string name="pref_subcat_font">Фонт</string> - <!--Preference subcategory--> - <string name="pref_subcat_messages">Поруке</string> - <!--Preference subcategory--> - <string name="pref_subcat_avatars">Сличице</string> - <string name="donate_google">Донирајте преко Гугла</string> - <string name="donate_google_summary">Гугл узима 30% од донација</string> - <string name="donate_paypal">Донирајте преко Пејпала</string> - <string name="donate_paypal_button">Донирајте било који износ</string> - <string name="donate_paypal_button_summary">Купите ми шта год желите!</string> - <!--Donation product name--> - <string name="product_name_donation">Донација</string> - <!--$1 donation product name--> - <string name="product_name_donate_1">Донирајте један долар</string> - <!--$5 donation product name--> - <string name="product_name_donate_5">Донирајте пет долара</string> - <!--$3 donation product name--> - <string name="product_name_donate_10">Донирајте десет долара</string> - <!--$1 donation product description--> - <string name="product_description_donate_1">Платите ми колу</string> - <!--$5 donation product description--> - <string name="product_description_donate_5">Платите ми сендвич</string> - <!--$10 donaion product description--> - <string name="product_description_donate_10">Платите ми ручак</string> - <string name="title_settings">Подешавања</string> - <string name="title_search">Претрага</string> - <string name="title_compose">Састављање</string> - <string name="title_conversation_list">Разговори</string> - <string name="title_blocked">Блокирано</string> - <string name="title_changelog">Измене</string> - <string name="title_picker">Нове поруке</string> - <string name="title_donate">Донација</string> - <string name="title_qk_responses">QK одговори</string> - <string name="title_block_address">Блокирај број</string> - <string name="title_unblock_address">Одблокирај број</string> - <string name="title_conversations_selected">%s одабрано</string> - <string name="title_palette">Палета</string> - <string name="title_rgb">ЦЗП (RGB)</string> - <!-- Menu shown in the context menu when long pressing on a message when the message contains - one or more phone numbers and/or email addresses and the number or email is new to - contacts. [CHAR LIMIT=50] --> - <string name="menu_add_address_to_contacts">Додај <xliff:g id="contactEmailOrNumber">%s</xliff:g> у контакте</string> - <!-- Context menu item on an individual message for viewing an attached slideshow --> - <string name="view_slideshow">Прикажи пројекцију слајдова</string> - <!-- Context menu item on an individual message for viewing message details such as time and date --> - <string name="view_message_details">Прикажи детаље</string> - <!-- Context menu item on an individual message for viewing a delivery report --> - <string name="view_delivery_report">Прикажи извештај</string> - <!-- Context menu item on an individual message for deleting only that message --> - <string name="delete_message">Избриши</string> - <!-- Abbreviation for "kilobyte" --> - <string name="kilobyte">kB</string> - <!-- Individual message context menu item --> - <string name="copy_message_text">Копирај текст</string> - <!-- Header for context menu on an individual message --> - <string name="message_options">Опције поруке</string> - <!-- Delivery Header View --> - <!-- Title of "Report" window --> - <string name="delivery_header_title">Извештај</string> - <!--Text for app restart confirmation dialog--> - <string name="restart_message">Ове измене ће се применити при следећем отварању QKSMS-a</string> - <!--Dialog title for asking if a user wants to delete a conversation--> - <string name="delete_conversation">Обриши разговоре</string> - <!--Dialog title for asking if a user wants to delete all failed messages--> - <string name="delete_all_failed">Брисање неуспелих порука</string> - <!--CDialog title for asking if a user wants to delete a conversation--> - <string name="delete_confirmation">Јесте ли сигурни да желите да обришете (%s) разговора?</string> - <!--CDialog title for asking if a user wants to delete all failed messages--> - <string name="delete_all_failed_confirmation">Јесте ли сигурни да желите да обришете неуспеле поруке из (%s) разговора?</string> - <!--(Unused) Dialog title shown if APNs have not been set--> - <string name="apns_not_set">Имена приступних тачака нису подешена</string> - <!--(Unused) Dialog description shown if APNs have not been set--> - <string name="apns_not_set_description">Изгледа да имена приступних тачака нису подешена. То значи да ММС неће добро радити. Додирните Потврди да би их QKSMS пронашао за вас :)</string> - <!--Dialog title show if MMS hasn't been configured--> - <string name="set_up_mms_title">Подешавање ММС-а?</string> - <!--Dialog description shown if MMS hasn't yet been configured--> - <string name="set_up_mms_description">Изгледа да ММС још увек није подешен у QKSMS-у. Додирните Потврди да би ММС аутоматски био подешен.</string> - <!-- Dialog message text explaining that a draft message will not be saved due to invalid recipients --> - <string name="discard_message_reason">Порука ће бити одбачена јер нема важећих примаоца.</string> - <string name="invalid_code">Неважећи код</string> - <!--Button to restart app now instead of manually later--> - <string name="restart">Поново покрени одмах</string> - <!--Notification action to reply to a message--> - <string name="reply">Одговори</string> - <!--Notification action to reply to a message--> - <string name="reply_qksms">Одговори преко QKSMS-а</string> - <!--Notification action to mark a message as read--> - <string name="read">Прочитај</string> - <!--Notification action to mark a message as read--> - <string name="mark_read">Означи као прочитано</string> - <!--Notification action to call the sender of a message--> - <string name="call">Позови</string> - <!-- Notification toast message --> - <string name="notification_mute_on">Обавештења оногућена</string> - <string name="notification_mute_off">Обавештења онемогућена</string> - <!--Positive action button--> - <string name="yes">Да</string> - <string name="add">Додај</string> - <!--Positive action button--> - <string name="save">Сачувај</string> - <!--Positive action button--> - <string name="enable">Омогући</string> - <!--Positive action button--> - <string name="upgrade_now">Подеси сада</string> - <!--Positive action button--> - <string name="okay">У реду</string> - <!--Positive action button--> - <string name="redeem">Искористи</string> - <!--Neutral action button--> - <string name="just_once">Само једном</string> - <!--Neutral action button--> - <string name="later">Касније</string> - <!--Neutral action button --> - <string name="cancel">Откажи</string> - <!-- Name of the local user when displaying sender of an outgoing message (personal pronoun) --> - <string name="messagelist_sender_self">Ја</string> - <!-- Sender to be used if the sender address has been hidden --> - <string name="hidden_sender_address">Адреса скривеног примаоца</string> - <!-- Subject to display in the conversation list if there is no subject --> - <string name="no_subject_view">(Нема теме)</string> - <!-- Time and date a message is due to expire --> - <string name="expire_on">"Expires: <xliff:g id="date">%s</xliff:g>"</string> - <!-- Formatting for subject displayed inline, prepended to MMS message text --> - <string name="inline_subject">"<Subject: <xliff:g id="subject">%s</xliff:g>>"</string> - <!-- Text of a button appearing for MMS messages that have not yet been downloaded, causing the message to be downloaded (imperative verb) --> - <string name="download">Преузми</string> - <!-- Message displayed in place of the "download message" button once it has been pressed, indicating that the download is in progress --> - <string name="downloading">Преузимам</string> - <!-- Toast message while an image is being resized --> - <string name="compressing">Слика исувише велика. Сажимам\u2026</string> - <!-- Header shown above favorite contacts in QKCompose --> - <string name="favorites">Омиљени контакти</string> - <!-- Word represents 'self' in a conversation --> - <string name="me">Ја</string> - <string name="menu_edit">Уреди</string> - <string name="menu_delete_messages">Избриши поруке</string> - <string name="menu_delete_failed">Обриши неуспеле поруке</string> - <string name="menu_lock">Закључај</string> - <string name="menu_unlock">Откључај</string> - <!-- When the user tries to view message details and some error occurs while - retrieving those details, this message will be shown. --> - <string name="cannot_get_details">Преузимање детаља није могуће.</string> - <!-- Title of "Message details" dialog --> - <string name="message_details_title">Детаљи поруке</string> - <!-- Label in "Message details" dialog --> - <string name="message_type_label">Врста\u000A</string> - <!-- "Type" value in "Message details" dialog --> - <string name="text_message">Текстуална порука</string> - <!-- "Type" value in "Message details" dialog --> - <string name="multimedia_message">Мултимедијална порука</string> - <!-- "Type" value in "Message details" dialog --> - <string name="multimedia_notification">Обавештење о мултимедијалној поруци</string> - <!-- Label in "Message details" dialog showing who sent the message. --> - <string name="from_label">Од\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="to_address_label">Коме\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="bcc_label">Скривена копија\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="sent_label">Послато\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="received_label">Примљено\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="saved_label">Сачувано\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="subject_label">Наслов\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="message_size_label">Величина поруке\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="priority_label">Важност\u000A</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_high">Висока</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_normal">Нормална</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_low">Ниска</string> - <!-- Label in "Message details" dialog --> - <string name="message_class_label">Класа поруке\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="error_code_label">Код грешке\u000A</string> - <!-- Alert dialog title when creating a slideshow [CHAR LIMIT=none] --> - <string name="building_slideshow_title">Прављење пројекције слајдова</string> - <!-- Tag appearing on conversations in the conversation list that contain a draft message --> - <string name="has_draft">Недовршено</string> - <!-- In conversation list items, this is the separator between a contact's name and the draft stamp [CHAR LIMIT=5] --> - <string name="draft_separator">,\u0020</string> - <!-- In conversation list items, this comes after the receipient's name and contains the number of messages in the thread [CHAR LIMIT=5] --> - <string name="message_count_format">\u00a0<xliff:g id="number" example="1">%1$s</xliff:g></string> - <!-- For debugging: Dialog box title indicating there's a situation where data has unexpectedly changed --> - <string name="error_state">Недоследно стање</string> - <!-- For debugging: Dialog box text indicating there's a situation where data has unexpectedly changed --> - <string name="error_state_text">Стање разговора и примаоца је недоследно. Снимите извештај о грешци и пошаљите га преко http://go/droidanizer </string> - <!-- This is the dialog title for the "Select link" dialog, shown when the user clicks on a - chat in the chat history view if there are links in the chat message. The dialog displays the - links if there are any --> - <string name="select_link_title">Одаберите радњу</string> - <!-- In message list items, this string builds the timestamp line when the message is in a group [CHAR LIMIT=NONE] --> - <string name="message_timestamp_format"><xliff:g id="string" example="Fred Flinstone">%1$s</xliff:g>\u0020-\u0020<xliff:g id="string" example="9:39AM">%2$s</xliff:g></string> - <!--Message sending status: sending--> - <string name="status_sending">Слање…</string> - <!--Message sending status: failed--> - <!--<string name="status_failed">Failed. Tap to retry</string>--> - <!-- Delivery Report Activity --> - <!-- Status in "Report" window --> - <string name="status_none">(Ништа)</string> - <!-- Status in "Report" window --> - <string name="status_pending">На чекању</string> - <!-- Status in "Report" window --> - <string name="status_read">Прочитано</string> - <!-- Status in "Report" window --> - <string name="status_received">Примљено</string> - <!-- Status in "Report" window --> - <string name="status_failed">Неуспело. Додирните за могућности</string> - <!-- Status in "Report" window --> - <string name="status_unread">Непрочитано</string> - <!-- Status in "Report" window --> - <string name="status_rejected">Одбијено</string> - <!-- Label in "Report" window --> - <string name="recipient_label">Прималац:\u0020</string> - <!-- Label in "Report" window --> - <string name="status_label">Стање:\u0020</string> - <!-- Label in "Report" window [CHAR LIMIT=50]--> - <string name="delivered_label">Испоручено:\u0020</string> - <string name="do_something">Уради нешто</string> - <!-- Confirm Delete --> - <!-- Delete confirmation dialog title --> - <string name="confirm_dialog_title">Избрисати?</string> - <!-- Delete confirmation dialog title for locked messages --> - <string name="confirm_dialog_locked_title">Избрисати закључану поруку?</string> - <!-- This message is displayed in a confirmation dialog when the user selects one or more - conversations and then taps the "Delete" button. --> - <plurals name="confirm_delete_conversation"> - <!-- Case of 1 result. --> - <item quantity="one">Један разговор ће бити избрисан.</item> - <item quantity="few"><xliff:g id="number" example="15">%1$s</xliff:g> разговора ће бити избрисано.</item> - <!-- Case of 0 or 2 or more results. --> - <item quantity="other"><xliff:g id="number" example="15">%1$s</xliff:g> разговора ће бити избрисано.</item> - </plurals> - <string name="confirm_delete_conversation">Цео разговор ће бити избрисан.</string> - <!-- Delete all threads confirmation dialog message --> - <string name="confirm_delete_all_conversations">Сви разговори ће бити избрисани.</string> - <!-- Delete message confirmation dialog message --> - <string name="confirm_delete_message">Порука ће бити избрисана.</string> - <!-- Delete message confirmation dialog message for a locked message --> - <string name="confirm_delete_locked_message">Избрисати ову закључану поруку?</string> - <!-- Delete all the messages on the SIM dialog message --> - <string name="confirm_delete_all_SIM_messages">Све поруке на SIM картици ће бити избрисане.</string> - <!-- Delete the selected message on the SIM dialog message --> - <string name="confirm_delete_SIM_message">Ова порука на SIM картици ће бити избрисана.</string> - <!-- Delete unlocked checkbox title --> - <string name="delete_unlocked">Брисање закључаних порука</string> - <!-- Delete button title --> - <string name="delete">Обрисати</string> - <!-- More button title --> - <string name="more">Још</string> - <!-- More button summary --> - <string name="more_summary">Додирните да видите још</string> - <!-- Action bar mode title when multi-selecting conversations --> - <string name="select_conversations">Изаберите разговоре</string> - <!-- Show this in the middle of the main activity when there are no conversations [CHAR LIMIT=none] --> - <string name="no_conversations">Нема разговора.</string> - <!-- Show this in the middle of the main activity when loading conversations [CHAR LIMIT=none] --> - <string name="loading_conversations">Учитавање разговора.</string> - <!-- Tells the user that QKSMS isn't the default SMS app --> - <string name="not_default">Подразумавана СМС аплиакција</string> - <!-- Tells the user they need to set QKSMS as the default app in order to use this feature --> - <string name="default_info">Да бисте то урадили QKSMS мора бити основна апликација за СМС</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to mark messages as read --> - <string name="not_default_mark_read">QKSMS мора да буде Ваша основна апликација за СМС да бисте поруке означили као прочитане</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to mark messages as unread --> - <string name="not_default_mark_unread">QKSMS мора да буде Ваша основна апликација за СМС да бисте поруке означили као непрочитане</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to send messages --> - <string name="not_default_delete">QKSMS мора да буде Ваша основна апликација за СМС да бисте обрисали поруке</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to delete messages --> - <string name="not_default_send">QKSMS мора да буде Ваша основна апликација за СМС да бисте слали поруке</string> - <!-- Tells the user they should set QKSMS as the default messaging app --> - <string name="not_default_first">Неке ствари неће радити док не поставите QKSMS као основну СМС апликацију</string> - <string name="delayed_messaging_info">Одложено слање Вам омогућава да откажете поруке пре него што се пошаљу. То, и још што-шта можете наћи у подешавањима</string> - <string name="delayed_duration_bounds_error">Трајање мора бити између 1 и 30 секунди</string> - <!-- Dialog title for the Read Report dialog. --> - <string name="confirm">Потврди</string> - <!-- Dialog text for the Read Report dialog. --> - <string name="message_send_read_report">Извештај ће бити послат.</string> - <!-- Dialog title for updating app icon color --> - <string name="update_icon_title">Ажурирај боју иконе</string> - <!-- Dialog message for updating app icon color --> - <string name="update_icon_message">Када се мења боја иконе, QKSMS мора бити поново покренут</string> - <string name="dialog_conversation_details_title">Детаљи о разговору</string> - <string name="dialog_conversation_details_last_message_date">Датум последње поруке</string> - <string name="dialog_conversation_details_message_count">Број порука</string> - <string name="dialog_conversation_details_recipients">Примаоци (%s)</string> - <string name="dialog_should_i_answer_title">Should I Answer? није инсталиран</string> - <string name="dialog_should_i_answer_message">Желите ли да преузмете апликацију са Google Play-а?</string> - <string name="dialog_delete_old_messages">Јесте ли сигурни да желите да се старе поруке аутоматски бришу?</string> - <!-- Title for audio file picker --> - <string name="select_audio">Одабери звук</string> - <!-- Menu title to copy an attachment to the shared storage [CHAR LIMIT=25] --> - <string name="copy_to_sdcard">Сачувај прилог</string> - <!-- Toast message on successful copy to shared storage [CHAR LIMIT=30] --> - <string name="copy_to_sdcard_success">Прилог је сачуван.</string> - <!-- Toast message on failed copy to shared storage [CHAR LIMIT=30] --> - <string name="copy_to_sdcard_fail">Чување прилога није успело.</string> - <!-- Menu title to save a sound as a ringtone --> - <string name="save_ringtone">Сачувај као мелодију звона</string> - <!-- Toast message on successful copying ringtone to drm provider --> - <string name="saved_ringtone">Мелодија звона је сачувана.</string> - <!-- Toast message on failed copying ringtone to drm provider --> - <string name="saved_ringtone_fail">Чување мелодије звона није успело.</string> - <!-- Menu item --> - <!-- Menu item [CHAR LIMIT=40] --> - <string name="menu_group_participants">Више учесника</string> - <!--Toast shown when a draft is saved--> - <string name="toast_draft">Радна верзија сачувана</string> - <!--Toast shown when a conversation is deleted--> - <string name="toast_conversation_deleted">Разговор је обрисан</string> - <!--Toast shown when device is low on storage--> - <string name="toast_low_memory">"Меморија телефона је пуна. Обришите неке датотеке да ослободите простор."</string> - <!--Toast shown to tell user that forwarding messages doesn't work yet--> - <string name="toast_forward">Ова могућност још није омогућена. За сада, користите опцију \"Копирај\", и налепите текст у разговор у који желите да га пошаљете</string> - <!--Toast shown for unimplemented features--> - <string name="toast_unimplemented">Ова могућност још није омогућена</string> - <!--Toast shown when a message fails to send--> - <string name="toast_message_failure">Слање поруке није успело</string> - <!--Toast shown when a message is delivered--> - <string name="toast_message_delivered">Порука је достављена</string> - <!--Toast shown when a message is not delivered--> - <string name="toast_message_not_delivered">Порука није достављена</string> - <!--Toast shown when default APNs are loaded--> - <string name="toast_default_apns_loaded">Учитана су основна подешавања за приступну тачку</string> - <!--Toast shown when text is copied to the clipboard--> - <string name="toast_copy_text">Текст је ископиран у међумеморију</string> - <!--Toast shown when Google Play Services is not available for purchasing a product--> - <string name="toast_billing_not_available">Куповина захтева да Google Play продавница буде на Вашем Андроиду</string> - <!--Toast shown when Google Play Services is not available for purchasing a product--> - <string name="toast_endlessjabber_not_installed">EndlessJabber није нађен, отварам Google Play</string> - <string name="toast_changelog_error">Није могуће учитати листу измена. Молимо покушајте касније</string> - <string name="toast_conversation_error">Не могу да отворим разговор</string> - <string name="toast_deleting_old_messages">Ваше старе поруке ће ускоро бити обрисане</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_1">Хвала Вам за донацију! Ви сте мој нови најбољи пријатељ.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_2">Хвала Вам за донацију! Волим Вас.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_3">Хвала Вам за донацију! Помажете QKSMS да постане најбоља апликација за поруке икада.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_4">Хвала Вам за донацију! Сјајни сте.</string> - <!--Menu option to mute conversation--> - <string name="menu_mute_conversation">Не примај обавештења из овог разговора</string> - <!--Menu option to mute conversation--> - <string name="menu_unmute_conversation">Примај обавештења из овог разговора</string> - <string name="menu_block_conversations">Блокирај разговоре</string> - <string name="menu_unblock_conversations">Одблокирај разговоре</string> - <string name="menu_messages">Поруке</string> - <string name="menu_blocked">Блокирано</string> - <string name="menu_blocked_conversations">Блокирано (%s нових)</string> - <string name="menu_unblocked_conversations">Поруке (%s нових)</string> - <string name="menu_notifications">Обавештења</string> - <string name="menu_notifications_off">Обавештења искључена</string> - <string name="menu_notification_settings">Подешавања разговора</string> - <string name="menu_view_details">Видите детаље</string> - <string name="menu_mark_read">Означи као прочитано</string> - <string name="menu_mark_unread">Означи као непрочитано</string> - <string name="menu_delete_conversation">Обриши разговор</string> - <string name="menu_multi_select">Обележи разговор</string> - <string name="menu_done">Урађено</string> - <string name="failed_message_title">Могућности неуспеле поруке</string> - <!--Toast shown to tell the user that they don't have a photo attachments app, and suggests that they download one--> - <string name="attachment_app_not_found">Нема апликације за додатке. Пробајте да инсталирате неку фото-галерију!</string> - <string name="attachment_camera_error">Камера није могла да се покрене</string> - <string name="pref_max_mms_attachment_size">Највећа дозвољена величина додатка у ММС-у</string> - <string name="error_no_recipients">Изаберите неке контакте којима ћете послати ову поруку!</string> - <string name="error_file_not_found">QKSMS не може да приступи датотеци коју желите да поделите!</string> - <string name="sending_blocked_welcome_screen_message">Сачекајте! Слаћете праве поруке за само минут!</string> - <string name="notification_colored_icon_ready">Притисните да бисте додали пречицу на почетни екран.</string> - <string name="notification_title_colored_icon_ready">QKSMS обојена икона је спремна</string> - <string name="icon_ready">Ваша нова икона је готова!</string> - <string name="icon_ready_message">Сада је, свеже обојену, можете поново додати на почетни екран.</string> - <string name="dont_ask_again">Не питај опет</string> - <string name="warning">Упозорење о Stagefright-у</string> - <string name="stagefright_warning">Видео поруке могу да садрже штетан код који може Ваш уређај отворити за нападе хакера. Да ли желите да наставите?</string> - <!-- MMS DIALOG SETUP STRINGS --> - <string name="mms_setup_set_up_mms_title">Да подесим ММС?</string> - <string name="mms_setup_set_up_mms_body">Изгледа да ММС није подешен у QKSMS. Додирните \"У реду\" да аутоматски подесите ММС.</string> - <string name="mms_setup_setting_up_later_title">Подеси ММС касније</string> - <string name="mms_setup_setting_up_later_body">Идите у ММС одељак у Подешавањима да пробате аутоматско подешавање, контактирате подршку, или унесете сопствена подешавања.</string> - <string name="mms_setup_no_configurations_found_title">Нема подешавања</string> - <string name="mms_setup_no_configurations_found_body">Нисам могао да нађем аутоматска подешавања за Вашег оператера. Додирните \"У реду\" да контактирате подршку. МИ ћемо Вам помоћи око подешавања! </string> - <string name="mms_setup_one_configuration_found_title">Једно подешавање нађено</string> - <string name="mms_setup_one_configuration_found_body">Нашли смо подешавања за %s оператера? Је ли то у реду?</string> - <string name="mms_setup_multiple_configurations_found_title">Више подешавања нађено</string> - <string name="mms_setup_multiple_configurations_found_body">Нашли смо више ММС подешавања. Изаберите Вашег оператера са листе, или притисните \"ништа\" ако вашег оператера нема на листи.</string> - <string name="mms_setup_next_steps_title">Наредни кораци</string> - <string name="mms_setup_next_steps_body">Идите у ММС одељак у Подешавањима да пробате аутоматско подешавање, контактирате подршку, или унесете сопствена подешавања.</string> - <string name="mms_setup_success_title">То је то!</string> - <string name="mms_setup_success_body">Ако наиђете на било какав проблем, идите у ММС одељак у Подешавањима да пробате аутоматско подешавање, контактирате подршку, или унесете сопствена подешавања.</string> - <string name="na">Ништа</string> - <string name="no">Не</string> - <string name="pref_automatically_configure_mms">Аутоматско подешавање ММС-а</string> - <string name="pref_mms_contact_support">Контактирати подршку</string> - <string name="pref_category_sending_mms">Слање ММС-а</string> - <string name="pref_category_mms_configuration">Подешавање ММС-а</string> - <string name="pref_mms_contact_support_summary">Контактирајте QKSMS тим за помоћ око подешавања ММС-а</string> - <string name="pref_markdown_enabled">Обликовање текста</string> - <string name="pref_markdown_enabled_summary">Нека помоћу знакова текст буде подебљан, подвучен, или итализиран у порукама</string> - <string name="want_read_indicators">Желите ли индикаторе да ли су поруке прочитане или не?</string> - <string name="color_swatch_description">Боја %1$d</string> - <string name="color_swatch_description_selected">Боја %1$d изабрана</string> - <string name="color_picker_default_title">Изаберите боју</string> - <string name="message_delivered">Порука је ипоручена</string> - <string name="message_not_delivered">Порука није достављена</string> - <string name="error">Грешка</string> - <string name="invalid_destination">Неважећа адреса.</string> - <string name="service_not_activated">Услуга није активирана на мрежи.</string> - <string name="service_message_not_found">Порука је истекла, или није више доступна.</string> - <string name="service_network_problem">Слање није могуће због проблема на мрежи.</string> - <string name="message_queued">Ваша порука не може бити тренутно послата. Послаћу је чим мрежа проради.</string> - <string name="download_later">Не могу сада да преузмем. Покушајте поново касније.</string> - <string name="no_apn">Нема приступних тачака за апликацију, мораћете то да подесите у подешавањима!</string> - <string name="no_subject">(Нема теме)</string> - <string name="unknown_sender">Непознати пошиљалац</string> - <string name="dl_failure_notification">Нисам могао да преузмем поруку <xliff:g id="subject">%1$s</xliff:g> од <xliff:g id="from">%2$s</xliff:g>.</string> - <string name="auto_select_multiple_apns">Више различитих подешавања је нађено. Испробајте једно. Ако оно не ради, пробајте ново тако што ћете отићи у Подешавања > Напредно > Учитај основна подешавања приступне тачке.</string> - <string name="auto_select_apn">Аутоматски изабери приступне тачке</string> - <string name="auto_select_failed_title">Аутоматско подешавање је неуспело</string> - <string name="auto_select_failed">Пробајте да нађете подешавања приступне тачке Вашег оператера (MMSC, Порт, Прокси) и да их унесете у Подешавања > Напредно.</string> - <string name="date_yesterday">Јуче</string> - <string name="date_just_now">Управо сада</string> - <string name="compose_loading_attachment">Учитавам прилог</string> - <string name="hint_no_messages">Још нема порука.\nДодирните + да пошаљете једну!</string> - <string-array name="resend_menu"> - <item>Поново пошаљи</item> - <item>Уреди</item> - <item>Избриши</item> - </string-array> - <string-array name="message_menu"> - <item>Проследи поруку</item> - <item>Умножи текст</item> - <item>Види детаље</item> - <item>Избриши поруку</item> - </string-array> - <string-array name="background_titles"> - <item>Material светла</item> - <item>Material тамна</item> - <item>Црна</item> - </string-array> - <string-array name="font_sizes"> - <item>Мали</item> - <item>Нормалан</item> - <item>Велики</item> - <item>Највећи</item> - </string-array> - <string-array name="font_families"> - <item>Roboto Обичан</item> - <item>Roboto Згуснути</item> - <item>Системски фонт</item> - </string-array> - <string-array name="font_weights"> - <item>Танак</item> - <item>Нормалан</item> - </string-array> - <!-- String to match as no subject and filter out as a subject. For example, if the - subject string is "no subject", we won't display that. We'll pretend - no subject string was delivered. --> - <string-array name="empty_subject_strings"> - <item>нема теме</item> - </string-array> - <string-array name="qk_responses"> - <item>У реду</item> - <item>Сачекај секунд</item> - <item>Стижем</item> - <item>Хвала</item> - <item>Не звучи лоше</item> - <item>Шта има?</item> - <item>Договорено</item> - <item>Не</item> - <item>Волим те</item> - <item>Извини</item> - <item>Значи, ЛОЛ</item> - <item>Добро онда</item> - </string-array> - <string-array name="enter_button_options"> - <item>Прикажи емоџије</item> - <item>Нови ред</item> - <item>Пошаљи поруку</item> - </string-array> - <string-array name="notification_private_options"> - <item>Прикажи све</item> - <item>Сакриј поруку</item> - <item>Сакриј поруку и пошиљаоца</item> - </string-array> - <!-- Max MMS attachment sizes. I.e. will compress pictures that are larger than 300 KB down to - under 300KB. --> - <string-array name="max_mms_attachment_sizes"> - <item>300 KБ</item> - <item>600 KБ</item> - <item>1 МБ</item> - <item>Неограничено</item> - </string-array> -</resources> diff --git a/QKSMS/src/main/res/values-sv/strings.xml b/QKSMS/src/main/res/values-sv/strings.xml deleted file mode 100644 index 25f2be8d1..000000000 --- a/QKSMS/src/main/res/values-sv/strings.xml +++ /dev/null @@ -1,768 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!--Generated by crowdin.com--> -<resources xmlns:xliff="http://schemas.android.com/apk/res-auto"> - <!--Slogan--> - <string name="slogan">Tyck om att skicka SMS igen.</string> - <!--Text shown when a phone number cannot be found--> - <string name="unknown_number">Okänt nummer</string> - <!--Content description for photos--> - <string name="popup_photo_CD">Foto</string> - <!--Text to be displayed while content is loading--> - <string name="loading">Laddar…</string> - <!--Test string--> - <string name="test">Teststräng</string> - <!--Hint for contacts text field--> - <string name="hint_contacts">Välj mottagare</string> - <!--Hint for search text field--> - <string name="hint_search">Sök efter något</string> - <!--Hint for message reply text field--> - <string name="hint_reply">Skriv meddelande</string> - <!--Hint for code redemption--> - <string name="hint_redeem">Ange kod</string> - <string name="hint_hex">Hex</string> - <!--Text shown for single new message in notification--> - <string name="new_message">Nytt meddelande</string> - <!--Text shown after number of unread messages in notification (ex. 3 new messages)--> - <string name="new_messages">nya meddelanden</string> - <!--Text shown for single failed message in notification--> - <string name="failed_message">Kunde inte skicka meddelande</string> - <!--Text shown after number of failed messages in notification (ex. 3 messages failed to send)--> - <string name="failed_messages">meddelanden kunde inte skickas</string> - <!--Text shown under failed message count--> - <string name="failed_messages_summary">Tryck för att visa</string> - <!--QuickCompose notification title--> - <string name="quickcompose">QK-komponera</string> - <!--QuickCompose notification text--> - <string name="quickcompose_detail">Tryck för att skicka ett meddelande</string> - <!--Welcome screen intro button--> - <string name="welcome_start">Då börjar vi!</string> - <!--Allows user to skip welcome screen--> - <string name="welcome_skip">HÖPPA ÖVER</string> - <!--Allows user to finish the welcome screen--> - <string name="welcome_finish">KLAR</string> - <!--Indicates to user they can pick a color--> - <string name="welcome_theme_title">Välj en färg</string> - <!--Indicates to user they can pick any colors--> - <string name="welcome_theme_description">Vilken färg som helst.</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_night_description">Akta ögonen.</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_night_hint">Växla mig</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_quickreply_title">QK-svara</string> - <!--QK Reply explanation--> - <string name="welcome_quickreply_description">Svara på meddelanden, snabbare än någonsin.</string> - <!--Prompts user to try QK Reply--> - <string name="welcome_quickreply_hint">Testa!</string> - <!--QK Reply demo message--> - <string name="welcome_quickreply_message_1">Visst var det häftigt? Du kan se hela konversationen direkt. Tryck utanför pop-upfönstret eller tryck på krysset för att avvisa det.</string> - <!--QK Reply demo message--> - <string name="welcome_quickreply_message_2">Detta är QK-svar. Nu kan du svara överallt. Tryck på utvidgningsknappen för att se vad som händer :)</string> - <!--Settings option in menu--> - <string name="menu_settings">Inställningar</string> - <!--Search option in menu--> - <string name="menu_search">Sök</string> - <!--Show full conversation in QuickReply--> - <string name="menu_show_all">Visa alla meddelanden</string> - <!--Show only unread messages in QuickReply--> - <string name="menu_show_unread">Visa olästa meddelanden</string> - <!--Open conversation option in menu (shown in QuickReply)--> - <string name="menu_open_thread">Öppna konversation</string> - <!--Forward message option in menu--> - <string name="menu_forward">Vidarebefordra</string> - <!--Call contact option in menu--> - <string name="menu_call">Ring</string> - <!--Mark a message/conversation as read option in menu--> - <string name="menu_read">Markera som läst</string> - <!--Delete a message option in menu--> - <string name="menu_delete">Ta bort</string> - <!--Donate option in menu--> - <string name="menu_billing">Donera</string> - <!--Copy text option in menu--> - <string name="menu_copy">Kopiera text</string> - <!--Changelog option in menu--> - <string name="menu_changelog">"Vad är nytt"</string> - <!--Expand settings option in menu--> - <string name="menu_show_all_prefs">Visa alla</string> - <!--Show less settings option in menu--> - <string name="menu_show_fewer_prefs">Visa färre</string> - <!--Title for message details popup--> - <string name="details_title">Detaljer</string> - <!--Title for address that message is being sent to in message details popup--> - <string name="details_to">Till</string> - <!--Title for address that message is sent from in message details popup--> - <string name="details_from">Från</string> - <!--Title for text of a message in message details popup--> - <string name="details_body">Meddelande</string> - <!--Title for date sent of a message in message details popup--> - <string name="details_date_sent">Datum sänt</string> - <!--Title for date received of a message in message details popup--> - <string name="details_date_received">Datum mottaget</string> - <!--Title for rate snackbar--> - <string name="rate_title">Like QKSMS?</string> - <!--Title for rate button--> - <string name="rate_action">Rate</string> - <string name="pref_category_appearance">Utseende</string> - <string name="pref_category_summary_appearance">Teman, typsnitt, färger, bilder med mera</string> - <string name="pref_category_general">Allmänt</string> - <string name="pref_category_summary_general">Leverans, skickande, formatering</string> - <string name="pref_category_blocking">Message blocking</string> - <string name="pref_category_notifications">Aviseringar</string> - <string name="pref_category_summary_notifications">Ljud, LED, integritet</string> - <string name="pref_category_mms">MMS</string> - <string name="pref_category_summary_mms">Konfigurera MMS (APN:er), maxstorlek, gruppmeddelanden</string> - <string name="pref_category_quickreply">QK-svara</string> - <string name="pref_category_summary_quickreply">QK-svar, pop-upalternativ</string> - <string name="pref_category_quickcompose">QK-komponera</string> - <string name="pref_category_summary_quickcompose">QK-komponera, stjärnmarkerade kontakter</string> - <string name="pref_category_about">Om</string> - <string name="pref_category_summary_about">Version, ändringslogg, upphovsmän, tack</string> - <string name="pref_theme">Theme color</string> - <string name="pref_theme_summary_alt">Tryck för att ändra tema</string> - <string name="pref_icon">Icon color</string> - <string name="pref_icon_summary">Tap to change the QKSMS icon color</string> - <string name="pref_status_tint">Tonat statusfält</string> - <string name="pref_navigation_tint">Tonat navigeringsfält</string> - <string name="pref_background">Bakgrundsfärg</string> - <string name="pref_background_summary">Tryck för att ändra bakgrundsfärgen</string> - <string name="pref_bubbles">Meddelandebubblor</string> - <string name="pref_bubbles_summary">Tryck för att ändra alternativen för meddelandebubblorna</string> - <string name="pref_night">Nattläge</string> - <string name="pref_night_summary">Spara batteri och minska ögonansträngningen</string> - <string name="pref_night_amoled">Helt svart bakgrund</string> - <string name="pref_night_amoled_summary">Spara extra batteri på enheter med AMOLED-skärmar</string> - <string name="pref_bubble_style_new">Använd ny bubbelstil</string> - <string name="pref_color_sent">Färga skickade meddelanden</string> - <string name="pref_color_sent_summary">Färga bakgrundsbubblorna för utgående meddelanden</string> - <string name="pref_color_received">Färga mottagna meddelanden</string> - <string name="pref_color_received_summary">Färga bakgrundsbubblorna för inkommande meddelanden</string> - <string name="pref_hide_avatar_conversations">Göm profilbilder i konversationer</string> - <string name="pref_hide_avatar_conversations_summary">Göm kontakters profilbilder i konversationslistan</string> - <string name="pref_hide_avatar_sent">Göm profilbilder för skickade meddelanden</string> - <string name="pref_hide_avatar_sent_summary">Göm din profilbild för utgående meddelanden</string> - <string name="pref_hide_avatar_received">Göm profilbilder för mottagna meddelanden</string> - <string name="pref_hide_avatar_received_summary">Göm kontaktens profilbild för inkommande meddelanden</string> - <string name="pref_font_family">Typsnittsfamilj</string> - <string name="pref_font_size">Teckenstorlek</string> - <string name="pref_font_weight">Teckenstil</string> - <string name="pref_message_count">Meddelanderäknare</string> - <string name="pref_message_count_summary">Visa antalet meddelande för varje konversation</string> - <string name="pref_sent_timestamps">Sent timestamps</string> - <string name="pref_sent_timestamps_summary">Show the timestamp for when a message was sent, not received</string> - <string name="pref_force_timestamps">Force timestamps</string> - <string name="pref_force_timestamps_summary">Enable timestamps for all messages</string> - <string name="pref_key_timestamp_delay">New timestamp delay</string> - <string name="pref_key_timestamp_delay_summary">The number of minutes which must elapse between two messages in order for a new timestamp to be shown.</string> - <string name="pref_compose_favorites">Stjärnmärkta kontakter</string> - <string name="pref_compose_summary_favorites">Visar dina stjärnmarkerade kontakter i fönstret för QK-komponera, så att de bara är ett tryck iväg</string> - <string name="pref_prox_sensor_call">Närhetssensor</string> - <string name="pref_prox_sensor_call_summary">När du visar en konversation, håll telefonen mot örat för att ringa upp</string> - <string name="pref_delivery">Leveransrapporter</string> - <string name="pref_delivery_summary">Bekräfta att meddelanden har skickats</string> - <string name="pref_delivery_toast">Visa toast</string> - <string name="pref_delivery_toast_summary">Visa en kort toast för att indikera att meddelandet levereras</string> - <string name="pref_delivery_vibrate">Vibrera</string> - <string name="pref_delivery_vibrate_summary">Vibrera vid meddelandeleverans</string> - <string name="pref_delete_old_messages">Delete old messages</string> - <string name="pref_delete_old_messages_summary">Automatically delete messages once they\'re old enough</string> - <string name="pref_delete_old_messages_unread">Unread messages</string> - <string name="pref_delete_old_messages_unread_summary">Automatically delete unread messages after %s days</string> - <string name="pref_delete_old_messages_read">Read messages</string> - <string name="pref_delete_old_messages_read_summary">Automatically delete read messages after %s days</string> - <string name="pref_yappy">Yappy-integrering</string> - <string name="pref_endlessjabber_summary">Aktivera fullt stöd för Yappy</string> - <string name="pref_blocked_conversations">Blocked conversations</string> - <string name="pref_blocked_conversations_summary">Long-press on a conversation and block to move to blocked inbox and stop notifications</string> - <string name="pref_block_future">Block future messages</string> - <string name="pref_block_future_summary">Add additional phone numbers to block</string> - <string name="pref_should_i_answer">Should I Answer? Integration</string> - <string name="pref_should_i_answer_summary">Automatically delete incoming messages from numbers which are blocked through Should I Answer?</string> - <string name="pref_mobile_only">Mobilnummer</string> - <string name="pref_mobile_only_summary">Visa bara mobilnummer bland kontaktförslag</string> - <string name="pref_auto_emoji">Automatisk Emoji</string> - <string name="pref_auto_emoji_summary">Ersätt text med Emoji-symboler</string> - <string name="pref_enter_button">Enter-knapp</string> - <string name="pref_enter_button_summary">Tryck för att ändra enter-knappens beteende</string> - <string name="pref_compose_group">Gruppmeddelanden</string> - <string name="pref_compose_group_summary">När ett meddelande komponeras till flera personer, skicka ett gruppmeddelande istället för individuella meddelanden</string> - <string name="pref_auto_download">Ladda ner MMS automatiskt</string> - <string name="pref_auto_download_summary">Ladda automatiskt ner MMS-meddelanden när de finns tillgängliga</string> - <string name="pref_auto_data">Aotomatisk dataanslutning</string> - <string name="pref_auto_data_summary">Starta dataanslutning automatiskt när MMS skickas eller tas emot</string> - <string name="pref_split">Dela upp SMS</string> - <string name="pref_split_summary">Dela upp långa meddelanden i kortare, separata meddelanden</string> - <string name="pref_split_counter">Delningsräknare</string> - <string name="pref_split_counter_summary">Lägger till en räknare framför varje delat meddelande</string> - <string name="pref_long_as_mms">Skicka långa som MMS</string> - <string name="pref_long_as_mms_summary">Skicka långa meddelanden som MMS istället för att dela upp dem</string> - <string name="pref_long_as_mms_after">Skicka som MMS efter</string> - <string name="pref_long_as_mms_after_summary">Skicka långa meddelanden som MMS när de når ett visst antal meddelanden</string> - <string name="pref_return">Visa tillbakaknappen</string> - <string name="pref_return_summary">Visa tillbakaknappen på tangentbordet i stället för Emoji-knappen</string> - <string name="pref_text">Text</string> - <string name="pref_notifications">SMS-aviseringar aktiverade</string> - <string name="pref_led">Ljusavisering</string> - <string name="pref_theme_led">Färg på LED-aviseringar</string> - <string name="pref_wake">Vakna telefon</string> - <string name="pref_wake_summary">Starta skärmen när du tar emot ett nytt meddelande</string> - <string name="pref_notifications_private">Privata avsieringar</string> - <string name="pref_notifications_private_summary">Tap to change what should be hidden in notfication</string> - <string name="pref_ringtone">Aviseringsljud</string> - <string name="pref_ringtone_summary">Välj avsieringsljud</string> - <string name="pref_ticker">Visa ticker</string> - <string name="pref_ticker_summary">Visar utdrag av nya meddelanden i meddelandefältet</string> - <string name="pref_vibration">Vibration</string> - <string name="pref_vibration_summary">Vibrera när nya meddelanden tas emot</string> - <string name="pref_notification_call">Ring-knappen</string> - <string name="pref_notification_call_summary">Ring avsändaren direkt via aviseringen</string> - <string name="pref_dimiss_read">Mark as read</string> - <string name="pref_dismiss_read_summary">Mark message as read when notification is cleared</string> - <string name="pref_delayed">Fördröjda meddelanden</string> - <string name="pref_delayed_summary">Vänta innan meddelandet skickas, så att du kan kolla igenom dem</string> - <string name="pref_delayed_duration">Fördröjningstid i sekunder</string> - <string name="pref_delayed_duration_summary">Tid att vänta innan meddelandet skickas</string> - <string name="pref_night_auto">Automatiskt nattläge</string> - <string name="pref_night_auto_summary">Aktivera nattläget automatiskt baserat på tid på dygnet</string> - <string name="pref_day_start">Dagtid börjar</string> - <string name="pref_night_start">Nattid börjar</string> - <string name="pref_qk_responses">QK-svar</string> - <string name="pref_qk_responses_summary">Modifiera dina förinställda svar som kan användas från din Android Wear-enhet</string> - <string name="pref_quickreply_enabled">QK-svara aktiverat</string> - <string name="pref_quickreply_enabled_summary">Visa fönstret för QK-svara när ett nytt meddelande tas emot</string> - <string name="pref_tap_to_quit">Tryck för att avfärda</string> - <string name="pref_tap_to_quit_summary">Tryck utanför fönstret för att stänga det</string> - <string name="pref_quickcompose">QK-komponera aktiverat</string> - <string name="pref_quickcompose_summary">Visa en avisering du kan trycka på för att skriva ett nytt meddelande</string> - <string name="pref_mms_enabled">MMS aktiverat</string> - <string name="pref_mms_enabled_summary">Aktivera stöd för att skicka och ta emot MMS</string> - <string name="pref_mmsc_url">MMSC</string> - <string name="pref_mms_proxy">MMS-proxy</string> - <string name="pref_mms_port">MMS-port</string> - <string name="pref_apn_chooser">Ladda standard-APN:er</string> - <string name="pref_strip_unicode">Strippa Unicode</string> - <string name="pref_strip_unicode_summary">Byt ut tecken som inte stöds i fillängdsmeddelanden för GSM-kompatibla tecken till kompatibla tecken</string> - <string name="pref_system_bar_flat">Platt systemfält</string> - <string name="pref_system_bar_flat_summary">Få bort stigningen som visas i systemgränssnittsfälten på de flesta KitKat-enheterna</string> - <string name="pref_status_compat">Fix för statusfält</string> - <string name="pref_status_compat_summary">Fixar problem som orsakas av platt systemfält (Xposed) eller anpassade DPI-inställningar</string> - <string name="pref_navigation_compat">Fix för navigeringsfält</string> - <string name="pref_navigation_compat_summary">Fixar problem som orsakas av platt systemfält (Xposed) eller anpassade DIP-inställningar</string> - <string name="pref_about_version_title">QKSMS-version</string> - <string name="pref_about_authors_title">Upphovsmän</string> - <string name="pref_about_authors_summary">Moez Bhatti</string> - <string name="pref_changelog_summary">Tryck för att visa vad som är nytt</string> - <string name="pref_about_thanks_title">Tack</string> - <string name="pref_about_thanks_summary">Tryck för att visa bidragare</string> - <string name="pref_donate_title">Donera</string> - <string name="pref_donate_summary">QKSMS är gratis. Hjälp oss genom att donera!</string> - <string name="pref_about_gplus_title">Google+</string> - <string name="pref_about_gplus_summary">Join the QKSMS Beta Testing community on Google+</string> - <string name="pref_about_github_title">GitHub</string> - <string name="pref_about_github_summary">QKSMS is open source. Contribute and report issues on GitHub</string> - <string name="pref_about_crowdin_title">Crowdin</string> - <string name="pref_about_crowdin_summary">Join the QKSMS translation project on Crowdin</string> - <!--Preference subcategory--> - <string name="pref_subcat_theme">Tema</string> - <!--Preference subcategory--> - <string name="pref_subcat_system_bars">Systemfält</string> - <!--Preference subcategory--> - <string name="pref_subcat_categories">Kategorier</string> - <!--Preference subcategory--> - <string name="pref_subcat_font">Typsnitt</string> - <!--Preference subcategory--> - <string name="pref_subcat_messages">Meddelanden</string> - <!--Preference subcategory--> - <string name="pref_subcat_avatars">Profilbilder</string> - <string name="donate_google">Donera med Google</string> - <string name="donate_google_summary">Google tar 30% av donationerna</string> - <string name="donate_paypal">Donera med PayPal</string> - <string name="donate_paypal_button">Donera vad du vill</string> - <string name="donate_paypal_button_summary">Köp vad du vill åt mig!</string> - <!--Donation product name--> - <string name="product_name_donation">Donera</string> - <!--$1 donation product name--> - <string name="product_name_donate_1">Donera $1 USD</string> - <!--$5 donation product name--> - <string name="product_name_donate_5">Donera $5 USD</string> - <!--$3 donation product name--> - <string name="product_name_donate_10">Donera $10 USD</string> - <!--$1 donation product description--> - <string name="product_description_donate_1">Köp en cola åt mig</string> - <!--$5 donation product description--> - <string name="product_description_donate_5">Köp en macka åt mig</string> - <!--$10 donaion product description--> - <string name="product_description_donate_10">Köp lunch åt mig</string> - <string name="title_settings">Inställningar</string> - <string name="title_search">Sök</string> - <string name="title_compose">Nytt meddelande</string> - <string name="title_conversation_list">Konversationer</string> - <string name="title_blocked">Blocked</string> - <string name="title_changelog">Ändringslogg</string> - <string name="title_picker">Nya meddelanden</string> - <string name="title_donate">Donera</string> - <string name="title_qk_responses">QK-svar</string> - <string name="title_block_address">Block number</string> - <string name="title_unblock_address">Unblock number</string> - <string name="title_conversations_selected">%s selected</string> - <string name="title_palette">Palette</string> - <string name="title_rgb">RGB</string> - <!-- Menu shown in the context menu when long pressing on a message when the message contains - one or more phone numbers and/or email addresses and the number or email is new to - contacts. [CHAR LIMIT=50] --> - <string name="menu_add_address_to_contacts">Lägg till <xliff:g id="contactEmailOrNumber">%s</xliff:g> till Folk</string> - <!-- Context menu item on an individual message for viewing an attached slideshow --> - <string name="view_slideshow">Visa bildspel</string> - <!-- Context menu item on an individual message for viewing message details such as time and date --> - <string name="view_message_details">Visa detaljer</string> - <!-- Context menu item on an individual message for viewing a delivery report --> - <string name="view_delivery_report">Visa rapport</string> - <!-- Context menu item on an individual message for deleting only that message --> - <string name="delete_message">Ta bort</string> - <!-- Abbreviation for "kilobyte" --> - <string name="kilobyte">KB</string> - <!-- Individual message context menu item --> - <string name="copy_message_text">Kopiera text</string> - <!-- Header for context menu on an individual message --> - <string name="message_options">Meddelandealternativ</string> - <!-- Delivery Header View --> - <!-- Title of "Report" window --> - <string name="delivery_header_title">Rapportera</string> - <!--Text for app restart confirmation dialog--> - <string name="restart_message">Dessa ändringar börjar gälla nästa gång QKSMS öppnas</string> - <!--Dialog title for asking if a user wants to delete a conversation--> - <string name="delete_conversation">Delete conversations</string> - <!--Dialog title for asking if a user wants to delete all failed messages--> - <string name="delete_all_failed">Kunde inte ta bort meddelandena</string> - <!--CDialog title for asking if a user wants to delete a conversation--> - <string name="delete_confirmation">Are you sure you would like to delete (%s) conversations?</string> - <!--CDialog title for asking if a user wants to delete all failed messages--> - <string name="delete_all_failed_confirmation">Are you sure you would like to delete failed messages from (%s) conversations?</string> - <!--(Unused) Dialog title shown if APNs have not been set--> - <string name="apns_not_set">APN:er inte valda</string> - <!--(Unused) Dialog description shown if APNs have not been set--> - <string name="apns_not_set_description">Det ser ut som att du inte ställt in några APN:er. Detta betyder att MMS inte fungerar som de ska. Tryck på okej för att låta QKSMS hitta dessa åt dig :)</string> - <!--Dialog title show if MMS hasn't been configured--> - <string name="set_up_mms_title">Ställ in MMS?</string> - <!--Dialog description shown if MMS hasn't yet been configured--> - <string name="set_up_mms_description">Det ser ut som att MMS inte konfigurerats i QKSMS än. Tryck på okej för att automatiskt konfigurera MMS.</string> - <!-- Dialog message text explaining that a draft message will not be saved due to invalid recipients --> - <string name="discard_message_reason">Ditt meddelande kommer att kastat då det inte har några giltiga mottagare.</string> - <string name="invalid_code">Ogiltig kod</string> - <!--Button to restart app now instead of manually later--> - <string name="restart">Starta om nu</string> - <!--Notification action to reply to a message--> - <string name="reply">Svara</string> - <!--Notification action to reply to a message--> - <string name="reply_qksms">Svara med QKSMS</string> - <!--Notification action to mark a message as read--> - <string name="read">Läs</string> - <!--Notification action to mark a message as read--> - <string name="mark_read">Markera som läst</string> - <!--Notification action to call the sender of a message--> - <string name="call">Ring</string> - <!-- Notification toast message --> - <string name="notification_mute_on">Notifications enabled</string> - <string name="notification_mute_off">Notifications disabled</string> - <!--Positive action button--> - <string name="yes">Ja</string> - <string name="add">Add</string> - <!--Positive action button--> - <string name="save">Spara</string> - <!--Positive action button--> - <string name="enable">Aktivera</string> - <!--Positive action button--> - <string name="upgrade_now">Ställ in</string> - <!--Positive action button--> - <string name="okay">Okej</string> - <!--Positive action button--> - <string name="redeem">Lös in</string> - <!--Neutral action button--> - <string name="just_once">Bara en gång</string> - <!--Neutral action button--> - <string name="later">Senare</string> - <!--Neutral action button --> - <string name="cancel">Avbryt</string> - <!-- Name of the local user when displaying sender of an outgoing message (personal pronoun) --> - <string name="messagelist_sender_self">Jag</string> - <!-- Sender to be used if the sender address has been hidden --> - <string name="hidden_sender_address">Gömd avsändaradress</string> - <!-- Subject to display in the conversation list if there is no subject --> - <string name="no_subject_view">(Inget ämne)</string> - <!-- Time and date a message is due to expire --> - <string name="expire_on">"Expires: <xliff:g id="date">%s</xliff:g>"</string> - <!-- Formatting for subject displayed inline, prepended to MMS message text --> - <string name="inline_subject">"<Subject: <xliff:g id="subject">%s</xliff:g>>"</string> - <!-- Text of a button appearing for MMS messages that have not yet been downloaded, causing the message to be downloaded (imperative verb) --> - <string name="download">Ladda ner</string> - <!-- Message displayed in place of the "download message" button once it has been pressed, indicating that the download is in progress --> - <string name="downloading">Laddar ner</string> - <!-- Toast message while an image is being resized --> - <string name="compressing">Bilden är för stor. Komprimerar\u2026</string> - <!-- Header shown above favorite contacts in QKCompose --> - <string name="favorites">Stjärnmärkta kontakter</string> - <!-- Word represents 'self' in a conversation --> - <string name="me">Jag</string> - <string name="menu_edit">Ändra</string> - <string name="menu_delete_messages">Ta bort meddelanden</string> - <string name="menu_delete_failed">Delete failed messages</string> - <string name="menu_lock">Lås</string> - <string name="menu_unlock">Lås upp</string> - <!-- When the user tries to view message details and some error occurs while - retrieving those details, this message will be shown. --> - <string name="cannot_get_details">Kan inte ta emot detaljer.</string> - <!-- Title of "Message details" dialog --> - <string name="message_details_title">Meddelandedetaljer</string> - <!-- Label in "Message details" dialog --> - <string name="message_type_label">Typ\u000A</string> - <!-- "Type" value in "Message details" dialog --> - <string name="text_message">Textmeddelande</string> - <!-- "Type" value in "Message details" dialog --> - <string name="multimedia_message">Multimediameddelande</string> - <!-- "Type" value in "Message details" dialog --> - <string name="multimedia_notification">Aviseringar för multimediameddelanden</string> - <!-- Label in "Message details" dialog showing who sent the message. --> - <string name="from_label">Från\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="to_address_label">Till\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="bcc_label">BCC\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="sent_label">Skickat\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="received_label">Mottaget\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="saved_label">Sparat\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="subject_label">Ämne\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="message_size_label">Meddelandestorlek\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="priority_label">Prioritet\u000A</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_high">Hög</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_normal">Normal</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_low">Låg</string> - <!-- Label in "Message details" dialog --> - <string name="message_class_label">Meddelandeklass\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="error_code_label">Felkod\u000A</string> - <!-- Alert dialog title when creating a slideshow [CHAR LIMIT=none] --> - <string name="building_slideshow_title">Bygger bildspel</string> - <!-- Tag appearing on conversations in the conversation list that contain a draft message --> - <string name="has_draft">Utkast</string> - <!-- In conversation list items, this is the separator between a contact's name and the draft stamp [CHAR LIMIT=5] --> - <string name="draft_separator">,\u0020</string> - <!-- In conversation list items, this comes after the receipient's name and contains the number of messages in the thread [CHAR LIMIT=5] --> - <string name="message_count_format">\u00a0<xliff:g id="number" example="1">%1$s</xliff:g></string> - <!-- For debugging: Dialog box title indicating there's a situation where data has unexpectedly changed --> - <string name="error_state">Inkonsekvent tillständ</string> - <!-- For debugging: Dialog box text indicating there's a situation where data has unexpectedly changed --> - <string name="error_state_text">Tillståndet för trådar och mottagare är inkonsekvent. För en buggrapport via http://go/droidanizer </string> - <!-- This is the dialog title for the "Select link" dialog, shown when the user clicks on a - chat in the chat history view if there are links in the chat message. The dialog displays the - links if there are any --> - <string name="select_link_title">Välj åtgärd</string> - <!-- In message list items, this string builds the timestamp line when the message is in a group [CHAR LIMIT=NONE] --> - <string name="message_timestamp_format"><xliff:g id="string" example="Fred Flinstone">%1$s</xliff:g>\u0020-\u0020<xliff:g id="string" example="9:39AM">%2$s</xliff:g></string> - <!--Message sending status: sending--> - <string name="status_sending">Skickar…</string> - <!--Message sending status: failed--> - <!--<string name="status_failed">Failed. Tap to retry</string>--> - <!-- Delivery Report Activity --> - <!-- Status in "Report" window --> - <string name="status_none">(Ingen)</string> - <!-- Status in "Report" window --> - <string name="status_pending">Avvaktar</string> - <!-- Status in "Report" window --> - <string name="status_read">Läst</string> - <!-- Status in "Report" window --> - <string name="status_received">Mottaget</string> - <!-- Status in "Report" window --> - <string name="status_failed">Misslyckades. Tryck för alternativ</string> - <!-- Status in "Report" window --> - <string name="status_unread">Oläst</string> - <!-- Status in "Report" window --> - <string name="status_rejected">Avvisat</string> - <!-- Label in "Report" window --> - <string name="recipient_label">Mottagare:\u0020</string> - <!-- Label in "Report" window --> - <string name="status_label">Status:\u0020</string> - <!-- Label in "Report" window [CHAR LIMIT=50]--> - <string name="delivered_label">Levererat:\u0020</string> - <string name="do_something">Gör något</string> - <!-- Confirm Delete --> - <!-- Delete confirmation dialog title --> - <string name="confirm_dialog_title">Ta bort?</string> - <!-- Delete confirmation dialog title for locked messages --> - <string name="confirm_dialog_locked_title">Ta bort låst meddelande?</string> - <!-- This message is displayed in a confirmation dialog when the user selects one or more - conversations and then taps the "Delete" button. --> - <plurals name="confirm_delete_conversation"> - <!-- Case of 1 result. --> - <item quantity="one">En konversation tas bort.</item> - <!-- Case of 0 or 2 or more results. --> - <item quantity="other"><xliff:g id="number" example="15">%1$s</xliff:g> konversationer kommer tas bort.</item> - </plurals> - <string name="confirm_delete_conversation">Hela tråden kommer tas bort.</string> - <!-- Delete all threads confirmation dialog message --> - <string name="confirm_delete_all_conversations">Alla trådar kommer tas bort.</string> - <!-- Delete message confirmation dialog message --> - <string name="confirm_delete_message">Meddelandet kommer tas bort.</string> - <!-- Delete message confirmation dialog message for a locked message --> - <string name="confirm_delete_locked_message">Ta bort det låsta meddelandet?</string> - <!-- Delete all the messages on the SIM dialog message --> - <string name="confirm_delete_all_SIM_messages">Alla meddelanden på SIM-kortet kommer tas bort.</string> - <!-- Delete the selected message on the SIM dialog message --> - <string name="confirm_delete_SIM_message">Meddelandet på SIM-kortet kommer tas bort.</string> - <!-- Delete unlocked checkbox title --> - <string name="delete_unlocked">Ta bort låsta meddelanden</string> - <!-- Delete button title --> - <string name="delete">Ta bort</string> - <!-- More button title --> - <string name="more">Mer</string> - <!-- More button summary --> - <string name="more_summary">Tryck för att se mer</string> - <!-- Action bar mode title when multi-selecting conversations --> - <string name="select_conversations">Välj konversationer</string> - <!-- Show this in the middle of the main activity when there are no conversations [CHAR LIMIT=none] --> - <string name="no_conversations">Inga konversationer.</string> - <!-- Show this in the middle of the main activity when loading conversations [CHAR LIMIT=none] --> - <string name="loading_conversations">Laddar konversationer.</string> - <!-- Tells the user that QKSMS isn't the default SMS app --> - <string name="not_default">Standard-SMS</string> - <!-- Tells the user they need to set QKSMS as the default app in order to use this feature --> - <string name="default_info">QKSMS måste vara standardapp för meddelanden för att göra det där</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to mark messages as read --> - <string name="not_default_mark_read">QKSMS måste vara standardapp för meddelanden för att markera meddelanden som lästa</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to mark messages as unread --> - <string name="not_default_mark_unread">QKSMS måste vara standardapp för meddelanden för att markera meddelanden som olästa</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to send messages --> - <string name="not_default_delete">QKSMS måste vara standardapp för meddelanden för att ta bort meddelanden</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to delete messages --> - <string name="not_default_send">QKSMS måste vara standardapp för att kunna skicka meddelanden</string> - <!-- Tells the user they should set QKSMS as the default messaging app --> - <string name="not_default_first">Vissa saker fungerar inte förrän QKSMS är standardappen för meddelanden</string> - <string name="delayed_messaging_info">Fördröjda meddelanden låter dig avbryta meddelanden innan de skickas. Välj standardåtgärd i inställningarna</string> - <string name="delayed_duration_bounds_error">Varaktigheten måste vara mellan 1 och 30 sekunder</string> - <!-- Dialog title for the Read Report dialog. --> - <string name="confirm">Bekräfta</string> - <!-- Dialog text for the Read Report dialog. --> - <string name="message_send_read_report">En läsrapport kommer skickas.</string> - <!-- Dialog title for updating app icon color --> - <string name="update_icon_title">Uppdatera ikonfärg</string> - <!-- Dialog message for updating app icon color --> - <string name="update_icon_message">QKSMS must be restarted when changing the icon color</string> - <string name="dialog_conversation_details_title">Konversationsdetaljer</string> - <string name="dialog_conversation_details_last_message_date">Senaste meddelandedatum</string> - <string name="dialog_conversation_details_message_count">Meddelanderäknare</string> - <string name="dialog_conversation_details_recipients">Mottagare (%s)</string> - <string name="dialog_should_i_answer_title">Should I Answer? not installed</string> - <string name="dialog_should_i_answer_message">Would you like to download the app from Google Play now?</string> - <string name="dialog_delete_old_messages">Are you sure you want to automatically delete old messages?</string> - <!-- Title for audio file picker --> - <string name="select_audio">Välj jud</string> - <!-- Menu title to copy an attachment to the shared storage [CHAR LIMIT=25] --> - <string name="copy_to_sdcard">Spara bilaga</string> - <!-- Toast message on successful copy to shared storage [CHAR LIMIT=30] --> - <string name="copy_to_sdcard_success">Bilagan sparades.</string> - <!-- Toast message on failed copy to shared storage [CHAR LIMIT=30] --> - <string name="copy_to_sdcard_fail">Kunde inte spara bilagan.</string> - <!-- Menu title to save a sound as a ringtone --> - <string name="save_ringtone">Spara som ringsignal</string> - <!-- Toast message on successful copying ringtone to drm provider --> - <string name="saved_ringtone">Ringsignal sparad.</string> - <!-- Toast message on failed copying ringtone to drm provider --> - <string name="saved_ringtone_fail">Kunde inte spara ringsignal.</string> - <!-- Menu item --> - <!-- Menu item [CHAR LIMIT=40] --> - <string name="menu_group_participants">Gruppdeltagare</string> - <!--Toast shown when a draft is saved--> - <string name="toast_draft">Sparade utkast</string> - <!--Toast shown when a conversation is deleted--> - <string name="toast_conversation_deleted">Konversation borttagen</string> - <!--Toast shown when device is low on storage--> - <string name="toast_low_memory">"Telefonens minne är fullt. Ta bort filer för att frigöra utrymme."</string> - <!--Toast shown to tell user that forwarding messages doesn't work yet--> - <string name="toast_forward">Den här funktionen har inte implementerats ännu. Använd istället funktionen \"Kopiera text\" och klistra in som om du skicka skicka</string> - <!--Toast shown for unimplemented features--> - <string name="toast_unimplemented">Den här funktion har ännu inte implementerats</string> - <!--Toast shown when a message fails to send--> - <string name="toast_message_failure">Meddelandet kunde inte skickas</string> - <!--Toast shown when a message is delivered--> - <string name="toast_message_delivered">Meddelandet levererades</string> - <!--Toast shown when a message is not delivered--> - <string name="toast_message_not_delivered">Meddelandet levererades inte</string> - <!--Toast shown when default APNs are loaded--> - <string name="toast_default_apns_loaded">Laddade standardinställningarna för</string> - <!--Toast shown when text is copied to the clipboard--> - <string name="toast_copy_text">Kopierade text till urklipp</string> - <!--Toast shown when Google Play Services is not available for purchasing a product--> - <string name="toast_billing_not_available">Köp kräver Google Play (för betalning) på din Android-telefon</string> - <!--Toast shown when Google Play Services is not available for purchasing a product--> - <string name="toast_endlessjabber_not_installed">EndlessJabber är inte installerat, öppnar Google Play</string> - <string name="toast_changelog_error">Couldn\'t load the changelog. Please try again later</string> - <string name="toast_conversation_error">Couldn\'t open conversation</string> - <string name="toast_deleting_old_messages">Your old messages will be deleted shortly</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_1">Tack för din donation! Du är min nya bästa vän.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_2">Tack för donationen! Jag älskar dig.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_3">Tack för att du donerade! Du hjälper QKSMS bli den bästa SMS-appen som någonsin gjorts.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_4">Tack för donationen! Du är grym.</string> - <!--Menu option to mute conversation--> - <string name="menu_mute_conversation">Tysta konversation</string> - <!--Menu option to mute conversation--> - <string name="menu_unmute_conversation">Avtysta konversation</string> - <string name="menu_block_conversations">Block conversations</string> - <string name="menu_unblock_conversations">Unblock conversations</string> - <string name="menu_messages">Messages</string> - <string name="menu_blocked">Blocked</string> - <string name="menu_blocked_conversations">Blocked (%s new)</string> - <string name="menu_unblocked_conversations">Messages (%s new)</string> - <string name="menu_notifications">Notifications</string> - <string name="menu_notifications_off">Notifications off</string> - <string name="menu_notification_settings">Conversation settings</string> - <string name="menu_view_details">Visa detaljer</string> - <string name="menu_mark_read">Markera som läst</string> - <string name="menu_mark_unread">Markera som oläst</string> - <string name="menu_delete_conversation">Ta bort konversation</string> - <string name="menu_multi_select">Välj konversation</string> - <string name="menu_done">Done</string> - <string name="failed_message_title">Alternativ för meddelande</string> - <!--Toast shown to tell the user that they don't have a photo attachments app, and suggests that they download one--> - <string name="attachment_app_not_found">Bifogningsapp hittades inte. Installera en galleriapp!</string> - <string name="attachment_camera_error">Kameran kunde inte öppnas</string> - <string name="pref_max_mms_attachment_size">Högsta storlek för MMS-bilaga</string> - <string name="error_no_recipients">Välj kontaktera att skicka meddelandet till!</string> - <string name="error_file_not_found">QKSMS kan inte komma åt filen du försöker dela!</string> - <string name="sending_blocked_welcome_screen_message">Häng kvar! Du kommer skicka riktiga meddelanden om en minut!</string> - <string name="notification_colored_icon_ready">Tryck för att lägga till din starta från hemskärmen.</string> - <string name="notification_title_colored_icon_ready">Färgad ikon för QKSMS är redo</string> - <string name="icon_ready">Din nya ikon är redo!</string> - <string name="icon_ready_message">Du kan lägga till den på hemskärmen igen med den uppdaterade färgen.</string> - <string name="dont_ask_again">Fråga inte igeån</string> - <string name="warning">Stagefright-varning</string> - <string name="stagefright_warning">Videomeddelanden kan innehålla farliga säkerhethål som kan utsätta din telefon för attacker. Vill du fortsätta?</string> - <!-- MMS DIALOG SETUP STRINGS --> - <string name="mms_setup_set_up_mms_title">Ställ in MMS?</string> - <string name="mms_setup_set_up_mms_body">Det ser ut som att MMS inte är inställt i QKSMS. Tryck på okej för att automatiskt konfigurera MMS.</string> - <string name="mms_setup_setting_up_later_title">Ställer in MMS senare</string> - <string name="mms_setup_setting_up_later_body">Besök MMS-sektionen i inställningarna för att göra en automatisk konfiguration, kontakta support eller ange din egna konfiguration.</string> - <string name="mms_setup_no_configurations_found_title">Ingen konfiguration kunde hittas</string> - <string name="mms_setup_no_configurations_found_body">Vi kunde inte hitta en MMS-konfiguration för din operatör. Tryck på okej för att kontakta support så hjälper vid dig!</string> - <string name="mms_setup_one_configuration_found_title">En konfiguration hittades</string> - <string name="mms_setup_one_configuration_found_body">Vi har hittat en MMS-konfiguration för operatören %s. Låter det rätt?</string> - <string name="mms_setup_multiple_configurations_found_title">Flera konfigurationer hittades</string> - <string name="mms_setup_multiple_configurations_found_body">Vi hittade flera MMS-konfigurationer. Välj din operatör från listan, eller tryck på \"Finns ej\" om in operatör inte finns med i listan.</string> - <string name="mms_setup_next_steps_title">Nästa steg</string> - <string name="mms_setup_next_steps_body">Besök MMS-sektionen i inställningarna för att testa automatisk konfiguration igen, kontakta support eller ange din egen konfiguration.</string> - <string name="mms_setup_success_title">Lyckades!</string> - <string name="mms_setup_success_body">Om du upptäcker några fel, besök SMS-sektionen i inställningarna för att testa automatisk konfiguration igen, kontakta support eller ange din egen konfiguration.</string> - <string name="na">Finns ej</string> - <string name="no">Nej</string> - <string name="pref_automatically_configure_mms">Konfigurera MMS automatiskt</string> - <string name="pref_mms_contact_support">Kontakta support</string> - <string name="pref_category_sending_mms">Skickar MMS</string> - <string name="pref_category_mms_configuration">MMS-konfiguration</string> - <string name="pref_mms_contact_support_summary">Kontakta QKSMS för att få hjälp med att ställa in MMS</string> - <string name="pref_markdown_enabled">Textformatering</string> - <string name="pref_markdown_enabled_summary">Använd markdown-syntax för att få fetstilt, understruken eller kursiv text i dina meddelanden</string> - <string name="want_read_indicators">vill du ha läsindikatorer?</string> - <string name="color_swatch_description">Färg %1$d</string> - <string name="color_swatch_description_selected">Färg %1$d vald</string> - <string name="color_picker_default_title">Välj en färg</string> - <string name="message_delivered">Meddelandet levererat</string> - <string name="message_not_delivered">Meddelandet levererades inte</string> - <string name="error">Fel</string> - <string name="invalid_destination">Ogiltig destinationsadress.</string> - <string name="service_not_activated">Servicen inte aktiverad på nätverket.</string> - <string name="service_message_not_found">Meddelandet gick ut eller är inte tillgängligt.</string> - <string name="service_network_problem">Kunde inte skicka på grund av nätverksproblem.</string> - <string name="message_queued">Kan för närvarande inte skicka ditt meddelande. Det kommer att skickas när servicen är tillgänglig.</string> - <string name="download_later">Kan inte ladda ner just nu. Försök igen senare.</string> - <string name="no_apn">Ingen APN specifierad för appen. Du måste ställa in det i inställningarna!</string> - <string name="no_subject">(Inget ämne)</string> - <string name="unknown_sender">Okänd sändare</string> - <string name="dl_failure_notification">Kunde inte ladda ner meddelandet <xliff:g id="subject">%1$s</xliff:g> från <xliff:g id="from">%2$s</xliff:g>.</string> - <string name="auto_select_multiple_apns">Flera olika konfigurationer har hittats. Testa en ny. Om det inte fungerar, kan du testa en annan genom att gå till Inställningar > Avancerat > Ladda standard-APN:er.</string> - <string name="auto_select_apn">Välj automatiskt APN:er</string> - <string name="auto_select_failed_title">Automatisk konfiguration misslyckades</string> - <string name="auto_select_failed">Sök efter din operatörs APN-inställningar (MMSC, port och proxy) och ange dem i Inställningar > Avancerat.</string> - <string name="date_yesterday">Igår</string> - <string name="date_just_now">Just nu</string> - <string name="compose_loading_attachment">Laddar bilaga</string> - <string name="hint_no_messages">No messages yet.\nClick the + to send one!</string> - <string-array name="resend_menu"> - <item>Skicka igen</item> - <item>Ändra</item> - <item>Ta bort</item> - </string-array> - <string-array name="message_menu"> - <item>Vidarebefordra meddelandet</item> - <item>Kopiera text</item> - <item>Visa detaljer</item> - <item>Ta bort meddelande</item> - </string-array> - <string-array name="background_titles"> - <item>Material Light</item> - <item>Material Dark</item> - <item>Black</item> - </string-array> - <string-array name="font_sizes"> - <item>Liten</item> - <item>Normal</item> - <item>Stor</item> - <item>Störst</item> - </string-array> - <string-array name="font_families"> - <item>Roboto Normal</item> - <item>Roboto Kondenserad</item> - <item>System font</item> - </string-array> - <string-array name="font_weights"> - <item>Tunn</item> - <item>Normal</item> - </string-array> - <!-- String to match as no subject and filter out as a subject. For example, if the - subject string is "no subject", we won't display that. We'll pretend - no subject string was delivered. --> - <string-array name="empty_subject_strings"> - <item>inget ämne</item> - </string-array> - <string-array name="qk_responses"> - <item>Okej</item> - <item>Ett ögonblick</item> - <item>På väg</item> - <item>Tack</item> - <item>Låter bra</item> - <item>Vad händer?</item> - <item>Håller med</item> - <item>Nej</item> - <item>Älskar dig</item> - <item>Förlåt</item> - <item>LOL</item> - <item>Det är okej</item> - </string-array> - <string-array name="enter_button_options"> - <item>Visa Emoji-symboler</item> - <item>Ny rad</item> - <item>Skicka meddelande</item> - </string-array> - <string-array name="notification_private_options"> - <item>Show all</item> - <item>Hide message</item> - <item>Hide message and sender</item> - </string-array> - <!-- Max MMS attachment sizes. I.e. will compress pictures that are larger than 300 KB down to - under 300KB. --> - <string-array name="max_mms_attachment_sizes"> - <item>300 KB</item> - <item>600 KB</item> - <item>1 MB</item> - <item>Obegränsat</item> - </string-array> -</resources> diff --git a/QKSMS/src/main/res/values-tl/strings.xml b/QKSMS/src/main/res/values-tl/strings.xml deleted file mode 100644 index c5518ad86..000000000 --- a/QKSMS/src/main/res/values-tl/strings.xml +++ /dev/null @@ -1,768 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!--Generated by crowdin.com--> -<resources xmlns:xliff="http://schemas.android.com/apk/res-auto"> - <!--Slogan--> - <string name="slogan">Love texting again.</string> - <!--Text shown when a phone number cannot be found--> - <string name="unknown_number">Hindi Kilalang Numero</string> - <!--Content description for photos--> - <string name="popup_photo_CD">Larawan</string> - <!--Text to be displayed while content is loading--> - <string name="loading">Loading na…</string> - <!--Test string--> - <string name="test">Sinusubukang string</string> - <!--Hint for contacts text field--> - <string name="hint_contacts">I-type ang mga tatanggap ng mensahe</string> - <!--Hint for search text field--> - <string name="hint_search">Maghanap ng kahit ano</string> - <!--Hint for message reply text field--> - <string name="hint_reply">I-type ang mensahe</string> - <!--Hint for code redemption--> - <string name="hint_redeem">Enter code</string> - <string name="hint_hex">Hex</string> - <!--Text shown for single new message in notification--> - <string name="new_message">Bagong Mensahe</string> - <!--Text shown after number of unread messages in notification (ex. 3 new messages)--> - <string name="new_messages">mga bagong mensahe</string> - <!--Text shown for single failed message in notification--> - <string name="failed_message">Hindi naipadala ang mensahe</string> - <!--Text shown after number of failed messages in notification (ex. 3 messages failed to send)--> - <string name="failed_messages">hindi naipadala ang mensahe</string> - <!--Text shown under failed message count--> - <string name="failed_messages_summary">I-tap upang makita</string> - <!--QuickCompose notification title--> - <string name="quickcompose">QK Compose</string> - <!--QuickCompose notification text--> - <string name="quickcompose_detail">Pindutin para magpadala ng mensahe</string> - <!--Welcome screen intro button--> - <string name="welcome_start">Let\'s get started!</string> - <!--Allows user to skip welcome screen--> - <string name="welcome_skip">SKIP</string> - <!--Allows user to finish the welcome screen--> - <string name="welcome_finish">FINISH</string> - <!--Indicates to user they can pick a color--> - <string name="welcome_theme_title">Pick a color</string> - <!--Indicates to user they can pick any colors--> - <string name="welcome_theme_description">Any color.</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_night_description">Easy on the eyes.</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_night_hint">Toggle me</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_quickreply_title">QK Reply</string> - <!--QK Reply explanation--> - <string name="welcome_quickreply_description">Reply to messages faster than ever.</string> - <!--Prompts user to try QK Reply--> - <string name="welcome_quickreply_hint">Try it!</string> - <!--QK Reply demo message--> - <string name="welcome_quickreply_message_1">Wow! Now wasn\'t that awesome? You can view your entire conversation at a glance. Tap outside the popup or press the checkmark to dismiss it.</string> - <!--QK Reply demo message--> - <string name="welcome_quickreply_message_2">This is QK Reply. Now you can reply to messages from anywhere. Tap the expand button to see what happens next :)</string> - <!--Settings option in menu--> - <string name="menu_settings">Mga Setting</string> - <!--Search option in menu--> - <string name="menu_search">Maghanap</string> - <!--Show full conversation in QuickReply--> - <string name="menu_show_all">Show all messages</string> - <!--Show only unread messages in QuickReply--> - <string name="menu_show_unread">Show unread messages</string> - <!--Open conversation option in menu (shown in QuickReply)--> - <string name="menu_open_thread">Buksan ang pag-uusap</string> - <!--Forward message option in menu--> - <string name="menu_forward">Ipasa ang mensahe</string> - <!--Call contact option in menu--> - <string name="menu_call">Tawagan</string> - <!--Mark a message/conversation as read option in menu--> - <string name="menu_read">Nabasa na</string> - <!--Delete a message option in menu--> - <string name="menu_delete">Delete</string> - <!--Donate option in menu--> - <string name="menu_billing">Donate</string> - <!--Copy text option in menu--> - <string name="menu_copy">Kopyahin</string> - <!--Changelog option in menu--> - <string name="menu_changelog">"Mga nabago"</string> - <!--Expand settings option in menu--> - <string name="menu_show_all_prefs">Show all</string> - <!--Show less settings option in menu--> - <string name="menu_show_fewer_prefs">Show fewer</string> - <!--Title for message details popup--> - <string name="details_title">Mga detalye</string> - <!--Title for address that message is being sent to in message details popup--> - <string name="details_to">Para kay</string> - <!--Title for address that message is sent from in message details popup--> - <string name="details_from">Galing kay</string> - <!--Title for text of a message in message details popup--> - <string name="details_body">Kabuuan</string> - <!--Title for date sent of a message in message details popup--> - <string name="details_date_sent">Pinadala</string> - <!--Title for date received of a message in message details popup--> - <string name="details_date_received">Natanggap</string> - <!--Title for rate snackbar--> - <string name="rate_title">Like QKSMS?</string> - <!--Title for rate button--> - <string name="rate_action">Rate</string> - <string name="pref_category_appearance">Itsura</string> - <string name="pref_category_summary_appearance">Themes, fonts, colors, avatars, and more</string> - <string name="pref_category_general">Pangkalahatan</string> - <string name="pref_category_summary_general">Delivery, message sending, formatting</string> - <string name="pref_category_blocking">Message blocking</string> - <string name="pref_category_notifications">Mga notification</string> - <string name="pref_category_summary_notifications">Sounds, LED, privacy</string> - <string name="pref_category_mms">MMS</string> - <string name="pref_category_summary_mms">Configure MMS (APNs), max size, group messaging</string> - <string name="pref_category_quickreply">QK Reply</string> - <string name="pref_category_summary_quickreply">QK Reply, popup options</string> - <string name="pref_category_quickcompose">QK Compose</string> - <string name="pref_category_summary_quickcompose">QK Compose, starred contacts</string> - <string name="pref_category_about">About</string> - <string name="pref_category_summary_about">Version, changelog, authors, thanks</string> - <string name="pref_theme">Theme color</string> - <string name="pref_theme_summary_alt">Tap to change theme</string> - <string name="pref_icon">Icon color</string> - <string name="pref_icon_summary">Tap to change the QKSMS icon color</string> - <string name="pref_status_tint">Kulayan ang status bar</string> - <string name="pref_navigation_tint">Kulayan ang navigation bar</string> - <string name="pref_background">Background color</string> - <string name="pref_background_summary">Tap to change background color</string> - <string name="pref_bubbles">Message bubbles</string> - <string name="pref_bubbles_summary">Tap to change message bubble preferences</string> - <string name="pref_night">Night mode</string> - <string name="pref_night_summary">Save battery and reduce eye strain</string> - <string name="pref_night_amoled">Purong itim na background</string> - <string name="pref_night_amoled_summary">Magtipid ng karagdagang baterya sa mga device na may AMOLED display</string> - <string name="pref_bubble_style_new">Use new bubble style</string> - <string name="pref_color_sent">Color sent messages</string> - <string name="pref_color_sent_summary">Color the background bubbles for outgoing messages</string> - <string name="pref_color_received">Color received messages</string> - <string name="pref_color_received_summary">Color the background bubbles for incoming messages</string> - <string name="pref_hide_avatar_conversations">Itago ang mag conversation avatar</string> - <string name="pref_hide_avatar_conversations_summary">Itago ang mga avatar sa conversation list</string> - <string name="pref_hide_avatar_sent">Itago ang avatar sa ipinadalang mensahe</string> - <string name="pref_hide_avatar_sent_summary">Itagot ang iyong avatar sa mga mensaheng ipinapadala mo</string> - <string name="pref_hide_avatar_received">Itago ang avatar sa natanggap na mensahe</string> - <string name="pref_hide_avatar_received_summary">Itago ang avatar ng contact para sa mga tinatanggap na mensahe</string> - <string name="pref_font_family">Anyo ng font</string> - <string name="pref_font_size">Laki ng font</string> - <string name="pref_font_weight">Bigat ng font</string> - <string name="pref_message_count">Bilang ng mensahe</string> - <string name="pref_message_count_summary">Show the number of messages for each conversation</string> - <string name="pref_sent_timestamps">Sent timestamps</string> - <string name="pref_sent_timestamps_summary">Show the timestamp for when a message was sent, not received</string> - <string name="pref_force_timestamps">Force timestamps</string> - <string name="pref_force_timestamps_summary">Enable timestamps for all messages</string> - <string name="pref_key_timestamp_delay">New timestamp delay</string> - <string name="pref_key_timestamp_delay_summary">The number of minutes which must elapse between two messages in order for a new timestamp to be shown.</string> - <string name="pref_compose_favorites">Starred contacts</string> - <string name="pref_compose_summary_favorites">Show your starred contacts in the QK Compose window, making them only a tap away</string> - <string name="pref_prox_sensor_call">Proximity sensor</string> - <string name="pref_prox_sensor_call_summary">While in a conversation, bring your phone to your ear to start a call</string> - <string name="pref_delivery">Kumpirmasyon ng SMS delivery</string> - <string name="pref_delivery_summary">BIgyang abiso na naipadala na ang mensahe</string> - <string name="pref_delivery_toast">Show toast</string> - <string name="pref_delivery_toast_summary">Show a short toast to indicate a message being delivered</string> - <string name="pref_delivery_vibrate">Mag vibrate</string> - <string name="pref_delivery_vibrate_summary">Mag vibrate kapag naipadala na ang mensahe</string> - <string name="pref_delete_old_messages">Delete old messages</string> - <string name="pref_delete_old_messages_summary">Automatically delete messages once they\'re old enough</string> - <string name="pref_delete_old_messages_unread">Unread messages</string> - <string name="pref_delete_old_messages_unread_summary">Automatically delete unread messages after %s days</string> - <string name="pref_delete_old_messages_read">Read messages</string> - <string name="pref_delete_old_messages_read_summary">Automatically delete read messages after %s days</string> - <string name="pref_yappy">Yappy integration</string> - <string name="pref_endlessjabber_summary">Enable full support for Yappy</string> - <string name="pref_blocked_conversations">Blocked conversations</string> - <string name="pref_blocked_conversations_summary">Long-press on a conversation and block to move to blocked inbox and stop notifications</string> - <string name="pref_block_future">Block future messages</string> - <string name="pref_block_future_summary">Add additional phone numbers to block</string> - <string name="pref_should_i_answer">Should I Answer? Integration</string> - <string name="pref_should_i_answer_summary">Automatically delete incoming messages from numbers which are blocked through Should I Answer?</string> - <string name="pref_mobile_only">Mobile numbers</string> - <string name="pref_mobile_only_summary">Only show mobile numbers in contact suggestions</string> - <string name="pref_auto_emoji">Automatic emoji</string> - <string name="pref_auto_emoji_summary">Replace text with image emoji</string> - <string name="pref_enter_button">Enter button</string> - <string name="pref_enter_button_summary">Tap to change keyboard enter button behavior</string> - <string name="pref_compose_group">Group messaging</string> - <string name="pref_compose_group_summary">When composing message to multiple people, send a group message instead of individual messages</string> - <string name="pref_auto_download">Auto download MMS</string> - <string name="pref_auto_download_summary">Automatically download MMS messages when they become available</string> - <string name="pref_auto_data">Automatic data</string> - <string name="pref_auto_data_summary">Turn on data automatically when sending or receiving MMS</string> - <string name="pref_split">Hatiin ang SMS</string> - <string name="pref_split_summary">Hatiin ang mahahabang mensahe at gawing magkakahiwalay na mensahe</string> - <string name="pref_split_counter">Pambilang ng hati</string> - <string name="pref_split_counter_summary">Nagdadagdag ng isang pambilang sa harap ng bawat hating mensahe</string> - <string name="pref_long_as_mms">Gawing MMS ang mahahaba</string> - <string name="pref_long_as_mms_summary">Ipadala bilang MMS ang mga mahahabang mensahe sa halip na paghiwa-hiwalayin ang mga ito</string> - <string name="pref_long_as_mms_after">Gawing MMS ang mahahaba pagkatapos ng</string> - <string name="pref_long_as_mms_after_summary">Send long messages as MMS when they exceed the length of a number of messages</string> - <string name="pref_return">Ipakita ang return button</string> - <string name="pref_return_summary">Ipakita ang return key sa keyboard sa halip na Emoji button</string> - <string name="pref_text">Text</string> - <string name="pref_notifications">Gumaganang SMS Notifications</string> - <string name="pref_led">LED sa mga notification</string> - <string name="pref_theme_led">Notification LED color</string> - <string name="pref_wake">Wake phone</string> - <string name="pref_wake_summary">Turn your screen on when you receive a new message</string> - <string name="pref_notifications_private">Pribadong notification</string> - <string name="pref_notifications_private_summary">Tap to change what should be hidden in notfication</string> - <string name="pref_ringtone">Tunog ng notification</string> - <string name="pref_ringtone_summary">Pumili ng tunog ng notification</string> - <string name="pref_ticker">Ipakita ang ticker</string> - <string name="pref_ticker_summary">Pinapakita ang kaunting piraso ng bagong mensahe sa notification bar</string> - <string name="pref_vibration">Vibration</string> - <string name="pref_vibration_summary">Mag vibrate kapag merong bagong mensahe na natanggap</string> - <string name="pref_notification_call">Call button</string> - <string name="pref_notification_call_summary">Tawagan ang nagpadala ng mensahe mula mismo sa notification</string> - <string name="pref_dimiss_read">Mark as read</string> - <string name="pref_dismiss_read_summary">Mark message as read when notification is cleared</string> - <string name="pref_delayed">Delayed messaging</string> - <string name="pref_delayed_summary">Wait before sending your messages, so you have a chance to review them</string> - <string name="pref_delayed_duration">Delay length (seconds)</string> - <string name="pref_delayed_duration_summary">Time to wait before sending your message</string> - <string name="pref_night_auto">Kusang night mode</string> - <string name="pref_night_auto_summary">Kusang paganahin ang night mode base sa oras</string> - <string name="pref_day_start">Simula ng umaga</string> - <string name="pref_night_start">Simula ng gabi</string> - <string name="pref_qk_responses">QK Responses</string> - <string name="pref_qk_responses_summary">Modify your preset responses to be used from your Android Wear device</string> - <string name="pref_quickreply_enabled">QK Reply enabled</string> - <string name="pref_quickreply_enabled_summary">Show QK Reply window whenever a new message is received</string> - <string name="pref_tap_to_quit">I-tap upang alisin</string> - <string name="pref_tap_to_quit_summary">Tap anywhere outside of the window to close it</string> - <string name="pref_quickcompose">QK Compose enabled</string> - <string name="pref_quickcompose_summary">Magpakita ng notification na nagbibigay sayo ng ablidad na gumawa ng panibagong mensahe</string> - <string name="pref_mms_enabled">MMS enabled</string> - <string name="pref_mms_enabled_summary">Enable sending and receiving of MMS messages</string> - <string name="pref_mmsc_url">MMSC</string> - <string name="pref_mms_proxy">MMS proxy</string> - <string name="pref_mms_port">MMS port</string> - <string name="pref_apn_chooser">I-load ang mga default na APN</string> - <string name="pref_strip_unicode">Strip unicode</string> - <string name="pref_strip_unicode_summary">I-swap ang mga letra na hindi suportado sa kabuuang haba ng mensahe para sa GSM compatible na letra</string> - <string name="pref_system_bar_flat">Flat system bars</string> - <string name="pref_system_bar_flat_summary">Get rid of the gradient shown on the system UI bars on most KitKat devices</string> - <string name="pref_status_compat">Ayusin ang status bar</string> - <string name="pref_status_compat_summary">Inaayos ang mga isyu na sanhi ng immersive mode, Tinted Status Bar (Xposed), o sariling DPI settings</string> - <string name="pref_navigation_compat">Ayusin ang navigation bar</string> - <string name="pref_navigation_compat_summary">Inaayos ang mga isyu na sanhi ng immersive mode, Tinted Status Bar (Xposed), o sariling DPI settings</string> - <string name="pref_about_version_title">QKSMS version</string> - <string name="pref_about_authors_title">Authors</string> - <string name="pref_about_authors_summary">Moez Bhatti</string> - <string name="pref_changelog_summary">Tap to view changelog</string> - <string name="pref_about_thanks_title">Thank you</string> - <string name="pref_about_thanks_summary">Tap to view open-source contributors</string> - <string name="pref_donate_title">Donate</string> - <string name="pref_donate_summary">QKSMS is free. Help support us by donating!</string> - <string name="pref_about_gplus_title">Google+</string> - <string name="pref_about_gplus_summary">Join the QKSMS Beta Testing community on Google+</string> - <string name="pref_about_github_title">GitHub</string> - <string name="pref_about_github_summary">QKSMS is open source. Contribute and report issues on GitHub</string> - <string name="pref_about_crowdin_title">Crowdin</string> - <string name="pref_about_crowdin_summary">Join the QKSMS translation project on Crowdin</string> - <!--Preference subcategory--> - <string name="pref_subcat_theme">Theme</string> - <!--Preference subcategory--> - <string name="pref_subcat_system_bars">System bars</string> - <!--Preference subcategory--> - <string name="pref_subcat_categories">Categories</string> - <!--Preference subcategory--> - <string name="pref_subcat_font">Font</string> - <!--Preference subcategory--> - <string name="pref_subcat_messages">Messages</string> - <!--Preference subcategory--> - <string name="pref_subcat_avatars">Avatars</string> - <string name="donate_google">Donate with Google</string> - <string name="donate_google_summary">Google takes 30% of donations</string> - <string name="donate_paypal">Donate with PayPal</string> - <string name="donate_paypal_button">Donate any amount</string> - <string name="donate_paypal_button_summary">Buy me anything you want!</string> - <!--Donation product name--> - <string name="product_name_donation">Donation</string> - <!--$1 donation product name--> - <string name="product_name_donate_1">Donate $1 USD</string> - <!--$5 donation product name--> - <string name="product_name_donate_5">Donate $5 USD</string> - <!--$3 donation product name--> - <string name="product_name_donate_10">Donate $10 USD</string> - <!--$1 donation product description--> - <string name="product_description_donate_1">Ibili mo ako ng Coke</string> - <!--$5 donation product description--> - <string name="product_description_donate_5">ibili mo ako ng sandwich</string> - <!--$10 donaion product description--> - <string name="product_description_donate_10">Ibili mo ako ng pananghalian</string> - <string name="title_settings">Mga setting</string> - <string name="title_search">Maghanap</string> - <string name="title_compose">Sumulat</string> - <string name="title_conversation_list">Mga Pag-uusap</string> - <string name="title_blocked">Blocked</string> - <string name="title_changelog">Mga Nabago</string> - <string name="title_picker">Mga bagong mensahe</string> - <string name="title_donate">Donate</string> - <string name="title_qk_responses">QK Responses</string> - <string name="title_block_address">Block number</string> - <string name="title_unblock_address">Unblock number</string> - <string name="title_conversations_selected">%s selected</string> - <string name="title_palette">Palette</string> - <string name="title_rgb">RGB</string> - <!-- Menu shown in the context menu when long pressing on a message when the message contains - one or more phone numbers and/or email addresses and the number or email is new to - contacts. [CHAR LIMIT=50] --> - <string name="menu_add_address_to_contacts">Magdadag ng <xliff:g id="contactEmailOrNumber">%s</xliff:g> sa mga contact</string> - <!-- Context menu item on an individual message for viewing an attached slideshow --> - <string name="view_slideshow">Tingnan ang slideshow</string> - <!-- Context menu item on an individual message for viewing message details such as time and date --> - <string name="view_message_details">Tingnan ang mga detalye</string> - <!-- Context menu item on an individual message for viewing a delivery report --> - <string name="view_delivery_report">Tingnan ang report</string> - <!-- Context menu item on an individual message for deleting only that message --> - <string name="delete_message">Burahin</string> - <!-- Abbreviation for "kilobyte" --> - <string name="kilobyte">KB</string> - <!-- Individual message context menu item --> - <string name="copy_message_text">Kopyahin ang text</string> - <!-- Header for context menu on an individual message --> - <string name="message_options">Message options</string> - <!-- Delivery Header View --> - <!-- Title of "Report" window --> - <string name="delivery_header_title">Report</string> - <!--Text for app restart confirmation dialog--> - <string name="restart_message">Mababago ang mga ito sa iyong muling pagbukas ng QKSMS</string> - <!--Dialog title for asking if a user wants to delete a conversation--> - <string name="delete_conversation">Delete conversations</string> - <!--Dialog title for asking if a user wants to delete all failed messages--> - <string name="delete_all_failed">Delete failed messages</string> - <!--CDialog title for asking if a user wants to delete a conversation--> - <string name="delete_confirmation">Are you sure you would like to delete (%s) conversations?</string> - <!--CDialog title for asking if a user wants to delete all failed messages--> - <string name="delete_all_failed_confirmation">Are you sure you would like to delete failed messages from (%s) conversations?</string> - <!--(Unused) Dialog title shown if APNs have not been set--> - <string name="apns_not_set">Hindi naka-set ang mga APN</string> - <!--(Unused) Dialog description shown if APNs have not been set--> - <string name="apns_not_set_description">Lumilitaw na ang mga APN mo ay hindi nai-set. Ibig sabihin nito, hindi gagana ng maayos ang MMS. Paki pindot ang okay para hayaan ang QKSMS na hanapin ang mga ito para sayo. :)</string> - <!--Dialog title show if MMS hasn't been configured--> - <string name="set_up_mms_title">Set up MMS?</string> - <!--Dialog description shown if MMS hasn't yet been configured--> - <string name="set_up_mms_description">It appears that MMS hasn\'t been configured in QKSMS yet. Press okay automatically configure MMS.</string> - <!-- Dialog message text explaining that a draft message will not be saved due to invalid recipients --> - <string name="discard_message_reason">Ang mensahe mo ay maita-tapon na dahil walang wastong tatanggap nito.</string> - <string name="invalid_code">Invalid code</string> - <!--Button to restart app now instead of manually later--> - <string name="restart">I-restart na ngayon</string> - <!--Notification action to reply to a message--> - <string name="reply">Sagutin</string> - <!--Notification action to reply to a message--> - <string name="reply_qksms">Reply via QKSMS</string> - <!--Notification action to mark a message as read--> - <string name="read">Nabasa na</string> - <!--Notification action to mark a message as read--> - <string name="mark_read">Mark as read</string> - <!--Notification action to call the sender of a message--> - <string name="call">Tawagan</string> - <!-- Notification toast message --> - <string name="notification_mute_on">Notifications enabled</string> - <string name="notification_mute_off">Notifications disabled</string> - <!--Positive action button--> - <string name="yes">Oo</string> - <string name="add">Add</string> - <!--Positive action button--> - <string name="save">Save</string> - <!--Positive action button--> - <string name="enable">Enable</string> - <!--Positive action button--> - <string name="upgrade_now">Set now</string> - <!--Positive action button--> - <string name="okay">Sige</string> - <!--Positive action button--> - <string name="redeem">Redeem</string> - <!--Neutral action button--> - <string name="just_once">Just once</string> - <!--Neutral action button--> - <string name="later">Mamaya</string> - <!--Neutral action button --> - <string name="cancel">kanselahin</string> - <!-- Name of the local user when displaying sender of an outgoing message (personal pronoun) --> - <string name="messagelist_sender_self">Ako</string> - <!-- Sender to be used if the sender address has been hidden --> - <string name="hidden_sender_address">Nakatanong address ng sender</string> - <!-- Subject to display in the conversation list if there is no subject --> - <string name="no_subject_view">(Walang Pamagat)</string> - <!-- Time and date a message is due to expire --> - <string name="expire_on">"Mag e-expire sa: <xliff:g id="date">%s</xliff:g>"</string> - <!-- Formatting for subject displayed inline, prepended to MMS message text --> - <string name="inline_subject">"<Pamagat: <xliff:g id="subject">%s</xliff:g>>"</string> - <!-- Text of a button appearing for MMS messages that have not yet been downloaded, causing the message to be downloaded (imperative verb) --> - <string name="download">Download</string> - <!-- Message displayed in place of the "download message" button once it has been pressed, indicating that the download is in progress --> - <string name="downloading">Nagdodownload na</string> - <!-- Toast message while an image is being resized --> - <string name="compressing">Masyadong malaki ang picture. Kino-compress\u2026</string> - <!-- Header shown above favorite contacts in QKCompose --> - <string name="favorites">Starred contacts</string> - <!-- Word represents 'self' in a conversation --> - <string name="me">Me</string> - <string name="menu_edit">I-edit</string> - <string name="menu_delete_messages">Burahin ang mga mensahe</string> - <string name="menu_delete_failed">Delete failed messages</string> - <string name="menu_lock">I-lock</string> - <string name="menu_unlock">I-unlock</string> - <!-- When the user tries to view message details and some error occurs while - retrieving those details, this message will be shown. --> - <string name="cannot_get_details">Hindi makuha ang mga detalye.</string> - <!-- Title of "Message details" dialog --> - <string name="message_details_title">Detalye ng mensahe</string> - <!-- Label in "Message details" dialog --> - <string name="message_type_label">Type\u000A</string> - <!-- "Type" value in "Message details" dialog --> - <string name="text_message">Mensaheng text</string> - <!-- "Type" value in "Message details" dialog --> - <string name="multimedia_message">Mensaheng multimedia</string> - <!-- "Type" value in "Message details" dialog --> - <string name="multimedia_notification">Notification para sa mensaheng multimedia</string> - <!-- Label in "Message details" dialog showing who sent the message. --> - <string name="from_label">From\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="to_address_label">To\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="bcc_label">Bcc\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="sent_label">Sent\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="received_label">Received\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="saved_label">Saved\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="subject_label">Subject\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="message_size_label">Message size\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="priority_label">Priority\u000A</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_high">Mataas</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_normal">Karaniwan</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_low">Mababa</string> - <!-- Label in "Message details" dialog --> - <string name="message_class_label">Message class\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="error_code_label">Error code\u000A</string> - <!-- Alert dialog title when creating a slideshow [CHAR LIMIT=none] --> - <string name="building_slideshow_title">Ginagawa na ang slideshow</string> - <!-- Tag appearing on conversations in the conversation list that contain a draft message --> - <string name="has_draft">Draft</string> - <!-- In conversation list items, this is the separator between a contact's name and the draft stamp [CHAR LIMIT=5] --> - <string name="draft_separator">,\u0020</string> - <!-- In conversation list items, this comes after the receipient's name and contains the number of messages in the thread [CHAR LIMIT=5] --> - <string name="message_count_format">\u00a0<xliff:g id="number" example="1">%1$s</xliff:g></string> - <!-- For debugging: Dialog box title indicating there's a situation where data has unexpectedly changed --> - <string name="error_state">Pabago-bagong katayuan</string> - <!-- For debugging: Dialog box text indicating there's a situation where data has unexpectedly changed --> - <string name="error_state_text">Ang estado ng mga thread at recipient ay paiba-iba. Paki kuha sana ng bug report at i-report ito sa pamamagitan ng http://go/droidanizer </string> - <!-- This is the dialog title for the "Select link" dialog, shown when the user clicks on a - chat in the chat history view if there are links in the chat message. The dialog displays the - links if there are any --> - <string name="select_link_title">Pumili ng gagawin</string> - <!-- In message list items, this string builds the timestamp line when the message is in a group [CHAR LIMIT=NONE] --> - <string name="message_timestamp_format"><xliff:g id="string" example="Fred Flinstone">%1$s</xliff:g>\u0020-\u0020<xliff:g id="string" example="9:39AM">%2$s</xliff:g></string> - <!--Message sending status: sending--> - <string name="status_sending">Ipinapadala na…</string> - <!--Message sending status: failed--> - <!--<string name="status_failed">Failed. Tap to retry</string>--> - <!-- Delivery Report Activity --> - <!-- Status in "Report" window --> - <string name="status_none">(Wala)</string> - <!-- Status in "Report" window --> - <string name="status_pending">Nakabinbin</string> - <!-- Status in "Report" window --> - <string name="status_read">Nabasa na</string> - <!-- Status in "Report" window --> - <string name="status_received">Natanggap na</string> - <!-- Status in "Report" window --> - <string name="status_failed">Failed. Tap for options</string> - <!-- Status in "Report" window --> - <string name="status_unread">Hindi pa nababasa</string> - <!-- Status in "Report" window --> - <string name="status_rejected">Tinanggihan</string> - <!-- Label in "Report" window --> - <string name="recipient_label">Tatanggap:\u0020</string> - <!-- Label in "Report" window --> - <string name="status_label">Kalagayan:\u0020</string> - <!-- Label in "Report" window [CHAR LIMIT=50]--> - <string name="delivered_label">Naihatid:\u0020</string> - <string name="do_something">Do something</string> - <!-- Confirm Delete --> - <!-- Delete confirmation dialog title --> - <string name="confirm_dialog_title">Burahin?</string> - <!-- Delete confirmation dialog title for locked messages --> - <string name="confirm_dialog_locked_title">Burahin ang naka-lock na mensahe?</string> - <!-- This message is displayed in a confirmation dialog when the user selects one or more - conversations and then taps the "Delete" button. --> - <plurals name="confirm_delete_conversation"> - <!-- Case of 1 result. --> - <item quantity="one">isang pag-uusap ang buburahin.</item> - <!-- Case of 0 or 2 or more results. --> - <item quantity="other"><xliff:g id="number" example="15">%1$s</xliff:g> na pag-uusap ang buburahin.</item> - </plurals> - <string name="confirm_delete_conversation">Ang buong pag-uusap ay buburahin.</string> - <!-- Delete all threads confirmation dialog message --> - <string name="confirm_delete_all_conversations">Lahat ng pag-uusap ay buburahin.</string> - <!-- Delete message confirmation dialog message --> - <string name="confirm_delete_message">Buburahin na ang mensahe.</string> - <!-- Delete message confirmation dialog message for a locked message --> - <string name="confirm_delete_locked_message">Burahin ang naka-lock na mensaheng ito?</string> - <!-- Delete all the messages on the SIM dialog message --> - <string name="confirm_delete_all_SIM_messages">Lahat ng mensahe sa SIM card ay buburahin na.</string> - <!-- Delete the selected message on the SIM dialog message --> - <string name="confirm_delete_SIM_message">Ang mensaheng ito sa SIM card ay buburahin.</string> - <!-- Delete unlocked checkbox title --> - <string name="delete_unlocked">Burahin ang naka-lock na mensahe</string> - <!-- Delete button title --> - <string name="delete">Burahin</string> - <!-- More button title --> - <string name="more">More</string> - <!-- More button summary --> - <string name="more_summary">Tap to see more</string> - <!-- Action bar mode title when multi-selecting conversations --> - <string name="select_conversations">Piliin ang mga pag-uusap</string> - <!-- Show this in the middle of the main activity when there are no conversations [CHAR LIMIT=none] --> - <string name="no_conversations">Walang pag-uusap.</string> - <!-- Show this in the middle of the main activity when loading conversations [CHAR LIMIT=none] --> - <string name="loading_conversations">Naglo-load na ang mga pag-uusap.</string> - <!-- Tells the user that QKSMS isn't the default SMS app --> - <string name="not_default">Default SMS</string> - <!-- Tells the user they need to set QKSMS as the default app in order to use this feature --> - <string name="default_info">QKSMS needs to be your SMS app to do that</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to mark messages as read --> - <string name="not_default_mark_read">QKSMS must be your SMS app to mark messages read</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to mark messages as unread --> - <string name="not_default_mark_unread">QKSMS must be your SMS app to mark messages unread</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to send messages --> - <string name="not_default_delete">QKSMS must be your SMS app to delete messages</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to delete messages --> - <string name="not_default_send">QKSMS must be your SMS app to send messages</string> - <!-- Tells the user they should set QKSMS as the default messaging app --> - <string name="not_default_first">Some things won\'t work until QKSMS is the default SMS app</string> - <string name="delayed_messaging_info">Delayed messaging allows you to cancel messages before they send. Change the default behavior and more in Settings</string> - <string name="delayed_duration_bounds_error">Duration must be between 1 and 30 seconds</string> - <!-- Dialog title for the Read Report dialog. --> - <string name="confirm">Kumpirmahin</string> - <!-- Dialog text for the Read Report dialog. --> - <string name="message_send_read_report">Ipapadala ang isang report na nabasa na.</string> - <!-- Dialog title for updating app icon color --> - <string name="update_icon_title">Update icon color</string> - <!-- Dialog message for updating app icon color --> - <string name="update_icon_message">QKSMS must be restarted when changing the icon color</string> - <string name="dialog_conversation_details_title">Conversation details</string> - <string name="dialog_conversation_details_last_message_date">Last message date</string> - <string name="dialog_conversation_details_message_count">Message count</string> - <string name="dialog_conversation_details_recipients">Recipients (%s)</string> - <string name="dialog_should_i_answer_title">Should I Answer? not installed</string> - <string name="dialog_should_i_answer_message">Would you like to download the app from Google Play now?</string> - <string name="dialog_delete_old_messages">Are you sure you want to automatically delete old messages?</string> - <!-- Title for audio file picker --> - <string name="select_audio">Pumili ng tunog</string> - <!-- Menu title to copy an attachment to the shared storage [CHAR LIMIT=25] --> - <string name="copy_to_sdcard">I-save ang attachment</string> - <!-- Toast message on successful copy to shared storage [CHAR LIMIT=30] --> - <string name="copy_to_sdcard_success">Nai-save na ang attachment.</string> - <!-- Toast message on failed copy to shared storage [CHAR LIMIT=30] --> - <string name="copy_to_sdcard_fail">Hindi mai-save ang attachment.</string> - <!-- Menu title to save a sound as a ringtone --> - <string name="save_ringtone">I-save bilang ringtone</string> - <!-- Toast message on successful copying ringtone to drm provider --> - <string name="saved_ringtone">Nai-save na bilang ringtone.</string> - <!-- Toast message on failed copying ringtone to drm provider --> - <string name="saved_ringtone_fail">Hindi mai-save ang ringtone.</string> - <!-- Menu item --> - <!-- Menu item [CHAR LIMIT=40] --> - <string name="menu_group_participants">Mga kalahok sa grupo</string> - <!--Toast shown when a draft is saved--> - <string name="toast_draft">Nai-save na ang draft</string> - <!--Toast shown when a conversation is deleted--> - <string name="toast_conversation_deleted">Burado na ang pag-uusap</string> - <!--Toast shown when device is low on storage--> - <string name="toast_low_memory">"Puno na ang storage ng iyong phone. Magbura ng ilang files para magkaroon ng libreng espasyo."</string> - <!--Toast shown to tell user that forwarding messages doesn't work yet--> - <string name="toast_forward">Hindi pa nai-implement ang feature na ito. Sa ngayon, maaring gamitn muna ang \'Copy text\' option at i-paste ito sa pag-uusap na gusto mong pag-sendan</string> - <!--Toast shown for unimplemented features--> - <string name="toast_unimplemented">Hindi pa nai-implement ang feature na ito</string> - <!--Toast shown when a message fails to send--> - <string name="toast_message_failure">Hindi nag-send ang mensahe</string> - <!--Toast shown when a message is delivered--> - <string name="toast_message_delivered">Naipadala na ang mensahe</string> - <!--Toast shown when a message is not delivered--> - <string name="toast_message_not_delivered">Hindi naipadala ang mensahe</string> - <!--Toast shown when default APNs are loaded--> - <string name="toast_default_apns_loaded">Nai-load na ang default APN settings</string> - <!--Toast shown when text is copied to the clipboard--> - <string name="toast_copy_text">Nakopya na ang text sa clipboard</string> - <!--Toast shown when Google Play Services is not available for purchasing a product--> - <string name="toast_billing_not_available">Ang pagbili ay nangangailangan ng Google Play Store (billing) sa iyong Android</string> - <!--Toast shown when Google Play Services is not available for purchasing a product--> - <string name="toast_endlessjabber_not_installed">Hindi naka-install ang Endlessjabber, binubuksan na ang Google Play</string> - <string name="toast_changelog_error">Couldn\'t load the changelog. Please try again later</string> - <string name="toast_conversation_error">Couldn\'t open conversation</string> - <string name="toast_deleting_old_messages">Your old messages will be deleted shortly</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_1">Salamat sa donasyon! Ikaw ang aking bagong matalik na kaibigan.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_2">Salamat sa donasyon! Mahal kita.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_3">Salamat sa donasyon! Tinutulungan mo ang QKSMS na maging pinaka malupit na texting app.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_4">Salamat sa donasyon! Hinahangaan kita.</string> - <!--Menu option to mute conversation--> - <string name="menu_mute_conversation">Mute conversation</string> - <!--Menu option to mute conversation--> - <string name="menu_unmute_conversation">Unmute conversation</string> - <string name="menu_block_conversations">Block conversations</string> - <string name="menu_unblock_conversations">Unblock conversations</string> - <string name="menu_messages">Messages</string> - <string name="menu_blocked">Blocked</string> - <string name="menu_blocked_conversations">Blocked (%s new)</string> - <string name="menu_unblocked_conversations">Messages (%s new)</string> - <string name="menu_notifications">Notifications</string> - <string name="menu_notifications_off">Notifications off</string> - <string name="menu_notification_settings">Conversation settings</string> - <string name="menu_view_details">View details</string> - <string name="menu_mark_read">Mark read</string> - <string name="menu_mark_unread">Mark unread</string> - <string name="menu_delete_conversation">Delete conversation</string> - <string name="menu_multi_select">Select conversation</string> - <string name="menu_done">Done</string> - <string name="failed_message_title">Failed message options</string> - <!--Toast shown to tell the user that they don't have a photo attachments app, and suggests that they download one--> - <string name="attachment_app_not_found">Attachments app not found. Try installing a photo gallery app!</string> - <string name="attachment_camera_error">The camera could not be opened</string> - <string name="pref_max_mms_attachment_size">Maximum MMS attachment size</string> - <string name="error_no_recipients">Select some contacts to send this message to!</string> - <string name="error_file_not_found">QKSMS can\'t access the file you\'re trying to share!</string> - <string name="sending_blocked_welcome_screen_message">Hold up! You\'ll get to send real messages in a minute!</string> - <string name="notification_colored_icon_ready">Touch to add to your launcher from home screen.</string> - <string name="notification_title_colored_icon_ready">QKSMS colored icon is ready</string> - <string name="icon_ready">Your new icon is ready!</string> - <string name="icon_ready_message">You can now add it to your home screen again with the updated color.</string> - <string name="dont_ask_again">Don\'t ask again</string> - <string name="warning">Stagefright warning</string> - <string name="stagefright_warning">Video messages may contain a harmful exploit that can leave your phone vulnerable to attacks. Would you like to continue?</string> - <!-- MMS DIALOG SETUP STRINGS --> - <string name="mms_setup_set_up_mms_title">Set up MMS?</string> - <string name="mms_setup_set_up_mms_body">It appears that MMS isn\'t set up in QKSMS. Press okay to automatically configure MMS.</string> - <string name="mms_setup_setting_up_later_title">Setting up MMS later</string> - <string name="mms_setup_setting_up_later_body">Visit the MMS section of Settings to try automatic configuration, contact support, or enter your own configuration.</string> - <string name="mms_setup_no_configurations_found_title">No configurations found</string> - <string name="mms_setup_no_configurations_found_body">We couldn\'t find an MMS configuration for your carrier automatically. Press okay to contact support. We\'ll help you get set up! </string> - <string name="mms_setup_one_configuration_found_title">One configuration found</string> - <string name="mms_setup_one_configuration_found_body">We have found an MMS configuration for the %s carrier. Does that sound right?</string> - <string name="mms_setup_multiple_configurations_found_title">Multiple configuration found</string> - <string name="mms_setup_multiple_configurations_found_body">We have found multiple MMS configurations. Choose your carrier from the list, or press N/A if your carrier isn\'t on the list.</string> - <string name="mms_setup_next_steps_title">Next steps</string> - <string name="mms_setup_next_steps_body">Visit the MMS section of Settings to try automatic configuration again, contact support, or enter your own configuration.</string> - <string name="mms_setup_success_title">Success!</string> - <string name="mms_setup_success_body">If you encounter any issues, visit the MMS section of Settings to try automatic configuration again, contact support, or enter your own configuration.</string> - <string name="na">N/A</string> - <string name="no">No</string> - <string name="pref_automatically_configure_mms">Automatically Configure MMS</string> - <string name="pref_mms_contact_support">Contact Support</string> - <string name="pref_category_sending_mms">Sending MMS</string> - <string name="pref_category_mms_configuration">MMS Configuration</string> - <string name="pref_mms_contact_support_summary">Contact the QKSMS team for help setting up MMS</string> - <string name="pref_markdown_enabled">Text formatting</string> - <string name="pref_markdown_enabled_summary">Use markdown syntax to get bold, underline, and italics in your messages</string> - <string name="want_read_indicators">Want read indicators?</string> - <string name="color_swatch_description">Color %1$d</string> - <string name="color_swatch_description_selected">Color %1$d selected</string> - <string name="color_picker_default_title">Select a Color</string> - <string name="message_delivered">Message Delivered</string> - <string name="message_not_delivered">Message Not Delivered</string> - <string name="error">Error</string> - <string name="invalid_destination">Invalid destination address.</string> - <string name="service_not_activated">Service not activated on network.</string> - <string name="service_message_not_found">Message expired or not available.</string> - <string name="service_network_problem">Couldn\'t send due to network problem.</string> - <string name="message_queued">Currently can\'t send your message. It will be sent when the service becomes available.</string> - <string name="download_later">Can\'t download right now. Try again later.</string> - <string name="no_apn">No APN specified for the app, you need to set it up in settings!</string> - <string name="no_subject">(No subject)</string> - <string name="unknown_sender">Unknown sender</string> - <string name="dl_failure_notification">Couldn\'t download message <xliff:g id="subject">%1$s</xliff:g> from <xliff:g id="from">%2$s</xliff:g>.</string> - <string name="auto_select_multiple_apns">Multiple different configurations have been found. Try one now. If it doesn\'t work, you can try a new one by going to Settings > Advanced > Load default APNs.</string> - <string name="auto_select_apn">Automatically Select APNs</string> - <string name="auto_select_failed_title">Automatic configuration failed</string> - <string name="auto_select_failed">Try searching for your carrier\'s APN settings (MMSC, Port, and Proxy) and entering them in Settings > Advanced.</string> - <string name="date_yesterday">Yesterday</string> - <string name="date_just_now">Just now</string> - <string name="compose_loading_attachment">Loading attachment</string> - <string name="hint_no_messages">No messages yet.\nClick the + to send one!</string> - <string-array name="resend_menu"> - <item>Resend</item> - <item>Edit</item> - <item>Delete</item> - </string-array> - <string-array name="message_menu"> - <item>Ipasa ang mensahe</item> - <item>Kopyahin</item> - <item>Tingnan ang mga detalye</item> - <item>Burahin ang mensahe</item> - </string-array> - <string-array name="background_titles"> - <item>Material Light</item> - <item>Material Dark</item> - <item>Black</item> - </string-array> - <string-array name="font_sizes"> - <item>Maliit</item> - <item>Karaniwan</item> - <item>Malaki</item> - <item>Pinaka malaki</item> - </string-array> - <string-array name="font_families"> - <item>Roboto Regular</item> - <item>Roboto Condensed</item> - <item>System font</item> - </string-array> - <string-array name="font_weights"> - <item>Manipis</item> - <item>Karaniwan</item> - </string-array> - <!-- String to match as no subject and filter out as a subject. For example, if the - subject string is "no subject", we won't display that. We'll pretend - no subject string was delivered. --> - <string-array name="empty_subject_strings"> - <item>walang pamagat</item> - </string-array> - <string-array name="qk_responses"> - <item>Okay</item> - <item>Give me a moment</item> - <item>On my way</item> - <item>Thanks</item> - <item>Sounds good</item> - <item>What\'s up?</item> - <item>Agreed</item> - <item>No</item> - <item>Love you</item> - <item>Sorry</item> - <item>LOL</item> - <item>That\'s okay</item> - </string-array> - <string-array name="enter_button_options"> - <item>Show emoji</item> - <item>New line</item> - <item>Send message</item> - </string-array> - <string-array name="notification_private_options"> - <item>Show all</item> - <item>Hide message</item> - <item>Hide message and sender</item> - </string-array> - <!-- Max MMS attachment sizes. I.e. will compress pictures that are larger than 300 KB down to - under 300KB. --> - <string-array name="max_mms_attachment_sizes"> - <item>300 KB</item> - <item>600 KB</item> - <item>1 MB</item> - <item>Unlimited</item> - </string-array> -</resources> diff --git a/QKSMS/src/main/res/values-tr/strings.xml b/QKSMS/src/main/res/values-tr/strings.xml deleted file mode 100644 index 05815631f..000000000 --- a/QKSMS/src/main/res/values-tr/strings.xml +++ /dev/null @@ -1,768 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!--Generated by crowdin.com--> -<resources xmlns:xliff="http://schemas.android.com/apk/res-auto"> - <!--Slogan--> - <string name="slogan">Tekrar mesaj atmayı seviyorum.</string> - <!--Text shown when a phone number cannot be found--> - <string name="unknown_number">Bilinmeyen Numara</string> - <!--Content description for photos--> - <string name="popup_photo_CD">Fotoğraf</string> - <!--Text to be displayed while content is loading--> - <string name="loading">Yükleniyor...</string> - <!--Test string--> - <string name="test">Test mesajı</string> - <!--Hint for contacts text field--> - <string name="hint_contacts">Alıcıları girin</string> - <!--Hint for search text field--> - <string name="hint_search">Yazı ara</string> - <!--Hint for message reply text field--> - <string name="hint_reply">Mesajınızı girin</string> - <!--Hint for code redemption--> - <string name="hint_redeem">Kodu girin</string> - <string name="hint_hex">Hex</string> - <!--Text shown for single new message in notification--> - <string name="new_message">Yeni mesaj</string> - <!--Text shown after number of unread messages in notification (ex. 3 new messages)--> - <string name="new_messages">yeni mesaj</string> - <!--Text shown for single failed message in notification--> - <string name="failed_message">Mesaj gönderilemedi</string> - <!--Text shown after number of failed messages in notification (ex. 3 messages failed to send)--> - <string name="failed_messages">mesaj gönderilemedi</string> - <!--Text shown under failed message count--> - <string name="failed_messages_summary">Görüntülemek için dokunun</string> - <!--QuickCompose notification title--> - <string name="quickcompose">QK oluşturmak</string> - <!--QuickCompose notification text--> - <string name="quickcompose_detail">Mesaj göndermek için tıklayın</string> - <!--Welcome screen intro button--> - <string name="welcome_start">Hadi başlayalım!</string> - <!--Allows user to skip welcome screen--> - <string name="welcome_skip">Geç</string> - <!--Allows user to finish the welcome screen--> - <string name="welcome_finish">BİTİR</string> - <!--Indicates to user they can pick a color--> - <string name="welcome_theme_title">Bir renk seç</string> - <!--Indicates to user they can pick any colors--> - <string name="welcome_theme_description">Herhangi bir renk.</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_night_description">Göze kolay.</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_night_hint">Bana geçiş yapmak</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_quickreply_title">QK yanıt</string> - <!--QK Reply explanation--> - <string name="welcome_quickreply_description">İletilere hiç olmadığı kadar hızlı yanıt ver.</string> - <!--Prompts user to try QK Reply--> - <string name="welcome_quickreply_hint">Dene!</string> - <!--QK Reply demo message--> - <string name="welcome_quickreply_message_1">Vay canına! Bu harika değil mi? Tüm yazdıklarını bir bakışta görmek. Açılan kutu dışına dokunun veya kapatmak için onay işareti tuşuna basın.</string> - <!--QK Reply demo message--> - <string name="welcome_quickreply_message_2">Bu QK yanıt . Şimdi herhangi bir yerden iletilere yanıt verebilirsiniz. Eski yazıları görmek için genişletme düğmesine dokunun</string> - <!--Settings option in menu--> - <string name="menu_settings">Ayarlar</string> - <!--Search option in menu--> - <string name="menu_search">Ara</string> - <!--Show full conversation in QuickReply--> - <string name="menu_show_all">Tüm mesajları göster</string> - <!--Show only unread messages in QuickReply--> - <string name="menu_show_unread">Okunmamış mesajları göster</string> - <!--Open conversation option in menu (shown in QuickReply)--> - <string name="menu_open_thread">Sohbeti aç</string> - <!--Forward message option in menu--> - <string name="menu_forward">Mesajı aktar</string> - <!--Call contact option in menu--> - <string name="menu_call">Ara</string> - <!--Mark a message/conversation as read option in menu--> - <string name="menu_read">Okundu olarak işaretle</string> - <!--Delete a message option in menu--> - <string name="menu_delete">Sil</string> - <!--Donate option in menu--> - <string name="menu_billing">Bağış Yapın</string> - <!--Copy text option in menu--> - <string name="menu_copy">Metni kopyala</string> - <!--Changelog option in menu--> - <string name="menu_changelog">"Yenilikler"</string> - <!--Expand settings option in menu--> - <string name="menu_show_all_prefs">Tümünü göster</string> - <!--Show less settings option in menu--> - <string name="menu_show_fewer_prefs">Daha az göster</string> - <!--Title for message details popup--> - <string name="details_title">Detaylar</string> - <!--Title for address that message is being sent to in message details popup--> - <string name="details_to">Kime</string> - <!--Title for address that message is sent from in message details popup--> - <string name="details_from">Kimden</string> - <!--Title for text of a message in message details popup--> - <string name="details_body">Metin</string> - <!--Title for date sent of a message in message details popup--> - <string name="details_date_sent">Gönderildiği tarih</string> - <!--Title for date received of a message in message details popup--> - <string name="details_date_received">Alındığı tarih</string> - <!--Title for rate snackbar--> - <string name="rate_title">QKSMS\'i beğen ;-)</string> - <!--Title for rate button--> - <string name="rate_action">Oranı</string> - <string name="pref_category_appearance">Görünüm</string> - <string name="pref_category_summary_appearance">Temalar, yazı tipleri, renkler, avatarları ve daha fazlası</string> - <string name="pref_category_general">Genel</string> - <string name="pref_category_summary_general">İletim, mesaj gönderme, biçimlendirme</string> - <string name="pref_category_blocking">Mesaj engelleme</string> - <string name="pref_category_notifications">Bildirimler</string> - <string name="pref_category_summary_notifications">Sesler, LED, gizlilik</string> - <string name="pref_category_mms">MMS</string> - <string name="pref_category_summary_mms">MMS (APNs) yapılandırmak için maksimum boyut, grup mesajlaşma</string> - <string name="pref_category_quickreply">QK yanıt</string> - <string name="pref_category_summary_quickreply">QK yanıt, açılır menüsü seçenekleri</string> - <string name="pref_category_quickcompose">QK oluşturmak</string> - <string name="pref_category_summary_quickcompose">QK oluşturmak, yıldız eklediğiniz kişiler</string> - <string name="pref_category_about">Hakkında</string> - <string name="pref_category_summary_about">Sürüm, değişenler, yazarlar, teşekkürler</string> - <string name="pref_theme">Tema rengi</string> - <string name="pref_theme_summary_alt">Temayı değiştirmek için dokunun</string> - <string name="pref_icon">Icon color</string> - <string name="pref_icon_summary">Tap to change the QKSMS icon color</string> - <string name="pref_status_tint">Renkli bildirim çubuğu</string> - <string name="pref_navigation_tint">Renkli sistem çubuğu</string> - <string name="pref_background">Arkaplan rengi</string> - <string name="pref_background_summary">Arka plan rengini değiştirmek için dokunun</string> - <string name="pref_bubbles">Mesaj kabarcıkları</string> - <string name="pref_bubbles_summary">Mesaj kabarcık tercihlerini değiştirmek için dokunun</string> - <string name="pref_night">Gece modu</string> - <string name="pref_night_summary">Pilden tasarruf et ve göz yorgunluğunu azalt</string> - <string name="pref_night_amoled">Tam siyah arkaplan</string> - <string name="pref_night_amoled_summary">AMOLED ekranlı cihazlarda daha fazla tasarruf sağlar</string> - <string name="pref_bubble_style_new">Yeni kabarcık stili kullan</string> - <string name="pref_color_sent">Gönderilen mesajları renklendir</string> - <string name="pref_color_sent_summary">Giden mesajlar için arka plan kabarcıklar rengi</string> - <string name="pref_color_received">Gelen mesajları renklendir</string> - <string name="pref_color_received_summary">Gelen iletiler için arka plan kabarcıklar rengi</string> - <string name="pref_hide_avatar_conversations">Sohbet avatarlarını gizle</string> - <string name="pref_hide_avatar_conversations_summary">Sohbet listesindeki kişilerin avatarlarını gizle</string> - <string name="pref_hide_avatar_sent">Gönderilen mesaj avatarlarını gizle</string> - <string name="pref_hide_avatar_sent_summary">Giden mesajlar için avatarınızı gizleyin</string> - <string name="pref_hide_avatar_received">Gelen mesaj avatarlarını gizle</string> - <string name="pref_hide_avatar_received_summary">Gelen mesajlar için kişi avatarını gizle</string> - <string name="pref_font_family">Yazı tipi ailesi</string> - <string name="pref_font_size">Font büyüklüğü</string> - <string name="pref_font_weight">Font kalınlığı</string> - <string name="pref_message_count">Mesaj sayısı</string> - <string name="pref_message_count_summary">Her bir sohbet için mesajların sayısını göster</string> - <string name="pref_sent_timestamps">Gönderilen damgaları</string> - <string name="pref_sent_timestamps_summary">Bir iletinin gönderildiği zaman, almamış için zaman damgası göster</string> - <string name="pref_force_timestamps">Force timestamps</string> - <string name="pref_force_timestamps_summary">Enable timestamps for all messages</string> - <string name="pref_key_timestamp_delay">New timestamp delay</string> - <string name="pref_key_timestamp_delay_summary">The number of minutes which must elapse between two messages in order for a new timestamp to be shown.</string> - <string name="pref_compose_favorites">Yıldız eklediğiniz kişiler</string> - <string name="pref_compose_summary_favorites">Yıldızlı kişileri QK sohbet oluşturma ekranında göstermek onları sadece bir tık uzakta olmasını sağlar</string> - <string name="pref_prox_sensor_call">Yakınlık sensörü</string> - <string name="pref_prox_sensor_call_summary">Sohbet ekranında iken telefonu kulağınıza götürerek arama yapın</string> - <string name="pref_delivery">İletim raporları</string> - <string name="pref_delivery_summary">Mesajınızın sorunsuz gönderildiğinin onayını alın</string> - <string name="pref_delivery_toast">Toast bildirimini göster</string> - <string name="pref_delivery_toast_summary">Toast bildirimi ile iletim raporunu göster</string> - <string name="pref_delivery_vibrate">Titreşim</string> - <string name="pref_delivery_vibrate_summary">Mesaj iletildiğinde titre</string> - <string name="pref_delete_old_messages">Delete old messages</string> - <string name="pref_delete_old_messages_summary">Automatically delete messages once they\'re old enough</string> - <string name="pref_delete_old_messages_unread">Unread messages</string> - <string name="pref_delete_old_messages_unread_summary">Automatically delete unread messages after %s days</string> - <string name="pref_delete_old_messages_read">Read messages</string> - <string name="pref_delete_old_messages_read_summary">Automatically delete read messages after %s days</string> - <string name="pref_yappy">Yappy entegrasyonu</string> - <string name="pref_endlessjabber_summary">Yappi için tam desteği etkinleştirme</string> - <string name="pref_blocked_conversations">Engellenen sohbetler</string> - <string name="pref_blocked_conversations_summary">Sohbete uzun basarak engelleyin yada bildirimi kapatın</string> - <string name="pref_block_future">Gelecek mesajları engelleyin</string> - <string name="pref_block_future_summary">Ek telefon numaralarını engellemek için ekleyin</string> - <string name="pref_should_i_answer">Ben Yanıt mıdır? bütünleşme</string> - <string name="pref_should_i_answer_summary">Otomatik ben cevap Should yoluyla engellenen numaralardan gelen mesajları silin?</string> - <string name="pref_mobile_only">Telefon numaraları</string> - <string name="pref_mobile_only_summary">Sadece rehberdeki numaraları göster</string> - <string name="pref_auto_emoji">Otomatik emoji</string> - <string name="pref_auto_emoji_summary">Metni emoji ile değiştir</string> - <string name="pref_enter_button">Enter tuşu</string> - <string name="pref_enter_button_summary">Enter tuşu özelliğini değiştir</string> - <string name="pref_compose_group">Grup mesajları</string> - <string name="pref_compose_group_summary">Birden fazla kişi için mesaj oluştururken, iletileri tek tek yerine bir gruba ileti gönderme</string> - <string name="pref_auto_download">MMS\'i otomatik indir</string> - <string name="pref_auto_download_summary">Kullanılabilir olduğunda otomatik olarak MMS\'i indir</string> - <string name="pref_auto_data">Otomatik veri</string> - <string name="pref_auto_data_summary">Mobil veriyi MMS alırken veya gönderirken otomatik olarak aç</string> - <string name="pref_split">SMS bölme</string> - <string name="pref_split_summary">Uzun mesajları bölerek yolla</string> - <string name="pref_split_counter">Bölme sayacı</string> - <string name="pref_split_counter_summary">Bölünen her mesajın önüne sıra numarası ekler</string> - <string name="pref_long_as_mms">Uzun mesajları MMS\'le yolla</string> - <string name="pref_long_as_mms_summary">Uzun mesajları bölerek yollamak yerine MMS\'e dönüştürerek gönderir</string> - <string name="pref_long_as_mms_after">Şu kadardan sonra MMS\'e dönüştür</string> - <string name="pref_long_as_mms_after_summary">Maximum karakter sayısı aşıldığında MMS olarak gönder</string> - <string name="pref_return">Enter tuşunu göster</string> - <string name="pref_return_summary">Klavyede Emoji tuşu yerine enter tuşunu göster</string> - <string name="pref_text">Metin</string> - <string name="pref_notifications">SMS uyarıları açık</string> - <string name="pref_led">Uyarı ışığı</string> - <string name="pref_theme_led">Bildirim Işığı Rengi</string> - <string name="pref_wake">Uyku modundan telefonu çıkar</string> - <string name="pref_wake_summary">Yeni bir mesaj geldiğinde ekranı aç</string> - <string name="pref_notifications_private">Gizli uyarılar</string> - <string name="pref_notifications_private_summary">Bildirimde gösterilmesini istediğin bilgileri değiştir</string> - <string name="pref_ringtone">Uyarı sesi</string> - <string name="pref_ringtone_summary">Bir uyarı sesi seçin</string> - <string name="pref_ticker">Ön izlemeyi göster</string> - <string name="pref_ticker_summary">Yeni mesajın bir kısmını uyarı çubuğunda gösterir</string> - <string name="pref_vibration">Titreşim</string> - <string name="pref_vibration_summary">Yeni mesaj alındığında titret</string> - <string name="pref_notification_call">Arama butonu</string> - <string name="pref_notification_call_summary">Mesaj göndereni bildirim çubuğundan ara</string> - <string name="pref_dimiss_read">Okundu olarak işaretle</string> - <string name="pref_dismiss_read_summary">Bildirim temizlendiğinde iletiyi okundu olarak işaretle</string> - <string name="pref_delayed">Gecikmeli mesaj</string> - <string name="pref_delayed_summary">Mesajı göndermeden bir süre bekleterek mesaj içeriğini gözden geçire bilir ve değiştire bilirsin</string> - <string name="pref_delayed_duration">Gecikme süresi (saniye)</string> - <string name="pref_delayed_duration_summary">İletinizi göndermeden önce beklenecek süre</string> - <string name="pref_night_auto">Otomatik gece modu</string> - <string name="pref_night_auto_summary">Otomatik olarak zamana göre gece modunu etkinleştir</string> - <string name="pref_day_start">Gün başlama vakti</string> - <string name="pref_night_start">Gece başlama vakti</string> - <string name="pref_qk_responses">QK yanıt</string> - <string name="pref_qk_responses_summary">Android wear\'ı kullanarak göndere bileceğiniz mesajları değiştir ve düzenle</string> - <string name="pref_quickreply_enabled">QK yanıtlama etkin</string> - <string name="pref_quickreply_enabled_summary">Yeni mesaj geldiğinde QK yanıtlamayı göster</string> - <string name="pref_tap_to_quit">Bas-kapat</string> - <string name="pref_tap_to_quit_summary">Kapatmak için pencerenin dışında bir herhangibir alana dokun</string> - <string name="pref_quickcompose">QK oluşturma etkin</string> - <string name="pref_quickcompose_summary">Üzerine tıklayarak yeni bir mesaj oluşturmanızı sağlayacak bir uyarı gösterir</string> - <string name="pref_mms_enabled">MMS etkin</string> - <string name="pref_mms_enabled_summary">MMS mesajlarını gönderme ve alma etkin</string> - <string name="pref_mmsc_url">MMSC</string> - <string name="pref_mms_proxy">MMS proxy</string> - <string name="pref_mms_port">MMS portu</string> - <string name="pref_apn_chooser">Varsayılan APNleri yükle</string> - <string name="pref_strip_unicode">Unicode karakteri ayıkla</string> - <string name="pref_strip_unicode_summary">Mesajlardaki GSM uyumlu olmayan karekterleri değiştir</string> - <string name="pref_system_bar_flat">Düz sistem çubuğu</string> - <string name="pref_system_bar_flat_summary">Kitkatdaki sistem çubuğundaki geçişi kaldır</string> - <string name="pref_status_compat">Bildirim çubuğu düzeltmesi</string> - <string name="pref_status_compat_summary">Tam ekran modu, \"Tinted Status Bar\" (Xposed modülü) veya özel DPI ayarlarından kaynaklanan sorunları düzeltir</string> - <string name="pref_navigation_compat">Gezinme çubuğu düzeltmesi</string> - <string name="pref_navigation_compat_summary">Tam ekran modu, \"Tinted Status Bar\" (Xposed modülü) veya özel DPI ayarlarından kaynaklanan sorunları düzeltir</string> - <string name="pref_about_version_title">QKSMS sürüm</string> - <string name="pref_about_authors_title">Yazarlar</string> - <string name="pref_about_authors_summary">Moez Bhatti</string> - <string name="pref_changelog_summary">Changelog görüntülemek için dokunun</string> - <string name="pref_about_thanks_title">Teşekkürler</string> - <string name="pref_about_thanks_summary">Açık kaynaklara katkıda bulunanları görüntülemek için dokunun</string> - <string name="pref_donate_title">Bağış Yapın</string> - <string name="pref_donate_summary">QKSMS ücretsizdir. Bize bağış yaparak destek olun!</string> - <string name="pref_about_gplus_title">Google+</string> - <string name="pref_about_gplus_summary">Google + \'da QKSMS Beta Testi topluluğuna katılmak</string> - <string name="pref_about_github_title">GitHub</string> - <string name="pref_about_github_summary">QKSMS is open source. Contribute and report issues on GitHub</string> - <string name="pref_about_crowdin_title">Crowdin</string> - <string name="pref_about_crowdin_summary">Join the QKSMS translation project on Crowdin</string> - <!--Preference subcategory--> - <string name="pref_subcat_theme">Tema</string> - <!--Preference subcategory--> - <string name="pref_subcat_system_bars">Sistem çubuğu</string> - <!--Preference subcategory--> - <string name="pref_subcat_categories">Kategoriler</string> - <!--Preference subcategory--> - <string name="pref_subcat_font">Yazı tipi</string> - <!--Preference subcategory--> - <string name="pref_subcat_messages">Mesajlar</string> - <!--Preference subcategory--> - <string name="pref_subcat_avatars">Avatarlar</string> - <string name="donate_google">Google ile bağış yap</string> - <string name="donate_google_summary">Google bağışın % 30\'unu alır</string> - <string name="donate_paypal">PayPal ile bağış yap</string> - <string name="donate_paypal_button">Herhangi bir miktar ile bağış yap</string> - <string name="donate_paypal_button_summary">Bana ne istersen al!</string> - <!--Donation product name--> - <string name="product_name_donation">Bağış</string> - <!--$1 donation product name--> - <string name="product_name_donate_1">1$ bağış yap</string> - <!--$5 donation product name--> - <string name="product_name_donate_5">5$ dolar bağış yap</string> - <!--$3 donation product name--> - <string name="product_name_donate_10">10$ dolar bağış yap</string> - <!--$1 donation product description--> - <string name="product_description_donate_1">Bana bir kola ısmarlayın</string> - <!--$5 donation product description--> - <string name="product_description_donate_5">Bana bir sandviç ısmarlayın</string> - <!--$10 donaion product description--> - <string name="product_description_donate_10">Bana bir yemek ısmarlayın</string> - <string name="title_settings">Ayarlar</string> - <string name="title_search">Ara</string> - <string name="title_compose">Oluştur</string> - <string name="title_conversation_list">Yazışmalar</string> - <string name="title_blocked">Bloke durumda</string> - <string name="title_changelog">Yenilikler</string> - <string name="title_picker">Yeni mesajlar</string> - <string name="title_donate">Bağış Yap</string> - <string name="title_qk_responses">QK yanıt</string> - <string name="title_block_address">Numara engelleme</string> - <string name="title_unblock_address">Numara engellemeyi kaldır</string> - <string name="title_conversations_selected">Seçili %s</string> - <string name="title_palette">Palette</string> - <string name="title_rgb">RGB</string> - <!-- Menu shown in the context menu when long pressing on a message when the message contains - one or more phone numbers and/or email addresses and the number or email is new to - contacts. [CHAR LIMIT=50] --> - <string name="menu_add_address_to_contacts">Bunu kişilere ekle: <xliff:g id="contactEmailOrNumber">%s</xliff:g></string> - <!-- Context menu item on an individual message for viewing an attached slideshow --> - <string name="view_slideshow">Slayt gösterisini görüntüle</string> - <!-- Context menu item on an individual message for viewing message details such as time and date --> - <string name="view_message_details">Ayrıntıları görüntüle</string> - <!-- Context menu item on an individual message for viewing a delivery report --> - <string name="view_delivery_report">Gönderim raporunu görüntüle</string> - <!-- Context menu item on an individual message for deleting only that message --> - <string name="delete_message">Sil</string> - <!-- Abbreviation for "kilobyte" --> - <string name="kilobyte">KB</string> - <!-- Individual message context menu item --> - <string name="copy_message_text">Metni kopyala</string> - <!-- Header for context menu on an individual message --> - <string name="message_options">Mesaj seçenekleri</string> - <!-- Delivery Header View --> - <!-- Title of "Report" window --> - <string name="delivery_header_title">Rapor et</string> - <!--Text for app restart confirmation dialog--> - <string name="restart_message">Değişiklikler QKSMS\'in bir sonraki açılışında devreye girecek</string> - <!--Dialog title for asking if a user wants to delete a conversation--> - <string name="delete_conversation">Yazışmaları sil</string> - <!--Dialog title for asking if a user wants to delete all failed messages--> - <string name="delete_all_failed">Başarısız mesajları sil</string> - <!--CDialog title for asking if a user wants to delete a conversation--> - <string name="delete_confirmation">(%s) konuşmalarını silmek istediğinizden emin misiniz?</string> - <!--CDialog title for asking if a user wants to delete all failed messages--> - <string name="delete_all_failed_confirmation">(%s) konuşmaların başarısız iletilerini silmek istediğinizden emin misiniz?</string> - <!--(Unused) Dialog title shown if APNs have not been set--> - <string name="apns_not_set">APNs ayarlanmamış</string> - <!--(Unused) Dialog description shown if APNs have not been set--> - <string name="apns_not_set_description">Görünüşe göre APN ayarı yapılmadı. Bu durumda MMS düzgün çalışmaz. QKSMS\'in sizin için ayarlaması için lütfen tamama basınız :)</string> - <!--Dialog title show if MMS hasn't been configured--> - <string name="set_up_mms_title">MMS ayarları yapılsın mi?</string> - <!--Dialog description shown if MMS hasn't yet been configured--> - <string name="set_up_mms_description">Görünüşe göre MMS henüz QKSMS için konfigüre edilmişmemiş. Otomatik olarak MMS\' iyapılandırmak için tamam\'a basın.</string> - <!-- Dialog message text explaining that a draft message will not be saved due to invalid recipients --> - <string name="discard_message_reason">Mesajınız kaydedilmeyecek çünkü geçerli alıcısı yok.</string> - <string name="invalid_code">Geçersiz kod</string> - <!--Button to restart app now instead of manually later--> - <string name="restart">Şimdi yeniden başlat</string> - <!--Notification action to reply to a message--> - <string name="reply">Cevapla</string> - <!--Notification action to reply to a message--> - <string name="reply_qksms">QKSMS ile yanıtla</string> - <!--Notification action to mark a message as read--> - <string name="read">Oku</string> - <!--Notification action to mark a message as read--> - <string name="mark_read">Okundu olarak işaretle</string> - <!--Notification action to call the sender of a message--> - <string name="call">Ara</string> - <!-- Notification toast message --> - <string name="notification_mute_on">Bildirimler etkin</string> - <string name="notification_mute_off">Bildirimler devre dışı</string> - <!--Positive action button--> - <string name="yes">Evet</string> - <string name="add">Ekle</string> - <!--Positive action button--> - <string name="save">Kaydet</string> - <!--Positive action button--> - <string name="enable">Etkinleştir</string> - <!--Positive action button--> - <string name="upgrade_now">Şimdi ayarla</string> - <!--Positive action button--> - <string name="okay">Tamam</string> - <!--Positive action button--> - <string name="redeem">Redeem</string> - <!--Neutral action button--> - <string name="just_once">Sadece bir kez</string> - <!--Neutral action button--> - <string name="later">Daha sonra</string> - <!--Neutral action button --> - <string name="cancel">İptal</string> - <!-- Name of the local user when displaying sender of an outgoing message (personal pronoun) --> - <string name="messagelist_sender_self">Ben</string> - <!-- Sender to be used if the sender address has been hidden --> - <string name="hidden_sender_address">Gizli gönderen adresi</string> - <!-- Subject to display in the conversation list if there is no subject --> - <string name="no_subject_view">(Konu yok)</string> - <!-- Time and date a message is due to expire --> - <string name="expire_on">"Son kullanma tarihi: <xliff:g id="date"> %s </xliff:g>"</string> - <!-- Formatting for subject displayed inline, prepended to MMS message text --> - <string name="inline_subject">"<Subject: <xliff:g id="subject">%s</xliff:g>>"</string> - <!-- Text of a button appearing for MMS messages that have not yet been downloaded, causing the message to be downloaded (imperative verb) --> - <string name="download">İndir</string> - <!-- Message displayed in place of the "download message" button once it has been pressed, indicating that the download is in progress --> - <string name="downloading">İndiriliyor</string> - <!-- Toast message while an image is being resized --> - <string name="compressing">Resim çok büyük. Sıkıştırılıyor\u2026</string> - <!-- Header shown above favorite contacts in QKCompose --> - <string name="favorites">Yıldız eklediğiniz kişiler</string> - <!-- Word represents 'self' in a conversation --> - <string name="me">Ben</string> - <string name="menu_edit">Düzenle</string> - <string name="menu_delete_messages">Mesajları sil</string> - <string name="menu_delete_failed">Başarısız iletileri sil</string> - <string name="menu_lock">Kilitle</string> - <string name="menu_unlock">Kilidi aç</string> - <!-- When the user tries to view message details and some error occurs while - retrieving those details, this message will be shown. --> - <string name="cannot_get_details">Ayrıntılar alınamıyor.</string> - <!-- Title of "Message details" dialog --> - <string name="message_details_title">Mesaj ayrıntıları</string> - <!-- Label in "Message details" dialog --> - <string name="message_type_label">Mesaj tipi\u000A</string> - <!-- "Type" value in "Message details" dialog --> - <string name="text_message">Metin mesajı</string> - <!-- "Type" value in "Message details" dialog --> - <string name="multimedia_message">Multimedya mesaj</string> - <!-- "Type" value in "Message details" dialog --> - <string name="multimedia_notification">Multimedya mesaj bildirimi</string> - <!-- Label in "Message details" dialog showing who sent the message. --> - <string name="from_label">Gönderen\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="to_address_label">Gönderilen\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="bcc_label">Bcc\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="sent_label">Gönderilen\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="received_label">Alınan\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="saved_label">Kaydedilen\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="subject_label">Konu\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="message_size_label">Mesaj boyutu\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="priority_label">Öncelik\u000A</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_high">Yüksek</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_normal">Orta</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_low">Düşük</string> - <!-- Label in "Message details" dialog --> - <string name="message_class_label">Mesaj class\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="error_code_label">Hata kodu\u000A</string> - <!-- Alert dialog title when creating a slideshow [CHAR LIMIT=none] --> - <string name="building_slideshow_title">Slayt gösterisi oluşturuluyor</string> - <!-- Tag appearing on conversations in the conversation list that contain a draft message --> - <string name="has_draft">Taslak</string> - <!-- In conversation list items, this is the separator between a contact's name and the draft stamp [CHAR LIMIT=5] --> - <string name="draft_separator">,\u0020</string> - <!-- In conversation list items, this comes after the receipient's name and contains the number of messages in the thread [CHAR LIMIT=5] --> - <string name="message_count_format">\u00a0<xliff:g id="number" example="1">%1$s</xliff:g></string> - <!-- For debugging: Dialog box title indicating there's a situation where data has unexpectedly changed --> - <string name="error_state">Tutarsız durum</string> - <!-- For debugging: Dialog box text indicating there's a situation where data has unexpectedly changed --> - <string name="error_state_text">Konu ve alıcıların durumu tutarsız. Lütfen bir hata raporu oluşturun ve http://go/droidanizer adresine rapor edin </string> - <!-- This is the dialog title for the "Select link" dialog, shown when the user clicks on a - chat in the chat history view if there are links in the chat message. The dialog displays the - links if there are any --> - <string name="select_link_title">Bir eylem seçin</string> - <!-- In message list items, this string builds the timestamp line when the message is in a group [CHAR LIMIT=NONE] --> - <string name="message_timestamp_format"><xliff:g id="string" example="Fred Flinstone">%1$s</xliff:g>\u0020-\u0020<xliff:g id="string" example="9:39AM">%2$s</xliff:g></string> - <!--Message sending status: sending--> - <string name="status_sending">Gönderiliyor...</string> - <!--Message sending status: failed--> - <!--<string name="status_failed">Failed. Tap to retry</string>--> - <!-- Delivery Report Activity --> - <!-- Status in "Report" window --> - <string name="status_none">(Yok)</string> - <!-- Status in "Report" window --> - <string name="status_pending">Beklemede</string> - <!-- Status in "Report" window --> - <string name="status_read">Okundu</string> - <!-- Status in "Report" window --> - <string name="status_received">Alındı</string> - <!-- Status in "Report" window --> - <string name="status_failed">Başarısız oldu. Seçenekler için dokunun</string> - <!-- Status in "Report" window --> - <string name="status_unread">Okunmadı</string> - <!-- Status in "Report" window --> - <string name="status_rejected">Reddedildi</string> - <!-- Label in "Report" window --> - <string name="recipient_label">Alıcı:\u0020</string> - <!-- Label in "Report" window --> - <string name="status_label">Durum:\u0020</string> - <!-- Label in "Report" window [CHAR LIMIT=50]--> - <string name="delivered_label">Ulaştırıldı:\u0020</string> - <string name="do_something">Bir şeyler yap</string> - <!-- Confirm Delete --> - <!-- Delete confirmation dialog title --> - <string name="confirm_dialog_title">Silinsin mi?</string> - <!-- Delete confirmation dialog title for locked messages --> - <string name="confirm_dialog_locked_title">Kilitlenmiş mesaj silinsin mi?</string> - <!-- This message is displayed in a confirmation dialog when the user selects one or more - conversations and then taps the "Delete" button. --> - <plurals name="confirm_delete_conversation"> - <!-- Case of 1 result. --> - <item quantity="one"><xliff:g id="number" example="15">%1$s</xliff:g> sohbet silinecek.</item> - <!-- Case of 0 or 2 or more results. --> - <item quantity="other"><xliff:g id="number" example="15">%1$s</xliff:g> sohbet silinecek.</item> - </plurals> - <string name="confirm_delete_conversation">Tüm sohbet silinecek.</string> - <!-- Delete all threads confirmation dialog message --> - <string name="confirm_delete_all_conversations">Tüm sohbetler silinecek.</string> - <!-- Delete message confirmation dialog message --> - <string name="confirm_delete_message">Bu mesaj silinecek.</string> - <!-- Delete message confirmation dialog message for a locked message --> - <string name="confirm_delete_locked_message">Bu kilitlenmiş mesaj silinsin mi?</string> - <!-- Delete all the messages on the SIM dialog message --> - <string name="confirm_delete_all_SIM_messages">SIM karttaki tüm mesajlar silinecek.</string> - <!-- Delete the selected message on the SIM dialog message --> - <string name="confirm_delete_SIM_message">SIM karttaki bu mesaj silinecek.</string> - <!-- Delete unlocked checkbox title --> - <string name="delete_unlocked">Kilitlenmiş mesajları sil</string> - <!-- Delete button title --> - <string name="delete">Sil</string> - <!-- More button title --> - <string name="more">Daha fazla</string> - <!-- More button summary --> - <string name="more_summary">Daha fazlasını görmek için dokunun</string> - <!-- Action bar mode title when multi-selecting conversations --> - <string name="select_conversations">Sohbetleri seç</string> - <!-- Show this in the middle of the main activity when there are no conversations [CHAR LIMIT=none] --> - <string name="no_conversations">Sohbet yok.</string> - <!-- Show this in the middle of the main activity when loading conversations [CHAR LIMIT=none] --> - <string name="loading_conversations">Sohbetler yükleniyor.</string> - <!-- Tells the user that QKSMS isn't the default SMS app --> - <string name="not_default">Varsayılan SMS</string> - <!-- Tells the user they need to set QKSMS as the default app in order to use this feature --> - <string name="default_info">Bunu yapmak için QKSMS\'in varsayılan sms uygulaman olması gerekiyor</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to mark messages as read --> - <string name="not_default_mark_read">Mesajları okundu olarak işaretlemek için QKSMS\'in varsayılan sms uygulaman olması gerekiyor</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to mark messages as unread --> - <string name="not_default_mark_unread">Mesajları okunmadı olarak işaretlemek için QKSMS\'in varsayılan sms uygulaman olması gerekiyor</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to send messages --> - <string name="not_default_delete">Mesajları silmek için QKSMS\'in varsayılan sms uygulaman olması gerekiyor</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to delete messages --> - <string name="not_default_send">Mesajları göndermek için QKSMS\'in varsayılan sms uygulaman olması gerekiyor</string> - <!-- Tells the user they should set QKSMS as the default messaging app --> - <string name="not_default_first">Bazı özellikler QKSMS varsayılan sms uygulaması olmadığı için kullanılamaz</string> - <string name="delayed_messaging_info">Gecikmeli mesaj mesajları gönderilmeden iptal edebilmenizi sağlar. Varsayılan davranışı ve daha fazlasını ayarlardan değiştire bilirsin</string> - <string name="delayed_duration_bounds_error">Süre 1 ile 30 saniye arasında olmalıdır</string> - <!-- Dialog title for the Read Report dialog. --> - <string name="confirm">Onayla</string> - <!-- Dialog text for the Read Report dialog. --> - <string name="message_send_read_report">Okundu raporu gönderilecek.</string> - <!-- Dialog title for updating app icon color --> - <string name="update_icon_title">Simge rengini güncelleştir</string> - <!-- Dialog message for updating app icon color --> - <string name="update_icon_message">QKSMS must be restarted when changing the icon color</string> - <string name="dialog_conversation_details_title">Konuşma ayrıntıları</string> - <string name="dialog_conversation_details_last_message_date">Son mesaj tarihi</string> - <string name="dialog_conversation_details_message_count">Mesaj sayısı</string> - <string name="dialog_conversation_details_recipients">Alıcılar (%s)</string> - <string name="dialog_should_i_answer_title">Should I Answer? not installed</string> - <string name="dialog_should_i_answer_message">Google\'dan uygulaması Şimdi Oyna indirmek ister misiniz?</string> - <string name="dialog_delete_old_messages">Are you sure you want to automatically delete old messages?</string> - <!-- Title for audio file picker --> - <string name="select_audio">Seç dosyası seç</string> - <!-- Menu title to copy an attachment to the shared storage [CHAR LIMIT=25] --> - <string name="copy_to_sdcard">Eklentiyi kaydet</string> - <!-- Toast message on successful copy to shared storage [CHAR LIMIT=30] --> - <string name="copy_to_sdcard_success">Eklenti kaydedildi.</string> - <!-- Toast message on failed copy to shared storage [CHAR LIMIT=30] --> - <string name="copy_to_sdcard_fail">Eklenti kaydedilemedi.</string> - <!-- Menu title to save a sound as a ringtone --> - <string name="save_ringtone">Zil sesi olarak kaydet</string> - <!-- Toast message on successful copying ringtone to drm provider --> - <string name="saved_ringtone">Zil sesi kaydedildi.</string> - <!-- Toast message on failed copying ringtone to drm provider --> - <string name="saved_ringtone_fail">Zil sesi kaydedilemedi.</string> - <!-- Menu item --> - <!-- Menu item [CHAR LIMIT=40] --> - <string name="menu_group_participants">Grup katılımcılarını</string> - <!--Toast shown when a draft is saved--> - <string name="toast_draft">Taslak kaydedildi</string> - <!--Toast shown when a conversation is deleted--> - <string name="toast_conversation_deleted">Yazışma silindi</string> - <!--Toast shown when device is low on storage--> - <string name="toast_low_memory">"Telefon hafızası dolu. Boş alan açmak için birkaç dosya silin."</string> - <!--Toast shown to tell user that forwarding messages doesn't work yet--> - <string name="toast_forward">Bu özellik henüz hazır değil. Lütfen şimdilik \"Yazıyı kopyala\" özelliğini kullanın ve göndermek istediğiniz sohbete yapıştırın</string> - <!--Toast shown for unimplemented features--> - <string name="toast_unimplemented">Bu özellik henüz hazır değil</string> - <!--Toast shown when a message fails to send--> - <string name="toast_message_failure">Mesaj gönderilemedi</string> - <!--Toast shown when a message is delivered--> - <string name="toast_message_delivered">Mesaj iletildi</string> - <!--Toast shown when a message is not delivered--> - <string name="toast_message_not_delivered">Mesaj iletilmedi</string> - <!--Toast shown when default APNs are loaded--> - <string name="toast_default_apns_loaded">Varsayılan APN ayarları yüklendi</string> - <!--Toast shown when text is copied to the clipboard--> - <string name="toast_copy_text">Yazı panoya kopyalandı</string> - <!--Toast shown when Google Play Services is not available for purchasing a product--> - <string name="toast_billing_not_available">Satın alma Android cihazınızda Google Play Store (ödeme) gerektiriyor</string> - <!--Toast shown when Google Play Services is not available for purchasing a product--> - <string name="toast_endlessjabber_not_installed">EndlessJabber yüklü değil, Google Play açılıyor</string> - <string name="toast_changelog_error">Yenilikler yüklenemedi. Lütfen daha sonra yeniden deneyin</string> - <string name="toast_conversation_error">Couldn\'t open conversation</string> - <string name="toast_deleting_old_messages">Your old messages will be deleted shortly</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_1">Bağışın için teşekkürler! Siz benim yeni dostumsunuz.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_2">Yardımın için teşekkürler! Sizi seviyoruz.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_3">Yardımın için teşekkürler! QKSMS\'in şimdiye kadarki en iyi mesajlaşma uygulaması olmasına yardımcı oluyorsun.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_4">Yardımın için teşekkürler! Mükemmelsiniz.</string> - <!--Menu option to mute conversation--> - <string name="menu_mute_conversation">Sohbetin sesini kapat</string> - <!--Menu option to mute conversation--> - <string name="menu_unmute_conversation">Sohbetin sesini aç</string> - <string name="menu_block_conversations">Blok konuşmaları</string> - <string name="menu_unblock_conversations">Konuşmaların engelini kaldır</string> - <string name="menu_messages">Mesajlar</string> - <string name="menu_blocked">Engellenmiş</string> - <string name="menu_blocked_conversations">Engellenmiş (yeni%s)</string> - <string name="menu_unblocked_conversations">Mesajlar (yeni%s)</string> - <string name="menu_notifications">Bildirimler</string> - <string name="menu_notifications_off">Bildirimleri kapat</string> - <string name="menu_notification_settings">Konuşma ayarları</string> - <string name="menu_view_details">Ayrıntıları görüntüle</string> - <string name="menu_mark_read">Okundu olarak işaretle</string> - <string name="menu_mark_unread">Okunmadı olarak işaretle</string> - <string name="menu_delete_conversation">Sohbeti sil</string> - <string name="menu_multi_select">Sohbeti seç</string> - <string name="menu_done">Tamam</string> - <string name="failed_message_title">Mesaj seçenekleri başarısız oldu</string> - <!--Toast shown to tell the user that they don't have a photo attachments app, and suggests that they download one--> - <string name="attachment_app_not_found">Eklenti uygulaması bulunamadı. Bir fotoğraf galeri uygulaması yüklemeyi deneyin!</string> - <string name="attachment_camera_error">Kamera açılamadı</string> - <string name="pref_max_mms_attachment_size">Maksimum MMS ek boyutu</string> - <string name="error_no_recipients">Mesajı göndermek için kişi seçin!</string> - <string name="error_file_not_found">QKSMS paylaşmaya çalıştığınız dosyaya erişemiyor!</string> - <string name="sending_blocked_welcome_screen_message">Bekle! Bir dakika içinde gerçek anlamda mesajlar göndere bileceksin!</string> - <string name="notification_colored_icon_ready">Ana ekrandan, başlatıcı eklemek için dokunun.</string> - <string name="notification_title_colored_icon_ready">QKSMS renkli simge hazır</string> - <string name="icon_ready">Yeni simgen hazır!</string> - <string name="icon_ready_message">Yenilenmiş rengi ile tekrar ana ekrana ekleye bilirsin.</string> - <string name="dont_ask_again">Bir daha sorma</string> - <string name="warning">Stagefright uyarısı (cihazda bulunan bir yazılım açığı)</string> - <string name="stagefright_warning">Video mesajları telefonunuzu saldırılara karşı savunmasız bırakabilir bir zararlı yazılım içerebilir. Devam etmek istiyor musunuz?</string> - <!-- MMS DIALOG SETUP STRINGS --> - <string name="mms_setup_set_up_mms_title">MMS ayarları yapılsın mı?</string> - <string name="mms_setup_set_up_mms_body">Görünüşe göre MMS QKSMS içinde kurulu değil. Otomatik olarak MMS\'i yapılandırmak Tamam tuşuna basın.</string> - <string name="mms_setup_setting_up_later_title">Daha sonra MMS\'i ayarla</string> - <string name="mms_setup_setting_up_later_body">Otomatik yapılandırma deneyin, destek birimine başvurun veya kendi yapılandırma ayarlarını girmek için ayarları MMS bölümünü ziyaret edin.</string> - <string name="mms_setup_no_configurations_found_title">Yapılandırma bulunamadı</string> - <string name="mms_setup_no_configurations_found_body">Bulunduğumuz operatör için otomatik olarak bir MMS yapılandırması bulamadım. Destek hizmetleri için Tamam tuşuna basın. Yapılandırma için size yardımcı olacaz! </string> - <string name="mms_setup_one_configuration_found_title">Bir yapılandırma bulundu</string> - <string name="mms_setup_one_configuration_found_body">%s operatörü için bir MMS yapılandırma bulduk. Bu doğru mu?</string> - <string name="mms_setup_multiple_configurations_found_title">Birden çok yapılandırma bulundu</string> - <string name="mms_setup_multiple_configurations_found_body">Birden fazla MMS yapılandırması bulduk. Operatörü listeden seçin veya operatör listede değilse N/A tuşuna basın.</string> - <string name="mms_setup_next_steps_title">Sonraki adımlar</string> - <string name="mms_setup_next_steps_body">Otomatik yapılandırma için tekrar deneyin, destek birimine başvurun veya kendi yapılandırma ayarlarınızı girmek için ayarlardan MMS bölümünü ziyaret edin.</string> - <string name="mms_setup_success_title">Başarılı!</string> - <string name="mms_setup_success_body">Eğer herhangi bir sorunla karşılaşırsanız, otomatik yapılandırmayı tekrar deneyin, destek birimine başvurun veya kendi yapılandırma ayarlarınızı girmek için ayarlarda MMS bölümünü ziyaret edin.</string> - <string name="na">N/A</string> - <string name="no">Hayır</string> - <string name="pref_automatically_configure_mms">Otomatik olarak MMS yapılandırma</string> - <string name="pref_mms_contact_support">Destek hizmetlerine başvur</string> - <string name="pref_category_sending_mms">MMS gönderme</string> - <string name="pref_category_mms_configuration">MMS yapılandırma</string> - <string name="pref_mms_contact_support_summary">MMS yapılandırılmasına yardım için QKSMS ekibine başvurun</string> - <string name="pref_markdown_enabled">Metin biçimlendirme</string> - <string name="pref_markdown_enabled_summary">İletilerinizde kalın, altı çizili ve italik için etiketleme sözdizimini kullanın</string> - <string name="want_read_indicators">Göstergeleri okumak ister misin?</string> - <string name="color_swatch_description">Renk %1$d</string> - <string name="color_swatch_description_selected">Seçili renk %1$d</string> - <string name="color_picker_default_title">Bir renk seçin</string> - <string name="message_delivered">Mesaj iletildi</string> - <string name="message_not_delivered">Mesaj iletilmedi</string> - <string name="error">Hata</string> - <string name="invalid_destination">Geçersiz hedef adresi.</string> - <string name="service_not_activated">Servis ağ üzerinde etkin değil.</string> - <string name="service_message_not_found">Mesajın süresi geçmiş ya da mevcut değil.</string> - <string name="service_network_problem">Ağ sorunu nedeniyle gönderilemedi</string> - <string name="message_queued">Mesajını gönderemedik. Servis sağlayıcı kullanıla bilir olduğunda gönderilecektir.</string> - <string name="download_later">Şu anda karşıdan yüklenemiyor. Daha sonra yeniden deneyin.</string> - <string name="no_apn">Hiçbir APN ayarı bulunamadı ayarlardan kurulum yapmalısınız!</string> - <string name="no_subject">(Konu yok)</string> - <string name="unknown_sender">Bilinmeyen gönderici</string> - <string name="dl_failure_notification">Mesaj indirilemedi <xliff:g id="subject">%1$s </xliff:g> <xliff:g id="from">%2$s </xliff:g>.</string> - <string name="auto_select_multiple_apns">Birden çok farklı konfigürasyonları bulduk. Şimdi bir tanesini deme. Eğer işe yaramazsa, yenisini denemek için ayarlar > Gelişmiş > varsayılan APNs\'yi yükle.</string> - <string name="auto_select_apn">Otomatik olarak APNs seçin</string> - <string name="auto_select_failed_title">Otomatik yapılandırma başarısız oldu</string> - <string name="auto_select_failed">Operatörünüz için APN ayarları aramayı deneyin (MMSC, bağlantı noktası ve Proxy) ve ayarlar > Gelişmiş kısmına gideren yapılandırın.</string> - <string name="date_yesterday">Dün</string> - <string name="date_just_now">şimdi</string> - <string name="compose_loading_attachment">Ek yükleme</string> - <string name="hint_no_messages">Henüz mesajınız yok.\nMesaj göndermek için + ya, tıklayın!</string> - <string-array name="resend_menu"> - <item>Yeniden gönder</item> - <item>Düzenle</item> - <item>Sil</item> - </string-array> - <string-array name="message_menu"> - <item>Mesajı aktar</item> - <item>Yazıyı kopyala</item> - <item>Detaylar</item> - <item>Mesajı sil</item> - </string-array> - <string-array name="background_titles"> - <item>Material Light</item> - <item>Material Dark</item> - <item>Siyah</item> - </string-array> - <string-array name="font_sizes"> - <item>Küçük</item> - <item>Normal</item> - <item>Büyük</item> - <item>En büyük</item> - </string-array> - <string-array name="font_families"> - <item>Roboto regular</item> - <item>Roboto Condensed</item> - <item>Sistem yazı tipi</item> - </string-array> - <string-array name="font_weights"> - <item>İnce</item> - <item>Kalın</item> - </string-array> - <!-- String to match as no subject and filter out as a subject. For example, if the - subject string is "no subject", we won't display that. We'll pretend - no subject string was delivered. --> - <string-array name="empty_subject_strings"> - <item>konu yok</item> - </string-array> - <string-array name="qk_responses"> - <item>Tamam</item> - <item>Bana bir dakika ver</item> - <item>Yolda</item> - <item>Teşekkürler</item> - <item>Kulağa güzel geliyor</item> - <item>Ne haber?</item> - <item>Kararlaştırıldı</item> - <item>Hayır</item> - <item>Seni seviyorum</item> - <item>Özür dilerim</item> - <item>Hehehe</item> - <item>Tamam o zaman</item> - </string-array> - <string-array name="enter_button_options"> - <item>Emoji göster</item> - <item>Yeni satır</item> - <item>Mesajı gönder</item> - </string-array> - <string-array name="notification_private_options"> - <item>Tümünü göster</item> - <item>Mesajı gizle</item> - <item>Mesajı ve göndereni gizle</item> - </string-array> - <!-- Max MMS attachment sizes. I.e. will compress pictures that are larger than 300 KB down to - under 300KB. --> - <string-array name="max_mms_attachment_sizes"> - <item>300 KB</item> - <item>600 KB</item> - <item>1 MB</item> - <item>Sınırsız</item> - </string-array> -</resources> diff --git a/QKSMS/src/main/res/values-v19/bools.xml b/QKSMS/src/main/res/values-v19/bools.xml deleted file mode 100644 index c83652f29..000000000 --- a/QKSMS/src/main/res/values-v19/bools.xml +++ /dev/null @@ -1,5 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<resources> - <bool name="hasKitKat">true</bool> - <bool name="preKitKat">false</bool> -</resources> \ No newline at end of file diff --git a/QKSMS/src/main/res/values-v19/dimens.xml b/QKSMS/src/main/res/values-v19/dimens.xml deleted file mode 100644 index 95b0df857..000000000 --- a/QKSMS/src/main/res/values-v19/dimens.xml +++ /dev/null @@ -1,4 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<resources> - <dimen name="slideshow_padding_top">24dp</dimen> -</resources> \ No newline at end of file diff --git a/QKSMS/src/main/res/values-v19/themes.xml b/QKSMS/src/main/res/values-v19/themes.xml deleted file mode 100644 index 1ea0d3a66..000000000 --- a/QKSMS/src/main/res/values-v19/themes.xml +++ /dev/null @@ -1,12 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<resources> - - <style name="AppThemeLight" parent="AppBaseThemeLight"> - <item name="android:windowContentOverlay">@null</item> - </style> - - <style name="AppThemeDark" parent="AppBaseThemeDark"> - <item name="android:windowContentOverlay">@null</item> - </style> - -</resources> \ No newline at end of file diff --git a/QKSMS/src/main/res/values-v21/bools.xml b/QKSMS/src/main/res/values-v21/bools.xml deleted file mode 100644 index 9cd94006d..000000000 --- a/QKSMS/src/main/res/values-v21/bools.xml +++ /dev/null @@ -1,5 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<resources> - <bool name="hasL">true</bool> - <bool name="preL">false</bool> -</resources> \ No newline at end of file diff --git a/QKSMS/src/main/res/values-v21/dimens.xml b/QKSMS/src/main/res/values-v21/dimens.xml deleted file mode 100644 index 2247fc360..000000000 --- a/QKSMS/src/main/res/values-v21/dimens.xml +++ /dev/null @@ -1,5 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<resources> - <dimen name="title_padding">0dp</dimen> - <dimen name="ab_height">56dp</dimen> -</resources> \ No newline at end of file diff --git a/QKSMS/src/main/res/values-v21/themes.xml b/QKSMS/src/main/res/values-v21/themes.xml deleted file mode 100644 index 2674dbe33..000000000 --- a/QKSMS/src/main/res/values-v21/themes.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<resources> - - <style name="AppThemeLight" parent="AppBaseThemeLight"> - <item name="android:windowContentOverlay">@null</item> - <item name="android:windowContentTransitions">true</item> - <item name="android:windowDrawsSystemBarBackgrounds">true</item> - <item name="android:windowAllowEnterTransitionOverlap">true</item> - <item name="android:windowAllowReturnTransitionOverlap">true</item> - <item name="android:windowSharedElementEnterTransition">@android:transition/move</item> - <item name="android:windowSharedElementExitTransition">@android:transition/move</item> - </style> - - <style name="AppThemeDark" parent="AppBaseThemeDark"> - <item name="android:windowContentOverlay">@null</item> - <item name="android:windowContentTransitions">true</item> - <item name="android:windowDrawsSystemBarBackgrounds">true</item> - <item name="android:windowAllowEnterTransitionOverlap">true</item> - <item name="android:windowAllowReturnTransitionOverlap">true</item> - <item name="android:windowSharedElementEnterTransition">@android:transition/move</item> - <item name="android:windowSharedElementExitTransition">@android:transition/move</item> - </style> - -</resources> \ No newline at end of file diff --git a/QKSMS/src/main/res/values-v24/bools.xml b/QKSMS/src/main/res/values-v24/bools.xml deleted file mode 100644 index e96a807a0..000000000 --- a/QKSMS/src/main/res/values-v24/bools.xml +++ /dev/null @@ -1,5 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<resources> - <bool name="hasN">true</bool> - <bool name="preN">false</bool> -</resources> \ No newline at end of file diff --git a/QKSMS/src/main/res/values-vi/strings.xml b/QKSMS/src/main/res/values-vi/strings.xml deleted file mode 100644 index 1b4c97590..000000000 --- a/QKSMS/src/main/res/values-vi/strings.xml +++ /dev/null @@ -1,767 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!--Generated by crowdin.com--> -<resources xmlns:xliff="http://schemas.android.com/apk/res-auto"> - <!--Slogan--> - <string name="slogan">Love texting again.</string> - <!--Text shown when a phone number cannot be found--> - <string name="unknown_number">Số Điện Thoại Không Rõ</string> - <!--Content description for photos--> - <string name="popup_photo_CD">Ảnh</string> - <!--Text to be displayed while content is loading--> - <string name="loading">Đang tải…</string> - <!--Test string--> - <string name="test">Test string</string> - <!--Hint for contacts text field--> - <string name="hint_contacts">Nhập người nhận</string> - <!--Hint for search text field--> - <string name="hint_search">Tìm kiếm gì đó</string> - <!--Hint for message reply text field--> - <string name="hint_reply">Nhập một tin nhắn</string> - <!--Hint for code redemption--> - <string name="hint_redeem">Nhập mã</string> - <string name="hint_hex">Hex</string> - <!--Text shown for single new message in notification--> - <string name="new_message">Tin nhắn mới</string> - <!--Text shown after number of unread messages in notification (ex. 3 new messages)--> - <string name="new_messages">tin nhắn mới</string> - <!--Text shown for single failed message in notification--> - <string name="failed_message">Tin nhắn không thể gửi được</string> - <!--Text shown after number of failed messages in notification (ex. 3 messages failed to send)--> - <string name="failed_messages">tin nhắn không thể gửi được</string> - <!--Text shown under failed message count--> - <string name="failed_messages_summary">Bấm để xem</string> - <!--QuickCompose notification title--> - <string name="quickcompose">QK Compose</string> - <!--QuickCompose notification text--> - <string name="quickcompose_detail">Nhấn để gửi tin nhắn</string> - <!--Welcome screen intro button--> - <string name="welcome_start">Hãy bắt đầu thôi nào!</string> - <!--Allows user to skip welcome screen--> - <string name="welcome_skip">BỎ QUA</string> - <!--Allows user to finish the welcome screen--> - <string name="welcome_finish">KẾT THÚC</string> - <!--Indicates to user they can pick a color--> - <string name="welcome_theme_title">Chọn một màu</string> - <!--Indicates to user they can pick any colors--> - <string name="welcome_theme_description">Bất kỳ màu nào.</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_night_description">Dễ chịu với mắt.</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_night_hint">Chuyển đổi</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_quickreply_title">QK Reply</string> - <!--QK Reply explanation--> - <string name="welcome_quickreply_description">Trả lời tin nhắn nhanh hơn bao giờ hết.</string> - <!--Prompts user to try QK Reply--> - <string name="welcome_quickreply_hint">Try it!</string> - <!--QK Reply demo message--> - <string name="welcome_quickreply_message_1">Wow! Now wasn\'t that awesome? You can view your entire conversation at a glance. Tap outside the popup or press the checkmark to dismiss it.</string> - <!--QK Reply demo message--> - <string name="welcome_quickreply_message_2">This is QK Reply. Now you can reply to messages from anywhere. Tap the expand button to see what happens next :)</string> - <!--Settings option in menu--> - <string name="menu_settings">Cài đặt</string> - <!--Search option in menu--> - <string name="menu_search">Tìm kiếm</string> - <!--Show full conversation in QuickReply--> - <string name="menu_show_all">Hiển thị tất cả tin nhắn</string> - <!--Show only unread messages in QuickReply--> - <string name="menu_show_unread">Hiển thi tin nhắn chưa đọc</string> - <!--Open conversation option in menu (shown in QuickReply)--> - <string name="menu_open_thread">Mở cuộc hội thoại</string> - <!--Forward message option in menu--> - <string name="menu_forward">Chuyển tiếp tin nhắn</string> - <!--Call contact option in menu--> - <string name="menu_call">Gọi</string> - <!--Mark a message/conversation as read option in menu--> - <string name="menu_read">Đánh dấu đã đọc</string> - <!--Delete a message option in menu--> - <string name="menu_delete">Xóa</string> - <!--Donate option in menu--> - <string name="menu_billing">Quyên góp</string> - <!--Copy text option in menu--> - <string name="menu_copy">Chép văn bản</string> - <!--Changelog option in menu--> - <string name="menu_changelog">"Có gì mới"</string> - <!--Expand settings option in menu--> - <string name="menu_show_all_prefs">Hiển thị tất cả</string> - <!--Show less settings option in menu--> - <string name="menu_show_fewer_prefs">Hiển thị ít hơn</string> - <!--Title for message details popup--> - <string name="details_title">Chi tiết</string> - <!--Title for address that message is being sent to in message details popup--> - <string name="details_to">Đến</string> - <!--Title for address that message is sent from in message details popup--> - <string name="details_from">Từ</string> - <!--Title for text of a message in message details popup--> - <string name="details_body">Thân</string> - <!--Title for date sent of a message in message details popup--> - <string name="details_date_sent">Ngày gửi</string> - <!--Title for date received of a message in message details popup--> - <string name="details_date_received">Ngày nhận</string> - <!--Title for rate snackbar--> - <string name="rate_title">Bạn có thích QKSMS không?</string> - <!--Title for rate button--> - <string name="rate_action">Đánh giá</string> - <string name="pref_category_appearance">Hiển thị</string> - <string name="pref_category_summary_appearance">Chủ đề, phông chữ, màu sắc, ảnh đại diện, và nhiều hơn nữa</string> - <string name="pref_category_general">Chung</string> - <string name="pref_category_summary_general">Delivery, message sending, formatting</string> - <string name="pref_category_blocking">Chặn tin nhắn</string> - <string name="pref_category_notifications">Thông báo</string> - <string name="pref_category_summary_notifications">Âm thanh, đèn LED, bảo mật</string> - <string name="pref_category_mms">MMS</string> - <string name="pref_category_summary_mms">Cấu hình MMS (APNs), kích thước tối đa, tin nhắn nhóm</string> - <string name="pref_category_quickreply">QK Reply</string> - <string name="pref_category_summary_quickreply">QK Reply, popup options</string> - <string name="pref_category_quickcompose">QK Compose</string> - <string name="pref_category_summary_quickcompose">QK Compose, starred contacts</string> - <string name="pref_category_about">Giới thiệu</string> - <string name="pref_category_summary_about">Phiên bản, thay đổi, tác giả, cảm ơn</string> - <string name="pref_theme">Màu chủ đề</string> - <string name="pref_theme_summary_alt">Bấm để thay đổi chủ đề</string> - <string name="pref_icon">Icon color</string> - <string name="pref_icon_summary">Tap to change the QKSMS icon color</string> - <string name="pref_status_tint">Nhuộm thanh trạng thái</string> - <string name="pref_navigation_tint">Nhuộm thanh điều hướng</string> - <string name="pref_background">Màu nền</string> - <string name="pref_background_summary">Bấm để thay đổi màu nền</string> - <string name="pref_bubbles">Bong bóng tin nhắn</string> - <string name="pref_bubbles_summary">Bấm để thay đổi tùy chọn bong bóng tin nhắn</string> - <string name="pref_night">Chế độ ban đêm</string> - <string name="pref_night_summary">Tiết kiệm pin và giảm mỏi mắt</string> - <string name="pref_night_amoled">Nền đen</string> - <string name="pref_night_amoled_summary">Tiết kiệm pin hơn trên các thiết bị có màn hình AMOLED</string> - <string name="pref_bubble_style_new">Sử dụng kiểu bong bóng mới</string> - <string name="pref_color_sent">Màu tin nhắn gửi</string> - <string name="pref_color_sent_summary">Màu nền bong bóng cho tin nhắn gửi đi</string> - <string name="pref_color_received">Màu tin nhắn nhận</string> - <string name="pref_color_received_summary">Màu nền bong bóng cho tin nhắn đến</string> - <string name="pref_hide_avatar_conversations">Ẩn ảnh đại diện cuộc trò chuyện</string> - <string name="pref_hide_avatar_conversations_summary">Ẩn ảnh đại điện cho danh bạ trong danh sách trò chuyện</string> - <string name="pref_hide_avatar_sent">Ẩn ảnh đại diện tin nhắn đã gửi</string> - <string name="pref_hide_avatar_sent_summary">Ẩn ảnh đại diện của bạn cho tin nhắn gửi đi</string> - <string name="pref_hide_avatar_received">Ẩn ảnh đại diện cho tin nhắn đã nhận</string> - <string name="pref_hide_avatar_received_summary">Ẩn ảnh đại diện của danh bạ cho tin nhắn đến</string> - <string name="pref_font_family">Phông chữ</string> - <string name="pref_font_size">Cỡ phông</string> - <string name="pref_font_weight">Độ đậm phông</string> - <string name="pref_message_count">Đếm tin nhắn</string> - <string name="pref_message_count_summary">Hiển thị số tin nhắn cho mỗi cuộc hội thoại</string> - <string name="pref_sent_timestamps">Sent timestamps</string> - <string name="pref_sent_timestamps_summary">Show the timestamp for when a message was sent, not received</string> - <string name="pref_force_timestamps">Force timestamps</string> - <string name="pref_force_timestamps_summary">Enable timestamps for all messages</string> - <string name="pref_key_timestamp_delay">New timestamp delay</string> - <string name="pref_key_timestamp_delay_summary">The number of minutes which must elapse between two messages in order for a new timestamp to be shown.</string> - <string name="pref_compose_favorites">Địa chỉ liên hệ có gắn dấu sao</string> - <string name="pref_compose_summary_favorites">Show your starred contacts in the QK Compose window, making them only a tap away</string> - <string name="pref_prox_sensor_call">Cảm biến tiệm cận</string> - <string name="pref_prox_sensor_call_summary">Khi trong một cuộc trò chuyện, đưa điện thoại lên tai để bắt đầu một cuộc gọi</string> - <string name="pref_delivery">Báo gửi</string> - <string name="pref_delivery_summary">Xác nhận rằng tin nhắn đã được gửi thành công</string> - <string name="pref_delivery_toast">Show toast</string> - <string name="pref_delivery_toast_summary">Show a short toast to indicate a message being delivered</string> - <string name="pref_delivery_vibrate">Báo rung</string> - <string name="pref_delivery_vibrate_summary">Báo rung khi gửi tin nhành công</string> - <string name="pref_delete_old_messages">Delete old messages</string> - <string name="pref_delete_old_messages_summary">Automatically delete messages once they\'re old enough</string> - <string name="pref_delete_old_messages_unread">Unread messages</string> - <string name="pref_delete_old_messages_unread_summary">Automatically delete unread messages after %s days</string> - <string name="pref_delete_old_messages_read">Read messages</string> - <string name="pref_delete_old_messages_read_summary">Automatically delete read messages after %s days</string> - <string name="pref_yappy">Kết hợp Yappy</string> - <string name="pref_endlessjabber_summary">Bật hỗ trợ đầy đủ cho Yappy</string> - <string name="pref_blocked_conversations">Cuộc hội thoại đã chặn</string> - <string name="pref_blocked_conversations_summary">Bấm giữ một cuộc hội thoại và chặn để di chuyển nó đến hộp thư bị chặn và ngừng thông báo</string> - <string name="pref_block_future">Chặn các tin nhắn trong tương lai</string> - <string name="pref_block_future_summary">Thêm số điện thoại bổ sung để chặn</string> - <string name="pref_should_i_answer">Kết hợp Should I Answer?</string> - <string name="pref_should_i_answer_summary">Tự động xóa tin nhắn từ các số điện thoại bị chặn từ Should I Answer?</string> - <string name="pref_mobile_only">Số điện thoại</string> - <string name="pref_mobile_only_summary">Chỉ hiển thị số điện thoại trong gợi ý danh bạ</string> - <string name="pref_auto_emoji">Automatic emoji</string> - <string name="pref_auto_emoji_summary">Replace text with image emoji</string> - <string name="pref_enter_button">Enter button</string> - <string name="pref_enter_button_summary">Tap to change keyboard enter button behavior</string> - <string name="pref_compose_group">Group messaging</string> - <string name="pref_compose_group_summary">When composing message to multiple people, send a group message instead of individual messages</string> - <string name="pref_auto_download">Auto download MMS</string> - <string name="pref_auto_download_summary">Automatically download MMS messages when they become available</string> - <string name="pref_auto_data">Automatic data</string> - <string name="pref_auto_data_summary">Turn on data automatically when sending or receiving MMS</string> - <string name="pref_split">Tách SMS</string> - <string name="pref_split_summary">Tách tin nhắn dài thành nhiều tin nhắn</string> - <string name="pref_split_counter">Split counter</string> - <string name="pref_split_counter_summary">Adds a counter to the front of each split message</string> - <string name="pref_long_as_mms">Gửi tin nhắn dài như là MMS</string> - <string name="pref_long_as_mms_summary">Gửi tin nhắn dài như là MMS thay vì tách chúng ra</string> - <string name="pref_long_as_mms_after">Send long as MMS after</string> - <string name="pref_long_as_mms_after_summary">Send long messages as MMS when they exceed the length of a number of messages</string> - <string name="pref_return">Hiển thị nút trở về</string> - <string name="pref_return_summary">Hiển thi nút trở về trên bàn phím thay cho nút Emoji</string> - <string name="pref_text">Văn bản</string> - <string name="pref_notifications">Đã bật thông báo SMS</string> - <string name="pref_led">Thông báo đèn LED</string> - <string name="pref_theme_led">Màu thông báo đèn LED</string> - <string name="pref_wake">Đánh thức điện thoại</string> - <string name="pref_wake_summary">Bật màn hình khi nhận được một tin nhắn mới</string> - <string name="pref_notifications_private">Thông báo riêng tư</string> - <string name="pref_notifications_private_summary">Bấm để thay đổi những gì nên được ẩn đi trong thông báo</string> - <string name="pref_ringtone">Âm thông báo</string> - <string name="pref_ringtone_summary">Chọn âm thanh thông báo</string> - <string name="pref_ticker">Show ticker</string> - <string name="pref_ticker_summary">Shows snippet of new message in notification bar</string> - <string name="pref_vibration">Vibration</string> - <string name="pref_vibration_summary">Báo rung khi nhận tin nhắn mới</string> - <string name="pref_notification_call">Nút gọi</string> - <string name="pref_notification_call_summary">Gọi cho người gửi ngay trong thông báo</string> - <string name="pref_dimiss_read">Đánh dấu đã đọc</string> - <string name="pref_dismiss_read_summary">Đánh dấu đã đọc khi xóa thông báo</string> - <string name="pref_delayed">Hoãn gửi tin nhắn</string> - <string name="pref_delayed_summary">Chờ đợi trước khi gửi tin nhắn của bạn, do vậy bạn có cơ hội để xem lại nó</string> - <string name="pref_delayed_duration">Độ trễ (giây)</string> - <string name="pref_delayed_duration_summary">Thời gian chờ đợi trước khi gửi tin nhắn</string> - <string name="pref_night_auto">Chế độ ban đêm tự động</string> - <string name="pref_night_auto_summary">Tự động kích hoạt chế độ ban đêm dựa vào thời gian</string> - <string name="pref_day_start">Bắt đầu thời gian ban ngày</string> - <string name="pref_night_start">Bắt đầu thời gian ban đêm</string> - <string name="pref_qk_responses">QK Responses</string> - <string name="pref_qk_responses_summary">Modify your preset responses to be used from your Android Wear device</string> - <string name="pref_quickreply_enabled">Đã kích hoạt QK Reply</string> - <string name="pref_quickreply_enabled_summary">Hiển thị của sổ QK Reply mỗi khi nhận được tin nhắn mới</string> - <string name="pref_tap_to_quit">Chạm để bỏ qua</string> - <string name="pref_tap_to_quit_summary">Chạm bất cứ chỗ nào bên ngoài cửa sổ để đóng nó</string> - <string name="pref_quickcompose">Đã kích hoạt QK Compose</string> - <string name="pref_quickcompose_summary">Hiển thị thông báo cho phép bạn chạm để soạn tin nhắn mới</string> - <string name="pref_mms_enabled">Đã kích hoạt MMS</string> - <string name="pref_mms_enabled_summary">Cho phép gửi và nhận MMS</string> - <string name="pref_mmsc_url">MMSC</string> - <string name="pref_mms_proxy">MMS proxy</string> - <string name="pref_mms_port">MMS port</string> - <string name="pref_apn_chooser">Tải APNs mặc đinh</string> - <string name="pref_strip_unicode">Lấy mã Unicode</string> - <string name="pref_strip_unicode_summary">Chuyển các ký tự không được hỗ trợ trong tin nhắn-đầy đủ sang các ký tự tương thích với GSM</string> - <string name="pref_system_bar_flat">Flat system bars</string> - <string name="pref_system_bar_flat_summary">Get rid of the gradient shown on the system UI bars on most KitKat devices</string> - <string name="pref_status_compat">Sửa thanh trạng thái</string> - <string name="pref_status_compat_summary">Fixes issues caused by immersive mode, Tinted Status Bar (Xposed), or custom DPI settings</string> - <string name="pref_navigation_compat">Sửa thanh điều hướng</string> - <string name="pref_navigation_compat_summary">Fixes issues caused by immersive mode, Tinted Status Bar (Xposed), or custom DPI settings</string> - <string name="pref_about_version_title">Phiên bản QKSMS</string> - <string name="pref_about_authors_title">Tác giả</string> - <string name="pref_about_authors_summary">Moez Bhatti</string> - <string name="pref_changelog_summary">Chạm để xem các thay đổi</string> - <string name="pref_about_thanks_title">Cảm ơn bạn</string> - <string name="pref_about_thanks_summary">Chạm để xem những người có đóng góp</string> - <string name="pref_donate_title">Quyên góp</string> - <string name="pref_donate_summary">QKSMS là ứng dụng miễn phí. Hãy hỗ trợ chúng tôi bằng các quyên góp!</string> - <string name="pref_about_gplus_title">Google+</string> - <string name="pref_about_gplus_summary">Tham gia cộng đồng Thử Nghiệm QKSMS Beta trên Google+</string> - <string name="pref_about_github_title">GitHub</string> - <string name="pref_about_github_summary">QKSMS là ứng dụng mã nguồn mở. Hãy đóng góp và báo lỗi trên GitHub</string> - <string name="pref_about_crowdin_title">Crowdin</string> - <string name="pref_about_crowdin_summary">Tham gia dự án dịch QKSMS trên Crowdin</string> - <!--Preference subcategory--> - <string name="pref_subcat_theme">Chủ đề</string> - <!--Preference subcategory--> - <string name="pref_subcat_system_bars">System bars</string> - <!--Preference subcategory--> - <string name="pref_subcat_categories">Danh mục</string> - <!--Preference subcategory--> - <string name="pref_subcat_font">Phông chữ</string> - <!--Preference subcategory--> - <string name="pref_subcat_messages">Tin nhắn</string> - <!--Preference subcategory--> - <string name="pref_subcat_avatars">Ảnh đại diện</string> - <string name="donate_google">Quyên góp bằng Google</string> - <string name="donate_google_summary">Google lấy 30% khoản đóng góp</string> - <string name="donate_paypal">Quyên góp bằng PayPal</string> - <string name="donate_paypal_button">Quyên góp bằng nào cũng được</string> - <string name="donate_paypal_button_summary">Bạn mua cho tôi cái gì cũng được!</string> - <!--Donation product name--> - <string name="product_name_donation">Quyên góp</string> - <!--$1 donation product name--> - <string name="product_name_donate_1">Quyên góp $1 USD</string> - <!--$5 donation product name--> - <string name="product_name_donate_5">Quyên góp $5 USD</string> - <!--$3 donation product name--> - <string name="product_name_donate_10">Quyên góp $10 USD</string> - <!--$1 donation product description--> - <string name="product_description_donate_1">Mua cho tôi một lon Coca-Cola</string> - <!--$5 donation product description--> - <string name="product_description_donate_5">Mua cho tôi một bánh sanhwich</string> - <!--$10 donaion product description--> - <string name="product_description_donate_10">Mua cho tôi một bữa trưa</string> - <string name="title_settings">Cài đặt</string> - <string name="title_search">Tìm kiếm</string> - <string name="title_compose">Soạn</string> - <string name="title_conversation_list">Cuộc hội thoại</string> - <string name="title_blocked">Bị chặn</string> - <string name="title_changelog">Các thay đổi</string> - <string name="title_picker">Tin nhắn mới</string> - <string name="title_donate">Quyên tặng</string> - <string name="title_qk_responses">QK Responses</string> - <string name="title_block_address">Chặn số điện thoại</string> - <string name="title_unblock_address">Bỏ chặn số điện thoại</string> - <string name="title_conversations_selected">Đã chọn %s</string> - <string name="title_palette">Palette</string> - <string name="title_rgb">RGB</string> - <!-- Menu shown in the context menu when long pressing on a message when the message contains - one or more phone numbers and/or email addresses and the number or email is new to - contacts. [CHAR LIMIT=50] --> - <string name="menu_add_address_to_contacts">Thêm <xliff:g id="contactEmailOrNumber">%s</xliff:g> vào Danh bạ</string> - <!-- Context menu item on an individual message for viewing an attached slideshow --> - <string name="view_slideshow">View slideshow</string> - <!-- Context menu item on an individual message for viewing message details such as time and date --> - <string name="view_message_details">Xem chi tiết</string> - <!-- Context menu item on an individual message for viewing a delivery report --> - <string name="view_delivery_report">Xem báo cáo</string> - <!-- Context menu item on an individual message for deleting only that message --> - <string name="delete_message">Xóa</string> - <!-- Abbreviation for "kilobyte" --> - <string name="kilobyte">KB</string> - <!-- Individual message context menu item --> - <string name="copy_message_text">Chép văn bản</string> - <!-- Header for context menu on an individual message --> - <string name="message_options">Tùy chọn tin nhắn</string> - <!-- Delivery Header View --> - <!-- Title of "Report" window --> - <string name="delivery_header_title">Báo cáo</string> - <!--Text for app restart confirmation dialog--> - <string name="restart_message">Những thay đổi này sẽ có hiệu lực trong lần tiếp theo bạn mở QKSMS</string> - <!--Dialog title for asking if a user wants to delete a conversation--> - <string name="delete_conversation">Xóa cuộc hội thoại</string> - <!--Dialog title for asking if a user wants to delete all failed messages--> - <string name="delete_all_failed">Xóa các tin nhắn không gửi được</string> - <!--CDialog title for asking if a user wants to delete a conversation--> - <string name="delete_confirmation">Bạn có chắc muốn xóa (%s) cuộc hội thoại không?</string> - <!--CDialog title for asking if a user wants to delete all failed messages--> - <string name="delete_all_failed_confirmation">Bạn có chắc muốn xóa các tin nhắn không gửi được từ (%s) cuộc hội thoại không?</string> - <!--(Unused) Dialog title shown if APNs have not been set--> - <string name="apns_not_set">Chưa đặt APNs</string> - <!--(Unused) Dialog description shown if APNs have not been set--> - <string name="apns_not_set_description">It appears that your APNs have not been set. This means that MMS will not work properly. Please press okay to have QKSMS find them for you :)</string> - <!--Dialog title show if MMS hasn't been configured--> - <string name="set_up_mms_title">Cài đặt MMS?</string> - <!--Dialog description shown if MMS hasn't yet been configured--> - <string name="set_up_mms_description">It appears that MMS hasn\'t been configured in QKSMS yet. Press okay automatically configure MMS.</string> - <!-- Dialog message text explaining that a draft message will not be saved due to invalid recipients --> - <string name="discard_message_reason">Tin nhắn của bạn sẽ bị loại bỏ vì không có người nhận hợp lệ.</string> - <string name="invalid_code">Mã không hợp lệ</string> - <!--Button to restart app now instead of manually later--> - <string name="restart">Khởi động lại ngay</string> - <!--Notification action to reply to a message--> - <string name="reply">Trả lời</string> - <!--Notification action to reply to a message--> - <string name="reply_qksms">Trả lời bằng QKSMS</string> - <!--Notification action to mark a message as read--> - <string name="read">Đã đọc</string> - <!--Notification action to mark a message as read--> - <string name="mark_read">Đánh dấu đã đọc</string> - <!--Notification action to call the sender of a message--> - <string name="call">Gọi</string> - <!-- Notification toast message --> - <string name="notification_mute_on">Đã bật thông báo</string> - <string name="notification_mute_off">Đã tắt thông báo</string> - <!--Positive action button--> - <string name="yes">Có</string> - <string name="add">Thêm</string> - <!--Positive action button--> - <string name="save">Lưu</string> - <!--Positive action button--> - <string name="enable">Kích hoạt</string> - <!--Positive action button--> - <string name="upgrade_now">Thiếp lập ngay</string> - <!--Positive action button--> - <string name="okay">Okay</string> - <!--Positive action button--> - <string name="redeem">Đổi thưởng</string> - <!--Neutral action button--> - <string name="just_once">Chỉ một lần</string> - <!--Neutral action button--> - <string name="later">Để sau</string> - <!--Neutral action button --> - <string name="cancel">Hủy</string> - <!-- Name of the local user when displaying sender of an outgoing message (personal pronoun) --> - <string name="messagelist_sender_self">Tôi</string> - <!-- Sender to be used if the sender address has been hidden --> - <string name="hidden_sender_address">Địa chỉ người gửi bị ẩn</string> - <!-- Subject to display in the conversation list if there is no subject --> - <string name="no_subject_view">(Không có tiêu đề)</string> - <!-- Time and date a message is due to expire --> - <string name="expire_on">"Expires: <xliff:g id="date">%s</xliff:g>"</string> - <!-- Formatting for subject displayed inline, prepended to MMS message text --> - <string name="inline_subject">"<Subject: <xliff:g id="subject">%s</xliff:g>>"</string> - <!-- Text of a button appearing for MMS messages that have not yet been downloaded, causing the message to be downloaded (imperative verb) --> - <string name="download">Tải về</string> - <!-- Message displayed in place of the "download message" button once it has been pressed, indicating that the download is in progress --> - <string name="downloading">Đang tải</string> - <!-- Toast message while an image is being resized --> - <string name="compressing">Ảnh quá lớn. Đang nén\u2026</string> - <!-- Header shown above favorite contacts in QKCompose --> - <string name="favorites">Danh bạ có gắn sao</string> - <!-- Word represents 'self' in a conversation --> - <string name="me">Tôi</string> - <string name="menu_edit">Chỉnh sửa</string> - <string name="menu_delete_messages">Xóa tin nhắn</string> - <string name="menu_delete_failed">Xóa các tin nhắn không gửi được</string> - <string name="menu_lock">Khóa</string> - <string name="menu_unlock">Mở khóa</string> - <!-- When the user tries to view message details and some error occurs while - retrieving those details, this message will be shown. --> - <string name="cannot_get_details">Không nhận được thông tin chi tiết.</string> - <!-- Title of "Message details" dialog --> - <string name="message_details_title">Chi tiết tin nhắn</string> - <!-- Label in "Message details" dialog --> - <string name="message_type_label">Kiểu\u000A</string> - <!-- "Type" value in "Message details" dialog --> - <string name="text_message">Tin nhắn văn bản</string> - <!-- "Type" value in "Message details" dialog --> - <string name="multimedia_message">Tin nhắn đa phương tiện</string> - <!-- "Type" value in "Message details" dialog --> - <string name="multimedia_notification">Thông báo tin nhắn đa phương tiện</string> - <!-- Label in "Message details" dialog showing who sent the message. --> - <string name="from_label">Từ\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="to_address_label">Đến\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="bcc_label">Bcc\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="sent_label">Gửi\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="received_label">Nhận\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="saved_label">Lưu\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="subject_label">Tiêu đề\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="message_size_label">Kích thước tin nhắn\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="priority_label">Ưu tiên\u000A</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_high">Cao</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_normal">Trung bình</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_low">Thấp</string> - <!-- Label in "Message details" dialog --> - <string name="message_class_label">Cấp tin nhắn\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="error_code_label">Mã lỗi\u000A</string> - <!-- Alert dialog title when creating a slideshow [CHAR LIMIT=none] --> - <string name="building_slideshow_title">Building slideshow</string> - <!-- Tag appearing on conversations in the conversation list that contain a draft message --> - <string name="has_draft">Nháp</string> - <!-- In conversation list items, this is the separator between a contact's name and the draft stamp [CHAR LIMIT=5] --> - <string name="draft_separator">,\u0020</string> - <!-- In conversation list items, this comes after the receipient's name and contains the number of messages in the thread [CHAR LIMIT=5] --> - <string name="message_count_format">\u00a0<xliff:g id="number" example="1">%1$s</xliff:g></string> - <!-- For debugging: Dialog box title indicating there's a situation where data has unexpectedly changed --> - <string name="error_state">Inconsistent state</string> - <!-- For debugging: Dialog box text indicating there's a situation where data has unexpectedly changed --> - <string name="error_state_text">The state of threads and recipients is inconsistent. Please capture a bug report and report it via http://go/droidanizer </string> - <!-- This is the dialog title for the "Select link" dialog, shown when the user clicks on a - chat in the chat history view if there are links in the chat message. The dialog displays the - links if there are any --> - <string name="select_link_title">Chọn hành động</string> - <!-- In message list items, this string builds the timestamp line when the message is in a group [CHAR LIMIT=NONE] --> - <string name="message_timestamp_format"><xliff:g id="string" example="Fred Flinstone">%1$s</xliff:g>\u0020-\u0020<xliff:g id="string" example="9:39AM">%2$s</xliff:g></string> - <!--Message sending status: sending--> - <string name="status_sending">Đang gửi…</string> - <!--Message sending status: failed--> - <!--<string name="status_failed">Failed. Tap to retry</string>--> - <!-- Delivery Report Activity --> - <!-- Status in "Report" window --> - <string name="status_none">(Không có)</string> - <!-- Status in "Report" window --> - <string name="status_pending">Dang chờ</string> - <!-- Status in "Report" window --> - <string name="status_read">Đã đọc</string> - <!-- Status in "Report" window --> - <string name="status_received">Đã nhận</string> - <!-- Status in "Report" window --> - <string name="status_failed">Thất bại. Chạm để chọn tùy chọn</string> - <!-- Status in "Report" window --> - <string name="status_unread">Chưa đọc</string> - <!-- Status in "Report" window --> - <string name="status_rejected">Từ chối</string> - <!-- Label in "Report" window --> - <string name="recipient_label">Người nhận:\u0020</string> - <!-- Label in "Report" window --> - <string name="status_label">Trạng thái:\u0020</string> - <!-- Label in "Report" window [CHAR LIMIT=50]--> - <string name="delivered_label">Delivered:\u0020</string> - <string name="do_something">Làm gì đó</string> - <!-- Confirm Delete --> - <!-- Delete confirmation dialog title --> - <string name="confirm_dialog_title">Xóa?</string> - <!-- Delete confirmation dialog title for locked messages --> - <string name="confirm_dialog_locked_title">Xóa tin nhắn bj khóa?</string> - <!-- This message is displayed in a confirmation dialog when the user selects one or more - conversations and then taps the "Delete" button. --> - <plurals name="confirm_delete_conversation"> - <!-- Case of 1 result. --> - <!-- Case of 0 or 2 or more results. --> - <item quantity="other"><xliff:g id="number" example="15">%1$s</xliff:g> cuộc hội thoại sẽ bị xóa.</item> - </plurals> - <string name="confirm_delete_conversation">Toàn bộ chủ đề sẽ bị xóa.</string> - <!-- Delete all threads confirmation dialog message --> - <string name="confirm_delete_all_conversations">Tất cả các chủ đề sẽ bị xóa.</string> - <!-- Delete message confirmation dialog message --> - <string name="confirm_delete_message">Tin nhắn sẽ bị xóa.</string> - <!-- Delete message confirmation dialog message for a locked message --> - <string name="confirm_delete_locked_message">Xóa thư bị khóa này?</string> - <!-- Delete all the messages on the SIM dialog message --> - <string name="confirm_delete_all_SIM_messages">Tất cả tin nhắn trên SIM sẽ bị xóa.</string> - <!-- Delete the selected message on the SIM dialog message --> - <string name="confirm_delete_SIM_message">Tin nhắn này trên SIM sẽ bị xóa.</string> - <!-- Delete unlocked checkbox title --> - <string name="delete_unlocked">Xóa các thư bị khóa</string> - <!-- Delete button title --> - <string name="delete">Xóa</string> - <!-- More button title --> - <string name="more">Thêm</string> - <!-- More button summary --> - <string name="more_summary">Chạm để xem thêm</string> - <!-- Action bar mode title when multi-selecting conversations --> - <string name="select_conversations">Chọn các cuộc hội thoại</string> - <!-- Show this in the middle of the main activity when there are no conversations [CHAR LIMIT=none] --> - <string name="no_conversations">Không có cuộc hội thoại nào.</string> - <!-- Show this in the middle of the main activity when loading conversations [CHAR LIMIT=none] --> - <string name="loading_conversations">Đang tải các cuộc hội thoại.</string> - <!-- Tells the user that QKSMS isn't the default SMS app --> - <string name="not_default">SMS mặc định</string> - <!-- Tells the user they need to set QKSMS as the default app in order to use this feature --> - <string name="default_info">QKSMS cần phải là ứng dụng nhắn tin SMS của bạn để làm điều đó</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to mark messages as read --> - <string name="not_default_mark_read">QKSMS cần phải là ứng dụng nhắn tin SMS của bạn để đánh dáu thư đã đọc</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to mark messages as unread --> - <string name="not_default_mark_unread">QKSMS must be your SMS app to mark messages unread</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to send messages --> - <string name="not_default_delete">QKSMS cần phải là ứng dụng nhắn tin SMS của bạn để xóa tin nhắn</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to delete messages --> - <string name="not_default_send">QKSMS cần phải là ứng dụng nhắn tin SMS của bạn để gửi tin nhắn</string> - <!-- Tells the user they should set QKSMS as the default messaging app --> - <string name="not_default_first">Một số thứ sẽ không hoạt động cho đến khi QKSMS là ứng dụng nhắn tin mặc định</string> - <string name="delayed_messaging_info">Hoãn gửi tin nhắn cho phép bạn hủy tin nhắn trước khi gửi nó. Thay đổi hành vi mặc định và nhiều hơn ở Cài đặt</string> - <string name="delayed_duration_bounds_error">Thời gian phải từ 1 đến 30 giây</string> - <!-- Dialog title for the Read Report dialog. --> - <string name="confirm">Xác nhận</string> - <!-- Dialog text for the Read Report dialog. --> - <string name="message_send_read_report">Một báo cáo đọc sẽ được gửi.</string> - <!-- Dialog title for updating app icon color --> - <string name="update_icon_title">Cập nhật màu sắc icon</string> - <!-- Dialog message for updating app icon color --> - <string name="update_icon_message">QKSMS must be restarted when changing the icon color</string> - <string name="dialog_conversation_details_title">Chi tiết cuộc trò chuyện</string> - <string name="dialog_conversation_details_last_message_date">Ngày tin nhắn cuối cùng</string> - <string name="dialog_conversation_details_message_count">Số lượng tin nhắn</string> - <string name="dialog_conversation_details_recipients">Người nhận (%s)</string> - <string name="dialog_should_i_answer_title">Should I Answer? chư được cài đặt</string> - <string name="dialog_should_i_answer_message">Bạn có muốn tải ứng dụng từ Google Play bây giờ không?</string> - <string name="dialog_delete_old_messages">Are you sure you want to automatically delete old messages?</string> - <!-- Title for audio file picker --> - <string name="select_audio">Chọn âm thanh</string> - <!-- Menu title to copy an attachment to the shared storage [CHAR LIMIT=25] --> - <string name="copy_to_sdcard">Lưu tệp đính kèm</string> - <!-- Toast message on successful copy to shared storage [CHAR LIMIT=30] --> - <string name="copy_to_sdcard_success">Đã lưu tệp đính kèm.</string> - <!-- Toast message on failed copy to shared storage [CHAR LIMIT=30] --> - <string name="copy_to_sdcard_fail">Không thể lưu tệp đính kèm.</string> - <!-- Menu title to save a sound as a ringtone --> - <string name="save_ringtone">Lưu như là nhạc chuông</string> - <!-- Toast message on successful copying ringtone to drm provider --> - <string name="saved_ringtone">Đã lưu nhạc chuông.</string> - <!-- Toast message on failed copying ringtone to drm provider --> - <string name="saved_ringtone_fail">Không thể lưu nhạc chuông.</string> - <!-- Menu item --> - <!-- Menu item [CHAR LIMIT=40] --> - <string name="menu_group_participants">Những người tham gia nhóm</string> - <!--Toast shown when a draft is saved--> - <string name="toast_draft">Đã lưu thư nháp</string> - <!--Toast shown when a conversation is deleted--> - <string name="toast_conversation_deleted">Đã xóa cuộc trò chuyện</string> - <!--Toast shown when device is low on storage--> - <string name="toast_low_memory">"Bộ nhớ điện thoại đã đầy. Xóa một vài tệp tin để có dung lượng trống."</string> - <!--Toast shown to tell user that forwarding messages doesn't work yet--> - <string name="toast_forward">Tính năng này chưa hoàn thiện. Vui lòng sử dụng tùy chọn Sao chép văn bản và dán vào cuộc trò chuyện mà bạn muốn gửi</string> - <!--Toast shown for unimplemented features--> - <string name="toast_unimplemented">Tính năng này chưa hoàn thiện</string> - <!--Toast shown when a message fails to send--> - <string name="toast_message_failure">Không gửi được tin nhắn</string> - <!--Toast shown when a message is delivered--> - <string name="toast_message_delivered">Tin nhắn đã gửi</string> - <!--Toast shown when a message is not delivered--> - <string name="toast_message_not_delivered">Tin nhắn chưa gửi</string> - <!--Toast shown when default APNs are loaded--> - <string name="toast_default_apns_loaded">Đã nạp thiếp lập APN mặc định</string> - <!--Toast shown when text is copied to the clipboard--> - <string name="toast_copy_text">Đã chép văn bản vào bộ nhớ tạm</string> - <!--Toast shown when Google Play Services is not available for purchasing a product--> - <string name="toast_billing_not_available">Mua hang yêu cầu Google Play Store (thanh toán) trên thiết bị Android của bạn</string> - <!--Toast shown when Google Play Services is not available for purchasing a product--> - <string name="toast_endlessjabber_not_installed">Chưa cài đặt EndlessJabber, mở Google Play</string> - <string name="toast_changelog_error">Không tải được các thay đổi. Vui lòng thử lại sau</string> - <string name="toast_conversation_error">Couldn\'t open conversation</string> - <string name="toast_deleting_old_messages">Your old messages will be deleted shortly</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_1">Cảm ơn bạn đã quyên góp! Bạn là bạn thân nhất của tôi rồi.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_2">Cảm ơn bạn đã quyên góp! Tôi yêu bạn.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_3">Cảm ơn bạn đã quyên góp! Bạn đang giúp QKSMS trở thành ứng dụng nhắn tin tuyệt vời nhất từng được tạo ra.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_4">Cảm ơn bạn đã quyên góp! Bạn thật tuyệt với.</string> - <!--Menu option to mute conversation--> - <string name="menu_mute_conversation">Tắt tiếng cuộc trò chuyện</string> - <!--Menu option to mute conversation--> - <string name="menu_unmute_conversation">Bật tiếng cuộc trò chuyện</string> - <string name="menu_block_conversations">Khóa cuộc trò chuyện</string> - <string name="menu_unblock_conversations">Mở khóa cuộc trò chuyện</string> - <string name="menu_messages">Tin nhắn</string> - <string name="menu_blocked">Bị chặn</string> - <string name="menu_blocked_conversations">Bị chặn (%s mới)</string> - <string name="menu_unblocked_conversations">Tin nhắn (%s mới)</string> - <string name="menu_notifications">Thông báo</string> - <string name="menu_notifications_off">Tắt thông báo</string> - <string name="menu_notification_settings">Cài đặt cuộc trò chuyện</string> - <string name="menu_view_details">Xem chi tiết</string> - <string name="menu_mark_read">Đánh dấu đã đọc</string> - <string name="menu_mark_unread">Đánh dấu chưa đọc</string> - <string name="menu_delete_conversation">Xóa cuộc hội thoại</string> - <string name="menu_multi_select">Chọn cuộc hội thoại</string> - <string name="menu_done">Xong</string> - <string name="failed_message_title">Tùy chọn tin nhắn không gửi được</string> - <!--Toast shown to tell the user that they don't have a photo attachments app, and suggests that they download one--> - <string name="attachment_app_not_found">Không tìm thấy ứng dụng tệp tin đính kèm. Hãy thử cài ứng dụng xem ảnh!</string> - <string name="attachment_camera_error">Không thể mở được máy ảnh</string> - <string name="pref_max_mms_attachment_size">Kích thước tệp tin đính kèm MMS tối đa</string> - <string name="error_no_recipients">Chọn một số liên hệ để gửi tin nhắn này!</string> - <string name="error_file_not_found">QKSMS không thể truy cập tệp tin bạn đang cố gắng chia sẻ!</string> - <string name="sending_blocked_welcome_screen_message">Chờ đã! Bạn sẽ được gửi tin nhắn thật một lúc nữa!</string> - <string name="notification_colored_icon_ready">Chạm để thêm vào launcher của bạn từ màn hình chủ.</string> - <string name="notification_title_colored_icon_ready">QKSMS colored icon is ready</string> - <string name="icon_ready">Icon mới của bạn đã sẵn sàng!</string> - <string name="icon_ready_message">Bây giờ bạn có thể thêm lại nó vào màn hình chủ của bạn với màu sắc đã được cập nhật.</string> - <string name="dont_ask_again">Không hỏi lại</string> - <string name="warning">Cảnh báo Stagefright</string> - <string name="stagefright_warning">Tin nhắn video có thể chứa mã độc khiến điện thoại của bạn dễ bị tấn công. Bạn có muốn tiếp tục không?</string> - <!-- MMS DIALOG SETUP STRINGS --> - <string name="mms_setup_set_up_mms_title">Cài đặt MMS?</string> - <string name="mms_setup_set_up_mms_body">Chúng tôi thấy rằng MMS chưa được cài đặt trong QKSMS. Nhấp Ok để tự động cấu hình MMS.</string> - <string name="mms_setup_setting_up_later_title">Cài đặt MMS sau</string> - <string name="mms_setup_setting_up_later_body">Truy cập phần MMS trong Cài đặt để tự động cấu hình, liên hệ hỗ trợ, hoặc nhập cấu hình riêng của bạn.</string> - <string name="mms_setup_no_configurations_found_title">Không tìm thấy cấu hình nào</string> - <string name="mms_setup_no_configurations_found_body">Chúng tôi không thể tìm thấy cấu hình MMS cho mạng của bạn một cách tự động. Nhấp Ok để liên hệ hỗ trợ. Chúng tôi sẽ giúp bạn có được cấu hình đó! </string> - <string name="mms_setup_one_configuration_found_title">Tìm thấy một cấu hình</string> - <string name="mms_setup_one_configuration_found_body">Chúng tôi đã tìm thấy một cấu hình MMS cho mạng %s. Như vậy có đúng không?</string> - <string name="mms_setup_multiple_configurations_found_title">Tìm thấy nhiều cấu hình</string> - <string name="mms_setup_multiple_configurations_found_body">Chúng tôi đã tìm thấy nhiều cấu hình MMS. Chọn mạng của bạn từ danh sách, hoặc nhấp N/A nếu mạng của bạn không nằm trong danh sách.</string> - <string name="mms_setup_next_steps_title">Bước tiếp theo</string> - <string name="mms_setup_next_steps_body">Truy cập phần MMS trong Cài đặt để cố gắng tự động cấu hình lại lần nữa, liên hệ hỗ trợ, hoặc nhập cấu hình riêng của bạn.</string> - <string name="mms_setup_success_title">Thành công!</string> - <string name="mms_setup_success_body">Nếu bạn gặp bất cứ vấn đề gì, hãy truy cập phần MMS trong Cài đặt để cố gắng tự động cấu hình lại lần nữa, liên hệ hỗ trợ, hoặc nhập cấu hình riêng của bạn.</string> - <string name="na">N/A</string> - <string name="no">Không</string> - <string name="pref_automatically_configure_mms">Tự đông cấu hình MMS</string> - <string name="pref_mms_contact_support">Liên hệ hỗ trợ</string> - <string name="pref_category_sending_mms">Đang gửi MMS</string> - <string name="pref_category_mms_configuration">Cấu hình MMS</string> - <string name="pref_mms_contact_support_summary">Liên hệ nhóm QKSMS để được giúp đỡ cấu hình MMS</string> - <string name="pref_markdown_enabled">Định dạng văn bản</string> - <string name="pref_markdown_enabled_summary">Use markdown syntax to get bold, underline, and italics in your messages</string> - <string name="want_read_indicators">Want read indicators?</string> - <string name="color_swatch_description">Màu %1$d</string> - <string name="color_swatch_description_selected">Đã chọn màu %1$d</string> - <string name="color_picker_default_title">Chọn màu</string> - <string name="message_delivered">Tin nhắn đã gửi</string> - <string name="message_not_delivered">Tin nhắn chưa gửi được</string> - <string name="error">Lỗi</string> - <string name="invalid_destination">Địa chỉ không hợp lệ.</string> - <string name="service_not_activated">Dịch vụ không được kích hoạt trên mạng này.</string> - <string name="service_message_not_found">Tin nhắn hết hạn hoặc không có sẵn.</string> - <string name="service_network_problem">Không thể gửi do lỗi mạng.</string> - <string name="message_queued">Hiện tại tin nhắn của bạn không thể gửi được. Nó sẽ được gửi khi đện thoại của bạn có sóng.</string> - <string name="download_later">Không thể tải về lúc này. Hãy thử lại sau.</string> - <string name="no_apn">No APN specified for the app, you need to set it up in settings!</string> - <string name="no_subject">(Không đề)</string> - <string name="unknown_sender">Không rõ người gửi</string> - <string name="dl_failure_notification">Không thể tải tin nhắn <xliff:g id="subject">%1$s</xliff:g> từ <xliff:g id="from">%2$s</xliff:g>.</string> - <string name="auto_select_multiple_apns">Multiple different configurations have been found. Try one now. If it doesn\'t work, you can try a new one by going to Settings > Advanced > Load default APNs.</string> - <string name="auto_select_apn">Tự động chọn APNs</string> - <string name="auto_select_failed_title">Tự động cấu hình thất bại</string> - <string name="auto_select_failed">Hãy thử tìm kiếm cài đặt APN cho mạng của bạn (MMSC, Port, and Proxy) và điền chúng trong Cài đặt > Nâng cao.</string> - <string name="date_yesterday">Hôm qua</string> - <string name="date_just_now">Vừa xong</string> - <string name="compose_loading_attachment">Đang tải tệp đính kèm</string> - <string name="hint_no_messages">Chưa có tin nhắn nào.\nBấm nút + để gửi một tin nhắn!</string> - <string-array name="resend_menu"> - <item>Gửi lại</item> - <item>Sửa</item> - <item>Xóa</item> - </string-array> - <string-array name="message_menu"> - <item>Chuyển tiếp tin nhắn</item> - <item>Chép văn bản</item> - <item>Xem chi tiết</item> - <item>Xóa tin nhắn</item> - </string-array> - <string-array name="background_titles"> - <item>Material Light</item> - <item>Material Dark</item> - <item>Đen</item> - </string-array> - <string-array name="font_sizes"> - <item>Nhỏ</item> - <item>Bình thường</item> - <item>Lớn</item> - <item>Lớn nhất</item> - </string-array> - <string-array name="font_families"> - <item>Roboto Regular</item> - <item>Roboto Condensed</item> - <item>Font hệ thống</item> - </string-array> - <string-array name="font_weights"> - <item>Light</item> - <item>Bình thường</item> - </string-array> - <!-- String to match as no subject and filter out as a subject. For example, if the - subject string is "no subject", we won't display that. We'll pretend - no subject string was delivered. --> - <string-array name="empty_subject_strings"> - <item>không đề</item> - </string-array> - <string-array name="qk_responses"> - <item>Ok</item> - <item>Chờ tôi một chút</item> - <item>Tôi đang đến đây</item> - <item>Cảm ơn</item> - <item>Có vẻ được</item> - <item>Có chuyện gì vậy?</item> - <item>Đồng ý</item> - <item>Không</item> - <item>Yêu bạn</item> - <item>Xin lỗi</item> - <item>LOL</item> - <item>Không sao đâu</item> - </string-array> - <string-array name="enter_button_options"> - <item>Hiển thị emoji</item> - <item>Dòng mới</item> - <item>Gửi tin nhắn</item> - </string-array> - <string-array name="notification_private_options"> - <item>Hiển thị tất cả</item> - <item>Ẩn tin nhắn</item> - <item>Ẩn tin nhắn và người gửi</item> - </string-array> - <!-- Max MMS attachment sizes. I.e. will compress pictures that are larger than 300 KB down to - under 300KB. --> - <string-array name="max_mms_attachment_sizes"> - <item>300 KB</item> - <item>600 KB</item> - <item>1 MB</item> - <item>Không giới hạn</item> - </string-array> -</resources> diff --git a/QKSMS/src/main/res/values-zh-rCN/strings.xml b/QKSMS/src/main/res/values-zh-rCN/strings.xml deleted file mode 100644 index 8b2df220e..000000000 --- a/QKSMS/src/main/res/values-zh-rCN/strings.xml +++ /dev/null @@ -1,767 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!--Generated by crowdin.com--> -<resources xmlns:xliff="http://schemas.android.com/apk/res-auto"> - <!--Slogan--> - <string name="slogan">再一次爱上发送短信</string> - <!--Text shown when a phone number cannot be found--> - <string name="unknown_number">未知号码</string> - <!--Content description for photos--> - <string name="popup_photo_CD">图片</string> - <!--Text to be displayed while content is loading--> - <string name="loading">载入中...</string> - <!--Test string--> - <string name="test">测试字符串</string> - <!--Hint for contacts text field--> - <string name="hint_contacts">输入收件人</string> - <!--Hint for search text field--> - <string name="hint_search">搜索</string> - <!--Hint for message reply text field--> - <string name="hint_reply">输入信息</string> - <!--Hint for code redemption--> - <string name="hint_redeem">Enter code</string> - <string name="hint_hex">Hex</string> - <!--Text shown for single new message in notification--> - <string name="new_message">新信息</string> - <!--Text shown after number of unread messages in notification (ex. 3 new messages)--> - <string name="new_messages">条新信息</string> - <!--Text shown for single failed message in notification--> - <string name="failed_message">信息发送失败</string> - <!--Text shown after number of failed messages in notification (ex. 3 messages failed to send)--> - <string name="failed_messages">信息发送失败</string> - <!--Text shown under failed message count--> - <string name="failed_messages_summary">点击以查看</string> - <!--QuickCompose notification title--> - <string name="quickcompose">快速发送</string> - <!--QuickCompose notification text--> - <string name="quickcompose_detail">点击以发送一条信息</string> - <!--Welcome screen intro button--> - <string name="welcome_start">开始吧!</string> - <!--Allows user to skip welcome screen--> - <string name="welcome_skip">跳过</string> - <!--Allows user to finish the welcome screen--> - <string name="welcome_finish">完成</string> - <!--Indicates to user they can pick a color--> - <string name="welcome_theme_title">选取一种颜色</string> - <!--Indicates to user they can pick any colors--> - <string name="welcome_theme_description">任何颜色。</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_night_description">舒缓眼睛</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_night_hint">点我切换</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_quickreply_title">快速回复</string> - <!--QK Reply explanation--> - <string name="welcome_quickreply_description">以史上最快的速度回复</string> - <!--Prompts user to try QK Reply--> - <string name="welcome_quickreply_hint">试一试 !</string> - <!--QK Reply demo message--> - <string name="welcome_quickreply_message_1">Wow! Now wasn\'t that awesome? You can view your entire conversation at a glance. Tap outside the popup or press the checkmark to dismiss it.</string> - <!--QK Reply demo message--> - <string name="welcome_quickreply_message_2">这是快速回复。你现在可以在任意地方回复信息。点击顶栏看看接下来会发生什么 :)</string> - <!--Settings option in menu--> - <string name="menu_settings">设置</string> - <!--Search option in menu--> - <string name="menu_search">搜索</string> - <!--Show full conversation in QuickReply--> - <string name="menu_show_all">显示所有信息</string> - <!--Show only unread messages in QuickReply--> - <string name="menu_show_unread">显示未读消息</string> - <!--Open conversation option in menu (shown in QuickReply)--> - <string name="menu_open_thread">打开会话</string> - <!--Forward message option in menu--> - <string name="menu_forward">转发信息</string> - <!--Call contact option in menu--> - <string name="menu_call">拨打</string> - <!--Mark a message/conversation as read option in menu--> - <string name="menu_read">设为已读</string> - <!--Delete a message option in menu--> - <string name="menu_delete">删除</string> - <!--Donate option in menu--> - <string name="menu_billing">捐赠</string> - <!--Copy text option in menu--> - <string name="menu_copy">复制文本</string> - <!--Changelog option in menu--> - <string name="menu_changelog">"新特性"</string> - <!--Expand settings option in menu--> - <string name="menu_show_all_prefs">全部显示</string> - <!--Show less settings option in menu--> - <string name="menu_show_fewer_prefs">Show fewer</string> - <!--Title for message details popup--> - <string name="details_title">详细信息</string> - <!--Title for address that message is being sent to in message details popup--> - <string name="details_to">发送到</string> - <!--Title for address that message is sent from in message details popup--> - <string name="details_from">发送自</string> - <!--Title for text of a message in message details popup--> - <string name="details_body">正文</string> - <!--Title for date sent of a message in message details popup--> - <string name="details_date_sent">发送时间</string> - <!--Title for date received of a message in message details popup--> - <string name="details_date_received">接收时间</string> - <!--Title for rate snackbar--> - <string name="rate_title">Like QKSMS?</string> - <!--Title for rate button--> - <string name="rate_action">Rate</string> - <string name="pref_category_appearance">外观</string> - <string name="pref_category_summary_appearance">主题、 字体、 颜色、 头像,和更多</string> - <string name="pref_category_general">通用</string> - <string name="pref_category_summary_general">Delivery, message sending, formatting</string> - <string name="pref_category_blocking">Message blocking</string> - <string name="pref_category_notifications">通知</string> - <string name="pref_category_summary_notifications">声音、 LED灯、 隐私</string> - <string name="pref_category_mms">彩信</string> - <string name="pref_category_summary_mms">配置 MMS (Apn)、 最大尺寸、 群组消息</string> - <string name="pref_category_quickreply">快速回复</string> - <string name="pref_category_summary_quickreply">快速回复,弹出式菜单选项</string> - <string name="pref_category_quickcompose">快速撰写</string> - <string name="pref_category_summary_quickcompose">快速撰写,星标联系人</string> - <string name="pref_category_about">关于</string> - <string name="pref_category_summary_about">版本,更新日志,作者,致谢</string> - <string name="pref_theme">Theme color</string> - <string name="pref_theme_summary_alt">点击以更改主题</string> - <string name="pref_icon">Icon color</string> - <string name="pref_icon_summary">Tap to change the QKSMS icon color</string> - <string name="pref_status_tint">彩色状态栏</string> - <string name="pref_navigation_tint">彩色导航栏</string> - <string name="pref_background">背景色</string> - <string name="pref_background_summary">点击以更改背景色</string> - <string name="pref_bubbles">消息气泡</string> - <string name="pref_bubbles_summary">Tap to change message bubble preferences</string> - <string name="pref_night">夜间模式</string> - <string name="pref_night_summary">节约电量,减少眼睛疲劳</string> - <string name="pref_night_amoled">纯黑背景</string> - <string name="pref_night_amoled_summary">在使用 AMOLED 屏幕的设备上节省更多电量</string> - <string name="pref_bubble_style_new">Use new bubble style</string> - <string name="pref_color_sent">为已发送信息标色</string> - <string name="pref_color_sent_summary">为发送出的消息设置背景色</string> - <string name="pref_color_received">为已接收信息添加颜色</string> - <string name="pref_color_received_summary">为接收到的消息设置背景色</string> - <string name="pref_hide_avatar_conversations">隐藏会话列表头像</string> - <string name="pref_hide_avatar_conversations_summary">隐藏在会话列表中的联系人头像</string> - <string name="pref_hide_avatar_sent">隐藏已发送消息头像</string> - <string name="pref_hide_avatar_sent_summary">在发出的消息中隐藏您的头像</string> - <string name="pref_hide_avatar_received">隐藏已接收消息头像</string> - <string name="pref_hide_avatar_received_summary">隐藏接收到的消息的联系人头像</string> - <string name="pref_font_family">字体</string> - <string name="pref_font_size">字体大小</string> - <string name="pref_font_weight">字重</string> - <string name="pref_message_count">信息计数</string> - <string name="pref_message_count_summary">显示每个会话的消息数目</string> - <string name="pref_sent_timestamps">Sent timestamps</string> - <string name="pref_sent_timestamps_summary">Show the timestamp for when a message was sent, not received</string> - <string name="pref_force_timestamps">Force timestamps</string> - <string name="pref_force_timestamps_summary">Enable timestamps for all messages</string> - <string name="pref_key_timestamp_delay">New timestamp delay</string> - <string name="pref_key_timestamp_delay_summary">The number of minutes which must elapse between two messages in order for a new timestamp to be shown.</string> - <string name="pref_compose_favorites">星标联系人</string> - <string name="pref_compose_summary_favorites">Show your starred contacts in the QK Compose window, making them only a tap away</string> - <string name="pref_prox_sensor_call">距离传感器</string> - <string name="pref_prox_sensor_call_summary">While in a conversation, bring your phone to your ear to start a call</string> - <string name="pref_delivery">送达确认</string> - <string name="pref_delivery_summary">确认信息已发送成功</string> - <string name="pref_delivery_toast">显示弹出式提醒框</string> - <string name="pref_delivery_toast_summary">显示一个简短的弹出式提醒来指示信息已送达</string> - <string name="pref_delivery_vibrate">震动</string> - <string name="pref_delivery_vibrate_summary">信息送达后震动</string> - <string name="pref_delete_old_messages">Delete old messages</string> - <string name="pref_delete_old_messages_summary">Automatically delete messages once they\'re old enough</string> - <string name="pref_delete_old_messages_unread">Unread messages</string> - <string name="pref_delete_old_messages_unread_summary">Automatically delete unread messages after %s days</string> - <string name="pref_delete_old_messages_read">Read messages</string> - <string name="pref_delete_old_messages_read_summary">Automatically delete read messages after %s days</string> - <string name="pref_yappy">集成Yappy</string> - <string name="pref_endlessjabber_summary">启用对Yappy的完整支持</string> - <string name="pref_blocked_conversations">Blocked conversations</string> - <string name="pref_blocked_conversations_summary">Long-press on a conversation and block to move to blocked inbox and stop notifications</string> - <string name="pref_block_future">Block future messages</string> - <string name="pref_block_future_summary">Add additional phone numbers to block</string> - <string name="pref_should_i_answer">Should I Answer? Integration</string> - <string name="pref_should_i_answer_summary">Automatically delete incoming messages from numbers which are blocked through Should I Answer?</string> - <string name="pref_mobile_only">手机号码</string> - <string name="pref_mobile_only_summary">联系人建议中只显示手机号码</string> - <string name="pref_auto_emoji">自动Emoji</string> - <string name="pref_auto_emoji_summary">使用emoji表情替换文本</string> - <string name="pref_enter_button">Enter button</string> - <string name="pref_enter_button_summary">Tap to change keyboard enter button behavior</string> - <string name="pref_compose_group">群组消息</string> - <string name="pref_compose_group_summary">当撰写信息给多个人员时,发送一个群组信息而不是分开的信息</string> - <string name="pref_auto_download">自动下载彩信</string> - <string name="pref_auto_download_summary">Automatically download MMS messages when they become available</string> - <string name="pref_auto_data">Automatic data</string> - <string name="pref_auto_data_summary">Turn on data automatically when sending or receiving MMS</string> - <string name="pref_split">拆分信息</string> - <string name="pref_split_summary">将长信息拆分成几条信息</string> - <string name="pref_split_counter">拆分计数</string> - <string name="pref_split_counter_summary">在每条拆分的信息前面添加计数</string> - <string name="pref_long_as_mms">长信息发送为彩信</string> - <string name="pref_long_as_mms_summary">将长信息作为彩信发送,而不是拆分为多条短信</string> - <string name="pref_long_as_mms_after">在此之后将长信息作为彩信发送</string> - <string name="pref_long_as_mms_after_summary">Send long messages as MMS when they exceed the length of a number of messages</string> - <string name="pref_return">显示返回按钮</string> - <string name="pref_return_summary">在键盘上显示返回键而不是颜文字表情键</string> - <string name="pref_text">信息</string> - <string name="pref_notifications">启用来信通知</string> - <string name="pref_led">通知灯</string> - <string name="pref_theme_led">通知灯颜色</string> - <string name="pref_wake">唤醒手机</string> - <string name="pref_wake_summary">当收到新信息时点亮手机屏幕</string> - <string name="pref_notifications_private">隐私通知</string> - <string name="pref_notifications_private_summary">Tap to change what should be hidden in notfication</string> - <string name="pref_ringtone">通知提示音</string> - <string name="pref_ringtone_summary">选择通知提示音</string> - <string name="pref_ticker">显示通知摘要</string> - <string name="pref_ticker_summary">在通知栏中显示新信息的片段</string> - <string name="pref_vibration">震动</string> - <string name="pref_vibration_summary">在收到新信息后震动</string> - <string name="pref_notification_call">呼叫按钮</string> - <string name="pref_notification_call_summary">从通知中直接呼叫信息的发件人</string> - <string name="pref_dimiss_read">Mark as read</string> - <string name="pref_dismiss_read_summary">Mark message as read when notification is cleared</string> - <string name="pref_delayed">延迟消息</string> - <string name="pref_delayed_summary">Wait before sending your messages, so you have a chance to review them</string> - <string name="pref_delayed_duration">延迟时间 (秒)</string> - <string name="pref_delayed_duration_summary">Time to wait before sending your message</string> - <string name="pref_night_auto">自动夜间模式</string> - <string name="pref_night_auto_summary">在设定的时间内自动启用夜间模式</string> - <string name="pref_day_start">白天时间开始于</string> - <string name="pref_night_start">夜间时间开始于</string> - <string name="pref_qk_responses">快速响应</string> - <string name="pref_qk_responses_summary">定制你的预设回复内容,以便在Android Wear设备上使用</string> - <string name="pref_quickreply_enabled">启用快捷回复</string> - <string name="pref_quickreply_enabled_summary">Show QK Reply window whenever a new message is received</string> - <string name="pref_tap_to_quit">点击忽略</string> - <string name="pref_tap_to_quit_summary">Tap anywhere outside of the window to close it</string> - <string name="pref_quickcompose">启动快捷发送</string> - <string name="pref_quickcompose_summary">显示一条常驻通知,点击后可以快速撰写信息</string> - <string name="pref_mms_enabled">已启用彩信</string> - <string name="pref_mms_enabled_summary">启用发送和接收彩信</string> - <string name="pref_mmsc_url">彩信服务器 (MMSC)</string> - <string name="pref_mms_proxy">彩信代理</string> - <string name="pref_mms_port">彩信端口</string> - <string name="pref_apn_chooser">载入默认接入点名称设置 (APNs)</string> - <string name="pref_strip_unicode">分离 Unicode</string> - <string name="pref_strip_unicode_summary">将信息中无法使用的字符转换为与 GSM 兼容的字符(中文用户不要启用)</string> - <string name="pref_system_bar_flat">扁平化系统栏</string> - <string name="pref_system_bar_flat_summary">Get rid of the gradient shown on the system UI bars on most KitKat devices</string> - <string name="pref_status_compat">修复状态栏</string> - <string name="pref_status_compat_summary">修复由沉浸模式、Xposed 彩色状态栏模块或自定义 DPI 设置引起的问题</string> - <string name="pref_navigation_compat">修复导航栏</string> - <string name="pref_navigation_compat_summary">修复由沉浸模式、Xposed 彩色状态栏模块或自定义 DPI 设置引起的问题</string> - <string name="pref_about_version_title">QKSMS 版本</string> - <string name="pref_about_authors_title">作者</string> - <string name="pref_about_authors_summary">Moez Bhatti</string> - <string name="pref_changelog_summary">点击以查看更新日志</string> - <string name="pref_about_thanks_title">谢谢</string> - <string name="pref_about_thanks_summary">点击以查看开源贡献者</string> - <string name="pref_donate_title">Donate</string> - <string name="pref_donate_summary">QKSMS is free. Help support us by donating!</string> - <string name="pref_about_gplus_title">Google+</string> - <string name="pref_about_gplus_summary">Join the QKSMS Beta Testing community on Google+</string> - <string name="pref_about_github_title">Github</string> - <string name="pref_about_github_summary">QKSMS is open source. Contribute and report issues on GitHub</string> - <string name="pref_about_crowdin_title">Crowdin</string> - <string name="pref_about_crowdin_summary">Join the QKSMS translation project on Crowdin</string> - <!--Preference subcategory--> - <string name="pref_subcat_theme">主题</string> - <!--Preference subcategory--> - <string name="pref_subcat_system_bars">System bars</string> - <!--Preference subcategory--> - <string name="pref_subcat_categories">类别</string> - <!--Preference subcategory--> - <string name="pref_subcat_font">字体</string> - <!--Preference subcategory--> - <string name="pref_subcat_messages">Messages</string> - <!--Preference subcategory--> - <string name="pref_subcat_avatars">Avatars</string> - <string name="donate_google">使用 Google 帐户捐赠</string> - <string name="donate_google_summary">Google 会拿走 30% 的金额</string> - <string name="donate_paypal">使用 PayPal 捐赠</string> - <string name="donate_paypal_button">捐赠任意款项</string> - <string name="donate_paypal_button_summary">Buy me anything you want!</string> - <!--Donation product name--> - <string name="product_name_donation">Donation</string> - <!--$1 donation product name--> - <string name="product_name_donate_1">Donate $1 USD</string> - <!--$5 donation product name--> - <string name="product_name_donate_5">Donate $5 USD</string> - <!--$3 donation product name--> - <string name="product_name_donate_10">捐赠 10 美元</string> - <!--$1 donation product description--> - <string name="product_description_donate_1">请我一杯可乐</string> - <!--$5 donation product description--> - <string name="product_description_donate_5">请我一个三明治</string> - <!--$10 donaion product description--> - <string name="product_description_donate_10">请我一顿午餐</string> - <string name="title_settings">设置</string> - <string name="title_search">搜索</string> - <string name="title_compose">撰写</string> - <string name="title_conversation_list">会话</string> - <string name="title_blocked">已拦截</string> - <string name="title_changelog">更新日志</string> - <string name="title_picker">新信息</string> - <string name="title_donate">捐赠</string> - <string name="title_qk_responses">快捷回应</string> - <string name="title_block_address">拦截号码</string> - <string name="title_unblock_address">解除拦截号码</string> - <string name="title_conversations_selected">已选择 %s</string> - <string name="title_palette">Palette</string> - <string name="title_rgb">RGB</string> - <!-- Menu shown in the context menu when long pressing on a message when the message contains - one or more phone numbers and/or email addresses and the number or email is new to - contacts. [CHAR LIMIT=50] --> - <string name="menu_add_address_to_contacts">将 <xliff:g id="contactEmailOrNumber">%s</xliff:g> 添加到联系人</string> - <!-- Context menu item on an individual message for viewing an attached slideshow --> - <string name="view_slideshow">查看幻灯片</string> - <!-- Context menu item on an individual message for viewing message details such as time and date --> - <string name="view_message_details">查看详情</string> - <!-- Context menu item on an individual message for viewing a delivery report --> - <string name="view_delivery_report">查看报告</string> - <!-- Context menu item on an individual message for deleting only that message --> - <string name="delete_message">删除</string> - <!-- Abbreviation for "kilobyte" --> - <string name="kilobyte">KB</string> - <!-- Individual message context menu item --> - <string name="copy_message_text">复制文本</string> - <!-- Header for context menu on an individual message --> - <string name="message_options">信息选项</string> - <!-- Delivery Header View --> - <!-- Title of "Report" window --> - <string name="delivery_header_title">报告</string> - <!--Text for app restart confirmation dialog--> - <string name="restart_message">这些更改会在下次打开 QKSMS 时生效</string> - <!--Dialog title for asking if a user wants to delete a conversation--> - <string name="delete_conversation">删除会话</string> - <!--Dialog title for asking if a user wants to delete all failed messages--> - <string name="delete_all_failed">删除发送失败的消息</string> - <!--CDialog title for asking if a user wants to delete a conversation--> - <string name="delete_confirmation">你确定要删除(%s))条会话?</string> - <!--CDialog title for asking if a user wants to delete all failed messages--> - <string name="delete_all_failed_confirmation">Are you sure you would like to delete failed messages from (%s) conversations?</string> - <!--(Unused) Dialog title shown if APNs have not been set--> - <string name="apns_not_set">尚未设置接入点名称服 (APNs)</string> - <!--(Unused) Dialog description shown if APNs have not been set--> - <string name="apns_not_set_description">貌似您尚未设置接入点名称 (APNs)。这意味着无法正常收发彩信。请点击「确定」来让 QKSMS 协助您 :)</string> - <!--Dialog title show if MMS hasn't been configured--> - <string name="set_up_mms_title">设置彩信?</string> - <!--Dialog description shown if MMS hasn't yet been configured--> - <string name="set_up_mms_description">It appears that MMS hasn\'t been configured in QKSMS yet. Press okay automatically configure MMS.</string> - <!-- Dialog message text explaining that a draft message will not be saved due to invalid recipients --> - <string name="discard_message_reason">您的信息将被撤销,因为它没有有效的收件人。</string> - <string name="invalid_code">Invalid code</string> - <!--Button to restart app now instead of manually later--> - <string name="restart">立即重启</string> - <!--Notification action to reply to a message--> - <string name="reply">回复</string> - <!--Notification action to reply to a message--> - <string name="reply_qksms">通过 QKSMS 回复</string> - <!--Notification action to mark a message as read--> - <string name="read">已读</string> - <!--Notification action to mark a message as read--> - <string name="mark_read">标记为已读</string> - <!--Notification action to call the sender of a message--> - <string name="call">回拨</string> - <!-- Notification toast message --> - <string name="notification_mute_on">Notifications enabled</string> - <string name="notification_mute_off">Notifications disabled</string> - <!--Positive action button--> - <string name="yes">是</string> - <string name="add">添加</string> - <!--Positive action button--> - <string name="save">保存</string> - <!--Positive action button--> - <string name="enable">启用</string> - <!--Positive action button--> - <string name="upgrade_now">现在设置</string> - <!--Positive action button--> - <string name="okay">确定</string> - <!--Positive action button--> - <string name="redeem">兑换</string> - <!--Neutral action button--> - <string name="just_once">只此一次</string> - <!--Neutral action button--> - <string name="later">稍后</string> - <!--Neutral action button --> - <string name="cancel">取消</string> - <!-- Name of the local user when displaying sender of an outgoing message (personal pronoun) --> - <string name="messagelist_sender_self">我</string> - <!-- Sender to be used if the sender address has been hidden --> - <string name="hidden_sender_address">未知发送人</string> - <!-- Subject to display in the conversation list if there is no subject --> - <string name="no_subject_view">(无主题)</string> - <!-- Time and date a message is due to expire --> - <string name="expire_on">"到期时间: <xliff:g id="date">%s</xliff:g>"</string> - <!-- Formatting for subject displayed inline, prepended to MMS message text --> - <string name="inline_subject">"<主题: <xliff:g id="subject">%s</xliff:g>>"</string> - <!-- Text of a button appearing for MMS messages that have not yet been downloaded, causing the message to be downloaded (imperative verb) --> - <string name="download">下载</string> - <!-- Message displayed in place of the "download message" button once it has been pressed, indicating that the download is in progress --> - <string name="downloading">下载中</string> - <!-- Toast message while an image is being resized --> - <string name="compressing">图片太大。压缩中\u2026</string> - <!-- Header shown above favorite contacts in QKCompose --> - <string name="favorites">加星标的联系人</string> - <!-- Word represents 'self' in a conversation --> - <string name="me">我</string> - <string name="menu_edit">编辑</string> - <string name="menu_delete_messages">删除信息</string> - <string name="menu_delete_failed">删除失败的信息</string> - <string name="menu_lock">锁定</string> - <string name="menu_unlock">解锁</string> - <!-- When the user tries to view message details and some error occurs while - retrieving those details, this message will be shown. --> - <string name="cannot_get_details">无法获取详情</string> - <!-- Title of "Message details" dialog --> - <string name="message_details_title">信息详情</string> - <!-- Label in "Message details" dialog --> - <string name="message_type_label">Type\u000A</string> - <!-- "Type" value in "Message details" dialog --> - <string name="text_message">文本信息</string> - <!-- "Type" value in "Message details" dialog --> - <string name="multimedia_message">多媒体信息</string> - <!-- "Type" value in "Message details" dialog --> - <string name="multimedia_notification">彩信通知</string> - <!-- Label in "Message details" dialog showing who sent the message. --> - <string name="from_label">From\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="to_address_label">To\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="bcc_label">Bcc\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="sent_label">Sent\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="received_label">Received\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="saved_label">Saved\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="subject_label">主题\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="message_size_label">消息大小\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="priority_label">优先级\u000A</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_high">高</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_normal">正常</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_low">低</string> - <!-- Label in "Message details" dialog --> - <string name="message_class_label">Message class\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="error_code_label">Error code\u000A</string> - <!-- Alert dialog title when creating a slideshow [CHAR LIMIT=none] --> - <string name="building_slideshow_title">创建幻灯片</string> - <!-- Tag appearing on conversations in the conversation list that contain a draft message --> - <string name="has_draft">草稿</string> - <!-- In conversation list items, this is the separator between a contact's name and the draft stamp [CHAR LIMIT=5] --> - <string name="draft_separator">,\u0020</string> - <!-- In conversation list items, this comes after the receipient's name and contains the number of messages in the thread [CHAR LIMIT=5] --> - <string name="message_count_format">\u00a0<xliff:g id="number" example="1">%1$s</xliff:g></string> - <!-- For debugging: Dialog box title indicating there's a situation where data has unexpectedly changed --> - <string name="error_state">状态不一致</string> - <!-- For debugging: Dialog box text indicating there's a situation where data has unexpectedly changed --> - <string name="error_state_text">线程和收件人的状态不一致。请将错误回报至:http://go/droidanizer</string> - <!-- This is the dialog title for the "Select link" dialog, shown when the user clicks on a - chat in the chat history view if there are links in the chat message. The dialog displays the - links if there are any --> - <string name="select_link_title">选择操作</string> - <!-- In message list items, this string builds the timestamp line when the message is in a group [CHAR LIMIT=NONE] --> - <string name="message_timestamp_format"><xliff:g id="string" example="Fred Flinstone">%1$s</xliff:g>\u0020-\u0020<xliff:g id="string" example="9:39AM">%2$s</xliff:g></string> - <!--Message sending status: sending--> - <string name="status_sending">正在发送...</string> - <!--Message sending status: failed--> - <!--<string name="status_failed">Failed. Tap to retry</string>--> - <!-- Delivery Report Activity --> - <!-- Status in "Report" window --> - <string name="status_none">(无)</string> - <!-- Status in "Report" window --> - <string name="status_pending">正在等待</string> - <!-- Status in "Report" window --> - <string name="status_read">已读</string> - <!-- Status in "Report" window --> - <string name="status_received">已接收</string> - <!-- Status in "Report" window --> - <string name="status_failed">Failed. Tap for options</string> - <!-- Status in "Report" window --> - <string name="status_unread">未读</string> - <!-- Status in "Report" window --> - <string name="status_rejected">被拒收</string> - <!-- Label in "Report" window --> - <string name="recipient_label">收件人:\u0020</string> - <!-- Label in "Report" window --> - <string name="status_label">状态:\u0020</string> - <!-- Label in "Report" window [CHAR LIMIT=50]--> - <string name="delivered_label">送达时间:\u0020</string> - <string name="do_something">做些什么</string> - <!-- Confirm Delete --> - <!-- Delete confirmation dialog title --> - <string name="confirm_dialog_title">确认删除?</string> - <!-- Delete confirmation dialog title for locked messages --> - <string name="confirm_dialog_locked_title">删除锁定消息吗?</string> - <!-- This message is displayed in a confirmation dialog when the user selects one or more - conversations and then taps the "Delete" button. --> - <plurals name="confirm_delete_conversation"> - <!-- Case of 1 result. --> - <!-- Case of 0 or 2 or more results. --> - <item quantity="other"><xliff:g id="number" example="15">%1$s</xliff:g> 条会话将被删除</item> - </plurals> - <string name="confirm_delete_conversation">整个线程将被删除</string> - <!-- Delete all threads confirmation dialog message --> - <string name="confirm_delete_all_conversations">所有线程都将被都删除</string> - <!-- Delete message confirmation dialog message --> - <string name="confirm_delete_message">该信息将被删除</string> - <!-- Delete message confirmation dialog message for a locked message --> - <string name="confirm_delete_locked_message">删除此锁定信息吗?</string> - <!-- Delete all the messages on the SIM dialog message --> - <string name="confirm_delete_all_SIM_messages">SIM 卡上的所有信息将被都删除</string> - <!-- Delete the selected message on the SIM dialog message --> - <string name="confirm_delete_SIM_message">SIM 卡上的该条信息将被删除</string> - <!-- Delete unlocked checkbox title --> - <string name="delete_unlocked">删除锁定的消息</string> - <!-- Delete button title --> - <string name="delete">删除</string> - <!-- More button title --> - <string name="more">更多</string> - <!-- More button summary --> - <string name="more_summary">点击查看更多</string> - <!-- Action bar mode title when multi-selecting conversations --> - <string name="select_conversations">选择会话</string> - <!-- Show this in the middle of the main activity when there are no conversations [CHAR LIMIT=none] --> - <string name="no_conversations">无会话</string> - <!-- Show this in the middle of the main activity when loading conversations [CHAR LIMIT=none] --> - <string name="loading_conversations">正在加载会话</string> - <!-- Tells the user that QKSMS isn't the default SMS app --> - <string name="not_default">默认短信应用</string> - <!-- Tells the user they need to set QKSMS as the default app in order to use this feature --> - <string name="default_info">QKSMS needs to be your SMS app to do that</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to mark messages as read --> - <string name="not_default_mark_read">QKSMS must be your SMS app to mark messages read</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to mark messages as unread --> - <string name="not_default_mark_unread">QKSMS must be your SMS app to mark messages unread</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to send messages --> - <string name="not_default_delete">QKSMS must be your SMS app to delete messages</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to delete messages --> - <string name="not_default_send">QKSMS must be your SMS app to send messages</string> - <!-- Tells the user they should set QKSMS as the default messaging app --> - <string name="not_default_first">Some things won\'t work until QKSMS is the default SMS app</string> - <string name="delayed_messaging_info">Delayed messaging allows you to cancel messages before they send. Change the default behavior and more in Settings</string> - <string name="delayed_duration_bounds_error">Duration must be between 1 and 30 seconds</string> - <!-- Dialog title for the Read Report dialog. --> - <string name="confirm">确认</string> - <!-- Dialog text for the Read Report dialog. --> - <string name="message_send_read_report">将发送一份已读报告</string> - <!-- Dialog title for updating app icon color --> - <string name="update_icon_title">更新图标颜色</string> - <!-- Dialog message for updating app icon color --> - <string name="update_icon_message">QKSMS must be restarted when changing the icon color</string> - <string name="dialog_conversation_details_title">会话详情</string> - <string name="dialog_conversation_details_last_message_date">最后的消息日期</string> - <string name="dialog_conversation_details_message_count">消息计数</string> - <string name="dialog_conversation_details_recipients">收件人 (%s)</string> - <string name="dialog_should_i_answer_title">需要我回答吗?没有安装</string> - <string name="dialog_should_i_answer_message">Would you like to download the app from Google Play now?</string> - <string name="dialog_delete_old_messages">Are you sure you want to automatically delete old messages?</string> - <!-- Title for audio file picker --> - <string name="select_audio">选择音频</string> - <!-- Menu title to copy an attachment to the shared storage [CHAR LIMIT=25] --> - <string name="copy_to_sdcard">保存附件</string> - <!-- Toast message on successful copy to shared storage [CHAR LIMIT=30] --> - <string name="copy_to_sdcard_success">附件已保存</string> - <!-- Toast message on failed copy to shared storage [CHAR LIMIT=30] --> - <string name="copy_to_sdcard_fail">无法保存附件</string> - <!-- Menu title to save a sound as a ringtone --> - <string name="save_ringtone">保存为铃声</string> - <!-- Toast message on successful copying ringtone to drm provider --> - <string name="saved_ringtone">铃声已保存</string> - <!-- Toast message on failed copying ringtone to drm provider --> - <string name="saved_ringtone_fail">未能保存铃声</string> - <!-- Menu item --> - <!-- Menu item [CHAR LIMIT=40] --> - <string name="menu_group_participants">群组成员</string> - <!--Toast shown when a draft is saved--> - <string name="toast_draft">草稿已保存</string> - <!--Toast shown when a conversation is deleted--> - <string name="toast_conversation_deleted">会话已删除</string> - <!--Toast shown when device is low on storage--> - <string name="toast_low_memory">"手机存储空间已满。删除一些文件以释放空间。"</string> - <!--Toast shown to tell user that forwarding messages doesn't work yet--> - <string name="toast_forward">该特性尚未实行。目前请使用复制文本选项,并将其粘贴到想要发送的会话中</string> - <!--Toast shown for unimplemented features--> - <string name="toast_unimplemented">该特性尚未实行</string> - <!--Toast shown when a message fails to send--> - <string name="toast_message_failure">信息发送失败</string> - <!--Toast shown when a message is delivered--> - <string name="toast_message_delivered">信息已送达</string> - <!--Toast shown when a message is not delivered--> - <string name="toast_message_not_delivered">信息未送达</string> - <!--Toast shown when default APNs are loaded--> - <string name="toast_default_apns_loaded">已加载默认接入点名称设置 (APNs)</string> - <!--Toast shown when text is copied to the clipboard--> - <string name="toast_copy_text">文本已复制到剪贴板</string> - <!--Toast shown when Google Play Services is not available for purchasing a product--> - <string name="toast_billing_not_available">您的设备上装有 Play 商店后才能购买</string> - <!--Toast shown when Google Play Services is not available for purchasing a product--> - <string name="toast_endlessjabber_not_installed">尚未未安装 EndlessJabber,正在打开 Play 商店</string> - <string name="toast_changelog_error">Couldn\'t load the changelog. Please try again later</string> - <string name="toast_conversation_error">Couldn\'t open conversation</string> - <string name="toast_deleting_old_messages">Your old messages will be deleted shortly</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_1">感谢您的捐赠!你是我最好的朋友</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_2">感谢您的捐赠!我爱你。</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_3">感谢您的捐赠!你将帮助 QKSMS 成为有史以来最好的短信应用。</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_4">感谢您的捐赠!您真棒。</string> - <!--Menu option to mute conversation--> - <string name="menu_mute_conversation">会话静音</string> - <!--Menu option to mute conversation--> - <string name="menu_unmute_conversation">取消会话静音</string> - <string name="menu_block_conversations">Block conversations</string> - <string name="menu_unblock_conversations">Unblock conversations</string> - <string name="menu_messages">消息</string> - <string name="menu_blocked">已拦截</string> - <string name="menu_blocked_conversations">已拦截 (%s 条新消息)</string> - <string name="menu_unblocked_conversations">Messages (%s new)</string> - <string name="menu_notifications">Notifications</string> - <string name="menu_notifications_off">Notifications off</string> - <string name="menu_notification_settings">Conversation settings</string> - <string name="menu_view_details">查看详情</string> - <string name="menu_mark_read">标为已读</string> - <string name="menu_mark_unread">设为未读</string> - <string name="menu_delete_conversation">删除会话</string> - <string name="menu_multi_select">选择会话</string> - <string name="menu_done">Done</string> - <string name="failed_message_title">Failed message options</string> - <!--Toast shown to tell the user that they don't have a photo attachments app, and suggests that they download one--> - <string name="attachment_app_not_found">附件应用程序找不到。请尝试安装一个照片库应用程序 !</string> - <string name="attachment_camera_error">The camera could not be opened</string> - <string name="pref_max_mms_attachment_size">彩信的最大附件大小</string> - <string name="error_no_recipients">选择要向其发送此消息一些联系人 !</string> - <string name="error_file_not_found">QKSMS 不能访问您正在试图共享的文件 !</string> - <string name="sending_blocked_welcome_screen_message">Hold up! You\'ll get to send real messages in a minute!</string> - <string name="notification_colored_icon_ready">Touch to add to your launcher from home screen.</string> - <string name="notification_title_colored_icon_ready">QKSMS colored icon is ready</string> - <string name="icon_ready">Your new icon is ready!</string> - <string name="icon_ready_message">You can now add it to your home screen again with the updated color.</string> - <string name="dont_ask_again">不再询问</string> - <string name="warning">Stagefright warning</string> - <string name="stagefright_warning">Video messages may contain a harmful exploit that can leave your phone vulnerable to attacks. Would you like to continue?</string> - <!-- MMS DIALOG SETUP STRINGS --> - <string name="mms_setup_set_up_mms_title">Set up MMS?</string> - <string name="mms_setup_set_up_mms_body">It appears that MMS isn\'t set up in QKSMS. Press okay to automatically configure MMS.</string> - <string name="mms_setup_setting_up_later_title">稍后设置彩信</string> - <string name="mms_setup_setting_up_later_body">Visit the MMS section of Settings to try automatic configuration, contact support, or enter your own configuration.</string> - <string name="mms_setup_no_configurations_found_title">没有找到配置</string> - <string name="mms_setup_no_configurations_found_body">We couldn\'t find an MMS configuration for your carrier automatically. Press okay to contact support. We\'ll help you get set up! </string> - <string name="mms_setup_one_configuration_found_title">找到一个配置</string> - <string name="mms_setup_one_configuration_found_body">We have found an MMS configuration for the %s carrier. Does that sound right?</string> - <string name="mms_setup_multiple_configurations_found_title">找到多个配置</string> - <string name="mms_setup_multiple_configurations_found_body">We have found multiple MMS configurations. Choose your carrier from the list, or press N/A if your carrier isn\'t on the list.</string> - <string name="mms_setup_next_steps_title">下一步</string> - <string name="mms_setup_next_steps_body">Visit the MMS section of Settings to try automatic configuration again, contact support, or enter your own configuration.</string> - <string name="mms_setup_success_title">成功 !</string> - <string name="mms_setup_success_body">If you encounter any issues, visit the MMS section of Settings to try automatic configuration again, contact support, or enter your own configuration.</string> - <string name="na">不可用</string> - <string name="no">不</string> - <string name="pref_automatically_configure_mms">自动配置彩信</string> - <string name="pref_mms_contact_support">联系技术支持</string> - <string name="pref_category_sending_mms">正在发送彩信</string> - <string name="pref_category_mms_configuration">彩信设置</string> - <string name="pref_mms_contact_support_summary">Contact the QKSMS team for help setting up MMS</string> - <string name="pref_markdown_enabled">文本格式</string> - <string name="pref_markdown_enabled_summary">Use markdown syntax to get bold, underline, and italics in your messages</string> - <string name="want_read_indicators">想要使用阅读计数角标吗?</string> - <string name="color_swatch_description">颜色 %1$d</string> - <string name="color_swatch_description_selected">颜色 %1$d 已选择</string> - <string name="color_picker_default_title">选择一种颜色</string> - <string name="message_delivered">信息已送达</string> - <string name="message_not_delivered">信息未送达</string> - <string name="error">错误</string> - <string name="invalid_destination">无效的目标地址。</string> - <string name="service_not_activated">服务在网络上未激活</string> - <string name="service_message_not_found">信息过期或不可用。</string> - <string name="service_network_problem">由于出现网络问题无法发送。</string> - <string name="message_queued">Currently can\'t send your message. It will be sent when the service becomes available.</string> - <string name="download_later">Can\'t download right now. Try again later.</string> - <string name="no_apn">No APN specified for the app, you need to set it up in settings!</string> - <string name="no_subject">(无主题)</string> - <string name="unknown_sender">未知发件人</string> - <string name="dl_failure_notification">Couldn\'t download message <xliff:g id="subject">%1$s</xliff:g> from <xliff:g id="from">%2$s</xliff:g>.</string> - <string name="auto_select_multiple_apns">Multiple different configurations have been found. Try one now. If it doesn\'t work, you can try a new one by going to Settings > Advanced > Load default APNs.</string> - <string name="auto_select_apn">自动选择 APN</string> - <string name="auto_select_failed_title">自动配置失败</string> - <string name="auto_select_failed">Try searching for your carrier\'s APN settings (MMSC, Port, and Proxy) and entering them in Settings > Advanced.</string> - <string name="date_yesterday">昨天</string> - <string name="date_just_now">刚刚</string> - <string name="compose_loading_attachment">加载附件</string> - <string name="hint_no_messages">No messages yet.\nClick the + to send one!</string> - <string-array name="resend_menu"> - <item>重新发送</item> - <item>编辑</item> - <item>删除</item> - </string-array> - <string-array name="message_menu"> - <item>转发信息</item> - <item>复制文本</item> - <item>查看详情</item> - <item>删除信息</item> - </string-array> - <string-array name="background_titles"> - <item>质感设计亮色</item> - <item>质感设计暗色</item> - <item>黑色</item> - </string-array> - <string-array name="font_sizes"> - <item>小</item> - <item>正常</item> - <item>大</item> - <item>最大</item> - </string-array> - <string-array name="font_families"> - <item>Roboto Regular</item> - <item>Roboto Condensed</item> - <item>系统字体</item> - </string-array> - <string-array name="font_weights"> - <item>纤细</item> - <item>正常</item> - </string-array> - <!-- String to match as no subject and filter out as a subject. For example, if the - subject string is "no subject", we won't display that. We'll pretend - no subject string was delivered. --> - <string-array name="empty_subject_strings"> - <item>无主题</item> - </string-array> - <string-array name="qk_responses"> - <item>好的</item> - <item>请稍等一会儿</item> - <item>在路上了</item> - <item>谢谢</item> - <item>听上去不错</item> - <item>咋了</item> - <item>同意</item> - <item>不</item> - <item>爱你</item> - <item>抱歉</item> - <item>啊哈哈哈哈</item> - <item>好的</item> - </string-array> - <string-array name="enter_button_options"> - <item>显示表情</item> - <item>New line</item> - <item>发送短信</item> - </string-array> - <string-array name="notification_private_options"> - <item>显示全部</item> - <item>隐藏消息</item> - <item>隐藏消息和发件人</item> - </string-array> - <!-- Max MMS attachment sizes. I.e. will compress pictures that are larger than 300 KB down to - under 300KB. --> - <string-array name="max_mms_attachment_sizes"> - <item>300 KB</item> - <item>600 KB</item> - <item>1 MB</item> - <item>不限制</item> - </string-array> -</resources> diff --git a/QKSMS/src/main/res/values-zh/strings.xml b/QKSMS/src/main/res/values-zh/strings.xml deleted file mode 100644 index 4e7ed8285..000000000 --- a/QKSMS/src/main/res/values-zh/strings.xml +++ /dev/null @@ -1,770 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!--Generated by crowdin.com--> -<resources xmlns:xliff="http://schemas.android.com/apk/res-auto"> - <!--Slogan--> - <string name="slogan">Love texting again.</string> - <!--Text shown when a phone number cannot be found--> - <string name="unknown_number">未知的號碼</string> - <!--Content description for photos--> - <string name="popup_photo_CD">相片</string> - <!--Text to be displayed while content is loading--> - <string name="loading">載入中...</string> - <!--Test string--> - <string name="test">測試字串</string> - <!--Hint for contacts text field--> - <string name="hint_contacts">輸入收件人</string> - <!--Hint for search text field--> - <string name="hint_search">Search something</string> - <!--Hint for message reply text field--> - <string name="hint_reply">輸入訊息</string> - <!--Hint for code redemption--> - <string name="hint_redeem">Enter code</string> - <string name="hint_hex">Hex</string> - <!--Text shown for single new message in notification--> - <string name="new_message">新訊息</string> - <!--Text shown after number of unread messages in notification (ex. 3 new messages)--> - <string name="new_messages">新訊息</string> - <!--Text shown for single failed message in notification--> - <string name="failed_message">傳送失敗</string> - <!--Text shown after number of failed messages in notification (ex. 3 messages failed to send)--> - <string name="failed_messages">傳送失敗</string> - <!--Text shown under failed message count--> - <string name="failed_messages_summary">典擊查看</string> - <!--QuickCompose notification title--> - <string name="quickcompose">QK Compose</string> - <!--QuickCompose notification text--> - <string name="quickcompose_detail">點擊傳送訊息</string> - <!--Welcome screen intro button--> - <string name="welcome_start">Let\'s get started!</string> - <!--Allows user to skip welcome screen--> - <string name="welcome_skip">SKIP</string> - <!--Allows user to finish the welcome screen--> - <string name="welcome_finish">FINISH</string> - <!--Indicates to user they can pick a color--> - <string name="welcome_theme_title">Pick a color</string> - <!--Indicates to user they can pick any colors--> - <string name="welcome_theme_description">Any color.</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_night_description">Easy on the eyes.</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_night_hint">Toggle me</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_quickreply_title">QK Reply</string> - <!--QK Reply explanation--> - <string name="welcome_quickreply_description">Reply to messages faster than ever.</string> - <!--Prompts user to try QK Reply--> - <string name="welcome_quickreply_hint">Try it!</string> - <!--QK Reply demo message--> - <string name="welcome_quickreply_message_1">Wow! Now wasn\'t that awesome? You can view your entire conversation at a glance. Tap outside the popup or press the checkmark to dismiss it.</string> - <!--QK Reply demo message--> - <string name="welcome_quickreply_message_2">This is QK Reply. Now you can reply to messages from anywhere. Tap the expand button to see what happens next :)</string> - <!--Settings option in menu--> - <string name="menu_settings">設定</string> - <!--Search option in menu--> - <string name="menu_search">Search</string> - <!--Show full conversation in QuickReply--> - <string name="menu_show_all">Show all messages</string> - <!--Show only unread messages in QuickReply--> - <string name="menu_show_unread">Show unread messages</string> - <!--Open conversation option in menu (shown in QuickReply)--> - <string name="menu_open_thread">打開對話</string> - <!--Forward message option in menu--> - <string name="menu_forward">前一則訊息</string> - <!--Call contact option in menu--> - <string name="menu_call">致電</string> - <!--Mark a message/conversation as read option in menu--> - <string name="menu_read">標記已讀</string> - <!--Delete a message option in menu--> - <string name="menu_delete">Delete</string> - <!--Donate option in menu--> - <string name="menu_billing">Donate</string> - <!--Copy text option in menu--> - <string name="menu_copy">複製文字</string> - <!--Changelog option in menu--> - <string name="menu_changelog">"新東西"</string> - <!--Expand settings option in menu--> - <string name="menu_show_all_prefs">Show all</string> - <!--Show less settings option in menu--> - <string name="menu_show_fewer_prefs">Show fewer</string> - <!--Title for message details popup--> - <string name="details_title">詳細資訊</string> - <!--Title for address that message is being sent to in message details popup--> - <string name="details_to">給</string> - <!--Title for address that message is sent from in message details popup--> - <string name="details_from">從</string> - <!--Title for text of a message in message details popup--> - <string name="details_body">正文</string> - <!--Title for date sent of a message in message details popup--> - <string name="details_date_sent">發送時間</string> - <!--Title for date received of a message in message details popup--> - <string name="details_date_received">接收時間</string> - <!--Title for rate snackbar--> - <string name="rate_title">Like QKSMS?</string> - <!--Title for rate button--> - <string name="rate_action">Rate</string> - <string name="pref_category_appearance">Appearance</string> - <string name="pref_category_summary_appearance">Themes, fonts, colors, avatars, and more</string> - <string name="pref_category_general">一般</string> - <string name="pref_category_summary_general">Delivery, message sending, formatting</string> - <string name="pref_category_blocking">Message blocking</string> - <string name="pref_category_notifications">通知</string> - <string name="pref_category_summary_notifications">Sounds, LED, privacy</string> - <string name="pref_category_mms">MMS</string> - <string name="pref_category_summary_mms">Configure MMS (APNs), max size, group messaging</string> - <string name="pref_category_quickreply">QK Reply</string> - <string name="pref_category_summary_quickreply">QK Reply, popup options</string> - <string name="pref_category_quickcompose">QK Compose</string> - <string name="pref_category_summary_quickcompose">QK Compose, starred contacts</string> - <string name="pref_category_about">About</string> - <string name="pref_category_summary_about">Version, changelog, authors, thanks</string> - <string name="pref_theme">Theme color</string> - <string name="pref_theme_summary_alt">Tap to change theme</string> - <string name="pref_icon">Icon color</string> - <string name="pref_icon_summary">Tap to change the QKSMS icon color</string> - <string name="pref_status_tint">沉浸式狀態欄</string> - <string name="pref_navigation_tint">沉浸式虛擬鍵</string> - <string name="pref_background">Background color</string> - <string name="pref_background_summary">Tap to change background color</string> - <string name="pref_bubbles">Message bubbles</string> - <string name="pref_bubbles_summary">Tap to change message bubble preferences</string> - <string name="pref_night">夜間模式</string> - <string name="pref_night_summary">Save battery and reduce eye strain</string> - <string name="pref_night_amoled">純黑背景</string> - <string name="pref_night_amoled_summary">在 AMOLED 的螢幕上節約更多耗電量</string> - <string name="pref_bubble_style_new">Use new bubble style</string> - <string name="pref_color_sent">Color sent messages</string> - <string name="pref_color_sent_summary">Color the background bubbles for outgoing messages</string> - <string name="pref_color_received">Color received messages</string> - <string name="pref_color_received_summary">Color the background bubbles for incoming messages</string> - <string name="pref_hide_avatar_conversations">Hide conversation avatars</string> - <string name="pref_hide_avatar_conversations_summary">Hide avatars for contacts in conversation list</string> - <string name="pref_hide_avatar_sent">Hide sent message avatars</string> - <string name="pref_hide_avatar_sent_summary">Hide your avatar for outgoing messages</string> - <string name="pref_hide_avatar_received">Hide received message avatars</string> - <string name="pref_hide_avatar_received_summary">Hide contact avatar for incoming messages</string> - <string name="pref_font_family">Font family</string> - <string name="pref_font_size">字體大小</string> - <string name="pref_font_weight">Font weight</string> - <string name="pref_message_count">訊息數量</string> - <string name="pref_message_count_summary">Show the number of messages for each conversation</string> - <string name="pref_sent_timestamps">Sent timestamps</string> - <string name="pref_sent_timestamps_summary">Show the timestamp for when a message was sent, not received</string> - <string name="pref_force_timestamps">Force timestamps</string> - <string name="pref_force_timestamps_summary">Enable timestamps for all messages</string> - <string name="pref_key_timestamp_delay">New timestamp delay</string> - <string name="pref_key_timestamp_delay_summary">The number of minutes which must elapse between two messages in order for a new timestamp to be shown.</string> - <string name="pref_compose_favorites">Starred contacts</string> - <string name="pref_compose_summary_favorites">Show your starred contacts in the QK Compose window, making them only a tap away</string> - <string name="pref_prox_sensor_call">Proximity sensor</string> - <string name="pref_prox_sensor_call_summary">While in a conversation, bring your phone to your ear to start a call</string> - <string name="pref_delivery">傳送已確認</string> - <string name="pref_delivery_summary">確認訊息已成功傳送</string> - <string name="pref_delivery_toast">Show toast</string> - <string name="pref_delivery_toast_summary">Show a short toast to indicate a message being delivered</string> - <string name="pref_delivery_vibrate">震動</string> - <string name="pref_delivery_vibrate_summary">訊息送達後震動提醒</string> - <string name="pref_delete_old_messages">Delete old messages</string> - <string name="pref_delete_old_messages_summary">Automatically delete messages once they\'re old enough</string> - <string name="pref_delete_old_messages_unread">Unread messages</string> - <string name="pref_delete_old_messages_unread_summary">Automatically delete unread messages after %s days</string> - <string name="pref_delete_old_messages_read">Read messages</string> - <string name="pref_delete_old_messages_read_summary">Automatically delete read messages after %s days</string> - <string name="pref_yappy">Yappy integration</string> - <string name="pref_endlessjabber_summary">Enable full support for Yappy</string> - <string name="pref_blocked_conversations">Blocked conversations</string> - <string name="pref_blocked_conversations_summary">Long-press on a conversation and block to move to blocked inbox and stop notifications</string> - <string name="pref_block_future">Block future messages</string> - <string name="pref_block_future_summary">Add additional phone numbers to block</string> - <string name="pref_should_i_answer">Should I Answer? Integration</string> - <string name="pref_should_i_answer_summary">Automatically delete incoming messages from numbers which are blocked through Should I Answer?</string> - <string name="pref_mobile_only">Mobile numbers</string> - <string name="pref_mobile_only_summary">Only show mobile numbers in contact suggestions</string> - <string name="pref_auto_emoji">Automatic emoji</string> - <string name="pref_auto_emoji_summary">Replace text with image emoji</string> - <string name="pref_enter_button">Enter button</string> - <string name="pref_enter_button_summary">Tap to change keyboard enter button behavior</string> - <string name="pref_compose_group">Group messaging</string> - <string name="pref_compose_group_summary">When composing message to multiple people, send a group message instead of individual messages</string> - <string name="pref_auto_download">Auto download MMS</string> - <string name="pref_auto_download_summary">Automatically download MMS messages when they become available</string> - <string name="pref_auto_data">Automatic data</string> - <string name="pref_auto_data_summary">Turn on data automatically when sending or receiving MMS</string> - <string name="pref_split">分離訊息</string> - <string name="pref_split_summary">將長訊息分離成幾個短訊息</string> - <string name="pref_split_counter">分離計算</string> - <string name="pref_split_counter_summary">在每條拆開的訊息前加上計數</string> - <string name="pref_long_as_mms">將長訊息已 MMS 的形式傳送</string> - <string name="pref_long_as_mms_summary">將長訊息以 MMS 的形式傳送,而不是拆成多個短訊息</string> - <string name="pref_long_as_mms_after">在此之後將長訊息以 MMS 的形式傳送</string> - <string name="pref_long_as_mms_after_summary">Send long messages as MMS when they exceed the length of a number of messages</string> - <string name="pref_return">顯示返回按鈕</string> - <string name="pref_return_summary">在鍵盤上顯示返回鍵而不是 Emoji 表情鍵</string> - <string name="pref_text">Text</string> - <string name="pref_notifications">啟用簡訊通知</string> - <string name="pref_led">通知燈</string> - <string name="pref_theme_led">Notification LED color</string> - <string name="pref_wake">Wake phone</string> - <string name="pref_wake_summary">Turn your screen on when you receive a new message</string> - <string name="pref_notifications_private">隱私通知</string> - <string name="pref_notifications_private_summary">Tap to change what should be hidden in notfication</string> - <string name="pref_ringtone">通知鈴聲</string> - <string name="pref_ringtone_summary">選擇通知鈴聲</string> - <string name="pref_ticker">顯示通知摘要</string> - <string name="pref_ticker_summary">在通知欄中顯示部分訊息文字</string> - <string name="pref_vibration">震動</string> - <string name="pref_vibration_summary">當訊息送達時震動提醒</string> - <string name="pref_notification_call">撥號按鈕</string> - <string name="pref_notification_call_summary">從通知中直接致電寄件者</string> - <string name="pref_dimiss_read">Mark as read</string> - <string name="pref_dismiss_read_summary">Mark message as read when notification is cleared</string> - <string name="pref_delayed">Delayed messaging</string> - <string name="pref_delayed_summary">Wait before sending your messages, so you have a chance to review them</string> - <string name="pref_delayed_duration">Delay length (seconds)</string> - <string name="pref_delayed_duration_summary">Time to wait before sending your message</string> - <string name="pref_night_auto">自動進入夜間模式</string> - <string name="pref_night_auto_summary">依照時間自動啟用夜間模式</string> - <string name="pref_day_start">白天時間開始於</string> - <string name="pref_night_start">夜間時間開始於</string> - <string name="pref_qk_responses">QK Responses</string> - <string name="pref_qk_responses_summary">Modify your preset responses to be used from your Android Wear device</string> - <string name="pref_quickreply_enabled">QK Reply enabled</string> - <string name="pref_quickreply_enabled_summary">Show QK Reply window whenever a new message is received</string> - <string name="pref_tap_to_quit">點擊忽略</string> - <string name="pref_tap_to_quit_summary">Tap anywhere outside of the window to close it</string> - <string name="pref_quickcompose">QK Compose enabled</string> - <string name="pref_quickcompose_summary">在通知欄新增一個快速編輯的捷徑</string> - <string name="pref_mms_enabled">MMS enabled</string> - <string name="pref_mms_enabled_summary">Enable sending and receiving of MMS messages</string> - <string name="pref_mmsc_url">MMSC</string> - <string name="pref_mms_proxy">MMS 代理</string> - <string name="pref_mms_port">MMS 端口</string> - <string name="pref_apn_chooser">載入預設的 APN</string> - <string name="pref_strip_unicode">分離 Unicode</string> - <string name="pref_strip_unicode_summary">將訊息中不能使用的字元轉換為兼容於 GSM 的字元</string> - <string name="pref_system_bar_flat">Flat system bars</string> - <string name="pref_system_bar_flat_summary">Get rid of the gradient shown on the system UI bars on most KitKat devices</string> - <string name="pref_status_compat">修復狀態欄</string> - <string name="pref_status_compat_summary">修復由沉浸模式、彩色狀態欄 (Xposed) 或自訂 DPI 所引起的問題 </string> - <string name="pref_navigation_compat">修復虛擬鍵</string> - <string name="pref_navigation_compat_summary">修復由沉浸模式、彩色狀態欄 (Xposed) 或自訂 DPI 所引起的問題 </string> - <string name="pref_about_version_title">QKSMS version</string> - <string name="pref_about_authors_title">Authors</string> - <string name="pref_about_authors_summary">Moez Bhatti</string> - <string name="pref_changelog_summary">Tap to view changelog</string> - <string name="pref_about_thanks_title">Thank you</string> - <string name="pref_about_thanks_summary">Tap to view open-source contributors</string> - <string name="pref_donate_title">Donate</string> - <string name="pref_donate_summary">QKSMS is free. Help support us by donating!</string> - <string name="pref_about_gplus_title">Google+</string> - <string name="pref_about_gplus_summary">Join the QKSMS Beta Testing community on Google+</string> - <string name="pref_about_github_title">GitHub</string> - <string name="pref_about_github_summary">QKSMS is open source. Contribute and report issues on GitHub</string> - <string name="pref_about_crowdin_title">Crowdin</string> - <string name="pref_about_crowdin_summary">Join the QKSMS translation project on Crowdin</string> - <!--Preference subcategory--> - <string name="pref_subcat_theme">Theme</string> - <!--Preference subcategory--> - <string name="pref_subcat_system_bars">System bars</string> - <!--Preference subcategory--> - <string name="pref_subcat_categories">Categories</string> - <!--Preference subcategory--> - <string name="pref_subcat_font">Font</string> - <!--Preference subcategory--> - <string name="pref_subcat_messages">Messages</string> - <!--Preference subcategory--> - <string name="pref_subcat_avatars">Avatars</string> - <string name="donate_google">Donate with Google</string> - <string name="donate_google_summary">Google takes 30% of donations</string> - <string name="donate_paypal">Donate with PayPal</string> - <string name="donate_paypal_button">Donate any amount</string> - <string name="donate_paypal_button_summary">Buy me anything you want!</string> - <!--Donation product name--> - <string name="product_name_donation">Donation</string> - <!--$1 donation product name--> - <string name="product_name_donate_1">Donate $1 USD</string> - <!--$5 donation product name--> - <string name="product_name_donate_5">Donate $5 USD</string> - <!--$3 donation product name--> - <string name="product_name_donate_10">Donate $10 USD</string> - <!--$1 donation product description--> - <string name="product_description_donate_1">Buy me a Coke</string> - <!--$5 donation product description--> - <string name="product_description_donate_5">Buy me a sandwich</string> - <!--$10 donaion product description--> - <string name="product_description_donate_10">Buy me lunch</string> - <string name="title_settings">設定</string> - <string name="title_search">Search</string> - <string name="title_compose">編輯</string> - <string name="title_conversation_list">對話</string> - <string name="title_blocked">Blocked</string> - <string name="title_changelog">更新日誌</string> - <string name="title_picker">新訊息</string> - <string name="title_donate">Donate</string> - <string name="title_qk_responses">QK Responses</string> - <string name="title_block_address">Block number</string> - <string name="title_unblock_address">Unblock number</string> - <string name="title_conversations_selected">%s selected</string> - <string name="title_palette">Palette</string> - <string name="title_rgb">RGB</string> - <!-- Menu shown in the context menu when long pressing on a message when the message contains - one or more phone numbers and/or email addresses and the number or email is new to - contacts. [CHAR LIMIT=50] --> - <string name="menu_add_address_to_contacts">Add <xliff:g id="contactEmailOrNumber">%s</xliff:g> to People</string> - <!-- Context menu item on an individual message for viewing an attached slideshow --> - <string name="view_slideshow">View slideshow</string> - <!-- Context menu item on an individual message for viewing message details such as time and date --> - <string name="view_message_details">View details</string> - <!-- Context menu item on an individual message for viewing a delivery report --> - <string name="view_delivery_report">View report</string> - <!-- Context menu item on an individual message for deleting only that message --> - <string name="delete_message">Delete</string> - <!-- Abbreviation for "kilobyte" --> - <string name="kilobyte">KB</string> - <!-- Individual message context menu item --> - <string name="copy_message_text">Copy text</string> - <!-- Header for context menu on an individual message --> - <string name="message_options">Message options</string> - <!-- Delivery Header View --> - <!-- Title of "Report" window --> - <string name="delivery_header_title">Report</string> - <!--Text for app restart confirmation dialog--> - <string name="restart_message">這些更改將會在下次開啟 QKSMS 時生效</string> - <!--Dialog title for asking if a user wants to delete a conversation--> - <string name="delete_conversation">Delete conversations</string> - <!--Dialog title for asking if a user wants to delete all failed messages--> - <string name="delete_all_failed">Delete failed messages</string> - <!--CDialog title for asking if a user wants to delete a conversation--> - <string name="delete_confirmation">Are you sure you would like to delete (%s) conversations?</string> - <!--CDialog title for asking if a user wants to delete all failed messages--> - <string name="delete_all_failed_confirmation">Are you sure you would like to delete failed messages from (%s) conversations?</string> - <!--(Unused) Dialog title shown if APNs have not been set--> - <string name="apns_not_set">尚未設置 APN</string> - <!--(Unused) Dialog description shown if APNs have not been set--> - <string name="apns_not_set_description">看來你尚未設置 APN,這代表你的 MMS 將無法正常使用。 -點擊確定讓 QKSMS 協助您 : )</string> - <!--Dialog title show if MMS hasn't been configured--> - <string name="set_up_mms_title">Set up MMS?</string> - <!--Dialog description shown if MMS hasn't yet been configured--> - <string name="set_up_mms_description">It appears that MMS hasn\'t been configured in QKSMS yet. Press okay automatically configure MMS.</string> - <!-- Dialog message text explaining that a draft message will not be saved due to invalid recipients --> - <string name="discard_message_reason">Your message will be discarded because it has no valid recipients.</string> - <string name="invalid_code">Invalid code</string> - <!--Button to restart app now instead of manually later--> - <string name="restart">現在重新啟動</string> - <!--Notification action to reply to a message--> - <string name="reply">回覆</string> - <!--Notification action to reply to a message--> - <string name="reply_qksms">Reply via QKSMS</string> - <!--Notification action to mark a message as read--> - <string name="read">讀取</string> - <!--Notification action to mark a message as read--> - <string name="mark_read">Mark as read</string> - <!--Notification action to call the sender of a message--> - <string name="call">致電</string> - <!-- Notification toast message --> - <string name="notification_mute_on">Notifications enabled</string> - <string name="notification_mute_off">Notifications disabled</string> - <!--Positive action button--> - <string name="yes">確定</string> - <string name="add">Add</string> - <!--Positive action button--> - <string name="save">Save</string> - <!--Positive action button--> - <string name="enable">Enable</string> - <!--Positive action button--> - <string name="upgrade_now">Set now</string> - <!--Positive action button--> - <string name="okay">確定</string> - <!--Positive action button--> - <string name="redeem">Redeem</string> - <!--Neutral action button--> - <string name="just_once">Just once</string> - <!--Neutral action button--> - <string name="later">稍後</string> - <!--Neutral action button --> - <string name="cancel">取消</string> - <!-- Name of the local user when displaying sender of an outgoing message (personal pronoun) --> - <string name="messagelist_sender_self">我</string> - <!-- Sender to be used if the sender address has been hidden --> - <string name="hidden_sender_address">不明的寄件者</string> - <!-- Subject to display in the conversation list if there is no subject --> - <string name="no_subject_view">(沒有主題)</string> - <!-- Time and date a message is due to expire --> - <string name="expire_on">"到期日: <xliff:g id="date">%s</xliff:g>"</string> - <!-- Formatting for subject displayed inline, prepended to MMS message text --> - <string name="inline_subject">"<主題: <xliff:g id="subject">%s</xliff:g>>"</string> - <!-- Text of a button appearing for MMS messages that have not yet been downloaded, causing the message to be downloaded (imperative verb) --> - <string name="download">下載</string> - <!-- Message displayed in place of the "download message" button once it has been pressed, indicating that the download is in progress --> - <string name="downloading">下載中</string> - <!-- Toast message while an image is being resized --> - <string name="compressing">Picture too large. Compressing\u2026</string> - <!-- Header shown above favorite contacts in QKCompose --> - <string name="favorites">Starred contacts</string> - <!-- Word represents 'self' in a conversation --> - <string name="me">Me</string> - <string name="menu_edit">Edit</string> - <string name="menu_delete_messages">Delete messages</string> - <string name="menu_delete_failed">Delete failed messages</string> - <string name="menu_lock">Lock</string> - <string name="menu_unlock">Unlock</string> - <!-- When the user tries to view message details and some error occurs while - retrieving those details, this message will be shown. --> - <string name="cannot_get_details">Can\'t get details.</string> - <!-- Title of "Message details" dialog --> - <string name="message_details_title">Message details</string> - <!-- Label in "Message details" dialog --> - <string name="message_type_label">Type\u000A</string> - <!-- "Type" value in "Message details" dialog --> - <string name="text_message">Text message</string> - <!-- "Type" value in "Message details" dialog --> - <string name="multimedia_message">Multimedia message</string> - <!-- "Type" value in "Message details" dialog --> - <string name="multimedia_notification">Multimedia message notification</string> - <!-- Label in "Message details" dialog showing who sent the message. --> - <string name="from_label">From\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="to_address_label">To\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="bcc_label">Bcc\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="sent_label">Sent\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="received_label">Received\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="saved_label">Saved\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="subject_label">Subject\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="message_size_label">Message size\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="priority_label">Priority\u000A</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_high">High</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_normal">Normal</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_low">Low</string> - <!-- Label in "Message details" dialog --> - <string name="message_class_label">Message class\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="error_code_label">Error code\u000A</string> - <!-- Alert dialog title when creating a slideshow [CHAR LIMIT=none] --> - <string name="building_slideshow_title">Building slideshow</string> - <!-- Tag appearing on conversations in the conversation list that contain a draft message --> - <string name="has_draft">草稿</string> - <!-- In conversation list items, this is the separator between a contact's name and the draft stamp [CHAR LIMIT=5] --> - <string name="draft_separator">,\u0020</string> - <!-- In conversation list items, this comes after the receipient's name and contains the number of messages in the thread [CHAR LIMIT=5] --> - <string name="message_count_format">\u00a0<xliff:g id="number" example="1">%1$s</xliff:g></string> - <!-- For debugging: Dialog box title indicating there's a situation where data has unexpectedly changed --> - <string name="error_state">狀態不一致</string> - <!-- For debugging: Dialog box text indicating there's a situation where data has unexpectedly changed --> - <string name="error_state_text">此對話和收件人的狀態不一致。 -請擷取這段錯誤訊息回覆於:http://go/droidanizer</string> - <!-- This is the dialog title for the "Select link" dialog, shown when the user clicks on a - chat in the chat history view if there are links in the chat message. The dialog displays the - links if there are any --> - <string name="select_link_title">選擇動作</string> - <!-- In message list items, this string builds the timestamp line when the message is in a group [CHAR LIMIT=NONE] --> - <string name="message_timestamp_format"><xliff:g id="字串" example="Fred Flinstone">%1$s</xliff:g>\u0020-\u0020<xliff:g id="string" example="9:39AM">%2$s</xliff:g></string> - <!--Message sending status: sending--> - <string name="status_sending">正在發送...</string> - <!--Message sending status: failed--> - <!--<string name="status_failed">Failed. Tap to retry</string>--> - <!-- Delivery Report Activity --> - <!-- Status in "Report" window --> - <string name="status_none">(None)</string> - <!-- Status in "Report" window --> - <string name="status_pending">Pending</string> - <!-- Status in "Report" window --> - <string name="status_read">Read</string> - <!-- Status in "Report" window --> - <string name="status_received">Received</string> - <!-- Status in "Report" window --> - <string name="status_failed">Failed. Tap for options</string> - <!-- Status in "Report" window --> - <string name="status_unread">Unread</string> - <!-- Status in "Report" window --> - <string name="status_rejected">Rejected</string> - <!-- Label in "Report" window --> - <string name="recipient_label">Recipient:\u0020</string> - <!-- Label in "Report" window --> - <string name="status_label">Status:\u0020</string> - <!-- Label in "Report" window [CHAR LIMIT=50]--> - <string name="delivered_label">Delivered:\u0020</string> - <string name="do_something">Do something</string> - <!-- Confirm Delete --> - <!-- Delete confirmation dialog title --> - <string name="confirm_dialog_title">Delete?</string> - <!-- Delete confirmation dialog title for locked messages --> - <string name="confirm_dialog_locked_title">Delete locked message?</string> - <!-- This message is displayed in a confirmation dialog when the user selects one or more - conversations and then taps the "Delete" button. --> - <plurals name="confirm_delete_conversation"> - <!-- Case of 1 result. --> - <!-- Case of 0 or 2 or more results. --> - <item quantity="other"><xliff:g id="number" example="15">%1$s</xliff:g> conversations will be deleted.</item> - </plurals> - <string name="confirm_delete_conversation">The entire thread will be deleted.</string> - <!-- Delete all threads confirmation dialog message --> - <string name="confirm_delete_all_conversations">All threads will be deleted.</string> - <!-- Delete message confirmation dialog message --> - <string name="confirm_delete_message">The message will be deleted.</string> - <!-- Delete message confirmation dialog message for a locked message --> - <string name="confirm_delete_locked_message">Delete this locked message?</string> - <!-- Delete all the messages on the SIM dialog message --> - <string name="confirm_delete_all_SIM_messages">All messages on the SIM card will be deleted.</string> - <!-- Delete the selected message on the SIM dialog message --> - <string name="confirm_delete_SIM_message">This message on the SIM card will be deleted.</string> - <!-- Delete unlocked checkbox title --> - <string name="delete_unlocked">Delete locked messages</string> - <!-- Delete button title --> - <string name="delete">Delete</string> - <!-- More button title --> - <string name="more">More</string> - <!-- More button summary --> - <string name="more_summary">Tap to see more</string> - <!-- Action bar mode title when multi-selecting conversations --> - <string name="select_conversations">Choose conversations</string> - <!-- Show this in the middle of the main activity when there are no conversations [CHAR LIMIT=none] --> - <string name="no_conversations">No conversations.</string> - <!-- Show this in the middle of the main activity when loading conversations [CHAR LIMIT=none] --> - <string name="loading_conversations">Loading conversations.</string> - <!-- Tells the user that QKSMS isn't the default SMS app --> - <string name="not_default">Default SMS</string> - <!-- Tells the user they need to set QKSMS as the default app in order to use this feature --> - <string name="default_info">QKSMS needs to be your SMS app to do that</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to mark messages as read --> - <string name="not_default_mark_read">QKSMS must be your SMS app to mark messages read</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to mark messages as unread --> - <string name="not_default_mark_unread">QKSMS must be your SMS app to mark messages unread</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to send messages --> - <string name="not_default_delete">QKSMS must be your SMS app to delete messages</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to delete messages --> - <string name="not_default_send">QKSMS must be your SMS app to send messages</string> - <!-- Tells the user they should set QKSMS as the default messaging app --> - <string name="not_default_first">Some things won\'t work until QKSMS is the default SMS app</string> - <string name="delayed_messaging_info">Delayed messaging allows you to cancel messages before they send. Change the default behavior and more in Settings</string> - <string name="delayed_duration_bounds_error">Duration must be between 1 and 30 seconds</string> - <!-- Dialog title for the Read Report dialog. --> - <string name="confirm">Confirm</string> - <!-- Dialog text for the Read Report dialog. --> - <string name="message_send_read_report">A read report will be sent.</string> - <!-- Dialog title for updating app icon color --> - <string name="update_icon_title">Update icon color</string> - <!-- Dialog message for updating app icon color --> - <string name="update_icon_message">QKSMS must be restarted when changing the icon color</string> - <string name="dialog_conversation_details_title">Conversation details</string> - <string name="dialog_conversation_details_last_message_date">Last message date</string> - <string name="dialog_conversation_details_message_count">Message count</string> - <string name="dialog_conversation_details_recipients">Recipients (%s)</string> - <string name="dialog_should_i_answer_title">Should I Answer? not installed</string> - <string name="dialog_should_i_answer_message">Would you like to download the app from Google Play now?</string> - <string name="dialog_delete_old_messages">Are you sure you want to automatically delete old messages?</string> - <!-- Title for audio file picker --> - <string name="select_audio">Choose audio</string> - <!-- Menu title to copy an attachment to the shared storage [CHAR LIMIT=25] --> - <string name="copy_to_sdcard">Save attachment</string> - <!-- Toast message on successful copy to shared storage [CHAR LIMIT=30] --> - <string name="copy_to_sdcard_success">Attachment saved.</string> - <!-- Toast message on failed copy to shared storage [CHAR LIMIT=30] --> - <string name="copy_to_sdcard_fail">Couldn\'t save attachment.</string> - <!-- Menu title to save a sound as a ringtone --> - <string name="save_ringtone">Save as ringtone</string> - <!-- Toast message on successful copying ringtone to drm provider --> - <string name="saved_ringtone">Ringtone saved.</string> - <!-- Toast message on failed copying ringtone to drm provider --> - <string name="saved_ringtone_fail">Couldn\'t save ringtone.</string> - <!-- Menu item --> - <!-- Menu item [CHAR LIMIT=40] --> - <string name="menu_group_participants">Group participants</string> - <!--Toast shown when a draft is saved--> - <string name="toast_draft">儲存草稿</string> - <!--Toast shown when a conversation is deleted--> - <string name="toast_conversation_deleted">對話已刪除</string> - <!--Toast shown when device is low on storage--> - <string name="toast_low_memory">"手機儲存空間已滿。刪除某些檔案以釋放空間。"</string> - <!--Toast shown to tell user that forwarding messages doesn't work yet--> - <string name="toast_forward">這個功能尚未啟用。 -現階段請在對話中使用複製、貼上以進行傳送。</string> - <!--Toast shown for unimplemented features--> - <string name="toast_unimplemented">這個功能尚未啟用。</string> - <!--Toast shown when a message fails to send--> - <string name="toast_message_failure">傳送失敗。</string> - <!--Toast shown when a message is delivered--> - <string name="toast_message_delivered">訊息以傳送。</string> - <!--Toast shown when a message is not delivered--> - <string name="toast_message_not_delivered">尚未傳送訊息。</string> - <!--Toast shown when default APNs are loaded--> - <string name="toast_default_apns_loaded">載入預設的 APN</string> - <!--Toast shown when text is copied to the clipboard--> - <string name="toast_copy_text">複製文字到剪貼簿</string> - <!--Toast shown when Google Play Services is not available for purchasing a product--> - <string name="toast_billing_not_available">在 Google Play 上購買</string> - <!--Toast shown when Google Play Services is not available for purchasing a product--> - <string name="toast_endlessjabber_not_installed">EndlessJabber 尚未安裝,正在開啟 Google Play</string> - <string name="toast_changelog_error">Couldn\'t load the changelog. Please try again later</string> - <string name="toast_conversation_error">Couldn\'t open conversation</string> - <string name="toast_deleting_old_messages">Your old messages will be deleted shortly</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_1">謝謝你的捐獻!你是我最新的好朋友 : )</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_2">謝謝你的捐獻!我...愛你!</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_3">謝謝你的捐獻!你幫助 QKSMS 能變成更好的簡訊軟體!</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_4">謝謝你的捐獻!你超讚的!</string> - <!--Menu option to mute conversation--> - <string name="menu_mute_conversation">Mute conversation</string> - <!--Menu option to mute conversation--> - <string name="menu_unmute_conversation">Unmute conversation</string> - <string name="menu_block_conversations">Block conversations</string> - <string name="menu_unblock_conversations">Unblock conversations</string> - <string name="menu_messages">Messages</string> - <string name="menu_blocked">Blocked</string> - <string name="menu_blocked_conversations">Blocked (%s new)</string> - <string name="menu_unblocked_conversations">Messages (%s new)</string> - <string name="menu_notifications">Notifications</string> - <string name="menu_notifications_off">Notifications off</string> - <string name="menu_notification_settings">Conversation settings</string> - <string name="menu_view_details">View details</string> - <string name="menu_mark_read">Mark read</string> - <string name="menu_mark_unread">Mark unread</string> - <string name="menu_delete_conversation">Delete conversation</string> - <string name="menu_multi_select">Select conversation</string> - <string name="menu_done">Done</string> - <string name="failed_message_title">Failed message options</string> - <!--Toast shown to tell the user that they don't have a photo attachments app, and suggests that they download one--> - <string name="attachment_app_not_found">Attachments app not found. Try installing a photo gallery app!</string> - <string name="attachment_camera_error">The camera could not be opened</string> - <string name="pref_max_mms_attachment_size">Maximum MMS attachment size</string> - <string name="error_no_recipients">Select some contacts to send this message to!</string> - <string name="error_file_not_found">QKSMS can\'t access the file you\'re trying to share!</string> - <string name="sending_blocked_welcome_screen_message">Hold up! You\'ll get to send real messages in a minute!</string> - <string name="notification_colored_icon_ready">Touch to add to your launcher from home screen.</string> - <string name="notification_title_colored_icon_ready">QKSMS colored icon is ready</string> - <string name="icon_ready">Your new icon is ready!</string> - <string name="icon_ready_message">You can now add it to your home screen again with the updated color.</string> - <string name="dont_ask_again">Don\'t ask again</string> - <string name="warning">Stagefright warning</string> - <string name="stagefright_warning">Video messages may contain a harmful exploit that can leave your phone vulnerable to attacks. Would you like to continue?</string> - <!-- MMS DIALOG SETUP STRINGS --> - <string name="mms_setup_set_up_mms_title">Set up MMS?</string> - <string name="mms_setup_set_up_mms_body">It appears that MMS isn\'t set up in QKSMS. Press okay to automatically configure MMS.</string> - <string name="mms_setup_setting_up_later_title">Setting up MMS later</string> - <string name="mms_setup_setting_up_later_body">Visit the MMS section of Settings to try automatic configuration, contact support, or enter your own configuration.</string> - <string name="mms_setup_no_configurations_found_title">No configurations found</string> - <string name="mms_setup_no_configurations_found_body">We couldn\'t find an MMS configuration for your carrier automatically. Press okay to contact support. We\'ll help you get set up! </string> - <string name="mms_setup_one_configuration_found_title">One configuration found</string> - <string name="mms_setup_one_configuration_found_body">We have found an MMS configuration for the %s carrier. Does that sound right?</string> - <string name="mms_setup_multiple_configurations_found_title">Multiple configuration found</string> - <string name="mms_setup_multiple_configurations_found_body">We have found multiple MMS configurations. Choose your carrier from the list, or press N/A if your carrier isn\'t on the list.</string> - <string name="mms_setup_next_steps_title">Next steps</string> - <string name="mms_setup_next_steps_body">Visit the MMS section of Settings to try automatic configuration again, contact support, or enter your own configuration.</string> - <string name="mms_setup_success_title">Success!</string> - <string name="mms_setup_success_body">If you encounter any issues, visit the MMS section of Settings to try automatic configuration again, contact support, or enter your own configuration.</string> - <string name="na">N/A</string> - <string name="no">No</string> - <string name="pref_automatically_configure_mms">Automatically Configure MMS</string> - <string name="pref_mms_contact_support">Contact Support</string> - <string name="pref_category_sending_mms">Sending MMS</string> - <string name="pref_category_mms_configuration">MMS Configuration</string> - <string name="pref_mms_contact_support_summary">Contact the QKSMS team for help setting up MMS</string> - <string name="pref_markdown_enabled">Text formatting</string> - <string name="pref_markdown_enabled_summary">Use markdown syntax to get bold, underline, and italics in your messages</string> - <string name="want_read_indicators">Want read indicators?</string> - <string name="color_swatch_description">Color %1$d</string> - <string name="color_swatch_description_selected">Color %1$d selected</string> - <string name="color_picker_default_title">Select a Color</string> - <string name="message_delivered">Message Delivered</string> - <string name="message_not_delivered">Message Not Delivered</string> - <string name="error">Error</string> - <string name="invalid_destination">Invalid destination address.</string> - <string name="service_not_activated">Service not activated on network.</string> - <string name="service_message_not_found">Message expired or not available.</string> - <string name="service_network_problem">Couldn\'t send due to network problem.</string> - <string name="message_queued">Currently can\'t send your message. It will be sent when the service becomes available.</string> - <string name="download_later">Can\'t download right now. Try again later.</string> - <string name="no_apn">No APN specified for the app, you need to set it up in settings!</string> - <string name="no_subject">(No subject)</string> - <string name="unknown_sender">Unknown sender</string> - <string name="dl_failure_notification">Couldn\'t download message <xliff:g id="subject">%1$s</xliff:g> from <xliff:g id="from">%2$s</xliff:g>.</string> - <string name="auto_select_multiple_apns">Multiple different configurations have been found. Try one now. If it doesn\'t work, you can try a new one by going to Settings > Advanced > Load default APNs.</string> - <string name="auto_select_apn">Automatically Select APNs</string> - <string name="auto_select_failed_title">Automatic configuration failed</string> - <string name="auto_select_failed">Try searching for your carrier\'s APN settings (MMSC, Port, and Proxy) and entering them in Settings > Advanced.</string> - <string name="date_yesterday">Yesterday</string> - <string name="date_just_now">Just now</string> - <string name="compose_loading_attachment">Loading attachment</string> - <string name="hint_no_messages">No messages yet.\nClick the + to send one!</string> - <string-array name="resend_menu"> - <item>Resend</item> - <item>Edit</item> - <item>Delete</item> - </string-array> - <string-array name="message_menu"> - <item>轉寄</item> - <item>複製文字</item> - <item>查看詳情</item> - <item>刪除訊息</item> - </string-array> - <string-array name="background_titles"> - <item>Material Light</item> - <item>Material Dark</item> - <item>Black</item> - </string-array> - <string-array name="font_sizes"> - <item>小</item> - <item>正常</item> - <item>大</item> - <item>最大</item> - </string-array> - <string-array name="font_families"> - <item>Roboto Regular</item> - <item>Roboto Condensed</item> - <item>System font</item> - </string-array> - <string-array name="font_weights"> - <item>Light</item> - <item>Normal</item> - </string-array> - <!-- String to match as no subject and filter out as a subject. For example, if the - subject string is "no subject", we won't display that. We'll pretend - no subject string was delivered. --> - <string-array name="empty_subject_strings"> - <item>未命名</item> - </string-array> - <string-array name="qk_responses"> - <item>Okay</item> - <item>Give me a moment</item> - <item>On my way</item> - <item>Thanks</item> - <item>Sounds good</item> - <item>What\'s up?</item> - <item>Agreed</item> - <item>No</item> - <item>Love you</item> - <item>Sorry</item> - <item>LOL</item> - <item>That\'s okay</item> - </string-array> - <string-array name="enter_button_options"> - <item>Show emoji</item> - <item>New line</item> - <item>Send message</item> - </string-array> - <string-array name="notification_private_options"> - <item>Show all</item> - <item>Hide message</item> - <item>Hide message and sender</item> - </string-array> - <!-- Max MMS attachment sizes. I.e. will compress pictures that are larger than 300 KB down to - under 300KB. --> - <string-array name="max_mms_attachment_sizes"> - <item>300 KB</item> - <item>600 KB</item> - <item>1 MB</item> - <item>Unlimited</item> - </string-array> -</resources> diff --git a/QKSMS/src/main/res/values/attrs.xml b/QKSMS/src/main/res/values/attrs.xml deleted file mode 100644 index c543952d4..000000000 --- a/QKSMS/src/main/res/values/attrs.xml +++ /dev/null @@ -1,70 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<resources> - - <attr name="backgroundColor" format="color" /> - - <declare-styleable name="QKLinearLayout"> - <attr name="backgroundTint" /> - </declare-styleable> - - <attr name="type"> - <flag name="primary_bold" value="0" /> - <flag name="primary" value="1" /> - <flag name="secondary" value="2" /> - <flag name="tertiary" value="3" /> - <flag name="pref_category" value="4" /> - <flag name="dialog_title" value="5" /> - <flag name="dialog_message" value="6" /> - <flag name="dialog_button" value="7" /> - <flag name="toolbar" value="8" /> - </attr> - - <declare-styleable name="RobotoTextView"> - <attr name="typeface" /> - </declare-styleable> - - <declare-styleable name="QKTextView"> - <attr name="type" /> - </declare-styleable> - - <attr name="typeface"> - <enum name="roboto_thin" value="0" /> - <enum name="roboto_thin_italic" value="1" /> - <enum name="roboto_light" value="2" /> - <enum name="roboto_light_italic" value="3" /> - <enum name="roboto_regular" value="4" /> - <enum name="roboto_italic" value="5" /> - <enum name="roboto_medium" value="6" /> - <enum name="roboto_medium_italic" value="7" /> - <enum name="roboto_bold" value="8" /> - <enum name="roboto_bold_italic" value="9" /> - <enum name="roboto_black" value="10" /> - <enum name="roboto_black_italic" value="11" /> - <enum name="roboto_condensed_light" value="12" /> - <enum name="roboto_condensed_light_italic" value="13" /> - <enum name="roboto_condensed_regular" value="14" /> - <enum name="roboto_condensed_italic" value="15" /> - <enum name="roboto_condensed_bold" value="16" /> - <enum name="roboto_condensed_bold_italic" value="17" /> - <enum name="roboto_slab_thin" value="18" /> - <enum name="roboto_slab_light" value="19" /> - <enum name="roboto_slab_regular" value="20" /> - <enum name="roboto_slab_bold" value="21" /> - <enum name="lato_thin" value="22" /> - <enum name="lato_thin_italic" value="23" /> - <enum name="lato_light" value="24" /> - <enum name="lato_light_italic" value="25" /> - <enum name="lato_regular" value="26" /> - <enum name="lato_italic" value="27" /> - <enum name="lato_medium" value="28" /> - <enum name="lato_medium_italic" value="29" /> - <enum name="lato_bold" value="30" /> - <enum name="lato_bold_italic" value="31" /> - <enum name="lato_black" value="32" /> - <enum name="lato_black_italic" value="33" /> - </attr> - - <declare-styleable name="AvatarView"> - <attr name="initialSize" format="dimension" /> - </declare-styleable> -</resources> \ No newline at end of file diff --git a/QKSMS/src/main/res/values/bools.xml b/QKSMS/src/main/res/values/bools.xml deleted file mode 100644 index e0dcf9ff9..000000000 --- a/QKSMS/src/main/res/values/bools.xml +++ /dev/null @@ -1,11 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<resources> - <bool name="hasKitKat">false</bool> - <bool name="preKitKat">true</bool> - - <bool name="hasL">false</bool> - <bool name="preL">true</bool> - - <bool name="hasN">false</bool> - <bool name="preN">true</bool> -</resources> \ No newline at end of file diff --git a/QKSMS/src/main/res/values/colors.xml b/QKSMS/src/main/res/values/colors.xml deleted file mode 100644 index 3062b4977..000000000 --- a/QKSMS/src/main/res/values/colors.xml +++ /dev/null @@ -1,39 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<resources> - <color name="blue_light">#33B5E5</color> - <color name="blue_dark">#0099CC</color> - <color name="purple_light">#AA66CC</color> - <color name="purple_dark">#9933CC</color> - <color name="green_light">#99CC00</color> - <color name="green_dark">#669900</color> - <color name="yellow_light">#FFBB33</color> - <color name="yellow_dark">#FF8800</color> - <color name="red_light">#FF4444</color> - <color name="red_dark">#CC0000</color> - - <color name="white_pure">#ffffff</color> - <color name="white_med">#eeeeee</color> - <color name="white_holo">#e5e5e5</color> - <color name="grey_light_mega_ultra">#eeeeee</color> - <color name="grey_light_ultra">#cccccc</color> - <color name="grey_light">#999999</color> - <color name="grey_dark">#333333</color> - <color name="grey_material">#ff212121</color> - <color name="grey_dark_ultra">#111111</color> - <color name="black">#000000</color> - <color name="transparent">#00000000</color> - <color name="theme_light_text_primary">#212121</color> - <color name="theme_light_text_secondary">#707070</color> - <color name="theme_dark_text_primary">#FFFFFF</color> - <color name="theme_dark_text_secondary">#999999</color> - - <!-- Color states for `SwitchCompat` views --> - <color name="switch_thumb_enabled_light">#ECECEC</color> - <color name="switch_track_enabled_light">#A6A6A6</color> - <color name="switch_thumb_disabled_light">#B9B9B9</color> - <color name="switch_track_disabled_light">#D6D6D6</color> - <color name="switch_thumb_enabled_dark">#B9B9B9</color> - <color name="switch_track_enabled_dark">#646464</color> - <color name="switch_thumb_disabled_dark">#595959</color> - <color name="switch_track_disabled_dark">#383838</color> -</resources> \ No newline at end of file diff --git a/QKSMS/src/main/res/values/dimens.xml b/QKSMS/src/main/res/values/dimens.xml deleted file mode 100644 index 82cf681da..000000000 --- a/QKSMS/src/main/res/values/dimens.xml +++ /dev/null @@ -1,17 +0,0 @@ -<resources> - <dimen name="title_padding">16dp</dimen> - <dimen name="avatar_width_height">64dip</dimen> - <dimen name="message_item_avatar_on_right_text_indent">50dip</dimen> - <dimen name="message_item_text_padding_left_right">12dip</dimen> - <dimen name="message_item_text_padding_top">5dip</dimen> - <dimen name="mms_inline_attachment_size">224dip</dimen> - <dimen name="ab_height">48dp</dimen> - <dimen name="shadow_width">8dp</dimen> - - <dimen name="color_swatch_large">64dp</dimen> - <dimen name="color_swatch_small">48dp</dimen> - <dimen name="color_swatch_margins_large">8dp</dimen> - <dimen name="color_swatch_margins_small">4dp</dimen> - - <dimen name="slideshow_padding_top">0dp</dimen> -</resources> diff --git a/QKSMS/src/main/res/values/donottranslate.xml b/QKSMS/src/main/res/values/donottranslate.xml deleted file mode 100644 index a19ddf6db..000000000 --- a/QKSMS/src/main/res/values/donottranslate.xml +++ /dev/null @@ -1,55 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<resources> - - <string name="app_name">QKSMS</string> - - <string-array name="background_values"> - <item>light</item> - <item>grey</item> - <item>black</item> - </string-array> - - <string-array name="enter_button_values"> - <item>0</item> - <item>1</item> - <item>2</item> - </string-array> - - <string-array name="max_mms_attachment_size_values"> - <item>300kb</item> - <item>600kb</item> - <item>1mb</item> - <item>unlimited</item> - </string-array> - - <string-array name="contributor_names"> - <item>Jeremy Feinstein</item> - <item>Flavien Laurent</item> - <item>Evgeny Shishkin</item> - <item>Jacob Klinker</item> - <item>Jeff Gilfelt</item> - <item>Melnykov Oleksandr</item> - <item>ligi</item> - </string-array> - - <string-array name="contributor_githubs"> - <item>github.com/jfeinstein10</item> - <item>github.com/flavienlaurent</item> - <item>github.com/johnkil</item> - <item>github.com/klinker41</item> - <item>github.com/jgilfelt</item> - <item>github.com/makovkastar</item> - <item>github.com/ligi</item> - </string-array> - - <string-array name="contributor_projects"> - <item>SlidingMenu</item> - <item>colorpicker</item> - <item>Android-RobotoTextView</item> - <item>android-smsmms\nandroid-chips</item> - <item>SystemBarTint</item> - <item>FloatingActionButton</item> - <item>SnackEngage</item> - </string-array> - -</resources> diff --git a/QKSMS/src/main/res/values/ids.xml b/QKSMS/src/main/res/values/ids.xml deleted file mode 100644 index eac70c9a9..000000000 --- a/QKSMS/src/main/res/values/ids.xml +++ /dev/null @@ -1,5 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<resources> - <item name="selected_view" type="id"/> - -</resources> \ No newline at end of file diff --git a/QKSMS/src/main/res/values/integers.xml b/QKSMS/src/main/res/values/integers.xml deleted file mode 100644 index 0d48446ce..000000000 --- a/QKSMS/src/main/res/values/integers.xml +++ /dev/null @@ -1,22 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<resources> - - <string-array name="font_size_codes"> - <item>0</item> - <item>1</item> - <item>2</item> - <item>3</item> - </string-array> - - <string-array name="font_family_codes"> - <item>0</item> - <item>1</item> - <item>2</item> - </string-array> - - <string-array name="font_weight_codes"> - <item>2</item> - <item>0</item> - </string-array> - -</resources> \ No newline at end of file diff --git a/QKSMS/src/main/res/values/strings.xml b/QKSMS/src/main/res/values/strings.xml deleted file mode 100644 index e875c94ba..000000000 --- a/QKSMS/src/main/res/values/strings.xml +++ /dev/null @@ -1,834 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<resources xmlns:xliff="http://schemas.android.com/apk/res-auto"> - <!--Slogan--> - <string name="slogan">Love texting again.</string> - <!--Text shown when a phone number cannot be found--> - <string name="unknown_number">Unknown Number</string> - <!--Content description for photos--> - <string name="popup_photo_CD">Photo</string> - <!--Text to be displayed while content is loading--> - <string name="loading">Loading…</string> - <!--Test string--> - <string name="test">Test string</string> - - <!--Hint for contacts text field--> - <string name="hint_contacts">Enter recipients</string> - <!--Hint for search text field--> - <string name="hint_search">Search something</string> - <!--Hint for message reply text field--> - <string name="hint_reply">Enter a message</string> - <!--Hint for code redemption--> - <string name="hint_redeem">Enter code</string> - <string name="hint_hex">Hex</string> - - <!--Text shown for single new message in notification--> - <string name="new_message">New message</string> - <!--Text shown after number of unread messages in notification (ex. 3 new messages)--> - <string name="new_messages">new messages</string> - <!--Text shown for single failed message in notification--> - <string name="failed_message">Message failed to send</string> - <!--Text shown after number of failed messages in notification (ex. 3 messages failed to send)--> - <string name="failed_messages">messages failed to send</string> - <!--Text shown under failed message count--> - <string name="failed_messages_summary">Tap to view</string> - <!--QuickCompose notification title--> - <string name="quickcompose">QK Compose</string> - <!--QuickCompose notification text--> - <string name="quickcompose_detail">Click to send a message</string> - - <!--Welcome screen intro button--> - <string name="welcome_start">Let\'s get started!</string> - <!--Allows user to skip welcome screen--> - <string name="welcome_skip">SKIP</string> - <!--Allows user to finish the welcome screen--> - <string name="welcome_finish">FINISH</string> - <!--Indicates to user they can pick a color--> - <string name="welcome_theme_title">Pick a color</string> - <!--Indicates to user they can pick any colors--> - <string name="welcome_theme_description">Any color.</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_night_description">Easy on the eyes.</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_night_hint">Toggle me</string> - <!--Tells user to press button to toggle night mode--> - <string name="welcome_quickreply_title">QK Reply</string> - <!--QK Reply explanation--> - <string name="welcome_quickreply_description">Reply to messages faster than ever.</string> - <!--Prompts user to try QK Reply--> - <string name="welcome_quickreply_hint">Try it!</string> - <!--QK Reply demo message--> - <string name="welcome_quickreply_message_1">Wow! Now wasn\'t that awesome? You can view your entire conversation at a glance. Tap outside the popup or press the checkmark to dismiss it.</string> - <!--QK Reply demo message--> - <string name="welcome_quickreply_message_2">This is QK Reply. Now you can reply to messages from anywhere. Tap the expand button to see what happens next :)</string> - - <!--Settings option in menu--> - <string name="menu_settings">Settings</string> - <!--Search option in menu--> - <string name="menu_search">Search</string> - <!--Show full conversation in QuickReply--> - <string name="menu_show_all">Show all messages</string> - <!--Show only unread messages in QuickReply--> - <string name="menu_show_unread">Show unread messages</string> - <!--Open conversation option in menu (shown in QuickReply)--> - <string name="menu_open_thread">Open conversation</string> - <!--Forward message option in menu--> - <string name="menu_forward">Forward message</string> - <!--Call contact option in menu--> - <string name="menu_call">Call</string> - <!--Mark a message/conversation as read option in menu--> - <string name="menu_read">Mark as read</string> - <!--Delete a message option in menu--> - <string name="menu_delete">Delete</string> - <!--Donate option in menu--> - <string name="menu_billing">Donate</string> - <!--Copy text option in menu--> - <string name="menu_copy">Copy text</string> - <!--Changelog option in menu--> - <string name="menu_changelog">"What's new"</string> - <!--Expand settings option in menu--> - <string name="menu_show_all_prefs">Show all</string> - <!--Show less settings option in menu--> - <string name="menu_show_fewer_prefs">Show fewer</string> - - <!--Title for message details popup--> - <string name="details_title">Details</string> - <!--Title for address that message is being sent to in message details popup--> - <string name="details_to">To</string> - <!--Title for address that message is sent from in message details popup--> - <string name="details_from">From</string> - <!--Title for text of a message in message details popup--> - <string name="details_body">Body</string> - <!--Title for date sent of a message in message details popup--> - <string name="details_date_sent">Date sent</string> - <!--Title for date received of a message in message details popup--> - <string name="details_date_received">Date received</string> - <!--Title for rate snackbar--> - <string name="rate_title">Like QKSMS?</string> - <!--Title for rate button--> - <string name="rate_action">Rate</string> - - <string name="pref_category_appearance">Appearance</string> - <string name="pref_category_summary_appearance">Themes, fonts, colors, avatars, and more</string> - <string name="pref_category_general">General</string> - <string name="pref_category_summary_general">Delivery, message sending, formatting</string> - <string name="pref_category_blocking">Message blocking</string> - <string name="pref_category_notifications">Notifications</string> - <string name="pref_category_summary_notifications">Sounds, LED, privacy</string> - <string name="pref_category_mms">MMS</string> - <string name="pref_category_summary_mms">Configure MMS (APNs), max size, group messaging</string> - <string name="pref_category_quickreply">QK Reply</string> - <string name="pref_category_summary_quickreply">QK Reply, popup options</string> - <string name="pref_category_quickcompose">QK Compose</string> - <string name="pref_category_summary_quickcompose">QK Compose, starred contacts</string> - <string name="pref_category_about">About</string> - <string name="pref_category_summary_about">Version, changelog, authors, thanks</string> - - <string name="pref_theme">Theme color</string> - <string name="pref_theme_summary_alt">Tap to change theme</string> - <string name="pref_icon">Icon color</string> - <string name="pref_icon_summary">Tap to change the QKSMS icon color</string> - <string name="pref_status_tint">Tinted status bar</string> - <string name="pref_navigation_tint">Tinted navigation bar</string> - <string name="pref_background">Background color</string> - <string name="pref_background_summary">Tap to change background color</string> - <string name="pref_bubbles">Message bubbles</string> - <string name="pref_bubbles_summary">Tap to change message bubble preferences</string> - <string name="pref_night">Night mode</string> - <string name="pref_night_summary">Save battery and reduce eye strain</string> - <string name="pref_night_amoled">Pure black background</string> - <string name="pref_night_amoled_summary">Save extra battery on devices with AMOLED displays</string> - <string name="pref_bubble_style_new">Use new bubble style</string> - <string name="pref_color_sent">Color sent messages</string> - <string name="pref_color_sent_summary">Color the background bubbles for outgoing messages</string> - <string name="pref_color_received">Color received messages</string> - <string name="pref_color_received_summary">Color the background bubbles for incoming messages</string> - <string name="pref_hide_avatar_conversations">Hide conversation avatars</string> - <string name="pref_hide_avatar_conversations_summary">Hide avatars for contacts in conversation list</string> - <string name="pref_hide_avatar_sent">Hide sent message avatars</string> - <string name="pref_hide_avatar_sent_summary">Hide your avatar for outgoing messages</string> - <string name="pref_hide_avatar_received">Hide received message avatars</string> - <string name="pref_hide_avatar_received_summary">Hide contact avatar for incoming messages</string> - <string name="pref_font_family">Font family</string> - <string name="pref_font_size">Font size</string> - <string name="pref_font_weight">Font weight</string> - <string name="pref_message_count">Message count</string> - <string name="pref_message_count_summary">Show the number of messages for each conversation</string> - - <string name="pref_sent_timestamps">Sent timestamps</string> - <string name="pref_sent_timestamps_summary">Show the timestamp for when a message was sent, not received</string> - <string name="pref_force_timestamps">Force timestamps</string> - <string name="pref_force_timestamps_summary">Enable timestamps for all messages</string> - <string name="pref_key_timestamp_delay">New timestamp delay</string> - <string name="pref_key_timestamp_delay_summary">The number of minutes which must elapse between two messages in order for a new timestamp to be shown.</string> - <string name="pref_compose_favorites">Starred contacts</string> - <string name="pref_compose_summary_favorites">Show your starred contacts in the QK Compose window, making them only a tap away</string> - <string name="pref_prox_sensor_call">Proximity sensor</string> - <string name="pref_prox_sensor_call_summary">While in a conversation, bring your phone to your ear to start a call</string> - <string name="pref_delivery">Delivery confirmations</string> - <string name="pref_delivery_summary">Confirm that messages were sent successfully</string> - <string name="pref_delivery_toast">Show toast</string> - <string name="pref_delivery_toast_summary">Show a short toast to indicate a message being delivered</string> - <string name="pref_delivery_vibrate">Vibrate</string> - <string name="pref_delivery_vibrate_summary">Vibrate on message delivery</string> - <string name="pref_delete_old_messages">Delete old messages</string> - <string name="pref_delete_old_messages_summary">Automatically delete messages once they\'re old enough</string> - <string name="pref_delete_old_messages_unread">Unread messages</string> - <string name="pref_delete_old_messages_unread_summary">Automatically delete unread messages after %s days</string> - <string name="pref_delete_old_messages_read">Read messages</string> - <string name="pref_delete_old_messages_read_summary">Automatically delete read messages after %s days</string> - <string name="pref_yappy">Yappy integration</string> - <string name="pref_endlessjabber_summary">Enable full support for Yappy</string> - <string name="pref_blocked_conversations">Blocked conversations</string> - <string name="pref_blocked_conversations_summary">Long-press on a conversation and block to move to blocked inbox and stop notifications</string> - <string name="pref_block_future">Block future messages</string> - <string name="pref_block_future_summary">Add additional phone numbers to block</string> - <string name="pref_should_i_answer">Should I Answer? Integration</string> - <string name="pref_should_i_answer_summary">Automatically delete incoming messages from numbers which are blocked through Should I Answer?</string> - <string name="pref_mobile_only">Mobile numbers</string> - <string name="pref_mobile_only_summary">Only show mobile numbers in contact suggestions</string> - <string name="pref_auto_emoji">Automatic emoji</string> - <string name="pref_auto_emoji_summary">Replace text with image emoji</string> - <string name="pref_enter_button">Enter button</string> - <string name="pref_enter_button_summary">Tap to change keyboard enter button behavior</string> - <string name="pref_compose_group">Group messaging</string> - <string name="pref_compose_group_summary">When composing message to multiple people, send a group message instead of individual messages</string> - <string name="pref_auto_download">Auto download MMS</string> - <string name="pref_auto_download_summary">Automatically download MMS messages when they become available</string> - <string name="pref_auto_data">Automatic data</string> - <string name="pref_auto_data_summary">Turn on data automatically when sending or receiving MMS</string> - <string name="pref_send_texts_as_mms">Send texts as MMS</string> - <string name="pref_send_texts_as_mms_summary">Send text messages via MMS instead of SMS</string> - <string name="pref_split">Split SMS</string> - <string name="pref_split_summary">Split long messages into separate messages</string> - <string name="pref_split_counter">Split counter</string> - <string name="pref_split_counter_summary">Adds a counter to the front of each split message</string> - <string name="pref_long_as_mms">Send long as MMS</string> - <string name="pref_long_as_mms_summary">Send long messages as MMS instead of splitting them</string> - <string name="pref_long_as_mms_after">Send long as MMS after</string> - <string name="pref_long_as_mms_after_summary">Send long messages as MMS when they exceed the length of a number of messages</string> - <string name="pref_return">Show return button</string> - <string name="pref_return_summary">Show return key on keyboard instead of Emoji button</string> - <string name="pref_text">Text</string> - - <string name="pref_notifications">SMS notifications enabled</string> - <string name="pref_led">Notification LED</string> - <string name="pref_theme_led">Notification LED color</string> - <string name="pref_wake">Wake phone</string> - <string name="pref_wake_summary">Turn your screen on when you receive a new message</string> - <string name="pref_notifications_private">Private notifications</string> - <string name="pref_notifications_private_summary">Tap to change what should be hidden in notfication</string> - <string name="pref_ringtone">Notification sound</string> - <string name="pref_ringtone_summary">Select a notification sound</string> - <string name="pref_ticker">Show ticker</string> - <string name="pref_ticker_summary">Shows snippet of new message in notification bar</string> - <string name="pref_vibration">Vibration</string> - <string name="pref_vibration_summary">Vibrate when new messages are received</string> - <string name="pref_notification_call">Call button</string> - <string name="pref_notification_call_summary">Call the sender of a message right from the notification</string> - <string name="pref_dimiss_read">Mark as read</string> - <string name="pref_dismiss_read_summary">Mark message as read when notification is cleared</string> - - <string name="pref_delayed">Delayed messaging</string> - <string name="pref_delayed_summary">Wait before sending your messages, so you have a chance to review them</string> - <string name="pref_delayed_duration">Delay length (seconds)</string> - <string name="pref_delayed_duration_summary">Time to wait before sending your message</string> - <string name="pref_night_auto">Automatic night mode</string> - <string name="pref_night_auto_summary">Enable night mode automatically based on the time</string> - <string name="pref_day_start">Day time begins</string> - <string name="pref_night_start">Night time begins</string> - <string name="pref_qk_responses">QK Responses</string> - <string name="pref_qk_responses_summary">Modify your preset responses to be used from your Android Wear device</string> - - <string name="pref_quickreply_enabled">QK Reply enabled</string> - <string name="pref_quickreply_enabled_summary">Show QK Reply window whenever a new message is received</string> - <string name="pref_tap_to_quit">Tap to dismiss</string> - <string name="pref_tap_to_quit_summary">Tap anywhere outside of the window to close it</string> - - <string name="pref_quickcompose">QK Compose enabled</string> - <string name="pref_quickcompose_summary">Display a notification that allows you to click on to compose a new message</string> - - <string name="pref_mms_enabled">MMS enabled</string> - <string name="pref_mms_enabled_summary">Enable sending and receiving of MMS messages</string> - <string name="pref_mmsc_url">MMSC</string> - <string name="pref_mms_proxy">MMS proxy</string> - <string name="pref_mms_port">MMS port</string> - <string name="pref_apn_chooser">Load default APNs</string> - <string name="pref_strip_unicode">Strip unicode</string> - <string name="pref_strip_unicode_summary">Swap characters that are not supported in full-length messages for GSM compatible characters</string> - <string name="pref_system_bar_flat">Flat system bars</string> - <string name="pref_system_bar_flat_summary">Get rid of the gradient shown on the system UI bars on most KitKat devices</string> - <string name="pref_status_compat">Status bar fix</string> - <string name="pref_status_compat_summary">Fixes issues caused by immersive mode, Tinted Status Bar (Xposed), or custom DPI settings</string> - <string name="pref_navigation_compat">Navigation bar fix</string> - <string name="pref_navigation_compat_summary">Fixes issues caused by immersive mode, Tinted Status Bar (Xposed), or custom DPI settings</string> - - <string name="pref_about_version_title">QKSMS version</string> - <string name="pref_about_authors_title">Authors</string> - <string name="pref_about_authors_summary">Moez Bhatti</string> - <string name="pref_changelog_summary">Tap to view changelog</string> - <string name="pref_about_thanks_title">Thank you</string> - <string name="pref_about_thanks_summary">Tap to view open-source contributors</string> - <string name="pref_donate_title">Donate</string> - <string name="pref_donate_summary">QKSMS is free. Help support us by donating!</string> - <string name="pref_about_gplus_title">Google+</string> - <string name="pref_about_gplus_summary">Join the QKSMS Beta Testing community on Google+</string> - <string name="pref_about_github_title">GitHub</string> - <string name="pref_about_github_summary">QKSMS is open source. Contribute and report issues on GitHub</string> - <string name="pref_about_crowdin_title">Crowdin</string> - <string name="pref_about_crowdin_summary">Join the QKSMS translation project on Crowdin</string> - - <!--Preference subcategory--> - <string name="pref_subcat_theme">Theme</string> - <!--Preference subcategory--> - <string name="pref_subcat_system_bars">System bars</string> - <!--Preference subcategory--> - <string name="pref_subcat_categories">Categories</string> - <!--Preference subcategory--> - <string name="pref_subcat_font">Font</string> - <!--Preference subcategory--> - <string name="pref_subcat_messages">Messages</string> - <!--Preference subcategory--> - <string name="pref_subcat_avatars">Avatars</string> - - <string name="donate_google">Donate with Google</string> - <string name="donate_google_summary">Google takes 30% of donations</string> - <string name="donate_paypal">Donate with PayPal</string> - <string name="donate_paypal_button">Donate any amount</string> - <string name="donate_paypal_button_summary">Buy me anything you want!</string> - <!--Donation product name--> - <string name="product_name_donation">Donation</string> - <!--$1 donation product name--> - <string name="product_name_donate_1">Donate $1 USD</string> - <!--$5 donation product name--> - <string name="product_name_donate_5">Donate $5 USD</string> - <!--$3 donation product name--> - <string name="product_name_donate_10">Donate $10 USD</string> - <!--$1 donation product description--> - <string name="product_description_donate_1">Buy me a Coke</string> - <!--$5 donation product description--> - <string name="product_description_donate_5">Buy me a sandwich</string> - <!--$10 donaion product description--> - <string name="product_description_donate_10">Buy me lunch</string> - - <string name="title_settings">Settings</string> - <string name="title_search">Search</string> - <string name="title_compose">Compose</string> - <string name="title_conversation_list">Conversations</string> - <string name="title_blocked">Blocked</string> - <string name="title_changelog">Changelog</string> - <string name="title_picker">New messages</string> - <string name="title_donate">Donate</string> - <string name="title_qk_responses">QK Responses</string> - <string name="title_block_address">Block number</string> - <string name="title_unblock_address">Unblock number</string> - <string name="title_conversations_selected">%s selected</string> - <string name="title_palette">Palette</string> - <string name="title_rgb">RGB</string> - - <!-- Menu shown in the context menu when long pressing on a message when the message contains - one or more phone numbers and/or email addresses and the number or email is new to - contacts. [CHAR LIMIT=50] --> - <string name="menu_add_address_to_contacts">Add <xliff:g id="contactEmailOrNumber">%s</xliff:g> to People</string> - - <!-- Context menu item on an individual message for viewing an attached slideshow --> - <string name="view_slideshow">View slideshow</string> - <!-- Context menu item on an individual message for viewing message details such as time and date --> - <string name="view_message_details">View details</string> - <!-- Context menu item on an individual message for viewing a delivery report --> - <string name="view_delivery_report">View report</string> - <!-- Context menu item on an individual message for deleting only that message --> - <string name="delete_message">Delete</string> - <!-- Abbreviation for "kilobyte" --> - <string name="kilobyte">KB</string> - - <!-- Individual message context menu item --> - <string name="copy_message_text">Copy text</string> - <!-- Header for context menu on an individual message --> - <string name="message_options">Message options</string> - - <!-- Delivery Header View --> - <!-- Title of "Report" window --> - <string name="delivery_header_title">Report</string> - - <!--Text for app restart confirmation dialog--> - <string name="restart_message">These changes will take effect the next time QKSMS is opened</string> - <!--Dialog title for asking if a user wants to delete a conversation--> - <string name="delete_conversation">Delete conversations</string> - <!--Dialog title for asking if a user wants to delete all failed messages--> - <string name="delete_all_failed">Delete failed messages</string> - <!--CDialog title for asking if a user wants to delete a conversation--> - <string name="delete_confirmation">Are you sure you would like to delete (%s) conversations?</string> - <!--CDialog title for asking if a user wants to delete all failed messages--> - <string name="delete_all_failed_confirmation">Are you sure you would like to delete failed messages from (%s) conversations?</string> - <!--(Unused) Dialog title shown if APNs have not been set--> - <string name="apns_not_set">APNs not set</string> - <!--(Unused) Dialog description shown if APNs have not been set--> - <string name="apns_not_set_description">It appears that your APNs have not been set. This means that MMS will not work properly. Please press okay to have QKSMS find them for you :)</string> - <!--Dialog title show if MMS hasn't been configured--> - <string name="set_up_mms_title">Set up MMS?</string> - <!--Dialog description shown if MMS hasn't yet been configured--> - <string name="set_up_mms_description">It appears that MMS hasn\'t been configured in QKSMS yet. Press okay automatically configure MMS.</string> - - <!-- Dialog message text explaining that a draft message will not be saved due to invalid recipients --> - <string name="discard_message_reason">Your message will be discarded because it has no valid recipients.</string> - - <string name="invalid_code">Invalid code</string> - - <!--Button to restart app now instead of manually later--> - <string name="restart">Restart now</string> - <!--Notification action to reply to a message--> - <string name="reply">Reply</string> - <!--Notification action to reply to a message--> - <string name="reply_qksms">Reply via QKSMS</string> - <!--Notification action to mark a message as read--> - <string name="read">Read</string> - <!--Notification action to mark a message as read--> - <string name="mark_read">Mark as read</string> - <!--Notification action to call the sender of a message--> - <string name="call">Call</string> - <!-- Notification toast message --> - <string name="notification_mute_on">Notifications enabled</string> - <string name="notification_mute_off">Notifications disabled</string> - <!--Positive action button--> - <string name="yes">Yes</string> - <string name="add">Add</string> - <!--Positive action button--> - <string name="save">Save</string> - <!--Positive action button--> - <string name="enable">Enable</string> - <!--Positive action button--> - <string name="upgrade_now">Set now</string> - <!--Positive action button--> - <string name="okay">Okay</string> - <!--Positive action button--> - <string name="redeem">Redeem</string> - <!--Neutral action button--> - <string name="just_once">Just once</string> - <!--Neutral action button--> - <string name="later">Later</string> - <!--Neutral action button --> - <string name="cancel">Cancel</string> - <!-- Name of the local user when displaying sender of an outgoing message (personal pronoun) --> - <string name="messagelist_sender_self">Me</string> - <!-- Sender to be used if the sender address has been hidden --> - <string name="hidden_sender_address">Hidden sender address</string> - <!-- Subject to display in the conversation list if there is no subject --> - <string name="no_subject_view">(No subject)</string> - <!-- Time and date a message is due to expire --> - <string name="expire_on">"Expires: <xliff:g id="date">%s</xliff:g>"</string> - <!-- Formatting for subject displayed inline, prepended to MMS message text --> - <string name="inline_subject">"<Subject: <xliff:g id="subject">%s</xliff:g>>"</string> - <!-- Text of a button appearing for MMS messages that have not yet been downloaded, causing the message to be downloaded (imperative verb) --> - <string name="download">Download</string> - <!-- Message displayed in place of the "download message" button once it has been pressed, indicating that the download is in progress --> - <string name="downloading">Downloading</string> - <!-- Toast message while an image is being resized --> - <string name="compressing">Picture too large. Compressing\u2026</string> - <!-- Header shown above favorite contacts in QKCompose --> - <string name="favorites">Starred contacts</string> - <!-- Word represents 'self' in a conversation --> - <string name="me">Me</string> - - <string name="menu_edit">Edit</string> - <string name="menu_delete_messages">Delete messages</string> - <string name="menu_delete_failed">Delete failed messages</string> - <string name="menu_lock">Lock</string> - <string name="menu_unlock">Unlock</string> - - <!-- When the user tries to view message details and some error occurs while - retrieving those details, this message will be shown. --> - <string name="cannot_get_details">Can\'t get details.</string> - <!-- Title of "Message details" dialog --> - <string name="message_details_title">Message details</string> - <!-- Label in "Message details" dialog --> - <string name="message_type_label">Type\u000A</string> - <!-- "Type" value in "Message details" dialog --> - <string name="text_message">Text message</string> - <!-- "Type" value in "Message details" dialog --> - <string name="multimedia_message">Multimedia message</string> - <!-- "Type" value in "Message details" dialog --> - <string name="multimedia_notification">Multimedia message notification</string> - <!-- Label in "Message details" dialog showing who sent the message. --> - <string name="from_label">From\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="to_address_label">To\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="bcc_label">Bcc\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="sent_label">Sent\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="received_label">Received\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="saved_label">Saved\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="subject_label">Subject\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="message_size_label">Message size\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="priority_label">Priority\u000A</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_high">High</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_normal">Normal</string> - <!-- "Priority" value in "Message details" dialog --> - <string name="priority_low">Low</string> - <!-- Label in "Message details" dialog --> - <string name="message_class_label">Message class\u000A</string> - <!-- Label in "Message details" dialog --> - <string name="error_code_label">Error code\u000A</string> - - <!-- Alert dialog title when creating a slideshow [CHAR LIMIT=none] --> - <string name="building_slideshow_title">Building slideshow</string> - - <!-- Tag appearing on conversations in the conversation list that contain a draft message --> - <string name="has_draft">Draft</string> - <!-- In conversation list items, this is the separator between a contact's name and the draft stamp [CHAR LIMIT=5] --> - <string name="draft_separator">,\u0020</string> - <!-- In conversation list items, this comes after the receipient's name and contains the number of messages in the thread [CHAR LIMIT=5] --> - <string name="message_count_format">\u00a0<xliff:g id="number" example="1">%1$s</xliff:g></string> - - <!-- For debugging: Dialog box title indicating there's a situation where data has unexpectedly changed --> - <string name="error_state">Inconsistent state</string> - <!-- For debugging: Dialog box text indicating there's a situation where data has unexpectedly changed --> - <string name="error_state_text">The state of threads and recipients is inconsistent. Please capture a bug report and report it via http://go/droidanizer </string> - <!-- This is the dialog title for the "Select link" dialog, shown when the user clicks on a - chat in the chat history view if there are links in the chat message. The dialog displays the - links if there are any --> - <string name="select_link_title">Choose action</string> - - <!-- In message list items, this string builds the timestamp line when the message is in a group [CHAR LIMIT=NONE] --> - <string name="message_timestamp_format"><xliff:g id="string" example="Fred Flinstone">%1$s</xliff:g>\u0020-\u0020<xliff:g id="string" example="9:39AM">%2$s</xliff:g></string> - - <!--Message sending status: sending--> - <string name="status_sending">Sending…</string> - <!--Message sending status: failed--> - <!--<string name="status_failed">Failed. Tap to retry</string>--> - - <!-- Delivery Report Activity --> - <!-- Status in "Report" window --> - <string name="status_none">(None)</string> - <!-- Status in "Report" window --> - <string name="status_pending">Pending</string> - <!-- Status in "Report" window --> - <string name="status_read">Read</string> - <!-- Status in "Report" window --> - <string name="status_received">Received</string> - <!-- Status in "Report" window --> - <string name="status_failed">Failed. Tap for options</string> - <!-- Status in "Report" window --> - <string name="status_unread">Unread</string> - <!-- Status in "Report" window --> - <string name="status_rejected">Rejected</string> - <!-- Label in "Report" window --> - <string name="recipient_label">Recipient:\u0020</string> - <!-- Label in "Report" window --> - <string name="status_label">Status:\u0020</string> - <!-- Label in "Report" window [CHAR LIMIT=50]--> - <string name="delivered_label">Delivered:\u0020</string> - - <string name="do_something">Do something</string> - - <!-- Confirm Delete --> - <!-- Delete confirmation dialog title --> - <string name="confirm_dialog_title">Delete?</string> - <!-- Delete confirmation dialog title for locked messages --> - <string name="confirm_dialog_locked_title">Delete locked message?</string> - <!-- This message is displayed in a confirmation dialog when the user selects one or more - conversations and then taps the "Delete" button. --> - <plurals name="confirm_delete_conversation"> - <!-- Case of 1 result. --> - <item quantity="one">One conversation will be deleted.</item> - <!-- Case of 0 or 2 or more results. --> - <item quantity="other"><xliff:g id="number" example="15">%1$s</xliff:g> conversations will be deleted.</item> - </plurals> - <string name="confirm_delete_conversation">The entire thread will be deleted.</string> - <!-- Delete all threads confirmation dialog message --> - <string name="confirm_delete_all_conversations">All threads will be deleted.</string> - <!-- Delete message confirmation dialog message --> - <string name="confirm_delete_message">The message will be deleted.</string> - <!-- Delete message confirmation dialog message for a locked message --> - <string name="confirm_delete_locked_message">Delete this locked message?</string> - <!-- Delete all the messages on the SIM dialog message --> - <string name="confirm_delete_all_SIM_messages">All messages on the SIM card will be deleted.</string> - <!-- Delete the selected message on the SIM dialog message --> - <string name="confirm_delete_SIM_message">This message on the SIM card will be deleted.</string> - <!-- Delete unlocked checkbox title --> - <string name="delete_unlocked">Delete locked messages</string> - <!-- Delete button title --> - <string name="delete">Delete</string> - <!-- More button title --> - <string name="more">More</string> - <!-- More button summary --> - <string name="more_summary">Tap to see more</string> - <!-- Action bar mode title when multi-selecting conversations --> - <string name="select_conversations">Choose conversations</string> - <!-- Show this in the middle of the main activity when there are no conversations [CHAR LIMIT=none] --> - <string name="no_conversations">No conversations.</string> - <!-- Show this in the middle of the main activity when loading conversations [CHAR LIMIT=none] --> - <string name="loading_conversations">Loading conversations.</string> - <!-- Tells the user that QKSMS isn't the default SMS app --> - <string name="not_default">Default SMS</string> - <!-- Tells the user they need to set QKSMS as the default app in order to use this feature --> - <string name="default_info">QKSMS needs to be your SMS app to do that</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to mark messages as read --> - <string name="not_default_mark_read">QKSMS must be your SMS app to mark messages read</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to mark messages as unread --> - <string name="not_default_mark_unread">QKSMS must be your SMS app to mark messages unread</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to send messages --> - <string name="not_default_delete">QKSMS must be your SMS app to delete messages</string> - <!-- Tells the user they need to set QKSMS as the default messaging app in order to delete messages --> - <string name="not_default_send">QKSMS must be your SMS app to send messages</string> - <!-- Tells the user they should set QKSMS as the default messaging app --> - <string name="not_default_first">Some things won\'t work until QKSMS is the default SMS app</string> - <string name="delayed_messaging_info">Delayed messaging allows you to cancel messages before they send. Change the default behavior and more in Settings</string> - <string name="delayed_duration_bounds_error">Duration must be between 1 and 30 seconds</string> - - <!-- Dialog title for the Read Report dialog. --> - <string name="confirm">Confirm</string> - <!-- Dialog text for the Read Report dialog. --> - <string name="message_send_read_report">A read report will be sent.</string> - - <!-- Dialog title for updating app icon color --> - <string name="update_icon_title">Update icon color</string> - <!-- Dialog message for updating app icon color --> - <string name="update_icon_message">QKSMS must be restarted when changing the icon color</string> - - <string name="dialog_conversation_details_title">Conversation details</string> - <string name="dialog_conversation_details_last_message_date">Last message date</string> - <string name="dialog_conversation_details_message_count">Message count</string> - <string name="dialog_conversation_details_recipients">Recipients (%s)</string> - <string name="dialog_should_i_answer_title">Should I Answer? not installed</string> - <string name="dialog_should_i_answer_message">Would you like to download the app from Google Play now?</string> - <string name="dialog_delete_old_messages">Are you sure you want to automatically delete old messages?</string> - - <!-- Title for audio file picker --> - <string name="select_audio">Choose audio</string> - <!-- Menu title to copy an attachment to the shared storage [CHAR LIMIT=25] --> - <string name="copy_to_sdcard">Save attachment</string> - <!-- Toast message on successful copy to shared storage [CHAR LIMIT=30] --> - <string name="copy_to_sdcard_success">Attachment saved.</string> - <!-- Toast message on failed copy to shared storage [CHAR LIMIT=30] --> - <string name="copy_to_sdcard_fail">Couldn\'t save attachment.</string> - <!-- Menu title to save a sound as a ringtone --> - <string name="save_ringtone">Save as ringtone</string> - <!-- Toast message on successful copying ringtone to drm provider --> - <string name="saved_ringtone">Ringtone saved.</string> - <!-- Toast message on failed copying ringtone to drm provider --> - <string name="saved_ringtone_fail">Couldn\'t save ringtone.</string> - <!-- Menu item --> - <!-- Menu item [CHAR LIMIT=40] --> - <string name="menu_group_participants">Group participants</string> - - <!--Toast shown when a draft is saved--> - <string name="toast_draft">Saved draft</string> - <!--Toast shown when a conversation is deleted--> - <string name="toast_conversation_deleted">Conversation deleted</string> - <!--Toast shown when device is low on storage--> - <string name="toast_low_memory">"Phone storage is full. Delete some files to free space."</string> - <!--Toast shown to tell user that forwarding messages doesn't work yet--> - <string name="toast_forward">This feature has not yet been implemented. For now please use the Copy text option and paste that in the conversation you would like to send it</string> - <!--Toast shown for unimplemented features--> - <string name="toast_unimplemented">This feature has not yet been implemented</string> - <!--Toast shown when a message fails to send--> - <string name="toast_message_failure">Message failed to send</string> - <!--Toast shown when a message is delivered--> - <string name="toast_message_delivered">Message delivered</string> - <!--Toast shown when a message is not delivered--> - <string name="toast_message_not_delivered">Message not delivered</string> - <!--Toast shown when default APNs are loaded--> - <string name="toast_default_apns_loaded">Loaded default APN settings</string> - <!--Toast shown when text is copied to the clipboard--> - <string name="toast_copy_text">Copied text to clipboard</string> - <!--Toast shown when Google Play Services is not available for purchasing a product--> - <string name="toast_billing_not_available">Purchase requires Google Play Store (billing) on your Android</string> - <!--Toast shown when Google Play Services is not available for purchasing a product--> - <string name="toast_endlessjabber_not_installed">EndlessJabber is not installed, opening Google Play</string> - <string name="toast_changelog_error">Couldn\'t load the changelog. Please try again later</string> - <string name="toast_conversation_error">Couldn\'t open conversation</string> - <string name="toast_deleting_old_messages">Your old messages will be deleted shortly</string> - - <!--Toast shown to thank user for donating--> - <string name="thanks_1">Thank you for donating! You\'re my new best friend.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_2">Thanks for the donation! I love you.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_3">Thanks for donating! You\'re helping QKSMS become the best texting app ever made.</string> - <!--Toast shown to thank user for donating--> - <string name="thanks_4">Thanks for the donation! You\'re awesome.</string> - - <!--Menu option to mute conversation--> - <string name="menu_mute_conversation">Mute conversation</string> - <!--Menu option to mute conversation--> - <string name="menu_unmute_conversation">Unmute conversation</string> - <string name="menu_block_conversations">Block conversations</string> - <string name="menu_unblock_conversations">Unblock conversations</string> - <string name="menu_messages">Messages</string> - <string name="menu_blocked">Blocked</string> - <string name="menu_blocked_conversations">Blocked (%s new)</string> - <string name="menu_unblocked_conversations">Messages (%s new)</string> - <string name="menu_notifications">Notifications</string> - <string name="menu_notifications_off">Notifications off</string> - <string name="menu_notification_settings">Conversation settings</string> - <string name="menu_view_details">View details</string> - <string name="menu_mark_read">Mark read</string> - <string name="menu_mark_unread">Mark unread</string> - <string name="menu_delete_conversation">Delete conversation</string> - <string name="menu_multi_select">Select conversation</string> - <string name="menu_done">Done</string> - <string name="failed_message_title">Failed message options</string> - <!--Toast shown to tell the user that they don't have a photo attachments app, and suggests that they download one--> - <string name="attachment_app_not_found">Attachments app not found. Try installing a photo gallery app!</string> - <string name="attachment_camera_error">The camera could not be opened</string> - <string name="pref_max_mms_attachment_size">Maximum MMS attachment size</string> - <string name="error_no_recipients">Select some contacts to send this message to!</string> - <string name="error_file_not_found">QKSMS can\'t access the file you\'re trying to share!</string> - <string name="sending_blocked_welcome_screen_message">Hold up! You\'ll get to send real messages in a minute!</string> - <string name="notification_colored_icon_ready">Touch to add to your launcher from home screen.</string> - <string name="notification_title_colored_icon_ready">QKSMS colored icon is ready</string> - <string name="icon_ready">Your new icon is ready!</string> - <string name="icon_ready_message">You can now add it to your home screen again with the updated color.</string> - <string name="dont_ask_again">Don\'t ask again</string> - <string name="warning">Stagefright warning</string> - <string name="stagefright_warning">Video messages may contain a harmful exploit that can leave your phone vulnerable to attacks. Would you like to continue?</string> - - <!-- MMS DIALOG SETUP STRINGS --> - <string name="mms_setup_set_up_mms_title">Set up MMS?</string> - <string name="mms_setup_set_up_mms_body">It appears that MMS isn\'t set up in QKSMS. Press okay to automatically configure MMS.</string> - - <string name="mms_setup_setting_up_later_title">Setting up MMS later</string> - <string name="mms_setup_setting_up_later_body">Visit the MMS section of Settings to try automatic configuration, contact support, or enter your own configuration.</string> - - <string name="mms_setup_no_configurations_found_title">No configurations found</string> - <string name="mms_setup_no_configurations_found_body">We couldn\'t find an MMS configuration for your carrier automatically. Press okay to contact support. We\'ll help you get set up! </string> - - <string name="mms_setup_one_configuration_found_title">One configuration found</string> - <string name="mms_setup_one_configuration_found_body">We have found an MMS configuration for the %s carrier. Does that sound right?</string> - - <string name="mms_setup_multiple_configurations_found_title">Multiple configuration found</string> - <string name="mms_setup_multiple_configurations_found_body">We have found multiple MMS configurations. Choose your carrier from the list, or press N/A if your carrier isn\'t on the list.</string> - - <string name="mms_setup_next_steps_title">Next steps</string> - <string name="mms_setup_next_steps_body">Visit the MMS section of Settings to try automatic configuration again, contact support, or enter your own configuration.</string> - - <string name="mms_setup_success_title">Success!</string> - <string name="mms_setup_success_body">If you encounter any issues, visit the MMS section of Settings to try automatic configuration again, contact support, or enter your own configuration.</string> - - <string name="na">N/A</string> - <string name="no">No</string> - <string name="pref_automatically_configure_mms">Automatically Configure MMS</string> - <string name="pref_mms_contact_support">Contact Support</string> - <string name="pref_category_sending_mms">Sending MMS</string> - <string name="pref_category_mms_configuration">MMS Configuration</string> - <string name="pref_mms_contact_support_summary">Contact the QKSMS team for help setting up MMS</string> - <string name="pref_markdown_enabled">Text formatting</string> - <string name="pref_markdown_enabled_summary">Use markdown syntax to get bold, underline, and italics in your messages</string> - <string name="want_read_indicators">Want read indicators?</string> - - <string name="color_swatch_description">Color %1$d</string> - <string name="color_swatch_description_selected">Color %1$d selected</string> - <string name="color_picker_default_title">Select a Color</string> - - <string name="message_delivered">Message Delivered</string> - <string name="message_not_delivered">Message Not Delivered</string> - <string name="error">Error</string> - <string name="invalid_destination">Invalid destination address.</string> - <string name="service_not_activated">Service not activated on network.</string> - <string name="service_message_not_found">Message expired or not available.</string> - <string name="service_network_problem">Couldn\'t send due to network problem.</string> - <string name="message_queued">Currently can\'t send your message. It will be sent when the service becomes available.</string> - <string name="download_later">Can\'t download right now. Try again later.</string> - <string name="no_apn">No APN specified for the app, you need to set it up in settings!</string> - <string name="no_subject">(No subject)</string> - <string name="unknown_sender">Unknown sender</string> - <string name="dl_failure_notification">Couldn\'t download message <xliff:g id="subject">%1$s</xliff:g> from <xliff:g id="from">%2$s</xliff:g>.</string> - - <string name="auto_select_multiple_apns">Multiple different configurations have been found. Try one now. If it doesn\'t work, you can try a new one by going to Settings > Advanced > Load default APNs.</string> - <string name="auto_select_apn">Automatically Select APNs</string> - - <string name="auto_select_failed_title">Automatic configuration failed</string> - <string name="auto_select_failed">Try searching for your carrier\'s APN settings (MMSC, Port, and Proxy) and entering them in Settings > Advanced.</string> - <string name="date_yesterday">Yesterday</string> - <string name="date_just_now">Just now</string> - <string name="compose_loading_attachment">Loading attachment</string> - <string name="hint_no_messages">No messages yet.\nClick the + to send one!</string> - - <string-array name="resend_menu"> - <item>Resend</item> - <item>Edit</item> - <item>Delete</item> - </string-array> - - <string-array name="message_menu"> - <item>Forward message</item> - <item>Copy text</item> - <item>View details</item> - <item>Delete message</item> - </string-array> - - <string-array name="background_titles"> - <item>Material Light</item> - <item>Material Dark</item> - <item>Black</item> - </string-array> - - <string-array name="font_sizes"> - <item>Small</item> - <item>Normal</item> - <item>Large</item> - <item>Largest</item> - </string-array> - - <string-array name="font_families"> - <item>Roboto Regular</item> - <item>Roboto Condensed</item> - <item>System font</item> - </string-array> - - <string-array name="font_weights"> - <item>Light</item> - <item>Normal</item> - </string-array> - - <!-- String to match as no subject and filter out as a subject. For example, if the - subject string is "no subject", we won't display that. We'll pretend - no subject string was delivered. --> - <string-array name="empty_subject_strings"> - <item>no subject</item> - </string-array> - - <string-array name="qk_responses"> - <item>Okay</item> - <item>Give me a moment</item> - <item>On my way</item> - <item>Thanks</item> - <item>Sounds good</item> - <item>What\'s up?</item> - <item>Agreed</item> - <item>No</item> - <item>Love you</item> - <item>Sorry</item> - <item>LOL</item> - <item>That\'s okay</item> - </string-array> - - <string-array name="enter_button_options"> - <item>Show emoji</item> - <item>New line</item> - <item>Send message</item> - </string-array> - - <string-array name="notification_private_options"> - <item>Show all</item> - <item>Hide message</item> - <item>Hide message and sender</item> - </string-array> - - <!-- Max MMS attachment sizes. I.e. will compress pictures that are larger than 300 KB down to - under 300KB. --> - <string-array name="max_mms_attachment_sizes"> - <item>300 KB</item> - <item>600 KB</item> - <item>1 MB</item> - <item>Unlimited</item> - </string-array> -</resources> diff --git a/QKSMS/src/main/res/values/styles.xml b/QKSMS/src/main/res/values/styles.xml deleted file mode 100644 index a376f9c8f..000000000 --- a/QKSMS/src/main/res/values/styles.xml +++ /dev/null @@ -1,22 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<resources> - - <style name="TextPrimary"> - <item name="android:textColor">@color/theme_light_text_primary</item> - <item name="android:textSize">16sp</item> - <item name="type">primary</item> - </style> - - <style name="TextSecondary"> - <item name="android:textColor">@color/theme_light_text_secondary</item> - <item name="android:textSize">14sp</item> - <item name="type">secondary</item> - </style> - - <style name="TextTertiary"> - <item name="android:textColor">@color/theme_light_text_secondary</item> - <item name="android:textSize">12sp</item> - <item name="type">tertiary</item> - </style> - -</resources> diff --git a/QKSMS/src/main/res/values/themes.xml b/QKSMS/src/main/res/values/themes.xml deleted file mode 100644 index 31678b2c4..000000000 --- a/QKSMS/src/main/res/values/themes.xml +++ /dev/null @@ -1,85 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<resources> - - <!-- LIGHT THEME --> - - <style name="AppThemeLight" parent="AppBaseThemeLight" /> - - <style name="AppThemeLightDialog" parent="Theme.AppCompat.Light.Dialog"> - <item name="android:windowBackground">@android:color/transparent</item> - <item name="backgroundColor">@color/grey_light_mega_ultra</item> - <item name="android:windowNoTitle">true</item> - <item name="windowActionBar">false</item> - <item name="toolbarStyle">@style/ActionBarTheme</item> - </style> - - <!-- DARK THEME --> - - <style name="AppThemeDark" parent="AppBaseThemeDark" /> - - <style name="AppThemeDarkDialog" parent="Theme.AppCompat.Dialog"> - <item name="android:windowBackground">@android:color/transparent</item> - <item name="android:activatedBackgroundIndicator">@color/grey_dark</item> - <item name="backgroundColor">@color/grey_material</item> - <item name="android:windowNoTitle">true</item> - <item name="windowActionBar">false</item> - <item name="toolbarStyle">@style/ActionBarTheme</item> - </style> - - <!-- DARK AMOLED THEME --> - - <style name="AppThemeDarkAmoled" parent="AppThemeDark"> - <item name="android:windowBackground">@color/black</item> - <item name="backgroundColor">@color/grey_material</item> - </style> - - <style name="AppThemeDarkAmoledDialog" parent="AppThemeDarkDialog"> - <item name="android:windowBackground">@android:color/transparent</item> - <item name="backgroundColor">@color/black</item> - </style> - - <!-- BASE THEMES --> - - <style name="AppBaseThemeLight" parent="Theme.AppCompat.Light.DarkActionBar"> - <item name="actionBarPopupTheme">@style/PopupTheme</item> - <item name="android:windowNoTitle">true</item> - <item name="windowActionBar">false</item> - <item name="windowNoTitle">true</item> - <item name="toolbarStyle">@style/ActionBarTheme</item> - <item name="android:displayOptions">showCustom</item> - <item name="android:windowBackground">@color/grey_light_mega_ultra</item> - <item name="colorPrimary">@color/grey_material</item> - <item name="backgroundColor">@color/grey_light_mega_ultra</item> - <item name="android:windowIsTranslucent">true</item> - </style> - - <style name="AppBaseThemeDark" parent="Theme.AppCompat"> - <item name="actionBarPopupTheme">@style/PopupTheme</item> - <item name="android:windowNoTitle">true</item> - <item name="windowActionBar">false</item> - <item name="windowNoTitle">true</item> - <item name="actionBarStyle">@style/ActionBarTheme</item> - <item name="android:displayOptions">showCustom</item> - <item name="android:windowBackground">@color/grey_material</item> - <item name="colorPrimary">@color/grey_material</item> - <item name="backgroundColor">@color/grey_material</item> - <item name="android:windowIsTranslucent">true</item> - </style> - - <!-- OTHER THEMES --> - - <style name="ActionBarTheme" parent="Theme.AppCompat.Light.DarkActionBar"> - <item name="actionMenuTextColor">@color/text_primary_dark</item> - </style> - - <style name="PopupTheme" parent="ThemeOverlay.AppCompat"> - <item name="android:colorBackground">@color/grey_material</item> - <item name="android:textColor">@color/text_primary_dark</item> - </style> - - <style name="PopupThemeLight" parent="ThemeOverlay.AppCompat.Light"> - <item name="android:colorBackground">@color/grey_light_mega_ultra</item> - <item name="android:textColor">@color/text_primary_light</item> - </style> - -</resources> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml-mcc204-mnc4/mms_config.xml b/QKSMS/src/main/res/xml-mcc204-mnc4/mms_config.xml deleted file mode 100644 index 61d5952c4..000000000 --- a/QKSMS/src/main/res/xml-mcc204-mnc4/mms_config.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<mms_config version="4"> - <int name="maxMessageSize">1048576</int> - <int name="maxImageHeight">1944</int> - <int name="maxImageWidth">2592</int> - <string name="userAgent">Nexus5</string> - <string name="uaProfUrl">http://gsm.lge.com/html/gsm/Nexus5-M10.xml</string> -</mms_config> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml-mcc208-mnc1/mms_config.xml b/QKSMS/src/main/res/xml-mcc208-mnc1/mms_config.xml deleted file mode 100644 index 56794d835..000000000 --- a/QKSMS/src/main/res/xml-mcc208-mnc1/mms_config.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<mms_config version="4"> - <int name="maxMessageSize">614400</int> - <int name="maxImageHeight">1944</int> - <int name="maxImageWidth">2592</int> - <string name="userAgent">Nexus5</string> - <string name="uaProfUrl">http://gsm.lge.com/html/gsm/Nexus5-M6.xml</string> -</mms_config> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml-mcc208-mnc10/mms_config.xml b/QKSMS/src/main/res/xml-mcc208-mnc10/mms_config.xml deleted file mode 100644 index 56794d835..000000000 --- a/QKSMS/src/main/res/xml-mcc208-mnc10/mms_config.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<mms_config version="4"> - <int name="maxMessageSize">614400</int> - <int name="maxImageHeight">1944</int> - <int name="maxImageWidth">2592</int> - <string name="userAgent">Nexus5</string> - <string name="uaProfUrl">http://gsm.lge.com/html/gsm/Nexus5-M6.xml</string> -</mms_config> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml-mcc208-mnc15/mms_config.xml b/QKSMS/src/main/res/xml-mcc208-mnc15/mms_config.xml deleted file mode 100644 index 56794d835..000000000 --- a/QKSMS/src/main/res/xml-mcc208-mnc15/mms_config.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<mms_config version="4"> - <int name="maxMessageSize">614400</int> - <int name="maxImageHeight">1944</int> - <int name="maxImageWidth">2592</int> - <string name="userAgent">Nexus5</string> - <string name="uaProfUrl">http://gsm.lge.com/html/gsm/Nexus5-M6.xml</string> -</mms_config> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml-mcc208-mnc20/mms_config.xml b/QKSMS/src/main/res/xml-mcc208-mnc20/mms_config.xml deleted file mode 100644 index 56794d835..000000000 --- a/QKSMS/src/main/res/xml-mcc208-mnc20/mms_config.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<mms_config version="4"> - <int name="maxMessageSize">614400</int> - <int name="maxImageHeight">1944</int> - <int name="maxImageWidth">2592</int> - <string name="userAgent">Nexus5</string> - <string name="uaProfUrl">http://gsm.lge.com/html/gsm/Nexus5-M6.xml</string> -</mms_config> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml-mcc208-mnc26/mms_config.xml b/QKSMS/src/main/res/xml-mcc208-mnc26/mms_config.xml deleted file mode 100644 index 56794d835..000000000 --- a/QKSMS/src/main/res/xml-mcc208-mnc26/mms_config.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<mms_config version="4"> - <int name="maxMessageSize">614400</int> - <int name="maxImageHeight">1944</int> - <int name="maxImageWidth">2592</int> - <string name="userAgent">Nexus5</string> - <string name="uaProfUrl">http://gsm.lge.com/html/gsm/Nexus5-M6.xml</string> -</mms_config> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml-mcc214-mnc3/mms_config.xml b/QKSMS/src/main/res/xml-mcc214-mnc3/mms_config.xml deleted file mode 100644 index 61d5952c4..000000000 --- a/QKSMS/src/main/res/xml-mcc214-mnc3/mms_config.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<mms_config version="4"> - <int name="maxMessageSize">1048576</int> - <int name="maxImageHeight">1944</int> - <int name="maxImageWidth">2592</int> - <string name="userAgent">Nexus5</string> - <string name="uaProfUrl">http://gsm.lge.com/html/gsm/Nexus5-M10.xml</string> -</mms_config> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml-mcc214-mnc7/mms_config.xml b/QKSMS/src/main/res/xml-mcc214-mnc7/mms_config.xml deleted file mode 100644 index b147529a5..000000000 --- a/QKSMS/src/main/res/xml-mcc214-mnc7/mms_config.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<mms_config version="4"> - <int name="maxMessageSize">512000</int> - <int name="maxImageHeight">1944</int> - <int name="maxImageWidth">2592</int> - <string name="userAgent">Nexus5</string> - <string name="uaProfUrl">http://gsm.lge.com/html/gsm/Nexus5-M5.xml</string> -</mms_config> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml-mcc218-mnc5/mms_config.xml b/QKSMS/src/main/res/xml-mcc218-mnc5/mms_config.xml deleted file mode 100644 index 61d5952c4..000000000 --- a/QKSMS/src/main/res/xml-mcc218-mnc5/mms_config.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<mms_config version="4"> - <int name="maxMessageSize">1048576</int> - <int name="maxImageHeight">1944</int> - <int name="maxImageWidth">2592</int> - <string name="userAgent">Nexus5</string> - <string name="uaProfUrl">http://gsm.lge.com/html/gsm/Nexus5-M10.xml</string> -</mms_config> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml-mcc222-mnc1/mms_config.xml b/QKSMS/src/main/res/xml-mcc222-mnc1/mms_config.xml deleted file mode 100644 index 61d5952c4..000000000 --- a/QKSMS/src/main/res/xml-mcc222-mnc1/mms_config.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<mms_config version="4"> - <int name="maxMessageSize">1048576</int> - <int name="maxImageHeight">1944</int> - <int name="maxImageWidth">2592</int> - <string name="userAgent">Nexus5</string> - <string name="uaProfUrl">http://gsm.lge.com/html/gsm/Nexus5-M10.xml</string> -</mms_config> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml-mcc222-mnc8/mms_config.xml b/QKSMS/src/main/res/xml-mcc222-mnc8/mms_config.xml deleted file mode 100644 index 61d5952c4..000000000 --- a/QKSMS/src/main/res/xml-mcc222-mnc8/mms_config.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<mms_config version="4"> - <int name="maxMessageSize">1048576</int> - <int name="maxImageHeight">1944</int> - <int name="maxImageWidth">2592</int> - <string name="userAgent">Nexus5</string> - <string name="uaProfUrl">http://gsm.lge.com/html/gsm/Nexus5-M10.xml</string> -</mms_config> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml-mcc238-mnc2/mms_config.xml b/QKSMS/src/main/res/xml-mcc238-mnc2/mms_config.xml deleted file mode 100644 index d2df6a745..000000000 --- a/QKSMS/src/main/res/xml-mcc238-mnc2/mms_config.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<mms_config version="4"> - <int name="maxMessageSize">2097152</int> - <int name="maxImageHeight">1944</int> - <int name="maxImageWidth">2592</int> - <string name="userAgent">Nexus5</string> - <string name="uaProfUrl">http://gsm.lge.com/html/gsm/Nexus5-M20.xml</string> -</mms_config> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml-mcc240-mnc1/mms_config.xml b/QKSMS/src/main/res/xml-mcc240-mnc1/mms_config.xml deleted file mode 100644 index 56794d835..000000000 --- a/QKSMS/src/main/res/xml-mcc240-mnc1/mms_config.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<mms_config version="4"> - <int name="maxMessageSize">614400</int> - <int name="maxImageHeight">1944</int> - <int name="maxImageWidth">2592</int> - <string name="userAgent">Nexus5</string> - <string name="uaProfUrl">http://gsm.lge.com/html/gsm/Nexus5-M6.xml</string> -</mms_config> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml-mcc240-mnc24/mms_config.xml b/QKSMS/src/main/res/xml-mcc240-mnc24/mms_config.xml deleted file mode 100644 index 56794d835..000000000 --- a/QKSMS/src/main/res/xml-mcc240-mnc24/mms_config.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<mms_config version="4"> - <int name="maxMessageSize">614400</int> - <int name="maxImageHeight">1944</int> - <int name="maxImageWidth">2592</int> - <string name="userAgent">Nexus5</string> - <string name="uaProfUrl">http://gsm.lge.com/html/gsm/Nexus5-M6.xml</string> -</mms_config> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml-mcc240-mnc4/mms_config.xml b/QKSMS/src/main/res/xml-mcc240-mnc4/mms_config.xml deleted file mode 100644 index 56794d835..000000000 --- a/QKSMS/src/main/res/xml-mcc240-mnc4/mms_config.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<mms_config version="4"> - <int name="maxMessageSize">614400</int> - <int name="maxImageHeight">1944</int> - <int name="maxImageWidth">2592</int> - <string name="userAgent">Nexus5</string> - <string name="uaProfUrl">http://gsm.lge.com/html/gsm/Nexus5-M6.xml</string> -</mms_config> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml-mcc240-mnc8/mms_config.xml b/QKSMS/src/main/res/xml-mcc240-mnc8/mms_config.xml deleted file mode 100644 index 56794d835..000000000 --- a/QKSMS/src/main/res/xml-mcc240-mnc8/mms_config.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<mms_config version="4"> - <int name="maxMessageSize">614400</int> - <int name="maxImageHeight">1944</int> - <int name="maxImageWidth">2592</int> - <string name="userAgent">Nexus5</string> - <string name="uaProfUrl">http://gsm.lge.com/html/gsm/Nexus5-M6.xml</string> -</mms_config> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml-mcc242-mnc1/mms_config.xml b/QKSMS/src/main/res/xml-mcc242-mnc1/mms_config.xml deleted file mode 100644 index d2df6a745..000000000 --- a/QKSMS/src/main/res/xml-mcc242-mnc1/mms_config.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<mms_config version="4"> - <int name="maxMessageSize">2097152</int> - <int name="maxImageHeight">1944</int> - <int name="maxImageWidth">2592</int> - <string name="userAgent">Nexus5</string> - <string name="uaProfUrl">http://gsm.lge.com/html/gsm/Nexus5-M20.xml</string> -</mms_config> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml-mcc242-mnc2/mms_config.xml b/QKSMS/src/main/res/xml-mcc242-mnc2/mms_config.xml deleted file mode 100644 index 56794d835..000000000 --- a/QKSMS/src/main/res/xml-mcc242-mnc2/mms_config.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<mms_config version="4"> - <int name="maxMessageSize">614400</int> - <int name="maxImageHeight">1944</int> - <int name="maxImageWidth">2592</int> - <string name="userAgent">Nexus5</string> - <string name="uaProfUrl">http://gsm.lge.com/html/gsm/Nexus5-M6.xml</string> -</mms_config> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml-mcc262-mnc7/mms_config.xml b/QKSMS/src/main/res/xml-mcc262-mnc7/mms_config.xml deleted file mode 100644 index 56794d835..000000000 --- a/QKSMS/src/main/res/xml-mcc262-mnc7/mms_config.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<mms_config version="4"> - <int name="maxMessageSize">614400</int> - <int name="maxImageHeight">1944</int> - <int name="maxImageWidth">2592</int> - <string name="userAgent">Nexus5</string> - <string name="uaProfUrl">http://gsm.lge.com/html/gsm/Nexus5-M6.xml</string> -</mms_config> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml-mcc274-mnc2/mms_config.xml b/QKSMS/src/main/res/xml-mcc274-mnc2/mms_config.xml deleted file mode 100644 index 61d5952c4..000000000 --- a/QKSMS/src/main/res/xml-mcc274-mnc2/mms_config.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<mms_config version="4"> - <int name="maxMessageSize">1048576</int> - <int name="maxImageHeight">1944</int> - <int name="maxImageWidth">2592</int> - <string name="userAgent">Nexus5</string> - <string name="uaProfUrl">http://gsm.lge.com/html/gsm/Nexus5-M10.xml</string> -</mms_config> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml-mcc274-mnc3/mms_config.xml b/QKSMS/src/main/res/xml-mcc274-mnc3/mms_config.xml deleted file mode 100644 index 61d5952c4..000000000 --- a/QKSMS/src/main/res/xml-mcc274-mnc3/mms_config.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<mms_config version="4"> - <int name="maxMessageSize">1048576</int> - <int name="maxImageHeight">1944</int> - <int name="maxImageWidth">2592</int> - <string name="userAgent">Nexus5</string> - <string name="uaProfUrl">http://gsm.lge.com/html/gsm/Nexus5-M10.xml</string> -</mms_config> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml-mcc286-mnc1/mms_config.xml b/QKSMS/src/main/res/xml-mcc286-mnc1/mms_config.xml deleted file mode 100644 index b147529a5..000000000 --- a/QKSMS/src/main/res/xml-mcc286-mnc1/mms_config.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<mms_config version="4"> - <int name="maxMessageSize">512000</int> - <int name="maxImageHeight">1944</int> - <int name="maxImageWidth">2592</int> - <string name="userAgent">Nexus5</string> - <string name="uaProfUrl">http://gsm.lge.com/html/gsm/Nexus5-M5.xml</string> -</mms_config> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml-mcc286-mnc3/mms_config.xml b/QKSMS/src/main/res/xml-mcc286-mnc3/mms_config.xml deleted file mode 100644 index b147529a5..000000000 --- a/QKSMS/src/main/res/xml-mcc286-mnc3/mms_config.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<mms_config version="4"> - <int name="maxMessageSize">512000</int> - <int name="maxImageHeight">1944</int> - <int name="maxImageWidth">2592</int> - <string name="userAgent">Nexus5</string> - <string name="uaProfUrl">http://gsm.lge.com/html/gsm/Nexus5-M5.xml</string> -</mms_config> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml-mcc294-mnc1/mms_config.xml b/QKSMS/src/main/res/xml-mcc294-mnc1/mms_config.xml deleted file mode 100644 index cd34f34a4..000000000 --- a/QKSMS/src/main/res/xml-mcc294-mnc1/mms_config.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<mms_config version="4"> - <int name="maxMessageSize">102400</int> - <int name="maxImageHeight">1944</int> - <int name="maxImageWidth">2592</int> - <string name="userAgent">Nexus5</string> - <string name="uaProfUrl">http://gsm.lge.com/html/gsm/Nexus5-M3.xml</string> -</mms_config> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml-mcc294-mnc2/mms_config.xml b/QKSMS/src/main/res/xml-mcc294-mnc2/mms_config.xml deleted file mode 100644 index 59dc23778..000000000 --- a/QKSMS/src/main/res/xml-mcc294-mnc2/mms_config.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<mms_config version="4"> - <int name="maxMessageSize">131072</int> - <int name="maxImageHeight">1944</int> - <int name="maxImageWidth">2592</int> - <string name="userAgent">Nexus5</string> - <string name="uaProfUrl">http://gsm.lge.com/html/gsm/Nexus5-M3.xml</string> -</mms_config> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml-mcc294-mnc3/mms_config.xml b/QKSMS/src/main/res/xml-mcc294-mnc3/mms_config.xml deleted file mode 100644 index 331fa1861..000000000 --- a/QKSMS/src/main/res/xml-mcc294-mnc3/mms_config.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<mms_config version="4"> - <int name="maxMessageSize">256000</int> - <int name="maxImageHeight">1944</int> - <int name="maxImageWidth">2592</int> - <string name="userAgent">Nexus5</string> - <string name="uaProfUrl">http://gsm.lge.com/html/gsm/Nexus5-M3.xml</string> -</mms_config> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml-mcc302-mnc220/mms_config.xml b/QKSMS/src/main/res/xml-mcc302-mnc220/mms_config.xml deleted file mode 100644 index 61d5952c4..000000000 --- a/QKSMS/src/main/res/xml-mcc302-mnc220/mms_config.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<mms_config version="4"> - <int name="maxMessageSize">1048576</int> - <int name="maxImageHeight">1944</int> - <int name="maxImageWidth">2592</int> - <string name="userAgent">Nexus5</string> - <string name="uaProfUrl">http://gsm.lge.com/html/gsm/Nexus5-M10.xml</string> -</mms_config> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml-mcc302-mnc221/mms_config.xml b/QKSMS/src/main/res/xml-mcc302-mnc221/mms_config.xml deleted file mode 100644 index 61d5952c4..000000000 --- a/QKSMS/src/main/res/xml-mcc302-mnc221/mms_config.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<mms_config version="4"> - <int name="maxMessageSize">1048576</int> - <int name="maxImageHeight">1944</int> - <int name="maxImageWidth">2592</int> - <string name="userAgent">Nexus5</string> - <string name="uaProfUrl">http://gsm.lge.com/html/gsm/Nexus5-M10.xml</string> -</mms_config> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml-mcc302-mnc270/mms_config.xml b/QKSMS/src/main/res/xml-mcc302-mnc270/mms_config.xml deleted file mode 100644 index 864d0792a..000000000 --- a/QKSMS/src/main/res/xml-mcc302-mnc270/mms_config.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<mms_config version="4"> - <int name="maxMessageSize">819200</int> - <int name="maxImageHeight">1944</int> - <int name="maxImageWidth">2592</int> - <string name="userAgent">Nexus5</string> - <string name="uaProfUrl">http://gsm.lge.com/html/gsm/Nexus5-M8.xml</string> -</mms_config> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml-mcc302-mnc290/mms_config.xml b/QKSMS/src/main/res/xml-mcc302-mnc290/mms_config.xml deleted file mode 100644 index 61d5952c4..000000000 --- a/QKSMS/src/main/res/xml-mcc302-mnc290/mms_config.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<mms_config version="4"> - <int name="maxMessageSize">1048576</int> - <int name="maxImageHeight">1944</int> - <int name="maxImageWidth">2592</int> - <string name="userAgent">Nexus5</string> - <string name="uaProfUrl">http://gsm.lge.com/html/gsm/Nexus5-M10.xml</string> -</mms_config> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml-mcc302-mnc370/mms_config.xml b/QKSMS/src/main/res/xml-mcc302-mnc370/mms_config.xml deleted file mode 100644 index 61d5952c4..000000000 --- a/QKSMS/src/main/res/xml-mcc302-mnc370/mms_config.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<mms_config version="4"> - <int name="maxMessageSize">1048576</int> - <int name="maxImageHeight">1944</int> - <int name="maxImageWidth">2592</int> - <string name="userAgent">Nexus5</string> - <string name="uaProfUrl">http://gsm.lge.com/html/gsm/Nexus5-M10.xml</string> -</mms_config> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml-mcc302-mnc490/mms_config.xml b/QKSMS/src/main/res/xml-mcc302-mnc490/mms_config.xml deleted file mode 100644 index 61d5952c4..000000000 --- a/QKSMS/src/main/res/xml-mcc302-mnc490/mms_config.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<mms_config version="4"> - <int name="maxMessageSize">1048576</int> - <int name="maxImageHeight">1944</int> - <int name="maxImageWidth">2592</int> - <string name="userAgent">Nexus5</string> - <string name="uaProfUrl">http://gsm.lge.com/html/gsm/Nexus5-M10.xml</string> -</mms_config> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml-mcc302-mnc500/mms_config.xml b/QKSMS/src/main/res/xml-mcc302-mnc500/mms_config.xml deleted file mode 100644 index 61d5952c4..000000000 --- a/QKSMS/src/main/res/xml-mcc302-mnc500/mms_config.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<mms_config version="4"> - <int name="maxMessageSize">1048576</int> - <int name="maxImageHeight">1944</int> - <int name="maxImageWidth">2592</int> - <string name="userAgent">Nexus5</string> - <string name="uaProfUrl">http://gsm.lge.com/html/gsm/Nexus5-M10.xml</string> -</mms_config> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml-mcc302-mnc510/mms_config.xml b/QKSMS/src/main/res/xml-mcc302-mnc510/mms_config.xml deleted file mode 100644 index 61d5952c4..000000000 --- a/QKSMS/src/main/res/xml-mcc302-mnc510/mms_config.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<mms_config version="4"> - <int name="maxMessageSize">1048576</int> - <int name="maxImageHeight">1944</int> - <int name="maxImageWidth">2592</int> - <string name="userAgent">Nexus5</string> - <string name="uaProfUrl">http://gsm.lge.com/html/gsm/Nexus5-M10.xml</string> -</mms_config> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml-mcc302-mnc610/mms_config.xml b/QKSMS/src/main/res/xml-mcc302-mnc610/mms_config.xml deleted file mode 100644 index 56794d835..000000000 --- a/QKSMS/src/main/res/xml-mcc302-mnc610/mms_config.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<mms_config version="4"> - <int name="maxMessageSize">614400</int> - <int name="maxImageHeight">1944</int> - <int name="maxImageWidth">2592</int> - <string name="userAgent">Nexus5</string> - <string name="uaProfUrl">http://gsm.lge.com/html/gsm/Nexus5-M6.xml</string> -</mms_config> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml-mcc302-mnc660/mms_config.xml b/QKSMS/src/main/res/xml-mcc302-mnc660/mms_config.xml deleted file mode 100644 index 61d5952c4..000000000 --- a/QKSMS/src/main/res/xml-mcc302-mnc660/mms_config.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<mms_config version="4"> - <int name="maxMessageSize">1048576</int> - <int name="maxImageHeight">1944</int> - <int name="maxImageWidth">2592</int> - <string name="userAgent">Nexus5</string> - <string name="uaProfUrl">http://gsm.lge.com/html/gsm/Nexus5-M10.xml</string> -</mms_config> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml-mcc302-mnc720/mms_config.xml b/QKSMS/src/main/res/xml-mcc302-mnc720/mms_config.xml deleted file mode 100644 index 61d5952c4..000000000 --- a/QKSMS/src/main/res/xml-mcc302-mnc720/mms_config.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<mms_config version="4"> - <int name="maxMessageSize">1048576</int> - <int name="maxImageHeight">1944</int> - <int name="maxImageWidth">2592</int> - <string name="userAgent">Nexus5</string> - <string name="uaProfUrl">http://gsm.lge.com/html/gsm/Nexus5-M10.xml</string> -</mms_config> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml-mcc302-mnc780/mms_config.xml b/QKSMS/src/main/res/xml-mcc302-mnc780/mms_config.xml deleted file mode 100644 index 56794d835..000000000 --- a/QKSMS/src/main/res/xml-mcc302-mnc780/mms_config.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<mms_config version="4"> - <int name="maxMessageSize">614400</int> - <int name="maxImageHeight">1944</int> - <int name="maxImageWidth">2592</int> - <string name="userAgent">Nexus5</string> - <string name="uaProfUrl">http://gsm.lge.com/html/gsm/Nexus5-M6.xml</string> -</mms_config> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml-mcc310-mnc10/mms_config.xml b/QKSMS/src/main/res/xml-mcc310-mnc10/mms_config.xml deleted file mode 100644 index b1d261577..000000000 --- a/QKSMS/src/main/res/xml-mcc310-mnc10/mms_config.xml +++ /dev/null @@ -1,16 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<mms_config version="4"> - <int name="maxMessageSize">1048576</int> - <int name="maxImageHeight">1944</int> - <int name="maxImageWidth">2592</int> - <bool name="enableMultipartSMS">false</bool> - <bool name="sendMultipartSmsAsSeparateMessages">true</bool> - <bool name="enableSlideDuration">false</bool> - <int name="maxMessageTextSize">-1</int> - <bool name="enableMMSReadReports">false</bool> - <bool name="enableSMSDeliveryReports">false</bool> - <bool name="enableMMSDeliveryReports">false</bool> - <string name="userAgent">Nexus5</string> - <string name="uaProfUrl">http://gsm.lge.com/html/gsm/Nexus5-M10.xml</string> - <bool name="supportMmsContentDisposition">false</bool> -</mms_config> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml-mcc310-mnc120/mms_config.xml b/QKSMS/src/main/res/xml-mcc310-mnc120/mms_config.xml deleted file mode 100644 index bf1e17f3e..000000000 --- a/QKSMS/src/main/res/xml-mcc310-mnc120/mms_config.xml +++ /dev/null @@ -1,23 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<mms_config version="4"> - <int name="maxMessageSize">1048576</int> - <int name="maxImageHeight">1944</int> - <int name="maxImageWidth">2592</int> - <bool name="enableMultipartSMS">false</bool> - <bool name="sendMultipartSmsAsSeparateMessages">true</bool> - <bool name="enableSlideDuration">false</bool> - <int name="maxMessageTextSize">-1</int> - <bool name="enableMMSReadReports">false</bool> - <bool name="enableSMSDeliveryReports">false</bool> - <bool name="enableMMSDeliveryReports">false</bool> - <string name="httpParams">X-MDN: ##LINE1##|Proxy-Authorization: Basic ##NAI##</string> - <string name="httpParamsLine1Key">##LINE1##</string> - <string name="httpParamsNaiKey">##NAI##</string> - <string name="naiSuffix">:pcs</string> - <string name="userAgent">Nexus5</string> - <string name="uaProfUrl">http://gsm.lge.com/html/gsm/Nexus5-M20.xml</string> - <string name="mmsc">http://mms.sprintpcs.com</string> - <string name="mmsproxy">68.28.31.7</string> - <string name="mmsport">80</string> - <bool name="supportMmsContentDisposition">false</bool> -</mms_config> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml-mcc310-mnc150/mms_config.xml b/QKSMS/src/main/res/xml-mcc310-mnc150/mms_config.xml deleted file mode 100644 index 61d5952c4..000000000 --- a/QKSMS/src/main/res/xml-mcc310-mnc150/mms_config.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<mms_config version="4"> - <int name="maxMessageSize">1048576</int> - <int name="maxImageHeight">1944</int> - <int name="maxImageWidth">2592</int> - <string name="userAgent">Nexus5</string> - <string name="uaProfUrl">http://gsm.lge.com/html/gsm/Nexus5-M10.xml</string> -</mms_config> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml-mcc310-mnc170/mms_config.xml b/QKSMS/src/main/res/xml-mcc310-mnc170/mms_config.xml deleted file mode 100644 index 6312dffc8..000000000 --- a/QKSMS/src/main/res/xml-mcc310-mnc170/mms_config.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<mms_config version="3"> - <int name="maxMessageSize">1048576</int> - <int name="maxImageHeight">1944</int> - <int name="maxImageWidth">2592</int> - <string name="userAgent">Nexus5</string> - <string name="uaProfUrl">http://gsm.lge.com/html/gsm/Nexus5-M10.xml</string> -</mms_config> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml-mcc310-mnc26/mms_config.xml b/QKSMS/src/main/res/xml-mcc310-mnc26/mms_config.xml deleted file mode 100644 index 6312dffc8..000000000 --- a/QKSMS/src/main/res/xml-mcc310-mnc26/mms_config.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<mms_config version="3"> - <int name="maxMessageSize">1048576</int> - <int name="maxImageHeight">1944</int> - <int name="maxImageWidth">2592</int> - <string name="userAgent">Nexus5</string> - <string name="uaProfUrl">http://gsm.lge.com/html/gsm/Nexus5-M10.xml</string> -</mms_config> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml-mcc310-mnc260/mms_config.xml b/QKSMS/src/main/res/xml-mcc310-mnc260/mms_config.xml deleted file mode 100644 index 6312dffc8..000000000 --- a/QKSMS/src/main/res/xml-mcc310-mnc260/mms_config.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<mms_config version="3"> - <int name="maxMessageSize">1048576</int> - <int name="maxImageHeight">1944</int> - <int name="maxImageWidth">2592</int> - <string name="userAgent">Nexus5</string> - <string name="uaProfUrl">http://gsm.lge.com/html/gsm/Nexus5-M10.xml</string> -</mms_config> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml-mcc310-mnc380/mms_config.xml b/QKSMS/src/main/res/xml-mcc310-mnc380/mms_config.xml deleted file mode 100644 index 842de9f7e..000000000 --- a/QKSMS/src/main/res/xml-mcc310-mnc380/mms_config.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<mms_config version="3"> - <int name="maxMessageSize">614400</int> - <int name="maxImageHeight">1944</int> - <int name="maxImageWidth">2592</int> - <string name="userAgent">Nexus5</string> - <string name="uaProfUrl">http://gsm.lge.com/html/gsm/Nexus5-M10.xml</string> -</mms_config> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml-mcc310-mnc410/mms_config.xml b/QKSMS/src/main/res/xml-mcc310-mnc410/mms_config.xml deleted file mode 100644 index 6312dffc8..000000000 --- a/QKSMS/src/main/res/xml-mcc310-mnc410/mms_config.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<mms_config version="3"> - <int name="maxMessageSize">1048576</int> - <int name="maxImageHeight">1944</int> - <int name="maxImageWidth">2592</int> - <string name="userAgent">Nexus5</string> - <string name="uaProfUrl">http://gsm.lge.com/html/gsm/Nexus5-M10.xml</string> -</mms_config> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml-mcc310-mnc420/mms_config.xml b/QKSMS/src/main/res/xml-mcc310-mnc420/mms_config.xml deleted file mode 100644 index 61d5952c4..000000000 --- a/QKSMS/src/main/res/xml-mcc310-mnc420/mms_config.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<mms_config version="4"> - <int name="maxMessageSize">1048576</int> - <int name="maxImageHeight">1944</int> - <int name="maxImageWidth">2592</int> - <string name="userAgent">Nexus5</string> - <string name="uaProfUrl">http://gsm.lge.com/html/gsm/Nexus5-M10.xml</string> -</mms_config> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml-mcc310-mnc450/mms_config.xml b/QKSMS/src/main/res/xml-mcc310-mnc450/mms_config.xml deleted file mode 100644 index 61d5952c4..000000000 --- a/QKSMS/src/main/res/xml-mcc310-mnc450/mms_config.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<mms_config version="4"> - <int name="maxMessageSize">1048576</int> - <int name="maxImageHeight">1944</int> - <int name="maxImageWidth">2592</int> - <string name="userAgent">Nexus5</string> - <string name="uaProfUrl">http://gsm.lge.com/html/gsm/Nexus5-M10.xml</string> -</mms_config> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml-mcc310-mnc490/mms_config.xml b/QKSMS/src/main/res/xml-mcc310-mnc490/mms_config.xml deleted file mode 100644 index 6312dffc8..000000000 --- a/QKSMS/src/main/res/xml-mcc310-mnc490/mms_config.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<mms_config version="3"> - <int name="maxMessageSize">1048576</int> - <int name="maxImageHeight">1944</int> - <int name="maxImageWidth">2592</int> - <string name="userAgent">Nexus5</string> - <string name="uaProfUrl">http://gsm.lge.com/html/gsm/Nexus5-M10.xml</string> -</mms_config> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml-mcc310-mnc560/mms_config.xml b/QKSMS/src/main/res/xml-mcc310-mnc560/mms_config.xml deleted file mode 100644 index 842de9f7e..000000000 --- a/QKSMS/src/main/res/xml-mcc310-mnc560/mms_config.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<mms_config version="3"> - <int name="maxMessageSize">614400</int> - <int name="maxImageHeight">1944</int> - <int name="maxImageWidth">2592</int> - <string name="userAgent">Nexus5</string> - <string name="uaProfUrl">http://gsm.lge.com/html/gsm/Nexus5-M10.xml</string> -</mms_config> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml-mcc310-mnc680/mms_config.xml b/QKSMS/src/main/res/xml-mcc310-mnc680/mms_config.xml deleted file mode 100644 index 842de9f7e..000000000 --- a/QKSMS/src/main/res/xml-mcc310-mnc680/mms_config.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<mms_config version="3"> - <int name="maxMessageSize">614400</int> - <int name="maxImageHeight">1944</int> - <int name="maxImageWidth">2592</int> - <string name="userAgent">Nexus5</string> - <string name="uaProfUrl">http://gsm.lge.com/html/gsm/Nexus5-M10.xml</string> -</mms_config> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml-mcc310-mnc770/mms_config.xml b/QKSMS/src/main/res/xml-mcc310-mnc770/mms_config.xml deleted file mode 100644 index 61d5952c4..000000000 --- a/QKSMS/src/main/res/xml-mcc310-mnc770/mms_config.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<mms_config version="4"> - <int name="maxMessageSize">1048576</int> - <int name="maxImageHeight">1944</int> - <int name="maxImageWidth">2592</int> - <string name="userAgent">Nexus5</string> - <string name="uaProfUrl">http://gsm.lge.com/html/gsm/Nexus5-M10.xml</string> -</mms_config> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml-mcc310-mnc90/mms_config.xml b/QKSMS/src/main/res/xml-mcc310-mnc90/mms_config.xml deleted file mode 100644 index 842de9f7e..000000000 --- a/QKSMS/src/main/res/xml-mcc310-mnc90/mms_config.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<mms_config version="3"> - <int name="maxMessageSize">614400</int> - <int name="maxImageHeight">1944</int> - <int name="maxImageWidth">2592</int> - <string name="userAgent">Nexus5</string> - <string name="uaProfUrl">http://gsm.lge.com/html/gsm/Nexus5-M10.xml</string> -</mms_config> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml-mcc310-mnc980/mms_config.xml b/QKSMS/src/main/res/xml-mcc310-mnc980/mms_config.xml deleted file mode 100644 index 61d5952c4..000000000 --- a/QKSMS/src/main/res/xml-mcc310-mnc980/mms_config.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<mms_config version="4"> - <int name="maxMessageSize">1048576</int> - <int name="maxImageHeight">1944</int> - <int name="maxImageWidth">2592</int> - <string name="userAgent">Nexus5</string> - <string name="uaProfUrl">http://gsm.lge.com/html/gsm/Nexus5-M10.xml</string> -</mms_config> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml-mcc311-mnc180/mms_config.xml b/QKSMS/src/main/res/xml-mcc311-mnc180/mms_config.xml deleted file mode 100644 index 61d5952c4..000000000 --- a/QKSMS/src/main/res/xml-mcc311-mnc180/mms_config.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<mms_config version="4"> - <int name="maxMessageSize">1048576</int> - <int name="maxImageHeight">1944</int> - <int name="maxImageWidth">2592</int> - <string name="userAgent">Nexus5</string> - <string name="uaProfUrl">http://gsm.lge.com/html/gsm/Nexus5-M10.xml</string> -</mms_config> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml-mcc311-mnc370/mms_config.xml b/QKSMS/src/main/res/xml-mcc311-mnc370/mms_config.xml deleted file mode 100644 index 61d5952c4..000000000 --- a/QKSMS/src/main/res/xml-mcc311-mnc370/mms_config.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<mms_config version="4"> - <int name="maxMessageSize">1048576</int> - <int name="maxImageHeight">1944</int> - <int name="maxImageWidth">2592</int> - <string name="userAgent">Nexus5</string> - <string name="uaProfUrl">http://gsm.lge.com/html/gsm/Nexus5-M10.xml</string> -</mms_config> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml-mcc311-mnc480/mms_config.xml b/QKSMS/src/main/res/xml-mcc311-mnc480/mms_config.xml deleted file mode 100644 index d5228db1b..000000000 --- a/QKSMS/src/main/res/xml-mcc311-mnc480/mms_config.xml +++ /dev/null @@ -1,21 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<mms_config version="2"> - <bool name="enabledTransID">true</bool> - <bool name="enabledNotifyWapMMSC">true</bool> - <int name="maxMessageSize">1258291</int> - <string name="uaProfTagName">Profile</string> - <int name="recipientLimit">20</int> - <string name="httpParams">x-up-calling-line-id: 1##LINE1##|X-VzW-MDN: 1##LINE1##</string> - <string name="httpParamsLine1Key">##LINE1##</string> - <int name="maxImageHeight">1944</int> - <int name="maxImageWidth">2592</int> - <string name="emailGatewayNumber">6245</string> - <bool name="aliasEnabled">true</bool> - <int name="aliasMinChars">2</int> - <int name="aliasMaxChars">48</int> - <bool name="allowAttachAudio">false</bool> - <bool name="enableMMSReadReports">false</bool> - <int name="maxSubjectLength">80</int> - <bool name="enableMultipartSMS">true</bool> - <int name="smsToMmsTextThreshold">7</int> -</mms_config> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml-mcc311-mnc490/mms_config.xml b/QKSMS/src/main/res/xml-mcc311-mnc490/mms_config.xml deleted file mode 100644 index b1d261577..000000000 --- a/QKSMS/src/main/res/xml-mcc311-mnc490/mms_config.xml +++ /dev/null @@ -1,16 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<mms_config version="4"> - <int name="maxMessageSize">1048576</int> - <int name="maxImageHeight">1944</int> - <int name="maxImageWidth">2592</int> - <bool name="enableMultipartSMS">false</bool> - <bool name="sendMultipartSmsAsSeparateMessages">true</bool> - <bool name="enableSlideDuration">false</bool> - <int name="maxMessageTextSize">-1</int> - <bool name="enableMMSReadReports">false</bool> - <bool name="enableSMSDeliveryReports">false</bool> - <bool name="enableMMSDeliveryReports">false</bool> - <string name="userAgent">Nexus5</string> - <string name="uaProfUrl">http://gsm.lge.com/html/gsm/Nexus5-M10.xml</string> - <bool name="supportMmsContentDisposition">false</bool> -</mms_config> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml-mcc311-mnc870/mms_config.xml b/QKSMS/src/main/res/xml-mcc311-mnc870/mms_config.xml deleted file mode 100644 index b1d261577..000000000 --- a/QKSMS/src/main/res/xml-mcc311-mnc870/mms_config.xml +++ /dev/null @@ -1,16 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<mms_config version="4"> - <int name="maxMessageSize">1048576</int> - <int name="maxImageHeight">1944</int> - <int name="maxImageWidth">2592</int> - <bool name="enableMultipartSMS">false</bool> - <bool name="sendMultipartSmsAsSeparateMessages">true</bool> - <bool name="enableSlideDuration">false</bool> - <int name="maxMessageTextSize">-1</int> - <bool name="enableMMSReadReports">false</bool> - <bool name="enableSMSDeliveryReports">false</bool> - <bool name="enableMMSDeliveryReports">false</bool> - <string name="userAgent">Nexus5</string> - <string name="uaProfUrl">http://gsm.lge.com/html/gsm/Nexus5-M10.xml</string> - <bool name="supportMmsContentDisposition">false</bool> -</mms_config> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml-mcc334-mnc20/mms_config.xml b/QKSMS/src/main/res/xml-mcc334-mnc20/mms_config.xml deleted file mode 100644 index 61d5952c4..000000000 --- a/QKSMS/src/main/res/xml-mcc334-mnc20/mms_config.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<mms_config version="4"> - <int name="maxMessageSize">1048576</int> - <int name="maxImageHeight">1944</int> - <int name="maxImageWidth">2592</int> - <string name="userAgent">Nexus5</string> - <string name="uaProfUrl">http://gsm.lge.com/html/gsm/Nexus5-M10.xml</string> -</mms_config> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml-mcc418-mnc20/mms_config.xml b/QKSMS/src/main/res/xml-mcc418-mnc20/mms_config.xml deleted file mode 100644 index de6f0473f..000000000 --- a/QKSMS/src/main/res/xml-mcc418-mnc20/mms_config.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<mms_config version="4"> - <int name="maxMessageSize">153600</int> - <int name="maxImageHeight">1944</int> - <int name="maxImageWidth">2592</int> - <string name="userAgent">Nexus5</string> - <string name="uaProfUrl">http://gsm.lge.com/html/gsm/Nexus5-M3.xml</string> -</mms_config> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml-mcc418-mnc30/mms_config.xml b/QKSMS/src/main/res/xml-mcc418-mnc30/mms_config.xml deleted file mode 100644 index de6f0473f..000000000 --- a/QKSMS/src/main/res/xml-mcc418-mnc30/mms_config.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<mms_config version="4"> - <int name="maxMessageSize">153600</int> - <int name="maxImageHeight">1944</int> - <int name="maxImageWidth">2592</int> - <string name="userAgent">Nexus5</string> - <string name="uaProfUrl">http://gsm.lge.com/html/gsm/Nexus5-M3.xml</string> -</mms_config> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml-mcc418-mnc5/mms_config.xml b/QKSMS/src/main/res/xml-mcc418-mnc5/mms_config.xml deleted file mode 100644 index cd34f34a4..000000000 --- a/QKSMS/src/main/res/xml-mcc418-mnc5/mms_config.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<mms_config version="4"> - <int name="maxMessageSize">102400</int> - <int name="maxImageHeight">1944</int> - <int name="maxImageWidth">2592</int> - <string name="userAgent">Nexus5</string> - <string name="uaProfUrl">http://gsm.lge.com/html/gsm/Nexus5-M3.xml</string> -</mms_config> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml-mcc420-mnc4/mms_config.xml b/QKSMS/src/main/res/xml-mcc420-mnc4/mms_config.xml deleted file mode 100644 index 1c44a9c46..000000000 --- a/QKSMS/src/main/res/xml-mcc420-mnc4/mms_config.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<mms_config version="4"> - <int name="maxMessageSize">409600</int> - <int name="maxImageHeight">1944</int> - <int name="maxImageWidth">2592</int> - <string name="userAgent">Nexus5</string> - <string name="uaProfUrl">http://gsm.lge.com/html/gsm/Nexus5-M6.xml</string> -</mms_config> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml-mcc440-mnc10/mms_config.xml b/QKSMS/src/main/res/xml-mcc440-mnc10/mms_config.xml deleted file mode 100644 index 56794d835..000000000 --- a/QKSMS/src/main/res/xml-mcc440-mnc10/mms_config.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<mms_config version="4"> - <int name="maxMessageSize">614400</int> - <int name="maxImageHeight">1944</int> - <int name="maxImageWidth">2592</int> - <string name="userAgent">Nexus5</string> - <string name="uaProfUrl">http://gsm.lge.com/html/gsm/Nexus5-M6.xml</string> -</mms_config> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml-mcc440-mnc20/mms_config.xml b/QKSMS/src/main/res/xml-mcc440-mnc20/mms_config.xml deleted file mode 100644 index cded36f0c..000000000 --- a/QKSMS/src/main/res/xml-mcc440-mnc20/mms_config.xml +++ /dev/null @@ -1,16 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<mms_config version="4"> - <bool name="enabledMMS">true</bool> - <int name="maxMessageSize">307200</int> - <int name="maxImageHeight">1944</int> - <int name="maxImageWidth">2592</int> - <int name="defaultSMSMessagesPerThread">10000</int> - <int name="defaultMMSMessagesPerThread">1000</int> - <int name="minMessageCountPerThread">10</int> - <int name="maxMessageCountPerThread">5000</int> - <string name="uaProfUrl">http://gsm.lge.com/html/gsm/Nexus5-M3.xml</string> - <int name="recipientLimit">-1</int> - <bool name="enableSlideDuration">true</bool> - <int name="maxMessageTextSize">-1</int> - <string name="userAgent">Nexus5</string> -</mms_config> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml-mcc450-mnc2/mms_config.xml b/QKSMS/src/main/res/xml-mcc450-mnc2/mms_config.xml deleted file mode 100644 index 1d8014f26..000000000 --- a/QKSMS/src/main/res/xml-mcc450-mnc2/mms_config.xml +++ /dev/null @@ -1,11 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<mms_config version="4"> - <int name="maxMessageSize">1048576</int> - <int name="maxImageHeight">1944</int> - <int name="maxImageWidth">2592</int> - <bool name="enableMMSReadReports">false</bool> - <bool name="enableSMSDeliveryReports">false</bool> - <bool name="enableMMSDeliveryReports">false</bool> - <string name="userAgent">Nexus5</string> - <string name="uaProfUrl">http://gsm.lge.com/html/gsm/Nexus5-M10.xml</string> -</mms_config> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml-mcc450-mnc5/mms_config.xml b/QKSMS/src/main/res/xml-mcc450-mnc5/mms_config.xml deleted file mode 100644 index 1d8014f26..000000000 --- a/QKSMS/src/main/res/xml-mcc450-mnc5/mms_config.xml +++ /dev/null @@ -1,11 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<mms_config version="4"> - <int name="maxMessageSize">1048576</int> - <int name="maxImageHeight">1944</int> - <int name="maxImageWidth">2592</int> - <bool name="enableMMSReadReports">false</bool> - <bool name="enableSMSDeliveryReports">false</bool> - <bool name="enableMMSDeliveryReports">false</bool> - <string name="userAgent">Nexus5</string> - <string name="uaProfUrl">http://gsm.lge.com/html/gsm/Nexus5-M10.xml</string> -</mms_config> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml-mcc450-mnc6/mms_config.xml b/QKSMS/src/main/res/xml-mcc450-mnc6/mms_config.xml deleted file mode 100644 index 2506621a1..000000000 --- a/QKSMS/src/main/res/xml-mcc450-mnc6/mms_config.xml +++ /dev/null @@ -1,12 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<mms_config version="4"> - <int name="maxMessageSize">1048576</int> - <int name="maxImageHeight">1944</int> - <int name="maxImageWidth">2592</int> - <int name="smsToMmsTextLengthThreshold">80</int> - <bool name="enableMMSReadReports">false</bool> - <bool name="enableSMSDeliveryReports">false</bool> - <bool name="enableMMSDeliveryReports">false</bool> - <string name="userAgent">Nexus5</string> - <string name="uaProfUrl">http://gsm.lge.com/html/gsm/Nexus5-M10.xml</string> -</mms_config> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml-mcc450-mnc8/mms_config.xml b/QKSMS/src/main/res/xml-mcc450-mnc8/mms_config.xml deleted file mode 100644 index 1d8014f26..000000000 --- a/QKSMS/src/main/res/xml-mcc450-mnc8/mms_config.xml +++ /dev/null @@ -1,11 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<mms_config version="4"> - <int name="maxMessageSize">1048576</int> - <int name="maxImageHeight">1944</int> - <int name="maxImageWidth">2592</int> - <bool name="enableMMSReadReports">false</bool> - <bool name="enableSMSDeliveryReports">false</bool> - <bool name="enableMMSDeliveryReports">false</bool> - <string name="userAgent">Nexus5</string> - <string name="uaProfUrl">http://gsm.lge.com/html/gsm/Nexus5-M10.xml</string> -</mms_config> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml-mcc450/mms_config.xml b/QKSMS/src/main/res/xml-mcc450/mms_config.xml deleted file mode 100644 index 61d5952c4..000000000 --- a/QKSMS/src/main/res/xml-mcc450/mms_config.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<mms_config version="4"> - <int name="maxMessageSize">1048576</int> - <int name="maxImageHeight">1944</int> - <int name="maxImageWidth">2592</int> - <string name="userAgent">Nexus5</string> - <string name="uaProfUrl">http://gsm.lge.com/html/gsm/Nexus5-M10.xml</string> -</mms_config> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml-mcc505-mnc1/mms_config.xml b/QKSMS/src/main/res/xml-mcc505-mnc1/mms_config.xml deleted file mode 100644 index d2df6a745..000000000 --- a/QKSMS/src/main/res/xml-mcc505-mnc1/mms_config.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<mms_config version="4"> - <int name="maxMessageSize">2097152</int> - <int name="maxImageHeight">1944</int> - <int name="maxImageWidth">2592</int> - <string name="userAgent">Nexus5</string> - <string name="uaProfUrl">http://gsm.lge.com/html/gsm/Nexus5-M20.xml</string> -</mms_config> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml-mcc530-mnc5/mms_config.xml b/QKSMS/src/main/res/xml-mcc530-mnc5/mms_config.xml deleted file mode 100644 index 56794d835..000000000 --- a/QKSMS/src/main/res/xml-mcc530-mnc5/mms_config.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<mms_config version="4"> - <int name="maxMessageSize">614400</int> - <int name="maxImageHeight">1944</int> - <int name="maxImageWidth">2592</int> - <string name="userAgent">Nexus5</string> - <string name="uaProfUrl">http://gsm.lge.com/html/gsm/Nexus5-M6.xml</string> -</mms_config> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml-mcc604-mnc2/mms_config.xml b/QKSMS/src/main/res/xml-mcc604-mnc2/mms_config.xml deleted file mode 100644 index cd34f34a4..000000000 --- a/QKSMS/src/main/res/xml-mcc604-mnc2/mms_config.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<mms_config version="4"> - <int name="maxMessageSize">102400</int> - <int name="maxImageHeight">1944</int> - <int name="maxImageWidth">2592</int> - <string name="userAgent">Nexus5</string> - <string name="uaProfUrl">http://gsm.lge.com/html/gsm/Nexus5-M3.xml</string> -</mms_config> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml-mcc604/mms_config.xml b/QKSMS/src/main/res/xml-mcc604/mms_config.xml deleted file mode 100644 index cd34f34a4..000000000 --- a/QKSMS/src/main/res/xml-mcc604/mms_config.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<mms_config version="4"> - <int name="maxMessageSize">102400</int> - <int name="maxImageHeight">1944</int> - <int name="maxImageWidth">2592</int> - <string name="userAgent">Nexus5</string> - <string name="uaProfUrl">http://gsm.lge.com/html/gsm/Nexus5-M3.xml</string> -</mms_config> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml-mcc647-mnc10/mms_config.xml b/QKSMS/src/main/res/xml-mcc647-mnc10/mms_config.xml deleted file mode 100644 index 56794d835..000000000 --- a/QKSMS/src/main/res/xml-mcc647-mnc10/mms_config.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<mms_config version="4"> - <int name="maxMessageSize">614400</int> - <int name="maxImageHeight">1944</int> - <int name="maxImageWidth">2592</int> - <string name="userAgent">Nexus5</string> - <string name="uaProfUrl">http://gsm.lge.com/html/gsm/Nexus5-M6.xml</string> -</mms_config> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml/apns.xml b/QKSMS/src/main/res/xml/apns.xml deleted file mode 100644 index 2c104495a..000000000 --- a/QKSMS/src/main/res/xml/apns.xml +++ /dev/null @@ -1,2362 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - * Copyright (C) 2015 QK Labs - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - --> -<apns version="8"> - <apn carrier="Cosmote Wireless Internet" mcc="202" mnc="01" apn="" type="ia" /> - <apn carrier="Cosmote Wireless Internet" mcc="202" mnc="01" apn="internet" type="default,supl" /> - <apn carrier="Cosmote Mms" mcc="202" mnc="01" apn="mms" mmsc="http://mmsc.cosmote.gr:8002" mmsproxy="10.10.10.20" mmsport="8080" type="mms" /> - <apn carrier="Vf Mobile Internet" mcc="202" mnc="05" apn="" type="ia" /> - <apn carrier="Vf Mobile Internet" mcc="202" mnc="05" apn="internet.vodafone.gr" type="default,supl" /> - <apn carrier="Vf MMS" mcc="202" mnc="05" apn="mms.vodafone.net" user="user" password="pass" mmsc="http://mms.vodafone.gr" mmsproxy="213.249.19.49" mmsport="5080" authtype="1" type="mms" /> - <apn carrier="Q-Telecom MMS GPRS" mcc="202" mnc="09" apn="q-mms.myq.gr" mmsc="http://mms.myq.gr" mmsproxy="192.168.80.134" mmsport="8080" type="mms" /> - <apn carrier="Wind Internet" mcc="202" mnc="10" apn="gint.b-online.gr" type="default,supl" /> - <apn carrier="Wind MMS" mcc="202" mnc="10" apn="mnet.b-online.gr" mmsc="http://192.168.200.95/servlets/mms" mmsproxy="192.168.200.11" mmsport="9401" type="mms" /> - <apn carrier="Tele2 GPRS" mcc="204" mnc="02" apn="internet.tele2.nl" mmsc="http://mmsc.tele2.nl" mmsproxy="193.12.40.64" mmsport="8080" type="default,supl,mms" /> - <apn carrier="Vodafone NL" mcc="204" mnc="04" apn="live.vodafone.com" user="vodafone" password="vodafone" authtype="1" mmsc="http://mmsc.mms.vodafone.nl" mmsproxy="192.168.251.150" mmsport="8799" type="default,supl,mms" /> - <apn carrier="KPN/Hi 4G LTE Mobiel internet" mcc="204" mnc="08" apn="KPN4G.nl" mmsc="http://mp.mobiel.kpn/mmsc" mmsproxy="10.10.100.20" mmsport="5080" type="default,supl,mms" /> - <apn carrier="KPN/Hi Mobiel Internet" mcc="204" mnc="08" apn="portalmmm.nl" mmsc="http://mp.mobiel.kpn/mmsc" mmsproxy="10.10.100.20" mmsport="5080" type="default,supl,mms" /> - <apn carrier="Rabo Mobiel Int." mcc="204" mnc="08" apn="rabo" type="default,supl" mvno_match_data="Rabo Mobiel" mvno_type="spn" /> - <apn carrier="Rabo Mobiel MMS" mcc="204" mnc="08" apn="rabo" mmsc="http://mp.mobiel.kpn/mmsc" mmsproxy="10.10.100.10" mmsport="5080" type="mms" mvno_match_data="Rabo Mobiel" mvno_type="spn" /> - <apn carrier="Telfort Internet" mcc="204" mnc="12" apn="internet" mmsc="http://mms" mmsproxy="193.113.200.195" mmsport="8080" type="default,supl,mms" /> - <apn carrier="T-Mobile Internet" mcc="204" mnc="16" apn="" type="ia" /> - <apn carrier="T-Mobile Internet" mcc="204" mnc="16" apn="internet" authtype="1" type="default,supl" /> - <apn carrier="T-Mobile MMS" mcc="204" mnc="16" apn="mms" user="tmobilemms" password="tmobilemms" authtype="1" mmsc="http://t-mobilemms" mmsproxy="10.10.10.11" mmsport="8080" type="mms" /> - <apn carrier="Ben Internet Abonnee" mcc="204" mnc="16" apn="internet.ben" type="default,supl" mvno_match_data="BEN NL" mvno_type="spn" /> - <apn carrier="Ben Internet PrePaid" mcc="204" mnc="16" apn="basic.internet.ben.data" type="default,supl" mvno_match_data="BEN NL" mvno_type="spn" /> - <apn carrier="Ben MMS" mcc="204" mnc="16" apn="mms.ben" authtype="1" mmsc="http://benmms/" mmsproxy="10.10.10.11" mmsport="8080" type="mms" mvno_match_data="BEN NL" mvno_type="spn" /> - <apn carrier="T-Mobile Internet" mcc="204" mnc="20" apn="" type="ia" /> - <apn carrier="T-Mobile Internet" mcc="204" mnc="20" apn="internet" authtype="1" type="default,supl" /> - <apn carrier="T-Mobile MMS" mcc="204" mnc="20" apn="mms" user="tmobilemms" password="tmobilemms" authtype="1" mmsc="http://t-mobilemms" mmsproxy="10.10.10.11" mmsport="8080" type="mms" /> - <apn carrier="Px MMS" mcc="206" mnc="01" apn="EVENT.PROXIMUS.BE" user="mms" password="mms" authtype="1" mmsc="http://mmsc.proximus.be/mms" mmsproxy="10.55.14.75" mmsport="8080" type="mms" /> - <apn carrier="Px Internet" mcc="206" mnc="01" apn="" type="ia" /> - <apn carrier="Px Internet" mcc="206" mnc="01" apn="INTERNET.PROXIMUS.BE" type="default,supl" /> - <apn carrier="Telenet Internet" mcc="206" mnc="01" apn="telenetwap.be" type="default,supl" mvno_match_data="2060188" mvno_type="imsi" /> - <apn carrier="Telenet MMS" mcc="206" mnc="01" apn="mms.be" mmsc="http://mmsc.telenet.be" mmsproxy="195.130.149.100" mmsport="80" type="mms" mvno_match_data="2060188" mvno_type="imsi" /> - <apn carrier="Virgin mobile" mcc="206" mnc="01" apn="virgin-mobile.fr" proxy="10.6.10.1" port="8080" type="default,supl" mvno_match_data="52" mvno_type="gid" /> - <apn carrier="VM MMS" mcc="206" mnc="01" apn="virgin-mobile.fr" mmsc="http://virginmms.fr" mmsproxy="10.6.10.1" mmsport="8080" type="mms" mvno_match_data="52" mvno_type="gid" /> - <apn carrier="EASTLINK" mcc="206" mnc="01" apn="mms.mobi.eastlink.ca" mmsc="http://mmss.mobi.eastlink.ca" mmsproxy="10.232.12.49" mmsport="8080" type="mms" mvno_match_data="B6" mvno_type="gid" /> - <apn carrier="Internet" mcc="206" mnc="01" apn="wisp.mobi.eastlink.ca" type="default,supl,dun" mvno_match_data="B6" mvno_type="gid" /> - <apn carrier="Telenet Internet" mcc="206" mnc="05" apn="telenetwap.be" type="default,supl" /> - <apn carrier="Telenet MMS" mcc="206" mnc="05" apn="mms.be" mmsc="http://mmsc.telenet.be" mmsproxy="195.130.149.100" mmsport="80" type="mms" /> - <apn carrier="Mobistar MMS" mcc="206" mnc="10" apn="mms.be" mmsc="http://mmsc.mobistar.be" mmsproxy="212.65.63.143" mmsport="8080" type="mms" /> - <apn carrier="Mobistar Internet" mcc="206" mnc="10" apn="mworld.be" type="default,supl" /> - <apn carrier="BASE WAP" mcc="206" mnc="20" apn="" type="ia" /> - <apn carrier="BASE WAP" mcc="206" mnc="20" apn="gprs.base.be" user="base" password="base" authtype="1" type="default,supl" /> - <apn carrier="BASE MMS" mcc="206" mnc="20" apn="mms.base.be" user="base" password="base" authtype="1" mmsc="http://mmsc.base.be" mmsproxy="217.72.235.1" mmsport="8080" type="mms" /> - <apn carrier="Orange World" mcc="208" mnc="01" apn="" type="ia" /> - <apn carrier="Orange World" mcc="208" mnc="01" apn="orange" user="orange" password="orange" authtype="1" type="default,supl" /> - <apn carrier="Orange MMS" mcc="208" mnc="01" apn="orange.acte" user="orange" password="orange" mmsc="http://mms.orange.fr" mmsproxy="192.168.10.200" mmsport="8080" authtype="1" type="mms" /> - <apn carrier="Orange Entreprise" mcc="208" mnc="01" apn="orange-mib" proxy="172.16.2.8" port="8000" user="orange" password="orange" authtype="2" type="default" /> - <apn carrier="Carrefour WAP" mcc="208" mnc="01" apn="ofnew.fr" proxy="192.168.10.100" port="8080" user="orange" password="orange" authtype="1" type="default,supl" mvno_match_data="33" mvno_type="gid" /> - <apn carrier="Carrefour MMS" mcc="208" mnc="01" apn="orange.acte" user="orange" password="orange" mmsc="http://mms.orange.fr" mmsproxy="192.168.10.200" mmsport="8080" authtype="1" type="mms" mvno_match_data="33" mvno_type="gid" /> - <apn carrier="VM WAP" mcc="208" mnc="01" apn="ofnew.fr" user="orange" password="orange" authtype="1" type="default,supl" mvno_match_data="52" mvno_type="gid" /> - <apn carrier="VM MMS" mcc="208" mnc="01" apn="orange.acte" user="orange" password="orange" mmsc="http://mms.orange.fr" mmsproxy="192.168.10.200" mmsport="8080" authtype="1" type="mms" mvno_match_data="52" mvno_type="gid" /> - <apn carrier="NRJWEB" mcc="208" mnc="01" apn="ofnew.fr" user="orange" password="orange" authtype="1" type="default,supl" mvno_match_data="4E" mvno_type="gid" /> - <apn carrier="NRJMMS" mcc="208" mnc="01" apn="orange.acte" user="orange" password="orange" mmsc="http://mms.orange.fr" mmsproxy="192.168.10.200" mmsport="8080" authtype="1" type="mms" mvno_match_data="4E" mvno_type="gid" /> - <apn carrier="Tele2 WAP" mcc="208" mnc="01" apn="ofnew.fr" user="orange" password="orange" type="default,supl" /> - <apn carrier="Tele2 MMS" mcc="208" mnc="01" apn="orange.acte" user="orange" password="orange" mmsc="http://mms.orange.fr" mmsproxy="192.168.10.200" mmsport="8080" type="mms" /> - <apn carrier="SFR webphone" mcc="208" mnc="10" apn="" type="ia" /> - <apn carrier="SFR webphone" mcc="208" mnc="10" apn="sl2sfr" type="default,supl" /> - <apn carrier="SFR" mcc="208" mnc="10" apn="sl2sfr" mmsc="http://mms1" mmsproxy="10.151.0.1" mmsport="8080" type="mms" /> - <apn carrier="NRJWEB" mcc="208" mnc="10" apn="fnetnrj" type="default,supl" mvno_match_data="4E" mvno_type="gid" /> - <apn carrier="NRJMMS" mcc="208" mnc="10" mmsc="http://mmsnrj" mmsproxy="10.143.156.5" mmsport="8080" apn="mmsnrj" type="mms" mvno_match_data="4E" mvno_type="gid" /> - <apn carrier="Auchan WAP" mcc="208" mnc="10" apn="wap65" type="default,supl" mvno_match_data="A MOBILE" mvno_type="spn" /> - <apn carrier="Auchan MMS" mcc="208" mnc="10" mmsc="http://mms65" mmsproxy="10.143.156.8" mmsport="8080" apn="mms65" type="mms" mvno_match_data="A MOBILE" mvno_type="spn" /> - <apn carrier="WAP Simplicime" mcc="208" mnc="10" proxy="192.168.21.3" port="8080" apn="wapdebitel" type="default,supl" /> - <apn carrier="MMS Simplicime" mcc="208" mnc="10" mmsc="http://mmsdebitel" mmsproxy="10.143.156.3" mmsport="8080" apn="mmsdebitel" type="mms" /> - <apn carrier="WAP LeclercMobile" mcc="208" mnc="10" proxy="192.168.21.9" port="8080" apn="wap66" type="default,supl" mvno_match_data="LeclercMobile" mvno_type="spn" /> - <apn carrier="MMS LeclercMobile" mcc="208" mnc="10" mmsc="http://mms66" mmsproxy="10.143.156.9" mmsport="8080" apn="mms66" type="mms" mvno_match_data="LeclercMobile" mvno_type="spn" /> - <apn carrier="Coriolis WAP" mcc="208" mnc="10" apn="fnetcoriolis" type="default,supl" mvno_match_data="12" mvno_type="gid" /> - <apn carrier="Coriolis MMS" mcc="208" mnc="10" mmsc="http://mmscoriolis" mmsproxy="10.143.156.6" mmsport="8080" apn="mmscoriolis" type="mms" mvno_match_data="12" mvno_type="gid" /> - <apn carrier="Keyyo Mobile Internet" mcc="208" mnc="10" apn="internet68" type="default,supl" /> - <apn carrier="Keyyo Mobile MMS" mcc="208" mnc="10" mmsc="http://mms68" mmsproxy="10.143.156.11" mmsport="8080" apn="mms68" type="mms" /> - <apn carrier="WEB La Poste Mobile" mcc="208" mnc="10" proxy="192.168.21.3" port="8080" apn="wapdebitel" type="default,supl" mvno_match_data="4C" mvno_type="gid" /> - <apn carrier="MMS La Poste Mobile" mcc="208" mnc="10" mmsc="http://mmsdebitel" mmsproxy="10.143.156.3" mmsport="8080" apn="mmsdebitel" type="mms" mvno_match_data="4C" mvno_type="gid" /> - <apn carrier="Darty Surf&Mails" mcc="208" mnc="10" apn="wap68" proxy="192.168.21.11" port="8080" type="default,supl" mvno_match_data="44" mvno_type="gid" /> - <apn carrier="Darty MMS" mcc="208" mnc="10" apn="mms68" mmsc="http://mms68/" mmsproxy="10.143.156.11" mmsport="8080" type="mms" mvno_match_data="44" mvno_type="gid" /> - <apn carrier="Free" mcc="208" mnc="15" apn="free" type="default,supl" /> - <apn carrier="Free MMS" mcc="208" mnc="15" mmsc="http://mms.free.fr" apn="mmsfree" type="mms" /> - <apn carrier="Bouygues Telecom" mcc="208" mnc="20" apn="mmsbouygtel.com" mmsc="http://mms.bouyguestelecom.fr/mms/wapenc" mmsproxy="62.201.129.226" mmsport="8080" type="default,supl,mms" /> - <apn carrier="Virgin mobile" mcc="208" mnc="23" apn="virgin-mobile.fr" proxy="10.6.10.1" port="8080" type="default,supl" mvno_match_data="52" mvno_type="gid" /> - <apn carrier="VM MMS" mcc="208" mnc="23" apn="virgin-mobile.fr" mmsc="http://virginmms.fr" mmsproxy="10.6.10.1" mmsport="8080" type="mms" mvno_match_data="52" mvno_type="gid" /> - <apn carrier="NRJ WEB" mcc="208" mnc="26" apn="fnetnrj" type="default,supl" mvno_match_data="4E" mvno_type="gid" /> - <apn carrier="NRJ MMS" mcc="208" mnc="26" apn="mmsnrj" mmsc="http://mmsnrj" mmsproxy="10.143.156.5" mmsport="8080" type="mms" mvno_match_data="4E" mvno_type="gid" /> - <apn carrier="Internet movil" mcc="214" mnc="01" apn="airtelwap.es" user="wap@wap" password="wap125" authtype="1" type="default,supl" /> - <apn carrier="MMS VODAFONE" mcc="214" mnc="01" apn="mms.vodafone.net" user="wap@wap" password="wap125" mmsc="http://mmsc.vodafone.es/servlets/mms" mmsproxy="212.73.32.10" mmsport="80" authtype="1" type="mms" /> - <apn carrier="Orange Internet Móvil" mcc="214" mnc="03" apn="" type="ia" /> - <apn carrier="Orange Internet Móvil" mcc="214" mnc="03" apn="orangeworld" user="orange" password="orange" authtype="1" type="default" /> - <apn carrier="Orange MMS" mcc="214" mnc="03" apn="orangemms" user="orange" password="orange" mmsc="http://mms.orange.es" mmsproxy="172.22.188.25" mmsport="8080" authtype="1" type="mms" /> - <apn carrier="Euskaltel Internet" mcc="214" mnc="03" apn="internet.euskaltel.mobi" user="CLIENTE" password="EUSKALTEL" authtype="1" type="default,supl" mvno_type="imsi" mvno_match_data="2140359" /> - <apn carrier="Euskaltel MMS" mcc="214" mnc="03" apn="euskaltelmms.euskaltel.mobi" user="MMS" password="EUSKALTEL" authtype="1" mmsc="http://mms.euskaltel.mobi" mmsproxy="172.16.18.74" mmsport="8080" type="mms" mvno_type="imsi" mvno_match_data="2140359" /> - <apn carrier="Yoigo Internet" mcc="214" mnc="04" apn="" type="ia" /> - <apn carrier="Yoigo Internet" mcc="214" mnc="04" apn="internet" type="default,supl" /> - <apn carrier="Yoigo MMS" mcc="214" mnc="04" apn="mms" mmsc="http://mmss/" mmsproxy="193.209.134.141" mmsport="80" type="mms" /> - <apn carrier="INTERNET GPRS" mcc="214" mnc="06" apn="airtelnet.es" user="vodafone" password="vodafone" type="default,supl" /> - <apn carrier="MMS Vodafone" mcc="214" mnc="06" apn="mms.vodafone.net" user="wap@wap" password="wap125" mmsc="http://mmsc.vodafone.es/servlets/mms" mmsproxy="212.73.32.10" mmsport="80" type="mms" /> - <apn carrier="Euskaltel MMS" mcc="214" mnc="06" apn="euskaltelmms.euskaltel.mobi" user="MMS" password="EUSKALTEL" mmsc="http://mms.euskaltel.mobi" mmsproxy="172.16.18.74" mmsport="8080" authtype="1" type="mms" mvno_match_data="0008" mvno_type="gid" /> - <apn carrier="Euskaltel Internet" mcc="214" mnc="06" apn="internet.euskaltel.mobi" user="CLIENTE" password="EUSKALTEL" authtype="1" type="default,supl" mvno_match_data="0008" mvno_type="gid" /> - <apn carrier="Internet R" mcc="214" mnc="06" apn="internet.mundo-r.com" authtype="1" type="default,supl" mvno_match_data="2140612" mvno_type="imsi" /> - <apn carrier="MMS R" mcc="214" mnc="06" apn="mms.mundo-r.com" mmsc="http://mms.mundo-r.com" mmsproxy="10.0.157.169" mmsport="8080" authtype="1" type="mms" mvno_match_data="2140612" mvno_type="imsi" /> - <apn carrier="TeleCable Internet" mcc="214" mnc="06" apn="internet.telecable.es" user="telecable" password="telecable" authtype="1" type="default,supl" mvno_match_data="2140613" mvno_type="imsi" /> - <apn carrier="TeleCable MMS" mcc="214" mnc="06" apn="mms.telecable.es" user="telecable" password="telecable" mmsc="http://mms.telecable.es/mms/" mmsproxy="212.89.0.84" mmsport="8080" authtype="1" type="mms" mvno_match_data="2140613" mvno_type="imsi" /> - <apn carrier="Eroski Movil GPRS" mcc="214" mnc="06" apn="gprs.eroskimovil.es" user="wap@wap" password="wap125" authtype="1" type="default,supl" mvno_match_data="2140606" mvno_type="imsi" /> - <apn carrier="Eroski Movil MMS" mcc="214" mnc="06" apn="mms.eroskimovil.es" user="wap@wap" password="wap125" mmsc="http://mms.eroskimovil.es/servlets/mms" mmsproxy="212.73.32.10" mmsport="80" authtype="1" type="mms" mvno_match_data="2140606" mvno_type="imsi" /> - <apn carrier="Movistar" mcc="214" mnc="07" apn="telefonica.es" user="telefonica" password="telefonica" proxy="10.138.255.133" port="8080" mmsc="http://mms.movistar.com" mmsproxy="10.138.255.5" mmsport="8080" authtype="1" type="default,supl,mms" /> - <apn carrier="Jazztel Internet" mcc="214" mnc="07" apn="jazzinternet" type="default,supl" mvno_match_data="JAZZTEL" mvno_type="spn" /> - <apn carrier="Jazztel MMS" mcc="214" mnc="07" apn="jazzmms" user="" password="" mmsc="http://jazztelmms.com/servlets/mms/" mmsproxy="37.132.0.10" mmsport="8080" authtype="1" type="mms" mvno_match_data="JAZZTEL" mvno_type="spn" /> - <apn carrier="Euskaltel MMS" mcc="214" mnc="08" apn="euskaltelmms.euskaltel.mobi" user="MMS" password="EUSKALTEL" mmsc="http://mms.euskaltel.mobi" mmsproxy="172.16.18.74" mmsport="8080" authtype="1" type="mms" /> - <apn carrier="Euskaltel Internet" mcc="214" mnc="08" apn="internet.euskaltel.mobi" user="CLIENTE" password="EUSKALTEL" authtype="1" type="default,supl" /> - <apn carrier="TeleCable Internet" mcc="214" mnc="16" apn="internet.telecable.es" user="telecable" password="telecable" type="default,supl" /> - <apn carrier="TeleCable MMS" mcc="214" mnc="16" apn="mms.telecable.es" user="telecable" password="telecable" mmsc="http://mms.telecable.es/mms/" mmsproxy="212.89.0.84" mmsport="8080" type="mms" /> - <apn carrier="ONO Internet" mcc="214" mnc="18" apn="internet.ono.com" type="default,supl" /> - <apn carrier="ONO MMS" mcc="214" mnc="18" apn="mms.ono.com" mmsc="http://mms.ono.com/" mmsproxy="10.126.0.50" mmsport="8080" type="mms" /> - <apn carrier="Simyo Internet" mcc="214" mnc="19" apn="gprs-service.com" mmsc="http://217.18.32.180:8080" mmsproxy="217.18.32.181" mmsport="8080" type="default,supl,mms" /> - <apn carrier="Jazztel Internet" mcc="214" mnc="21" apn="jazzinternet" type="default,supl" /> - <apn carrier="Jazztel MMS" mcc="214" mnc="21" apn="jazzmms" user="" password="" authtype="1" mmsc="http://jazztelmms.com/servlets/mms/" mmsproxy="37.132.0.10" mmsport="8080" type="mms" /> - <apn carrier="Telenor MMS" mcc="216" mnc="01" apn="mms" mmsc="http://mmsc.telenor.hu/" mmsproxy="84.225.255.1" mmsport="8080" type="mms" /> - <apn carrier="Telenor Online" mcc="216" mnc="01" apn="online" type="default,supl" /> - <apn carrier="Djuice MMS" mcc="216" mnc="01" apn="mms" mmsproxy="84.225.255.1" mmsport="8080" mmsc="http://mmsc.pgsm.hu/" type="mms" authtype="0" mvno_match_data="Djuice" mvno_type="spn" /> - <apn carrier="Djuice NET" mcc="216" mnc="01" apn="net" type="default" authtype="0" mvno_match_data="Djuice" mvno_type="spn" /> - <apn carrier="Djuice WAP" mcc="216" mnc="01" apn="wap" proxy="84.225.255.1" port="8080" type="default" authtype="0" mvno_match_data="Djuice" mvno_type="spn" /> - <apn carrier="T-Mobile H" mcc="216" mnc="30" apn="" type="ia" /> - <apn carrier="T-Mobile H MMS" mcc="216" mnc="30" apn="internet.telekom" mmsc="http://mms.t-mobile.hu/servlets/mms" mmsproxy="212.51.126.10" mmsport="8080" type="mms" authtype="1" /> - <apn carrier="T-Mobile H" mcc="216" mnc="30" apn="internet.telekom" type="default,supl" authtype="1" /> - <apn carrier="Vodafone Internet" mcc="216" mnc="70" apn="internet.vodafone.net" type="default,supl" authtype="0" mvno_match_data="21670xx2xxx" mvno_type="imsi" /> - <apn carrier="Vodafone MMS" mcc="216" mnc="70" apn="mms.vodafone.net" mmsproxy="80.244.97.2" mmsport="8080" mmsc="http://mms.vodafone.hu/servlets/mms" type="mms" authtype="0" mvno_match_data="21670xx2xxx" mvno_type="imsi" /> - <apn carrier="Vodafone Live!" mcc="216" mnc="70" apn="wap.vodafone.net" user="vodawap" password="vodawap" proxy="10.9.8.7" port="8080" type="default,supl" authtype="1" mvno_match_data="21670xx2xxx" mvno_type="imsi" /> - <apn carrier="Vodafone Internet VitaMAX" mcc="216" mnc="70" apn="vitamax.internet.vodafone.net" type="default,supl" mvno_match_data="21670xx1xxx" mvno_type="imsi" /> - <apn carrier="Vodafone MMS" mcc="216" mnc="70" apn="mms.vodafone.net" mmsproxy="80.244.97.2" mmsport="8080" mmsc="http://mms.vodafone.hu/servlets/mms" type="mms" mvno_match_data="21670xx1xxx" mvno_type="imsi" /> - <apn carrier="Vodafone Live! VitaMAX" mcc="216" mnc="70" apn="vitamax.wap.vodafone.net" user="vodawap" password="vodawap" proxy="10.9.8.7" port="8080" type="default,supl" authtype="1" mvno_match_data="21670xx1xxx" mvno_type="imsi" /> - <apn carrier="HT Eronet WAP" mcc="218" mnc="03" apn="wap.eronet.ba" proxy="10.12.3.10" port="8080" type="default,supl" /> - <apn carrier="HT Eronet GPRS" mcc="218" mnc="03" apn="gprs.eronet.ba" type="default,supl" /> - <apn carrier="Ht Eronet MMS" mcc="218" mnc="03" apn="mms.eronet.ba" mmsc="http://mms.gprs.eronet.ba/mms/wapenc" mmsproxy="10.12.3.11" mmsport="8080" type="mms" /> - <apn carrier="m:tel" mcc="218" mnc="05" apn="3g1" proxy="192.168.61.10" port="80" type="default,supl" /> - <apn carrier="mtelmms" mcc="218" mnc="05" apn="mtelmms" mmsc="http://mmsc.mtel.ba/mms/wapenc" mmsproxy="192.168.61.11" mmsport="8080" type="mms" /> - <apn carrier="Bh Mobile" mcc="218" mnc="90" apn="active.bhmobile.ba" type="default,supl" /> - <apn carrier="BHMobileMMS" mcc="218" mnc="90" apn="mms.bhmobile.ba" mmsc="http://mms.bhmobile.ba/cmmsc/post" mmsproxy="195.222.56.41" mmsport="8080" type="mms" /> - <apn carrier="T-Mobile MMS" mcc="219" mnc="01" apn="mms.htgprs" mmsc="http://mms.t-mobile.hr/servlets/mms" mmsproxy="10.12.0.4" mmsport="8080" authtype="1" type="mms" /> - <apn carrier="T-Mobile" mcc="219" mnc="01" apn="" type="ia" /> - <apn carrier="T-Mobile Internet" mcc="219" mnc="01" apn="internet.ht.hr" authtype="1" type="default,supl" /> - <apn carrier="Tele2" mcc="219" mnc="02" apn="internet.tele2.hr" mmsc="http://mmsc.tele2.hr" mmsproxy="193.12.40.66" mmsport="8080" type="default,supl,mms" /> - <apn carrier="Broadband" mcc="219" mnc="10" apn="" type="ia" /> - <apn carrier="Broadband" mcc="219" mnc="10" apn="data.vip.hr" user="38591" password="38591" authtype="1" proxy="212.91.99.91" port="8080" type="default,supl" /> - <apn carrier="VIP.mms" mcc="219" mnc="10" apn="mms.vipnet.hr" mmsc="http://mms.vipnet.hr/servlets/mms" mmsproxy="212.91.99.91" mmsport="8080" type="mms" /> - <apn carrier="Telenor WAP" mcc="220" mnc="01" apn="internet" user="telenor" password="gprs" proxy="217.65.192.33" port="8080" authtype="1" type="default,supl" /> - <apn carrier="Telenor MMS" mcc="220" mnc="01" apn="mms" mmsc="http://mms.telenor.rs/servlets/mms" mmsproxy="217.65.192.33" mmsport="8080" type="mms" /> - <apn carrier="Telenor MNE internet" mcc="220" mnc="02" apn="internet" user="gprs" password="gprs" proxy="192.168.246.5" port="8080" type="default,supl" /> - <apn carrier="Telenor MNE mms" mcc="220" mnc="02" apn="mms" user="mms" password="mms" mmsc="http://mm.vor.telenor.me" mmsproxy="192.168.246.5" mmsport="8080" type="mms" /> - <apn carrier="mt:s wap" mcc="220" mnc="03" apn="gprswap" user="mts" password="064" proxy="172.17.88.198" port="8080" authtype="1" type="default,supl" /> - <apn carrier="mt:s mms" mcc="220" mnc="03" apn="mms" user="mts" password="064" mmsc="http://mms.mts064.telekom.rs/mms/wapenc" mmsproxy="172.17.85.131" mmsport="8080" authtype="1" type="mms" /> - <apn carrier="T-Mobile MMS" mcc="220" mnc="04" apn="mms" user="38267" password="38267" mmsc="http://192.168.180.100/servlets/mms" mmsproxy="10.0.5.19" mmsport="8080" type="mms" /> - <apn carrier="T-Mobile Internet" mcc="220" mnc="04" apn="tmcg-wnw" user="38267" password="38267" proxy="10.0.5.19" port="8080" type="default,supl" /> - <apn carrier="SaskTel" mcc="204" mnc="04" apn="pda.stm.sk.ca" type="default,mms,supl,dun" mmsc="http://mms.sasktel.com/" mmsproxy="mig.sasktel.com" mmsport="80" mvno_match_data="5A" mvno_type="gid" /> - <apn carrier="Vip GPRS" mcc="220" mnc="05" apn="vipmobile" user="vipmobile" password="vipmobile" proxy="212.15.182.82" port="8080" authtype="1" type="default,supl" /> - <apn carrier="Vip MMS" mcc="220" mnc="05" apn="vipmobile.mms" user="vipmobile" password="vipmobile" mmsc="http://mmsc.vipmobile.rs" mmsproxy="212.15.182.82" mmsport="8080" authtype="1" type="mms" /> - <apn carrier="TIM WAP" mcc="222" mnc="01" apn="wap.tim.it" type="default,supl" /> - <apn carrier="TIM MMS" mcc="222" mnc="01" apn="unico.tim.it" mmsc="http://mms.tim.it/servlets/mms" mmsproxy="213.230.130.89" mmsport="80" type="mms" /> - <apn carrier="Internet" mcc="222" mnc="01" apn="internet.windmobile.ca" type="default,supl" protocol="IPV4V6" mvno_match_data="FFFFFF00" mvno_type="gid" /> - <apn carrier="MMS" mcc="222" mnc="01" apn="mms.windmobile.ca" mmsc="http://mms.windmobile.ca" mmsproxy="74.115.197.70" mmsport="8080" type="mms" mvno_match_data="FFFFFF00" mvno_type="gid" /> - <apn carrier="Acc. Internet da cell" mcc="222" mnc="10" apn="" type="ia" /> - <apn carrier="MMS Vodafone" mcc="222" mnc="10" apn="mms.vodafone.it" mmsc="http://mms.vodafone.it/servlets/mms" mmsproxy="10.128.224.10" mmsport="80" type="mms" /> - <apn carrier="Acc. Internet da cell" mcc="222" mnc="10" apn="mobile.vodafone.it" type="default,supl" /> - <apn carrier="WIND WEB" mcc="222" mnc="88" apn="internet.wind" type="default,supl" /> - <apn carrier="WIND MMS" mcc="222" mnc="88" apn="mms.wind" mmsc="http://mms.wind.it" mmsproxy="212.245.244.100" mmsport="8080" type="mms" /> - <apn carrier="Internet" mcc="222" mnc="88" apn="internet.windmobile.ca" type="default,supl" protocol="IPV4V6" mvno_match_data="FFFFFF00" mvno_type="gid" /> - <apn carrier="MMS" mcc="222" mnc="88" apn="mms.windmobile.ca" mmsc="http://mms.windmobile.ca" mmsproxy="74.115.197.70" mmsport="8080" type="mms" mvno_match_data="FFFFFF00" mvno_type="gid" /> - <apn carrier="3" mcc="222" mnc="99" apn="tre.it" mmsc="http://10.216.59.240:10021/mmsc" mmsproxy="62.13.171.3" mmsport="8799" type="default,supl,mms" /> - <apn carrier="Fastweb WEB" mcc="222" mnc="99" apn="apn.fastweb.it" mmsc="http://mms.fastweb.it/mms/wapenc" mmsproxy="10.0.65.9" mmsport="8080" type="default,supl,mms" mvno_match_data="FASTWEB" mvno_type="spn" /> - <apn carrier="Vodafone live!" mcc="226" mnc="01" apn="" type="ia" /> - <apn carrier="Vodafone live!" mcc="226" mnc="01" apn="live.vodafone.com" user="live" password="vodafone" authtype="1" type="default,supl" /> - <apn carrier="Vodafone MMS" mcc="226" mnc="01" apn="mms.vodafone.ro" user="mms" password="vodafone" mmsc="http://multimedia/servlets/mms" mmsproxy="193.230.161.231" mmsport="8080" authtype="1" type="mms" /> - <apn carrier="Cosmote Connect Mobile" mcc="226" mnc="03" apn="" type="ia" /> - <apn carrier="Cosmote Connect Mobile" mcc="226" mnc="03" apn="broadband" type="default,supl" /> - <apn carrier="Cosmote MMS" mcc="226" mnc="03" apn="mms" user="mms" password="mms" mmsc="http://mmsc1.mms.cosmote.ro:8002" mmsproxy="10.252.1.62" mmsport="8080" authtype="1" type="mms" /> - <apn carrier="web'n'walk" mcc="226" mnc="03" apn="wnw" user="wnw" password="wnw" authtype="1" type="default,supl" /> - <apn carrier="MMS" mcc="226" mnc="05" apn="mms" mmsc="http://10.10.3.133:8002" mmsproxy="10.10.3.130" mmsport="8080" type="mms" /> - <apn carrier="Digi.Mobil" mcc="226" mnc="05" apn="internet" authtype="1" type="default,supl" /> - <apn carrier="Cosmote Connect Mobile" mcc="226" mnc="06" apn="" type="ia" /> - <apn carrier="Cosmote Connect Mobile" mcc="226" mnc="06" apn="broadband" type="default,supl" /> - <apn carrier="Cosmote MMS" mcc="226" mnc="06" apn="mms" user="mms" password="mms" mmsc="http://mmsc1.mms.cosmote.ro:8002" mmsproxy="10.252.1.62" mmsport="8080" type="mms" /> - <apn carrier="web'n'walk" mcc="226" mnc="06" apn="wnw" user="wnw" password="wnw" type="default,supl" /> - <apn carrier="Orange Internet" mcc="226" mnc="10" apn="" type="ia" /> - <apn carrier="Orange MMS" mcc="226" mnc="10" apn="mms" user="mms" password="mms" mmsc="http://wap.mms.orange.ro:8002" mmsproxy="62.217.247.252" mmsport="8799" authtype="1" type="mms" /> - <apn carrier="Orange Internet" mcc="226" mnc="10" apn="net" type="default" /> - <apn carrier="Swisscom MMS" mcc="228" mnc="01" apn="event.swisscom.ch" mmsc="http://mms.natel.ch:8079" mmsproxy="192.168.210.2" mmsport="8080" type="mms" /> - <apn carrier="Swisscom Services" mcc="228" mnc="01" apn="gprs.swisscom.ch" proxy="192.168.210.1" port="8080" type="default,supl" /> - <apn carrier="Sunrise live" mcc="228" mnc="02" apn="internet" type="default,supl" /> - <apn carrier="Sunrise MMS" mcc="228" mnc="02" apn="mms.sunrise.ch" mmsc="http://mmsc.sunrise.ch" mmsproxy="212.35.34.75" mmsport="8080" type="mms" /> - <apn carrier="Orange Internet" mcc="228" mnc="03" apn="internet" type="default,supl" /> - <apn carrier="Orange MMS" mcc="228" mnc="03" apn="mms" mmsc="http://192.168.151.3:8002" mmsproxy="192.168.151.2" mmsport="8080" type="mms" /> - <apn carrier="T-Mobile CZ" mcc="230" mnc="01" apn="" type="ia" /> - <apn carrier="T-Mobile CZ" mcc="230" mnc="01" apn="internet.t-mobile.cz" user="wap" password="wap" authtype="1" type="default,supl" /> - <apn carrier="T-Mobile MMS" mcc="230" mnc="01" apn="mms.t-mobile.cz" user="mms" password="mms" mmsc="http://mms" mmsproxy="10.0.0.10" mmsport="80" authtype="1" type="mms" /> - <apn carrier="O2 internet" mcc="230" mnc="02" apn="internet" type="default,supl" /> - <apn carrier="O2 MMS" mcc="230" mnc="02" apn="mms" mmsc="http://mms.o2active.cz:8002" mmsproxy="160.218.160.218" mmsport="8080" type="mms" /> - <apn carrier="GPRS Web" mcc="230" mnc="03" apn="internet" type="default,supl" /> - <apn carrier="Vodafone MMS" mcc="230" mnc="03" apn="mms" user="mms" password="mms" mmsc="http://mms" mmsproxy="10.11.10.111" mmsport="80" authtype="1" type="mms" /> - <apn carrier="Orange SK" mcc="231" mnc="01" apn="internet" type="default" /> - <apn carrier="Orange SK MMS" mcc="231" mnc="01" apn="mms" user="wap" password="wap" authtype="1" mmsc="http://imms.orange.sk" mmsproxy="213.151.208.145" mmsport="8799" type="mms" /> - <apn carrier="Orange World" mcc="231" mnc="01" apn="orangewap" user="wap" password="wap" authtype="1" proxy="213.151.208.156" port="8799" type="default,supl" /> - <apn carrier="T-Mobile internet" mcc="231" mnc="02" apn="internet" authtype="1" type="default,supl" /> - <apn carrier="T-Mobile MMS" mcc="231" mnc="02" apn="mms" user="mms" password="mms" authtype="1" mmsc="http://mms" mmsproxy="192.168.1.1" mmsport="8080" type="mms" /> - <apn carrier="O2 internet" mcc="231" mnc="06" apn="o2internet" type="default,supl" /> - <apn carrier="O2 MMS" mcc="231" mnc="06" apn="o2mms" mmsc="http://mms.o2world.sk:8002" mmsproxy="10.97.1.11" mmsport="8080" type="mms" /> - <apn carrier="live!" mcc="232" mnc="01" apn="a1.net" user="ppp@a1plus.at" password="ppp" authtype="1" type="default,supl" /> - <apn carrier="A1 MMS" mcc="232" mnc="01" apn="free.a1.net" user="ppp@a1plus.at" password="ppp" mmsc="http://mmsc.a1.net" mmsproxy="194.48.124.71" mmsport="8001" authtype="1" type="mms" /> - <apn carrier="T-Mobile Internet" mcc="232" mnc="03" apn="" type="ia" /> - <apn carrier="T-Mobile Internet" mcc="232" mnc="03" apn="gprsinternet" user="t-mobile" password="tm" authtype="1" type="default,supl" /> - <apn carrier="T-Mobile MMS" mcc="232" mnc="03" apn="gprsmms" user="t-mobile" password="tm" mmsc="http://mmsc.t-mobile.at/servlets/mms" mmsproxy="10.12.0.20" mmsport="80" authtype="1" type="mms" /> - <apn carrier="Planet 3" mcc="232" mnc="05" apn="drei.at" mmsc="http://mmsc" mmsproxy="213.94.78.133" mmsport="8799" type="default,supl,mms" /> - <apn carrier="tele.ring mms" mcc="232" mnc="07" apn="mms" user="wap@telering.at" password="wap" mmsc="http://relay.mms.telering.at" mmsproxy="212.95.31.50" mmsport="80" authtype="1" type="mms" /> - <apn carrier="tele.ring web" mcc="232" mnc="07" apn="web" user="web@telering.at" password="web" authtype="1" type="default,supl" /> - <apn carrier="Planet3" mcc="232" mnc="10" apn="drei.at" mmsc="http://mmsc" mmsproxy="213.94.78.133" mmsport="8799" type="default,supl,mms" /> - <apn carrier="data.bob" mcc="232" mnc="11" apn="bob.at" user="data@bob.at" password="ppp" authtype="1" type="default,supl" /> - <apn carrier="data.bob MMS" mcc="232" mnc="11" apn="mms.bob.at" user="data@bob.at" password="ppp" mmsc="http://mmsc.bob.at" mmsproxy="194.48.124.7" mmsport="8001" authtype="1" type="mms" /> - <apn carrier="yesss!" mcc="232" mnc="12" apn="web.yesss.at" type="default,supl" /> - <apn carrier="UBIQUISYS" mcc="234" mnc="01" apn="internet" type="default,supl,mms" /> - <apn carrier="O2 MOBILE WEB" mcc="234" mnc="02" apn="mobile.o2.co.uk" user="O2web" password="O2web" type="default,supl" /> - <apn carrier="O2 MMS Prepay" mcc="234" mnc="02" apn="payandgo.o2.co.uk" user="payandgo" password="password" mmsc="http://mmsc.mms.o2.co.uk:8002" mmsproxy="82.132.254.1" mmsport="8080" type="mms" /> - <apn carrier="O2 MMS Postpay" mcc="234" mnc="02" apn="wap.o2.co.uk" user="o2wap" password="password" mmsc="http://mmsc.mms.o2.co.uk:8002" mmsproxy="82.132.254.1" mmsport="8080" type="mms" /> - <apn carrier="O2 Mobile Web" mcc="234" mnc="10" apn="mobile.o2.co.uk" user="o2web" password="password" type="default,supl" /> - <apn carrier="O2" mcc="234" mnc="10" apn="wap.o2.co.uk" user="o2wap" password="password" authtype="1" mmsc="http://mmsc.mms.o2.co.uk:8002" mmsproxy="82.132.254.1" mmsport="8080" type="mms" /> - <apn carrier="TESCO" mcc="234" mnc="10" apn="prepay.tesco-mobile.com" proxy="193.113.200.195" port="8080" user="tescowap" password="password" mmsc="http://mmsc.mms.o2.co.uk:8002" mmsproxy="193.113.200.195" mmsport="8080" authtype="1" type="default,supl,mms" mvno_match_data="0A" mvno_type="gid" /> - <apn carrier="O2 MOBILE WEB" mcc="234" mnc="11" apn="mobile.o2.co.uk" user="O2web" password="O2web" type="default,supl" /> - <apn carrier="O2 MMS Prepay" mcc="234" mnc="11" apn="payandgo.o2.co.uk" user="payandgo" password="password" mmsc="http://mmsc.mms.o2.co.uk:8002" mmsproxy="82.132.254.1" mmsport="8080" type="mms" /> - <apn carrier="O2 MMS Postpay" mcc="234" mnc="11" apn="wap.o2.co.uk" user="o2wap" password="password" mmsc="http://mmsc.mms.o2.co.uk:8002" mmsproxy="82.132.254.1" mmsport="8080" type="mms" /> - <apn carrier="O2 MOBILE WEB" mcc="234" mnc="11" apn="mobile.o2.co.uk" user="O2web" password="O2web" type="default,supl" /> - <apn carrier="O2 MMS Prepay" mcc="234" mnc="11" apn="payandgo.o2.co.uk" user="payandgo" password="password" mmsc="http://mmsc.mms.02.co.uk:8002" mmsproxy="82.132.254.1" mmsport="8080" type="mms" /> - <apn carrier="O2 MMS Postpay" mcc="234" mnc="11" apn="wap.o2.co.uk" user="o2wap" password="password" mmsc="http://mmsc.mms.02.co.uk:8002" mmsproxy="82.132.254.1" mmsport="8080" type="mms" /> - <apn carrier="Vodafone UK" mcc="234" mnc="15" apn="wap.vodafone.co.uk" user="wap" password="wap" mmsc="http://mms.vodafone.co.uk/servlets/mms" mmsproxy="212.183.137.12" mmsport="8799" authtype="1" type="default,supl,mms" /> - <apn carrier="Vodafone UK Prepay" mcc="234" mnc="15" apn="pp.vodafone.co.uk" user="wap" password="wap" mmsc="http://mms.vodafone.co.uk/servlets/mms" mmsproxy="212.183.137.12" mmsport="8799" authtype="1" type="default,supl,mms" /> - <apn carrier="ASDA WAP" mcc="234" mnc="15" apn="asdamobiles.co.uk" proxy="212.183.137.12" port="8799" user="wap" password="wap" mmsc="http://mms.asdamobiles.co.uk/servlets/mms" mmsproxy="212.183.137.12" mmsport="8799" authtype="1" type="default,supl,mms" mvno_match_data="A0" mvno_type="gid" /> - <apn carrier="Talkmob PAYG WAP" mcc="234" mnc="15" apn="payg.talkmobile.co.uk" proxy="212.183.137.12" port="8799" user="wap" password="wap" mmsc="http://mms.talkmobile.co.uk/servlets/mms" mmsproxy="212.183.137.12" mmsport="8799" authtype="1" type="default,supl,mms" mvno_match_data="C1" mvno_type="gid" /> - <apn carrier="Talkmob WAP" mcc="234" mnc="15" apn="talkmobile.co.uk" proxy="212.183.137.12" port="8799" user="wap" password="wap" mmsc="http://mms.talkmobile.co.uk/servlets/mms" mmsproxy="212.183.137.12" mmsport="8799" authtype="1" type="default,supl,mms" mvno_match_data="C1" mvno_type="gid" /> - <apn carrier="TalkTalk WAP" mcc="234" mnc="15" apn="mobile.talktalk.co.uk" mmsc="http://mms.talktalk.co.uk/servlets/mms" mmsproxy="212.183.137.12" mmsport="8799" type="default,supl,mms" mvno_match_data="70" mvno_type="gid" /> - <apn carrier="3" mcc="234" mnc="20" apn="three.co.uk" mmsc="http://mms.um.three.co.uk:10021/mmsc" mmsproxy="mms.three.co.uk" mmsport="8799" type="default,supl,mms" /> - <apn carrier="Virgin Media Mobile Internet" mcc="234" mnc="30" apn="goto.virginmobile.uk" user="user" mmsc="http://mms.virginmobile.co.uk:8002" mmsproxy="193.30.166.2" mmsport="8080" authtype="1" type="default,supl,mms" mvno_match_data="28" mvno_type="gid" /> - <apn carrier="EE Internet" mcc="234" mnc="30" apn="everywhere" user="eesecure" password="secure" authtype="1" type="default,supl,dun" /> - <apn carrier="EE MMS" mcc="234" mnc="30" apn="eezone" user="eesecure" password="secure" mmsc="http://mms/" mmsproxy="149.254.201.135" mmsport="8080" authtype="1" type="mms" /> - <apn carrier="EE Internet" mcc="234" mnc="31" apn="everywhere" user="eesecure" password="secure" authtype="1" type="default,supl,dun" /> - <apn carrier="EE MMS" mcc="234" mnc="31" apn="eezone" user="eesecure" password="secure" mmsc="http://mms/" mmsproxy="149.254.201.135" mmsport="8080" authtype="1" type="mms" /> - <apn carrier="EE Internet" mcc="234" mnc="32" apn="everywhere" user="eesecure" password="secure" authtype="1" type="default,supl,dun" /> - <apn carrier="EE MMS" mcc="234" mnc="32" apn="eezone" user="eesecure" password="secure" mmsc="http://mms/" mmsproxy="149.254.201.135" mmsport="8080" authtype="1" type="mms" /> - <apn carrier="EE Internet" mcc="234" mnc="33" apn="everywhere" user="eesecure" password="secure" authtype="1" type="default,supl,dun" /> - <apn carrier="EE MMS" mcc="234" mnc="33" apn="eezone" user="eesecure" password="secure" mmsc="http://mms/" mmsproxy="149.254.201.135" mmsport="8080" authtype="1" type="mms" /> - <apn carrier="EE Internet" mcc="234" mnc="34" apn="everywhere" user="eesecure" password="secure" authtype="1" type="default,supl,dun" /> - <apn carrier="EE MMS" mcc="234" mnc="34" apn="eezone" user="eesecure" password="secure" mmsc="http://mms/" mmsproxy="149.254.201.135" mmsport="8080" authtype="1" type="mms" /> - <apn carrier="Jersey Telecom" mcc="234" mnc="50" apn="mms" user="mms" password="mms" mmsc="http://mms.surfmail.com/mmsc" mmsproxy="212.9.19.199" mmsport="3130" type="mms" /> - <apn carrier="pepperWEB (Jersey)" mcc="234" mnc="50" apn="pepper" type="default,supl" /> - <apn carrier="C&W Guernsey Internet" mcc="234" mnc="55" apn="internet" type="default,supl" /> - <apn carrier="Sure Picture Messaging" mcc="234" mnc="55" apn="mms" mmsc="http://mmsc.gprs.cw.com/" mmsproxy="10.0.3.101" mmsport="80" type="mms" /> - <apn carrier="3G HSDPA" mcc="234" mnc="58" apn="3gpronto" type="default,supl" /> - <apn carrier="Manx Telecom Contract MMS" mcc="234" mnc="58" apn="mms.manxpronto.net" user="mms" password="mms" mmsc="http://mms.manxpronto.net:8002" mmsproxy="195.10.99.46" mmsport="8080" type="mms" /> - <apn carrier="Manx Telecom Prepay MMS" mcc="234" mnc="58" apn="mms.prontogo.net" user="mmsgo" password="mmsgo" mmsc="http://mms.manxpronto.net:8002" mmsproxy="195.10.99.41" mmsport="8080" type="mms" /> - <apn carrier="Manx Telecom Contract WEB" mcc="234" mnc="58" apn="web.manxpronto.net" user="gprs" password="gprs" type="default,supl" /> - <apn carrier="EE Internet" mcc="234" mnc="86" apn="everywhere" user="eesecure" password="secure" authtype="1" type="default,supl,dun" /> - <apn carrier="EE MMS" mcc="234" mnc="86" apn="eezone" user="eesecure" password="secure" mmsc="http://mms/" mmsproxy="149.254.201.135" mmsport="8080" authtype="1" type="mms" /> - <apn carrier="3" mcc="235" mnc="94" apn="three.co.uk" mmsc="http://mms.um.three.co.uk:10021/mmsc" mmsproxy="mms.three.co.uk" mmsport="8799" type="default,supl,mms" /> - <apn carrier="TDC Internet" mcc="238" mnc="01" apn="internet" type="default,supl" mvno_match_data="2380101xxxxxxxx" mvno_type="imsi" /> - <apn carrier="TDC MMS" mcc="238" mnc="01" apn="mms" mmsc="http://mmsc.tdc.dk:8002" mmsproxy="194.182.251.15" mmsport="8080" type="mms" mvno_match_data="2380101xxxxxxxx" mvno_type="imsi" /> - <apn carrier="Telmore Internet" mcc="238" mnc="01" apn="internet" type="default,supl" mvno_type="spn" mvno_match_data="TELMORE" /> - <apn carrier="Telmore MMS" mcc="238" mnc="01" apn="mms" mmsproxy="194.182.251.15" mmsport="8080" mmsc="http://192.168.241.114:8002" type="mms" mvno_type="spn" mvno_match_data="TELMORE" /> - <apn carrier="Telenor Internet" mcc="238" mnc="02" apn="Internet" type="default,supl" /> - <apn carrier="Telenor MMS" mcc="238" mnc="02" apn="telenor" mmsc="http://mms.telenor.dk" mmsproxy="212.88.64.8" mmsport="8080" type="mms" /> - <apn carrier="BiBoB Internet profil" mcc="238" mnc="02" apn="internet.bibob.dk" type="default,supl" mvno_type="spn" mvno_match_data="BiBoB" /> - <apn carrier="BiBoB" mcc="238" mnc="02" apn="mms.bibob.dk" mmsproxy="212.88.64.8" mmsport="8080" mmsc="http://mms.telenor.dk" type="mms" mvno_type="spn" mvno_match_data="BiBoB" /> - <apn carrier="CBB Internet" mcc="238" mnc="02" apn="internet" type="default,supl" mvno_type="spn" mvno_match_data="CBB Mobil" /> - <apn carrier="CBB MMS" mcc="238" mnc="02" apn="telenor" mmsproxy="212.88.64.8" mmsport="8080" mmsc="http://mms.telenor.dk" type="mms" mvno_type="spn" mvno_match_data="CBB Mobil" /> - <apn carrier="3" mcc="238" mnc="06" apn="data.tre.dk" mmsc="http://mms.3.dk/" mmsproxy="mmsproxy.3.dk" mmsport="8799" type="default,supl,mms" /> - <apn carrier="Telia SurfPort" mcc="238" mnc="20" apn="www.internet.mtelia.dk" type="default,supl" mvno_type="imsi" mvno_match_data="2382010x" /> - <apn carrier="Telia SurfPort" mcc="238" mnc="20" apn="www.internet.mtelia.dk" type="default,supl" mvno_type="imsi" mvno_match_data="2382030x" /> - <apn carrier="Telia MMS" mcc="238" mnc="20" apn="www.mms.mtelia.dk" mmsc="http://mms.telia.dk" mmsproxy="193.209.134.131" mmsport="8080" type="mms" mvno_type="imsi" mvno_match_data="2382010x" /> - <apn carrier="Telia MMS" mcc="238" mnc="20" apn="www.mms.mtelia.dk" mmsc="http://mms.telia.dk" mmsproxy="193.209.134.131" mmsport="8080" type="mms" mvno_type="imsi" mvno_match_data="2382030x" /> - <apn carrier="Call me Internet" mcc="238" mnc="20" apn="webSP" type="default,supl" mvno_type="spn" mvno_match_data="Call me" /> - <apn carrier="Call me MMS" mcc="238" mnc="20" apn="mmsSP" mmsproxy="193.209.134.131" mmsport="8080" mmsc="http://mms.telia.dk" type="mms" mvno_type="spn" mvno_match_data="Call me" /> - <apn carrier="DLG Tele GPRS" mcc="238" mnc="20" apn="webSP" type="default,supl" mvno_type="spn" mvno_match_data="DLG Tele" /> - <apn carrier="DLG Tele MMS" mcc="238" mnc="20" apn="mmsSP" mmsproxy="193.209.134.131" mmsport="8080" mmsc="http://mms.telia.dk" type="mms" mvno_type="spn" mvno_match_data="DLG Tele" /> - <apn carrier="Telenor Internet" mcc="238" mnc="77" apn="Internet" type="default,supl" /> - <apn carrier="Telenor MMS" mcc="238" mnc="77" apn="telenor" mmsc="http://mms.telenor.dk" mmsproxy="212.88.64.8" mmsport="8080" type="mms" /> - <apn carrier="Telia MMS" mcc="240" mnc="01" apn="mms.telia.se" mmsc="http://mmss" mmsproxy="193.209.134.132" mmsport="80" type="mms" /> - <apn carrier="Telia" mcc="240" mnc="01" apn="online.telia.se" type="default,supl" /> - <apn carrier="Halebop Internet" mcc="240" mnc="01" apn="halebop.telia.se" type="default,supl" mvno_match_data="240017xxxxxxxxx" mvno_type="imsi" /> - <apn carrier="Halebop MMS" mcc="240" mnc="01" apn="mms.telia.se" mmsc="http://mmss" mmsproxy="193.209.134.132" mmsport="80" type="mms" mvno_match_data="240017xxxxxxxxx" mvno_type="imsi" /> - <apn carrier="3" mcc="240" mnc="02" apn="data.tre.se" mmsc="http://mms.tre.se" mmsproxy="mmsproxy.tre.se" mmsport="8799" type="default,supl,mms" /> - <apn carrier="3" mcc="240" mnc="04" apn="data.tre.se" mmsc="http://mms.tre.se" mmsproxy="mmsproxy.tre.se" mmsport="8799" type="default,supl,mms" /> - <apn carrier="Telenor SE" mcc="240" mnc="04" apn="services.telenor.se" mmsc="http://mms" mmsproxy="172.30.253.241" mmsport="8799" type="default,supl,mms" mvno_match_data="Telenor SE" mvno_type="spn" /> - <apn carrier="Tele2 Internet" mcc="240" mnc="05" apn="4g.tele2.se" type="default,supl" mvno_match_data="Tele2" mvno_type="spn" /> - <apn carrier="Tele2 MMS" mcc="240" mnc="05" apn="4g.tele2.se" mmsc="http://mmsc.tele2.se" mmsproxy="130.244.202.30" mmsport="8080" type="mms" mvno_match_data="Tele2" mvno_type="spn" /> - <apn carrier="Tele2 Internet 3G" mcc="240" mnc="05" apn="internet.tele2.se" type="default,supl" mvno_match_data="Tele2" mvno_type="spn" /> - <apn carrier="Tele2 MMS 3G" mcc="240" mnc="05" apn="internet.tele2.se" mmsc="http://mmsc.tele2.se" mmsproxy="130.244.202.30" mmsport="8080" type="mms" mvno_match_data="Tele2" mvno_type="spn" /> - <apn carrier="Telia MMS" mcc="240" mnc="05" apn="mms.telia.se" mmsc="http://mmss" mmsproxy="193.209.134.132" mmsport="80" type="mms" mvno_match_data="Telia" mvno_type="spn" /> - <apn carrier="Telia" mcc="240" mnc="05" apn="online.telia.se" type="default,supl" mvno_match_data="Telia" mvno_type="spn" /> - <apn carrier="Halebop Internet" mcc="240" mnc="05" apn="halebop.telia.se" type="default,supl" mvno_match_data="Halebop" mvno_type="spn" /> - <apn carrier="Halebop MMS" mcc="240" mnc="05" apn="mms.telia.se" mmsc="http://mmss" mmsproxy="193.209.134.132" mmsport="80" type="mms" mvno_match_data="Halebop" mvno_type="spn" /> - <apn carrier="Tele2 Internet" mcc="240" mnc="07" apn="4g.tele2.se" type="default,supl" /> - <apn carrier="Tele2 MMS" mcc="240" mnc="07" apn="4g.tele2.se" mmsc="http://mmsc.tele2.se" mmsproxy="130.244.202.30" mmsport="8080" type="mms" /> - <apn carrier="Tele2 Internet 3G" mcc="240" mnc="07" apn="internet.tele2.se" type="default,supl" /> - <apn carrier="Tele2 MMS 3G" mcc="240" mnc="07" apn="internet.tele2.se" mmsc="http://mmsc.tele2.se" mmsproxy="130.244.202.30" mmsport="8080" type="mms" /> - <apn carrier="Tele2 Internet" mcc="240" mnc="07" apn="internet.tele2.no" user="wap" password="wap" type="default,supl" authtype="1" mvno_match_data="2400768xxxxxxxx" mvno_type="imsi" /> - <apn carrier="Tele2 MMS" mcc="240" mnc="07" apn="internet.tele2.no" mmsproxy="193.12.40.14" mmsport="8080" mmsc="http://mmsc.tele2.no" type="mms" mvno_match_data="2400768xxxxxxxx" mvno_type="imsi" /> - <apn carrier="Telenor SE" mcc="240" mnc="08" apn="services.telenor.se" mmsc="http://mms" mmsproxy="172.30.253.241" mmsport="8799" type="default,supl,mms" /> - <apn carrier="Tele2 Internet" mcc="240" mnc="24" apn="4g.tele2.se" type="default,supl" mvno_match_data="Tele2" mvno_type="spn" /> - <apn carrier="Tele2 MMS" mcc="240" mnc="24" apn="4g.tele2.se" mmsc="http://mmsc.tele2.se" mmsproxy="130.244.202.30" mmsport="8080" type="mms" mvno_match_data="Tele2" mvno_type="spn" /> - <apn carrier="Tele2 Internet 3G" mcc="240" mnc="24" apn="internet.tele2.se" type="default,supl" mvno_match_data="Tele2" mvno_type="spn" /> - <apn carrier="Tele2 MMS 3G" mcc="240" mnc="24" apn="internet.tele2.se" mmsc="http://mmsc.tele2.se" mmsproxy="130.244.202.30" mmsport="8080" type="mms" mvno_match_data="Tele2" mvno_type="spn" /> - <apn carrier="Telenor SE" mcc="240" mnc="24" apn="services.telenor.se" mmsc="http://mms" mmsproxy="172.30.253.241" mmsport="8799" type="default,supl,mms" mvno_match_data="Telenor SE" mvno_type="spn" /> - <apn carrier="Ventelo Internett" mcc="242" mnc="01" apn="internet.ventelo.no" type="default,supl" mvno_match_data="24201700xxxxxxx" mvno_type="imsi" /> - <apn carrier="Ventelo MMS" mcc="242" mnc="01" apn="mms.ventelo.no" user="ventelo" password="1111" mmsc="http://mmsc/" mmsproxy="10.10.10.11" mmsport="8080" type="mms" authtype="1" mvno_match_data="24201700xxxxxxx" mvno_type="imsi" /> - <apn carrier="Telenor" mcc="242" mnc="01" apn="telenor" mmsc="http://mmsc" mmsproxy="10.10.10.11" mmsport="8080" type="default,supl,mms" /> - <apn carrier="NetCom" mcc="242" mnc="02" apn="netcom" mmsc="http://mm/" mmsproxy="212.169.66.4" mmsport="8080" type="default,supl,mms" /> - <apn carrier="Chess MMS" mcc="242" mnc="02" apn="netcom" user="mms" password="netcom" mmsproxy="212.169.66.4" mmsport="8080" mmsc="http://mm/" type="mms" authtype="1" mvno_match_data="2420256xxxxxxxx" mvno_type="imsi" /> - <apn carrier="Chess Internett" mcc="242" mnc="02" apn="netcom" type="default,supl" mvno_match_data="2420256xxxxxxxx" mvno_type="imsi" /> - <apn carrier="NwN Internet" mcc="242" mnc="05" apn="internet" type="default,supl" /> - <apn carrier="NwN MMS" mcc="242" mnc="05" apn="mms" mmsc="http://mms.nwn.no" mmsproxy="188.149.250.10" mmsport="80" type="mms" /> - <apn carrier="DNA Internet" mcc="244" mnc="03" apn="internet" type="default,supl" /> - <apn carrier="DNA MMS" mcc="244" mnc="03" apn="mms" mmsc="http://mmsc.dna.fi" mmsproxy="10.1.1.2" mmsport="8080" type="mms" /> - <apn carrier="DNA Internet" mcc="244" mnc="04" apn="internet" type="default,supl" /> - <apn carrier="DNA MMS" mcc="244" mnc="04" apn="mms" user="dna" password="mms" mmsc="http://mmsc.dnafinland.fi/" mmsproxy="10.1.1.2" mmsport="8080" type="mms" /> - <apn carrier="Elisa Internet" mcc="244" mnc="05" apn="internet" type="default,supl" /> - <apn carrier="Elisa MMS" mcc="244" mnc="05" apn="mms" mmsc="http://mms.elisa.fi" mmsproxy="213.161.41.57" mmsport="80" type="mms" /> - <apn carrier="Saunalahti Internet" mcc="244" mnc="05" apn="internet.saunalahti" type="default,supl" mvno_match_data="2440541" mvno_type="imsi" /> - <apn carrier="Saunalahti MMS" mcc="244" mnc="05" apn="mms.saunalahti.fi" mmsc="http://mms.saunalahti.fi:8002/" mmsproxy="62.142.4.197" mmsport="8080" type="mms" mvno_match_data="2440541" mvno_type="imsi" /> - <apn carrier="TDC Internet" mcc="244" mnc="10" apn="internet.song.fi" user="song@internet" password="songnet" type="default,supl" /> - <apn carrier="TDC MMS" mcc="244" mnc="10" apn="mms.song.fi" mmsc="http://mms.song.fi" mmsproxy="213.161.41.58" mmsport="80" type="mms" /> - <apn carrier="DNA Internet" mcc="244" mnc="12" apn="internet" type="default,supl" /> - <apn carrier="DNA MMS" mcc="244" mnc="12" apn="mms" mmsc="http://mmsc.dna.fi" mmsproxy="10.1.1.2" mmsport="8080" type="mms" /> - <apn carrier="DNA Pro Internet" mcc="244" mnc="12" apn="dnapro.fi" authtype="1" type="default,supl" /> - <apn carrier="DNA Pro MMS" mcc="244" mnc="12" apn="mms.dnapro.fi" mmsc="http://mmsc.dnapro.fi/" mmsproxy="10.1.1.21" mmsport="8080" authtype="1" type="mms" /> - <apn carrier="TDC Internet Finland" mcc="244" mnc="12" apn="inet.tdc.fi" authtype="1" type="default,supl" /> - <apn carrier="TDC MMS Finland" mcc="244" mnc="12" apn="mms.tdc.fi" mmsc="http://mmsc.tdc.fi" mmsproxy="10.1.12.2" mmsport="8080" authtype="1" type="mms" /> - <apn carrier="DNA Internet" mcc="244" mnc="13" apn="internet" type="default,supl" /> - <apn carrier="DNA MMS" mcc="244" mnc="13" apn="mms" user="dna" password="mms" mmsc="http://mmsc.dnafinland.fi/" mmsproxy="10.1.1.2" mmsport="8080" type="mms" /> - <apn carrier="Saunalahti Internet" mcc="244" mnc="21" apn="internet.saunalahti" type="default,supl" /> - <apn carrier="Saunalahti MMS" mcc="244" mnc="21" apn="mms.saunalahti.fi" mmsc="http://mms.saunalahti.fi:8002/" mmsproxy="62.142.4.197" mmsport="8080" type="mms" /> - <apn carrier="SONERA Internet" mcc="244" mnc="91" apn="internet" type="default,supl" /> - <apn carrier="SONERA MMS" mcc="244" mnc="91" apn="wap.sonera.net" mmsc="http://mms.sonera.fi:8002" mmsproxy="195.156.25.33" mmsport="80" type="mms" /> - <apn carrier="Omnitel MMS" mcc="246" mnc="01" apn="gprs.mms.lt" user="mms" password="mms" mmsc="http://mms.omnitel.net:8002/" mmsproxy="194.176.32.149" mmsport="8080" authtype="1" type="mms" /> - <apn carrier="Omnitel Internet" mcc="246" mnc="01" apn="omnitel" user="omni" password="omni" authtype="1" type="default,supl" /> - <apn carrier="Bite Internet" mcc="246" mnc="02" apn="wap" type="default,supl" /> - <apn carrier="Bite MMS" mcc="246" mnc="02" apn="mms" user="mms@mms" password="mms" mmsc="http://mmsc/servlets/mms" mmsproxy="192.168.150.2" mmsport="8080" authtype="1" type="mms" /> - <apn carrier="Tele2 Internet LT" mcc="246" mnc="03" apn="internet.tele2.lt" mmsc="http://mmsc.tele2.lt/" mmsproxy="193.12.40.29" mmsport="8080" type="default,supl,mms" /> - <apn carrier="LMT Internet" mcc="247" mnc="01" apn="internet.lmt.lv" type="default,supl" /> - <apn carrier="LMT MMS" mcc="247" mnc="01" apn="internet.lmt.lv" mmsc="http://mmsc.lmt.lv/mmsc" type="mms" /> - <apn carrier="Tele2 LV Internet" mcc="247" mnc="02" apn="internet.tele2.lv" type="default,supl" /> - <apn carrier="Tele2 LV MMS" mcc="247" mnc="02" apn="mms.tele2.lv" user="wap" password="wap" mmsc="http://mmsc.tele2.lv/" mmsproxy="193.12.40.38" mmsport="8080" authtype="1" type="mms" /> - <apn carrier="Bite LV Internet" mcc="247" mnc="05" apn="internet" type="default,supl" /> - <apn carrier="Bite LV MMS" mcc="247" mnc="05" apn="mms" user="mms@mms" password="mms" mmsc="http://mmsc/servlets/mms" mmsproxy="192.168.150.2" mmsport="8080" authtype="1" type="mms" /> - <apn carrier="Bite LV WAP" mcc="247" mnc="05" apn="wap" proxy="213.226.131.133" port="8080" type="default,supl" /> - <apn carrier="EMT Internet" mcc="248" mnc="01" apn="internet.emt.ee" type="default,supl" /> - <apn carrier="EMT MMS" mcc="248" mnc="01" apn="mms.emt.ee" mmsc="http://mms.emt.ee/servlets/mms" mmsproxy="217.71.32.82" mmsport="8080" type="mms" /> - <apn carrier="EMT WAP" mcc="248" mnc="01" apn="wap.emt.ee" proxy="217.71.32.236" port="8080" type="default,supl" /> - <apn carrier="Send" mcc="248" mnc="01" apn="send.ee" mmsc="http://mms.emt.ee/servlets/mms" mmsproxy="217.71.32.82" mmsport="8080" type="default,supl,mms" mvno_match_data="248010x2" mvno_type="imsi" /> - <apn carrier="Send" mcc="248" mnc="01" apn="send.ee" mmsc="http://mms.emt.ee/servlets/mms" mmsproxy="217.71.32.82" mmsport="8080" type="default,supl,mms" mvno_match_data="248010x3" mvno_type="imsi" /> - <apn carrier="Elisa Internet" mcc="248" mnc="02" apn="internet" type="default,supl" /> - <apn carrier="Elisa MMS" mcc="248" mnc="02" apn="mms" mmsc="http://194.204.2.10" mmsproxy="194.204.2.6" mmsport="8000" type="mms" /> - <apn carrier="Elisa WAP" mcc="248" mnc="02" apn="wap" proxy="194.204.2.6" port="8000" type="default,supl" /> - <apn carrier="Tele2 Internet" mcc="248" mnc="03" apn="internet.tele2.ee" type="default,supl" /> - <apn carrier="Tele2 MMS" mcc="248" mnc="03" apn="mms.tele2.ee" mmsc="http://mmsc.tele2.ee" mmsproxy="193.12.40.6" mmsport="8080" type="mms" /> - <apn carrier="MTS Internet" mcc="250" mnc="01" apn="internet.mts.ru" user="mts" password="mts" authtype="1" type="default,supl" /> - <apn carrier="MTS MMS" mcc="250" mnc="01" apn="mms.mts.ru" user="mts" password="mts" mmsc="http://mmsc" mmsproxy="192.168.192.192" mmsport="8080" authtype="1" type="mms" /> - <apn carrier="Megafon Internet" mcc="250" mnc="02" apn="internet" user="" password="" type="default,supl" /> - <apn carrier="Megafon MMS" mcc="250" mnc="02" apn="mms" user="mms" password="mms" mmsc="http://mmsc:8002" mmsproxy="10.10.10.10" mmsport="8080" authtype="1" type="mms" /> - <apn carrier="YOTA Internet" mcc="250" mnc="11" apn="yota.ru" type="default,supl" /> - <apn carrier="TELE2 Internet" mcc="250" mnc="20" apn="internet.tele2.ru" type="default,supl" /> - <apn carrier="TELE2 MMS" mcc="250" mnc="20" apn="mms.tele2.ru" mmsc="http://mmsc.tele2.ru" mmsproxy="193.12.40.65" mmsport="8080" type="mms" /> - <apn carrier="Beeline Internet" mcc="250" mnc="99" apn="internet.beeline.ru" user="beeline" password="beeline" authtype="1" type="default,supl" /> - <apn carrier="Beeline MMS" mcc="250" mnc="99" apn="mms.beeline.ru" user="beeline" password="beeline" mmsc="http://mms/" mmsproxy="192.168.94.23" mmsport="8080" authtype="1" type="mms" /> - <apn carrier="MTS MMS" mcc="255" mnc="01" apn="mms" mmsc="http://mmsc:8002/" mmsproxy="192.168.10.10" mmsport="8080" type="mms" /> - <apn carrier="MTS-internet" mcc="255" mnc="01" apn="internet" type="default,supl" /> - <apn carrier="Beeline-internet" mcc="255" mnc="02" apn="internet.beeline.ua" type="default,supl" /> - <apn carrier="Beeline MMS" mcc="255" mnc="02" apn="mms.beeline.ua" mmsc="http://mms/" mmsproxy="172.29.18.192" mmsport="8080" type="mms" /> - <apn carrier="Kyivstar MMS" mcc="255" mnc="03" apn="mms.kyivstar.net" user="mms" password="mms" authtype="1" mmsc="http://mms.kyivstar.net" mmsproxy="10.10.10.10" mmsport="8080" type="mms" /> - <apn carrier="Kyivstar Internet" mcc="255" mnc="03" apn="www.kyivstar.net" user="igprs" password="internet" authtype="1" type="default,supl" /> - <apn carrier="Djuice MMS" mcc="255" mnc="03" apn="mms.djuice.com.ua" user="djuice" password="mms" authtype="1" mmsc="http://mms.kyivstar.net" mmsproxy="10.10.10.10" mmsport="8080" type="mms" mvno_match_data="DJUICE" mvno_type="spn" /> - <apn carrier="Djuice Internet" mcc="255" mnc="03" apn="www.djuice.com.ua" type="default,supl" mvno_match_data="DJUICE" mvno_type="spn" /> - <apn carrier="Life:) internet" mcc="255" mnc="06" apn="internet" type="default,supl" /> - <apn carrier="Life:) MMS" mcc="255" mnc="06" apn="mms" mmsc="http://mms.life.com.ua/cmmsc/post" mmsproxy="212.58.162.230" mmsport="8080" type="mms" /> - <apn carrier="Utel Internet" mcc="255" mnc="07" apn="3g.utel.ua" type="default,supl" /> - <apn carrier="Utel MMS" mcc="255" mnc="07" apn="3g.utel.ua" mmsc="http://10.212.1.4/mms/wapenc" mmsproxy="10.212.3.148" mmsport="8080" type="mms" /> - <apn carrier="Velcom Internet" mcc="257" mnc="01" apn="web.velcom.by" authtype="1" proxy="10.200.15.15" port="8080" type="default,supl" /> - <apn carrier="Velcom MMS" mcc="257" mnc="01" apn="mms.velcom.by" user="mms" password="mms" authtype="1" mmsc="http://mmsc" mmsproxy="10.200.15.15" mmsport="8080" type="mms" /> - <apn carrier="MTS Internet" mcc="257" mnc="02" apn="mts" user="mts" password="mts" authtype="1" type="default,supl" /> - <apn carrier="MTS MMS" mcc="257" mnc="02" apn="mts" user="mts" password="mts" authtype="1" mmsc="http://mmsc" mmsproxy="192.168.192.192" mmsport="8080" type="mms" /> - <apn carrier="life:) Internet" mcc="257" mnc="04" apn="internet.life.com.by" authtype="1" type="default,supl" /> - <apn carrier="life:) MMS" mcc="257" mnc="04" apn="mms.life.com.by" authtype="1" mmsc="http://mms.life.com.by/mmsc/" mmsproxy="10.10.10.20" mmsport="8080" type="mms" /> - <apn carrier="Orange_Internet_GPRS" mcc="259" mnc="01" apn="wap.orange.md" type="default,supl" /> - <apn carrier="Orange_MMS_GPRS" mcc="259" mnc="01" apn="mms.orange.md" mmsc="http://mms/mms" mmsproxy="192.168.127.125" mmsport="3128" type="mms" /> - <apn carrier="Moldcell Internet" mcc="259" mnc="02" apn="internet" type="default,supl" /> - <apn carrier="Moldcell MMS" mcc="259" mnc="02" apn="mms" mmsc="http://mms.moldcell.md/cmmsc/post" mmsproxy="10.0.10.10" mmsport="9401" type="mms" /> - <apn carrier="Unite Internet PrePay" mcc="259" mnc="05" apn="internet3g.unite.md" type="default,supl" /> - <apn carrier="Unite Internet PostPay" mcc="259" mnc="05" apn="internet.unite.md" type="default,supl" /> - <apn carrier="Unite MMS" mcc="259" mnc="05" apn="mms.unite.md" mmsc="http://10.32.15.68:38090/was" mmsproxy="10.32.15.164" mmsport="8080" type="mms" /> - <apn carrier="Orange MMS" apn="mms.orange.md" mmsc="http://mms/mms" mmsproxy="192.168.127.125" mmsport="3128" mcc="259" mnc="01" type="mms" /> - <apn carrier="Orange IMO" apn="wap.orange.md" proxy="192.168.127.124" mmsport="3128" mcc="259" mnc="01" type="mms" /> - <apn carrier="Plus Internet" mcc="260" mnc="01" apn="plus" type="default,supl" /> - <apn carrier="Plus MMS" mcc="260" mnc="01" apn="mms" mmsc="http://mms.plusgsm.pl:8002" mmsproxy="212.2.96.16" mmsport="8080" type="mms" /> - <apn carrier="T-mobile.pl" mcc="260" mnc="02" apn="" type="ia" /> - <apn carrier="T-mobile.pl" mcc="260" mnc="02" apn="internet" type="default,supl" /> - <apn carrier="T-mobile.pl" mcc="260" mnc="02" apn="mms" mmsc="http://mms/servlets/mms" mmsproxy="213.158.194.226" mmsport="8080" type="mms" /> - <apn carrier="heyahinternet" mcc="260" mnc="02" apn="heyah.pl" type="default,supl" /> - <apn carrier="heyahmms" mcc="260" mnc="02" apn="heyahmms" mmsc="http://mms.heyah.pl/servlets/mms" mmsproxy="213.158.194.226" mmsport="8080" type="mms" /> - <apn carrier="Orange Internet" mcc="260" mnc="03" apn="Internet" user="internet" password="internet" authtype="1" type="default,supl" /> - <apn carrier="Orange MMS" mcc="260" mnc="03" apn="mms" user="mms" password="mms" mmsc="http://mms.orange.pl" mmsproxy="192.168.6.104" mmsport="8080" authtype="1" type="mms" /> - <apn carrier="Play Internet" mcc="260" mnc="06" apn="internet" type="default,supl" /> - <apn carrier="Play MMS" mcc="260" mnc="06" apn="mms" mmsc="http://10.10.28.164/mms/wapenc" mmsproxy="10.10.25.5" mmsport="8080" type="mms" /> - <apn carrier="Telekom Internet" mcc="262" mnc="01" apn="" type="ia" /> - <apn carrier="Telekom Internet" mcc="262" mnc="01" apn="internet.telekom" user="telekom" password="telekom" mmsc="http://mms.t-mobile.de/servlets/mms" mmsproxy="172.28.23.131" mmsport="8008" authtype="1" type="default,supl,mms" /> - <apn carrier="Vodafone DE" mcc="262" mnc="02" apn="" type="ia" /> - <apn carrier="Vodafone DE-MMS" mcc="262" mnc="02" apn="event.vodafone.de" mmsc="http://139.7.24.1/servlets/mms" mmsproxy="139.7.29.17" mmsport="80" type="mms" /> - <apn carrier="Vodafone DE" mcc="262" mnc="02" apn="web.vodafone.de" type="default,supl" /> - <apn carrier="E-Plus Web GPRS" mcc="262" mnc="03" apn="internet.eplus.de" user="eplus" password="internet" authtype="1" type="default,supl" /> - <apn carrier="E-Plus MMS" mcc="262" mnc="03" apn="mms.eplus.de" user="mms" password="eplus" mmsc="http://mms/eplus/" mmsproxy="212.23.97.153" mmsport="5080" authtype="1" type="mms" /> - <apn carrier="o2" mcc="262" mnc="07" apn="internet" mmsc="http://10.81.0.7:8002" mmsproxy="82.113.100.5" mmsport="8080" type="default,supl,mms" /> - <apn carrier="o2 Internet Prepaid" mcc="262" mnc="07" apn="pinternet.interkom.de" proxy="82.113.100.6" port="8080" mmsc="http://10.81.0.7:8002" mmsproxy="82.113.100.6" mmsport="8080" type="default,supl,mms" /> - <apn carrier="Vodafone Net2" mcc="268" mnc="01" apn="" type="ia" /> - <apn carrier="Vodafone Net2" mcc="268" mnc="01" apn="net2.vodafone.pt" user="vodafone" password="vodafone" authtype="1" proxy="iproxy.vodafone.pt" port="80" mmsc="http://mms.vodafone.pt/servlets/mms" mmsproxy="iproxy.vodafone.pt" mmsport="80" type="default,supl,mms" /> - <apn carrier="ZON Internet" mcc="268" mnc="01" apn="" type="ia" mvno_match_data="ZON" mvno_type="spn" /> - <apn carrier="ZON Internet" mcc="268" mnc="01" apn="internet.zon.pt" type="default,supl" mvno_match_data="ZON" mvno_type="spn" /> - <apn carrier="ZON MMS" mcc="268" mnc="01" apn="vas.zon.pt" user="vas" password="vas" authtype="1" mmsc="http://mms/servlets/mms" mmsproxy="213.30.27.63" mmsport="8799" type="mms" mvno_match_data="ZON" mvno_type="spn" /> - <apn carrier="PortalOptimus" mcc="268" mnc="03" apn="" type="ia" /> - <apn carrier="PortalOptimus" mcc="268" mnc="03" apn="umts" mmsc="http://mmsc:10021/mmsc" mmsproxy="62.169.66.5" mmsport="8799" type="default,supl,mms" /> - <apn carrier="TMN" mcc="268" mnc="06" apn="mmsc.tmn.pt" user="tmn" password="tmnnet" authtype="1" mmsc="http://mmsc/" mmsproxy="10.111.2.16" mmsport="8080" type="mms" /> - <apn carrier="LUXGSM MMS" mcc="270" mnc="01" apn="mms.pt.lu" user="mms" password="mms" mmsc="http://mmsc.pt.lu" mmsproxy="194.154.192.88" mmsport="8080" type="mms" /> - <apn carrier="LUXGSM WAP" mcc="270" mnc="01" apn="wap.pt.lu" user="wap" password="wap" proxy="194.154.192.98" port="8080" type="default,supl" /> - <apn carrier="Tango WAP" mcc="270" mnc="77" apn="internet" user="tango" password="tango" proxy="130.244.196.90" port="8080" type="default,supl" /> - <apn carrier="Tango MMS" mcc="270" mnc="77" apn="mms" user="tango" password="tango" mmsc="http://mms.tango.lu" mmsproxy="212.66.75.3" mmsport="8080" type="mms" /> - <apn carrier="Vox Mobile" mcc="270" mnc="99" apn="vox.lu" mmsc="http://mms.vox.lu" mmsproxy="212.88.139.44" mmsport="8080" type="default,supl,mms" /> - <apn carrier="Vodafone IE" mcc="272" mnc="01" apn="live.vodafone.com" type="default,supl" /> - <apn carrier="Vodafone IE-MMS" mcc="272" mnc="01" apn="mms.vodafone.net" mmsc="http://www.vodafone.ie/mms" mmsproxy="10.24.59.200" mmsport="80" type="mms" /> - <apn carrier="O2 Ireland" mcc="272" mnc="02" apn="internet" proxy="62.40.32.40" port="8080" mmsc="http://mmsc.mms.o2.ie:8002" mmsproxy="62.40.32.40" mmsport="8080" type="default,supl,mms" /> - <apn carrier="Meteor Data" mcc="272" mnc="03" apn="data.mymeteor.ie" user="my" password="wap" authtype="1" type="default,supl" /> - <apn carrier="Meteor MMS" mcc="272" mnc="03" apn="mms.mymeteor.ie" user="my" password="wap" authtype="1" mmsc="http://mms.mymeteor.ie" mmsproxy="10.85.85.85" mmsport="8799" type="mms" /> - <apn carrier="3" mcc="272" mnc="05" apn="3ireland.ie" mmsc="http://mms.um.3ireland.ie:10021/mmsc" mmsproxy="mms.3ireland.ie" mmsport="8799" type="default,supl,mms" /> - <apn carrier="Tesco" mcc="272" mnc="11" apn="tescomobile.liffeytelecom.com" mmsc="http://mmc1/servlets/mms" mmsproxy="10.1.11.19" mmsport="8080" type="default,supl,mms" mvno_match_data="0A" mvno_type="gid" /> - <apn carrier="Siminn Internet" mcc="274" mnc="01" apn="internet" proxy="213.167.138.200" port="8080" type="default,supl" /> - <apn carrier="Siminn MMS" mcc="274" mnc="01" apn="mms.simi.is" mmsc="http://mms.simi.is/servlets/mms" mmsproxy="213.167.138.200" mmsport="8080" type="mms" /> - <apn carrier="Vodafone Internet" mcc="274" mnc="02" apn="gprs.is" type="default,supl" /> - <apn carrier="Vodafone MMS" mcc="274" mnc="02" apn="mms.gprs.is" mmsc="http://mmsc.vodafone.is" mmsproxy="10.22.0.10" mmsport="8080" type="mms" /> - <apn carrier="MMS Nova" mcc="274" mnc="11" apn="mms.nova.is" mmsc="http://mmsc.nova.is" mmsproxy="10.10.2.60" mmsport="8080" type="mms" /> - <apn carrier="Net Nova" mcc="274" mnc="11" apn="net.nova.is" proxy="10.10.2.60" port="8080" type="default,supl" /> - <apn carrier="Vodafone MT" mcc="278" mnc="01" apn="internet" user="internet" password="internet" type="default,supl" /> - <apn carrier="Vodafone MT-MMS" mcc="278" mnc="01" apn="mms.vodafone.com.mt" mmsc="http://mms.vodafone.com.mt/servlets/mms" mmsproxy="10.12.0.3" mmsport="8080" type="mms" /> - <apn carrier="CYTA" mcc="280" mnc="01" apn="cytamobile" user="user" password="pass" mmsc="http://mmsc.cyta.com.cy" mmsproxy="212.31.96.161" mmsport="8080" type="default,supl,mms" /> - <apn carrier="MTN MMS" mcc="280" mnc="10" apn="mms" user="mms" password="mms" mmsc="http://mms.mtn.com.cy/mmsc" mmsproxy="172.24.97.1" mmsport="3130" type="mms" /> - <apn carrier="MTN Wap" mcc="280" mnc="10" apn="wap" user="wap" password="wap" proxy="172.24.97.3" port="3130" type="default,supl" /> - <apn carrier="MTel" mcc="284" mnc="01" apn="inet-gprs.mtel.bg" type="default,supl" /> - <apn carrier="MTel MMS" mcc="284" mnc="01" apn="mms-gprs.mtel.bg" user="mtel" password="mtel" authtype="1" mmsc="http://mmsc/" mmsproxy="10.150.0.33" mmsport="8080" type="mms" /> - <apn carrier="VIVACOM Internet" mcc="284" mnc="03" apn="internet.vivacom.bg" user="vivacom" password="vivacom" authtype="1" type="default,supl" /> - <apn carrier="Vivacom MMS" mcc="284" mnc="03" apn="mms.vivacom.bg" user="mms" password="mms" authtype="1" mmsc="http://mmsc.vivacom.bg" mmsproxy="192.168.123.123" mmsport="8080" type="mms" /> - <apn carrier="GPRS GLOBUL" mcc="284" mnc="05" apn="globul" authtype="1" proxy="192.168.88.11" port="8004" type="default,supl" /> - <apn carrier="GLOBUL MMS GPRS" mcc="284" mnc="05" apn="mms.globul.bg" user="mms" mmsc="http://mmsc1.mms.globul.bg:8002" mmsproxy="192.168.87.11" mmsport="8004" type="mms" /> - <apn carrier="TURKCELL INTERNET" mcc="286" mnc="01" apn="internet" type="default,supl" /> - <apn carrier="TURKCELL MMS" mcc="286" mnc="01" apn="mms" user="mms" password="mms" authtype="1" mmsc="http://mms.turkcell.com.tr/servlets/mms" mmsproxy="212.252.169.217" mmsport="8080" type="mms" /> - <apn carrier="Vodafone internet" mcc="286" mnc="02" apn="internet" authtype="1" type="default,supl" /> - <apn carrier="Vodafone MMS" mcc="286" mnc="02" apn="mms" user="vodafone" password="vodafone" authtype="1" mmsc="http://217.31.233.18:6001/MM1Servlet" mmsproxy="217.31.233.18" mmsport="9401" type="mms" /> - <apn carrier="Vodafone Live" mcc="286" mnc="02" apn="vflive" user="vodafone" password="vodafone" proxy="212.65.136.226" port="9401" type="default,supl" /> - <apn carrier="AVEA INTERNET" mcc="286" mnc="03" apn="internet" authtype="1" type="default,supl" /> - <apn carrier="AVEA MMS" mcc="286" mnc="03" apn="mms" user="mms" password="mms" authtype="1" mmsc="http://mms.avea.com.tr/servlets/mms" mmsproxy="213.161.151.201" mmsport="8080" type="mms" /> - <apn carrier="Tele Internet" mcc="290" mnc="01" apn="internet" type="default,supl" /> - <apn carrier="Tele MMS" mcc="290" mnc="01" apn="mms" mmsc="http://mms.tele.gl/mms/wapenc" mmsproxy="10.112.222.37" mmsport="8080" type="mms" /> - <apn carrier="Si.mobil GPRS" mcc="293" mnc="40" apn="internet.simobil.si" user="simobil" password="internet" authtype="1" proxy="80.95.224.17" port="9201" type="default,supl" /> - <apn carrier="Si.mobil MMS" mcc="293" mnc="40" apn="mms.simobil.si" user="simobil" password="internet" authtype="1" mmsc="http://mmc/" mmsproxy="80.95.224.46" mmsport="9201" type="mms" /> - <apn carrier="Mobilni Internet" mcc="293" mnc="41" apn="internet" user="mobitel" password="internet" authtype="1" mmsc="http://mms.mobitel.si/servlets/mms" mmsproxy="213.229.249.40" mmsport="8080" type="default,supl,mms" /> - <apn carrier="T2" mcc="293" mnc="64" apn="internet.t-2.net" mmsc="http://www.mms.t-2.net:8002" mmsproxy="172.20.18.137" mmsport="8080" type="default,supl,mms" /> - <apn carrier="Tusmobil Internet" mcc="293" mnc="70" apn="internet.tusmobil.si" user="tusmobil" password="internet" authtype="1" type="default,supl" /> - <apn carrier="Tusmobil MMS" mcc="293" mnc="70" apn="mms.tusmobil.si" user="tusmobil" password="mms" authtype="1" mmsc="http://mms.tusmobil.si:8002" mmsproxy="91.185.221.85" mmsport="8080" type="mms" /> - <apn carrier="T-Mobile MK Internet" mcc="294" mnc="01" apn="" type="ia" /> - <apn carrier="T-Mobile MK Internet" mcc="294" mnc="01" apn="internet" user="internet" password="t-mobile" type="default,supl" /> - <apn carrier="T-Mobile MK MMS" mcc="294" mnc="01" apn="mms" user="mms" password="mms" mmsc="http://mms.t-mobile.com.mk" mmsproxy="62.162.155.227" mmsport="8080" type="mms" /> - <apn carrier="Cosmofon" mcc="294" mnc="02" apn="Internet" user="Internet" password="Internet" proxy="http://wap.planet.mk" port="8080" type="default,supl" /> - <apn carrier="Cosmofon MMS" mcc="294" mnc="02" apn="mms" mmsc="http://195.167.65.220:8002" mmsproxy="10.10.10.20" mmsport="8080" type="mms" /> - <apn carrier="Internet" mcc="294" mnc="03" apn="vipoperator" user="vipoperator" password="vipoperator" proxy="78.40.0.1" port="8080" type="default,supl" /> - <apn carrier="MMS" mcc="294" mnc="03" apn="vipoperator.mms" user="vipoperator" password="vipoperator" mmsc="http://mmsc.vipoperator.com.mk" mmsproxy="78.40.0.1" mmsport="8080" type="mms" /> - <apn carrier="T-Mobile MMS" mcc="297" mnc="02" apn="mms" user="38267" password="38267" mmsc="http://192.168.180.100/servlets/mms" mmsproxy="10.0.5.19" mmsport="8080" type="mms" /> - <apn carrier="T-Mobile Internet" mcc="297" mnc="02" apn="tmcg-wnw" user="38267" password="38267" proxy="10.0.5.19" port="8080" type="default,supl" /> - <apn carrier="TELUS" mcc="302" mnc="220" apn="sp.telus.com" type="default,mms,supl" mmsc="http://aliasredirect.net/proxy/mmsc" mmsproxy="74.49.0.18" mmsport="80" mvno_match_data="54" mvno_type="gid" /> - <apn carrier="Koodo" mcc="302" mnc="220" apn="sp.koodo.com" type="default,mms,supl,dun" mmsc="http://aliasredirect.net/proxy/koodo/mmsc" mmsproxy="74.49.0.18" mmsport="80" mvno_match_data="4B" mvno_type="gid" /> - <apn carrier="PC mobile" mcc="302" mnc="220" apn="sp.mb.com" type="default,mms,supl" mmsc="http://aliasredirect.net/proxy/mb/mmsc" mmsproxy="74.49.0.18" mmsport="80" mvno_match_data="50" mvno_type="gid" /> - <apn carrier="TELUS" mcc="302" mnc="221" apn="sp.telus.com" type="default,mms,supl" mmsc="http://aliasredirect.net/proxy/mmsc" mmsproxy="74.49.0.18" mmsport="80" mvno_match_data="54" mvno_type="gid" /> - <apn carrier="Koodo" mcc="302" mnc="221" apn="sp.koodo.com" type="default,mms,supl,dun" mmsc="http://aliasredirect.net/proxy/koodo/mmsc" mmsproxy="74.49.0.18" mmsport="80" mvno_match_data="4B" mvno_type="gid" /> - <apn carrier="PC mobile" mcc="302" mnc="221" apn="sp.mb.com" type="default,mms,supl" mmsc="http://aliasredirect.net/proxy/mb/mmsc" mmsproxy="74.49.0.18" mmsport="80" mvno_match_data="50" mvno_type="gid" /> - <apn carrier="MOWAP" mcc="302" mnc="320" apn="wap.davewireless.com" proxy="10.100.3.4" port="8080" type="default,supl" /> - <apn carrier="Mobilicity" mcc="302" mnc="320" apn="mms.davewireless.com" mmsc="http://mms.mobilicity.net" mmsproxy="10.100.3.4" mmsport="8080" type="mms" /> - <apn carrier="MMS" mcc="302" mnc="270" apn="mms.mobi.eastlink.ca" mmsc="http://mmss.mobi.eastlink.ca" mmsproxy="10.232.12.49" mmsport="8080" type="mms" /> - <apn carrier="Internet" mcc="302" mnc="270" apn="wisp.mobi.eastlink.ca" type="default,supl,dun" /> - <apn carrier="Internet" mcc="302" mnc="490" apn="internet.windmobile.ca" type="default,supl" protocol="IPV4V6" /> - <apn carrier="Wind Mobile" mcc="302" mnc="490" apn="mms.windmobile.ca" mmsc="http://mms.windmobile.ca" mmsproxy="74.115.197.70" mmsport="8080" type="mms" /> - <apn carrier="Videotron" mcc="302" mnc="500" apn="media.videotron" mmsc="http://media.videotron.com" type="default,supl,mms" /> - <apn carrier="Videotron" mcc="302" mnc="510" apn="media.videotron" mmsc="http://media.videotron.com" type="default,supl,mms" /> - <apn carrier="Bell Mobility" mcc="302" mnc="610" apn="pda.bell.ca" type="default,mms,dun,supl" mmsc="http://mms.bell.ca/mms/wapenc" mmsproxy="web.wireless.bell.ca" mmsport="80" /> - <apn carrier="MTS" mcc="302" mnc="370" apn="sp.mts" type="default,mms,supl" mmsc="http://mmsc2.mts.net/" mmsproxy="wapgw1.mts.net" mmsport="9201" protocol="IPV4V6" roaming_protocol="IPV4V6" mvno_match_data="2C" mvno_type="gid" /> - <apn carrier="Fido LTE" mcc="302" mnc="370" apn="ltemobile.apn" type="default,mms,supl" mmsc="http://mms.fido.ca" mmsproxy="mmsproxy.fido.ca" mmsport="80" protocol="IPV4V6" roaming_protocol="IPV4V6" /> - <apn carrier="MTS" mcc="302" mnc="660" apn="sp.mts" type="default,mms,supl" mmsc="http://mmsc2.mts.net/" mmsproxy="wapgw1.mts.net" mmsport="9201" protocol="IPV4V6" roaming_protocol="IPV4V6" mvno_match_data="2C" mvno_type="gid" /> - <apn carrier="Rogers LTE" mcc="302" mnc="720" apn="ltemobile.apn" type="default,mms,supl" mmsc="http://mms.gprs.rogers.com" mmsproxy="mmsproxy.rogers.com" mmsport="80" protocol="IPV4V6" roaming_protocol="IPV4V6" /> - <apn carrier="chatr" mcc="302" mnc="720" apn="chatrweb.apn" type="default,mms,supl" mmsc="http://mms.chatrwireless.com" mmsproxy="205.151.11.11" mmsport="80" proxy="205.151.11.11" port="80" protocol="IPV4V6" roaming_protocol="IPV4V6" mvno_match_data="302720x94" mvno_type="imsi" /> - <apn carrier="SaskTel" mcc="302" mnc="780" apn="pda.stm.sk.ca" type="default,mms,supl,dun" mmsc="http://mms.sasktel.com/" mmsproxy="mig.sasktel.com" mmsport="80" /> - <apn carrier="Internet" mcc="310" mnc="000" apn="n.ispsn" type="default" mmsc="http://mms.plspictures.com" mmsproxy="68.28.31.7" mmsport="80" protocol="IPV4V6" bearer="0" /> - <apn carrier="myBlue Pix" mcc="310" mnc="030" apn="mmswap.centennialwireless.com" mmsc="http://mms.myblue.com/servlets/mms" mmsproxy="63.99.231.135" mmsport="8080" type="mms" /> - <apn carrier="Internet" mcc="310" mnc="030" apn="private.centennialwireless.com" user="privuser" password="priv" type="default,supl" /> - <apn carrier="CorrMMS" mcc="310" mnc="080" apn="corrmms" mmsc="http://mms.iot1.com/corr/mms.php" mmsproxy="66.255.55.23" mmsport="80" type="mms" /> - <apn carrier="Internet" mcc="310" mnc="090" apn="isp" type="default,supl" /> - <apn carrier="MMS" mcc="310" mnc="090" apn="mms" mmsc="http://mms.edgemobile.net/mmsc" mmsproxy="12.108.12.13" mmsport="3128" type="mms" /> - <apn carrier="Edge MMS Prepay" mcc="310" mnc="090" apn="ppmms" mmsc="http://mms.edgemobile.net/mmsc" mmsproxy="12.108.12.13" mmsport="3128" type="mms" /> - <apn carrier="PLAT-OTA-MMS" mcc="310" mnc="100" apn="plateaumms" password="mmsc" mmsc="208.254.124.11:8514" mmsproxy="208.254.124.11" mmsport="8080" type="mms" /> - <apn carrier="PLATWEB" mcc="310" mnc="100" apn="plateauweb" type="default,supl" /> - <apn carrier="OTA" mcc="310" mnc="120" apn="otasn" type="fota,ia" user="null" password="null" /> - <apn carrier="My Multi Media" mcc="310" mnc="130" apn="mms.c1.ama" user="cell1mms" password="cell1" mmsc="http://mms.iot1.com/amarillo/mms.php" type="mms" /> - <apn carrier="T-Mobile US 160" mcc="310" mnc="160" apn="" type="ia" protocol="IPV6" roaming_protocol="IP" /> - <apn carrier="T-Mobile US 160" mcc="310" mnc="160" apn="fast.t-mobile.com" mmsc="http://mms.msg.eng.t-mobile.com/mms/wapenc" type="default,supl,mms" protocol="IPV6" roaming_protocol="IP" /> - <apn carrier="MetroPCS 160" mcc="310" mnc="160" apn="fast.metropcs.com" mmsc="http://metropcs.mmsmvno.com/mms/wapenc" type="default,supl,mms" protocol="IPV6" roaming_protocol="IP" mvno_match_data="6D" mvno_type="gid" /> - <apn carrier="DataConnect" mcc="310" mnc="170" apn="isp.cingular" type="default,supl" /> - <apn carrier="Cingular MMS" mcc="310" mnc="170" apn="wap.cingular" user="WAP@CINGULARGPRS.COM" password="CINGULAR1" mmsc="http://mmsc.cingular.com" mmsproxy="66.209.11.32" mmsport="8080" type="mms" /> - <apn carrier="T-Mobile US 200" mcc="310" mnc="200" apn="" type="ia" protocol="IPV6" roaming_protocol="IP" /> - <apn carrier="T-Mobile US 200" mcc="310" mnc="200" apn="fast.t-mobile.com" mmsc="http://mms.msg.eng.t-mobile.com/mms/wapenc" type="default,supl,mms" protocol="IPV6" roaming_protocol="IP" /> - <apn carrier="MetroPCS 200" mcc="310" mnc="200" apn="fast.metropcs.com" mmsc="http://metropcs.mmsmvno.com/mms/wapenc" type="default,supl,mms" protocol="IPV6" roaming_protocol="IP" mvno_match_data="6D" mvno_type="gid" /> - <apn carrier="T-Mobile US 210" mcc="310" mnc="210" apn="" type="ia" protocol="IPV6" roaming_protocol="IP" /> - <apn carrier="T-Mobile US 210" mcc="310" mnc="210" apn="fast.t-mobile.com" mmsc="http://mms.msg.eng.t-mobile.com/mms/wapenc" type="default,supl,mms" protocol="IPV6" roaming_protocol="IP" /> - <apn carrier="MetroPCS 210" mcc="310" mnc="210" apn="fast.metropcs.com" mmsc="http://metropcs.mmsmvno.com/mms/wapenc" type="default,supl,mms" protocol="IPV6" roaming_protocol="IP" mvno_match_data="6D" mvno_type="gid" /> - <apn carrier="T-Mobile US 220" mcc="310" mnc="220" apn="" type="ia" protocol="IPV6" roaming_protocol="IP" /> - <apn carrier="T-Mobile US 220" mcc="310" mnc="220" apn="fast.t-mobile.com" mmsc="http://mms.msg.eng.t-mobile.com/mms/wapenc" type="default,supl,mms" protocol="IPV6" roaming_protocol="IP" /> - <apn carrier="MetroPCS 220" mcc="310" mnc="220" apn="fast.metropcs.com" mmsc="http://metropcs.mmsmvno.com/mms/wapenc" type="default,supl,mms" protocol="IPV6" roaming_protocol="IP" mvno_match_data="6D" mvno_type="gid" /> - <apn carrier="T-Mobile US 230" mcc="310" mnc="230" apn="" type="ia" protocol="IPV6" roaming_protocol="IP" /> - <apn carrier="T-Mobile US 230" mcc="310" mnc="230" apn="fast.t-mobile.com" mmsc="http://mms.msg.eng.t-mobile.com/mms/wapenc" type="default,supl,mms" protocol="IPV6" roaming_protocol="IP" /> - <apn carrier="MetroPCS 230" mcc="310" mnc="230" apn="fast.metropcs.com" mmsc="http://metropcs.mmsmvno.com/mms/wapenc" type="default,supl,mms" protocol="IPV6" roaming_protocol="IP" mvno_match_data="6D" mvno_type="gid" /> - <apn carrier="T-Mobile US 240" mcc="310" mnc="240" apn="" type="ia" protocol="IPV6" roaming_protocol="IP" /> - <apn carrier="T-Mobile US 240" mcc="310" mnc="240" apn="fast.t-mobile.com" mmsc="http://mms.msg.eng.t-mobile.com/mms/wapenc" type="default,supl,mms" protocol="IPV6" roaming_protocol="IP" /> - <apn carrier="MetroPCS 240" mcc="310" mnc="240" apn="fast.metropcs.com" mmsc="http://metropcs.mmsmvno.com/mms/wapenc" type="default,supl,mms" protocol="IPV6" roaming_protocol="IP" mvno_match_data="6D" mvno_type="gid" /> - <apn carrier="T-Mobile US 250" mcc="310" mnc="250" apn="" type="ia" protocol="IPV6" roaming_protocol="IP" /> - <apn carrier="T-Mobile US 250" mcc="310" mnc="250" apn="fast.t-mobile.com" mmsc="http://mms.msg.eng.t-mobile.com/mms/wapenc" type="default,supl,mms" protocol="IPV6" roaming_protocol="IP" /> - <apn carrier="MetroPCS 250" mcc="310" mnc="250" apn="fast.metropcs.com" mmsc="http://metropcs.mmsmvno.com/mms/wapenc" type="default,supl,mms" protocol="IPV6" roaming_protocol="IP" mvno_match_data="6D" mvno_type="gid" /> - <apn carrier="T-Mobile" mcc="310" mnc="260" apn="fast.t-mobile.com" mmsc="http://mms.msg.eng.t-mobile.com/mms/wapenc" type="default,supl,mms" protocol="IPV6" roaming_protocol="IP" /> - <apn carrier="MetroPCS" mcc="310" mnc="260" apn="fast.metropcs.com" mmsc="http://metropcs.mmsmvno.com/mms/wapenc" type="default,supl,mms" protocol="IPV6" roaming_protocol="IP" mvno_match_data="6D" mvno_type="gid" /> - <apn carrier="Simple Mobile" mcc="310" mnc="260" mmsc="http://smpl.mms.msg.eng.t-mobile.com/mms/wapenc" type="mms" /> - <apn carrier="T-Mobile US 270" mcc="310" mnc="270" apn="" type="ia" protocol="IPV6" roaming_protocol="IP" /> - <apn carrier="T-Mobile US 270" mcc="310" mnc="270" apn="fast.t-mobile.com" mmsc="http://mms.msg.eng.t-mobile.com/mms/wapenc" type="default,supl,mms" protocol="IPV6" roaming_protocol="IP" /> - <apn carrier="MetroPCS 270" mcc="310" mnc="270" apn="fast.metropcs.com" mmsc="http://metropcs.mmsmvno.com/mms/wapenc" type="default,supl,mms" protocol="IPV6" roaming_protocol="IP" mvno_match_data="6D" mvno_type="gid" /> - <apn carrier="T-Mobile US 300" mcc="310" mnc="300" apn="fast.t-mobile.com" mmsc="http://mms.msg.eng.t-mobile.com/mms/wapenc" type="default,supl,mms" protocol="IPV6" roaming_protocol="IP" /> - <apn carrier="MetroPCS 300" mcc="310" mnc="300" apn="fast.metropcs.com" mmsc="http://metropcs.mmsmvno.com/mms/wapenc" type="default,supl,mms" protocol="IPV6" roaming_protocol="IP" mvno_match_data="6D" mvno_type="gid" /> - <apn carrier="T-Mobile US 310" mcc="310" mnc="310" apn="" type="ia" protocol="IPV6" roaming_protocol="IP" /> - <apn carrier="T-Mobile US 310" mcc="310" mnc="310" apn="fast.t-mobile.com" mmsc="http://mms.msg.eng.t-mobile.com/mms/wapenc" type="default,supl,mms" protocol="IPV6" roaming_protocol="IP" /> - <apn carrier="MetroPCS 310" mcc="310" mnc="310" apn="fast.metropcs.com" mmsc="http://metropcs.mmsmvno.com/mms/wapenc" type="default,supl,mms" protocol="IPV6" roaming_protocol="IP" mvno_match_data="6D" mvno_type="gid" /> - <apn carrier="Cingular 380 ATT" mcc="310" mnc="380" apn="proxy" mmsc="http://mmsc.cingular.com/" mmsproxy="wireless.cingular.com" type="default,supl,mms" /> - <apn carrier="AWS MMS" mcc="310" mnc="380" apn="proxy" mmsc="http://mmsc.mymmode.com" mmsproxy="10.250.250.55" mmsport="8080" type="mms" /> - <apn carrier="Celloneet MMS" mcc="310" mnc="390" apn="mms.celloneet.com" user="user1@mms.celloneet.com" password="celloneet" mmsc="http://mms.celloneet.com/servlets/mms" mmsproxy="63.99.231.135" mmsport="8080" type="mms" /> - <apn carrier="CBW Data" mcc="310" mnc="420" apn="wap.gocbw.com" mmsc="http://mms.gocbw.com:8088/mms" mmsproxy="216.68.79.202" mmsport="80" type="default,supl,mms" /> - <apn carrier="Viaero Internet" mcc="310" mnc="450" apn="internet.vedge.com" type="default,supl" /> - <apn carrier="Viaero MMS" mcc="310" mnc="450" apn="mms" mmsc="http://mms.viaero.com" mmsproxy="10.168.3.23" mmsport="9401" type="mms" /> - <apn carrier="DataConnect" mcc="310" mnc="470" apn="isp.cingular" type="default,supl" /> - <apn carrier="MediaNet" mcc="310" mnc="470" apn="wap.cingular" user="WAP@CINGULARGPRS.COM" password="CINGULAR1" mmsc="http://mmsc.cingular.com" mmsproxy="66.209.11.32" mmsport="8080" type="default,supl,mms" /> - <apn carrier="DataConnect" mcc="310" mnc="480" apn="isp.cingular" type="default,supl" /> - <apn carrier="MediaNet" mcc="310" mnc="480" apn="wap.cingular" user="WAP@CINGULARGPRS.COM" password="CINGULAR1" mmsc="http://mmsc.cingular.com" mmsproxy="66.209.11.32" mmsport="8080" type="default,supl,mms" /> - <apn carrier="T-Mobile US 490" mcc="310" mnc="490" apn="" type="ia" protocol="IPV6" roaming_protocol="IP" /> - <apn carrier="T-Mobile US 490" mcc="310" mnc="490" apn="fast.t-mobile.com" mmsc="http://mms.msg.eng.t-mobile.com/mms/wapenc" type="default,supl,mms" protocol="IPV6" roaming_protocol="IP" /> - <apn carrier="MetroPCS 490" mcc="310" mnc="490" apn="fast.metropcs.com" mmsc="http://metropcs.mmsmvno.com/mms/wapenc" type="default,supl,mms" protocol="IPV6" roaming_protocol="IP" mvno_match_data="6D" mvno_type="gid" /> - <apn carrier="GoodCall Picture Message" mcc="310" mnc="490" apn="good.call" mmsc="http://mms.suncom.net:8088/mms" mmsproxy="66.150.33.125" mmsport="8080" type="mms" /> - <apn carrier="Suncom MMS" mcc="310" mnc="490" apn="mms" mmsc="http://mms.suncom.net:8088/mms" mmsproxy="66.150.33.125" mmsport="8080" type="mms" /> - <apn carrier="T-Mobile US 530" mcc="310" mnc="530" apn="fast.t-mobile.com" mmsc="http://mms.msg.eng.t-mobile.com/mms/wapenc" type="default,supl,mms" protocol="IPV6" roaming_protocol="IP" /> - <apn carrier="MetroPCS 530" mcc="310" mnc="530" apn="fast.metropcs.com" mmsc="http://metropcs.mmsmvno.com/mms/wapenc" type="default,supl,mms" protocol="IPV6" roaming_protocol="IP" mvno_match_data="6D" mvno_type="gid" /> - <apn carrier="DobsonMMS" mcc="310" mnc="560" apn="dobsoncellularwap" mmsc="http://mmsc" mmsproxy="172.23.1.252" mmsport="8799" type="mms" /> - <apn carrier="ChinookMMS" mcc="310" mnc="570" apn="wapgw.chinookwireless.net" mmsc="http://mms.cellonenation.net/mms/" mmsproxy="204.181.155.195" mmsport="8080" type="mms" /> - <apn carrier="T-Mobile US 580" mcc="310" mnc="580" apn="" type="ia" protocol="IPV6" roaming_protocol="IP" /> - <apn carrier="T-Mobile US 580" mcc="310" mnc="580" apn="fast.t-mobile.com" mmsc="http://mms.msg.eng.t-mobile.com/mms/wapenc" type="default,supl,mms" protocol="IPV6" roaming_protocol="IP" /> - <apn carrier="MetroPCS 580" mcc="310" mnc="580" apn="fast.metropcs.com" mmsc="http://metropcs.mmsmvno.com/mms/wapenc" type="default,supl,mms" protocol="IPV6" roaming_protocol="IP" mvno_match_data="6D" mvno_type="gid" /> - <apn carrier="CellularOne MMS" mcc="310" mnc="590" apn="cellular1wap" mmsc="http://mmsc" mmsproxy="172.23.1.252" mmsport="8799" type="mms" /> - <apn carrier="T-Mobile US 590" mcc="310" mnc="590" apn="fast.t-mobile.com" mmsc="http://mms.msg.eng.t-mobile.com/mms/wapenc" type="default,supl,mms" protocol="IPV6" roaming_protocol="IP" /> - <apn carrier="MetroPCS 590" mcc="310" mnc="590" apn="fast.metropcs.com" mmsc="http://metropcs.mmsmvno.com/mms/wapenc" type="default,supl,mms" protocol="IPV6" roaming_protocol="IP" mvno_match_data="6D" mvno_type="gid" /> - <apn carrier="EpicINT" mcc="310" mnc="610" apn="internet.epictouch" type="default,supl" /> - <apn carrier="EpicMMS" mcc="310" mnc="610" apn="mms.epictouch" mmsc="http://mmsc.westlinkcom.com/servlets/mms" mmsproxy="63.99.231.135" mmsport="8080" type="mms" /> - <apn carrier="T-Mobile US 640" mcc="310" mnc="640" apn="fast.t-mobile.com" mmsc="http://mms.msg.eng.t-mobile.com/mms/wapenc" type="default,supl,mms" protocol="IPV6" roaming_protocol="IP" /> - <apn carrier="MetroPCS 640" mcc="310" mnc="640" apn="fast.metropcs.com" mmsc="http://metropcs.mmsmvno.com/mms/wapenc" type="default,supl,mms" protocol="IPV6" roaming_protocol="IP" mvno_match_data="6D" mvno_type="gid" /> - <apn carrier="T-Mobile US 660" mcc="310" mnc="660" apn="" type="ia" protocol="IPV6" roaming_protocol="IP" /> - <apn carrier="T-Mobile US 660" mcc="310" mnc="660" apn="fast.t-mobile.com" mmsc="http://mms.msg.eng.t-mobile.com/mms/wapenc" type="default,supl,mms" protocol="IPV6" roaming_protocol="IP" /> - <apn carrier="MetroPCS 660" mcc="310" mnc="660" apn="fast.metropcs.com" mmsc="http://metropcs.mmsmvno.com/mms/wapenc" type="default,supl,mms" protocol="IPV6" roaming_protocol="IP" mvno_match_data="6D" mvno_type="gid" /> - <apn carrier="Web 2" mcc="310" mnc="770" apn="i2.iwireless.com" type="default,supl" /> - <apn carrier="Web 1" mcc="310" mnc="770" apn="wap1.iwireless.com" proxy="209.4.229.31" port="9401" type="default,supl" /> - <apn carrier="Picture Messaging" mcc="310" mnc="770" apn="wap1.iwireless.com" mmsc="http://mmsc.iwireless.dataonair.net:6672" mmsproxy="209.4.229.32" mmsport="9401" type="mms" /> - <apn carrier="T-Mobile US 800" mcc="310" mnc="800" apn="" type="ia" protocol="IPV6" roaming_protocol="IP" /> - <apn carrier="T-Mobile US 800" mcc="310" mnc="800" apn="fast.t-mobile.com" mmsc="http://mms.msg.eng.t-mobile.com/mms/wapenc" type="default,supl,mms" protocol="IPV6" roaming_protocol="IP" /> - <apn carrier="MetroPCS 800" mcc="310" mnc="800" apn="fast.metropcs.com" mmsc="http://metropcs.mmsmvno.com/mms/wapenc" type="default,supl,mms" protocol="IPV6" roaming_protocol="IP" mvno_match_data="6D" mvno_type="gid" /> - <apn carrier="Internet" mcc="310" mnc="840" apn="isp" type="default,supl" /> - <apn carrier="MMS" mcc="310" mnc="840" apn="mms" mmsc="http://mms.edgemobile.net/mmsc" mmsproxy="12.108.12.13" mmsport="3128" type="mms" /> - <apn carrier="Edge MMS Prepay" mcc="310" mnc="840" apn="ppmms" mmsc="http://mms.edgemobile.net/mmsc" mmsproxy="12.108.12.13" mmsport="3128" type="mms" /> - <apn carrier="DTC MMS" mcc="310" mnc="880" apn="mms.adv.com" mmsc="http://mms.iot1.com/advantage/mms.php" type="mms" /> - <apn carrier="WOW_WAP" mcc="310" mnc="910" apn="wap.firstcellular.com" mmsc="mms.firstcellular.net/mmsc" mmsproxy="10.101.1.5" mmsport="3128" type="default,supl,mms" /> - <apn carrier="MMS" mcc="311" mnc="190" apn="wap.cellular1.net" mmsc="http://mms.cellular1.net/ecit/mms.php" type="mms" /> - <apn carrier="Farmers GPRS" mcc="311" mnc="210" apn="internet.farmerswireless.com" type="default,supl" /> - <apn carrier="Farmers MMS" mcc="311" mnc="210" apn="mms.farmers.com" mmsc="172.16.0.37:8514" type="mms" /> - <apn carrier="GCI WEB" mcc="311" mnc="370" apn="web.gci" type="default,supl" /> - <apn carrier="GCI MMS" mcc="311" mnc="370" apn="mms.gci" proxy="209.4.229.92" port="9201" mmsc="http://mmsc.gci.csky.us:6672" mmsproxy="209.4.229.92" mmsport="9201" type="mms" /> - <apn carrier="Internet" mcc="311" mnc="870" apn="n.ispsn" type="default" mmsc="http://mm.myboostmobile.com" mmsproxy="68.28.31.7" mmsport="80" protocol="IPV4V6" bearer="0" /> - <apn carrier="INTERNET CLARO" mcc="330" mnc="110" apn="internet.claropr.com" type="default,supl,dun" /> - <apn carrier="MMS CLARO" mcc="330" mnc="110" apn="mms.claropr.com" mmsproxy="10.50.38.3" mmsport="8799" mmsc="http://mmsg.claropr.com:10021/mmsc" type="mms" /> - <apn carrier="Internet" mcc="334" mnc="020" apn="internet.itelcel.com" user="webgprs" password="webgprs2002" authtype="1" type="default,supl,dun" /> - <apn carrier="Mensajes Multimedia" mcc="334" mnc="020" apn="mms.itelcel.com" user="mmsgprs" password="mmsgprs2003" mmsc="http://mms.itelcel.com/servlets/mms" mmsproxy="148.233.151.240" mmsport="8080" authtype="1" type="mms" /> - <apn carrier="Movistar INTERNET" mcc="334" mnc="03" apn="internet.movistar.mx" user="movistar" password="movistar" authtype="1" type="default,supl,dun" /> - <apn carrier="Movistar MMS" mcc="334" mnc="03" apn="mms.movistar.mx" user="movistar" password="movistar" mmsc="http://mms.movistar.mx" mmsproxy="10.2.20.1" mmsport="80" authtype="1" type="mms" /> - <apn carrier="Movistar INTERNET" mcc="334" mnc="030" apn="internet.movistar.mx" user="movistar" password="movistar" authtype="1" type="default,supl,dun" /> - <apn carrier="Movistar MMS" mcc="334" mnc="030" apn="mms.movistar.mx" user="movistar" password="movistar" mmsc="http://mms.movistar.mx" mmsproxy="10.2.20.1" mmsport="80" authtype="1" type="mms" /> - <apn carrier="Iusacell Internet" mcc="334" mnc="050" apn="web.iusacellgsm.mx" user="iusacellgsm" password="iusacellgsm" type="default,supl,dun" /> - <apn carrier="Iusacell MMS" mcc="334" mnc="050" apn="mms.iusacellgsm.mx" user="mmsiusacellgsm" password="mmsiusacellgsm" mmsc="http://mms.iusacell3g.com/" type="mms" /> - <apn carrier="INTERNET Digicel" mcc="338" mnc="05" apn="web" type="default,supl,dun" /> - <apn carrier="MMS Digicel" mcc="338" mnc="05" apn="wap" mmsproxy="172.16.7.12" mmsport="8080" mmsc="http://mms.digicelgroup.com" type="mms" /> - <apn carrier="INTERNET Digicel" mcc="338" mnc="050" apn="web" type="default,supl,dun" /> - <apn carrier="MMS Digicel" mcc="338" mnc="050" apn="wap" mmsproxy="172.16.7.12" mmsport="8080" mmsc="http://mms.digicelgroup.com" type="mms" /> - <apn carrier="Lime Internet Postpaid" mcc="338" mnc="18" apn="internet" type="default,supl,dun" /> - <apn carrier="Lime Postpaid MMS" mcc="338" mnc="18" apn="multimedia" mmsproxy="10.20.5.34" mmsport="8799" mmsc="http://mmsc" type="mms" /> - <apn carrier="Lime Internet Prepaid" mcc="338" mnc="18" apn="ppinternet" type="default,supl,dun" /> - <apn carrier="Lime Prepaid MMS" mcc="338" mnc="18" apn="ppmms" mmsproxy="10.20.5.34" mmsport="8799" mmsc="http://mmsc" type="mms" /> - <apn carrier="Lime Internet Postpaid" mcc="338" mnc="180" apn="internet" type="default,supl,dun" /> - <apn carrier="Lime Postpaid MMS" mcc="338" mnc="180" apn="multimedia" mmsproxy="10.20.5.34" mmsport="8799" mmsc="http://mmsc" type="mms" /> - <apn carrier="Lime Internet Prepaid" mcc="338" mnc="180" apn="ppinternet" type="default,supl,dun" /> - <apn carrier="Lime Prepaid MMS" mcc="338" mnc="180" apn="ppmms" mmsproxy="10.20.5.34" mmsport="8799" mmsc="http://mmsc" type="mms" /> - <apn carrier="Claro Web" mcc="338" mnc="070" apn="internet.ideasclaro.com.jm" user="" password="" authtype="1" type="default,supl,dun" /> - <apn carrier="Claro MMS" mcc="338" mnc="070" apn="mms.ideasclaro.com.jm" user="" password="" mmsproxy="190.80.147.118" mmsport="8080" mmsc="http://mms.ideasclaro.com.jm/mms/wapenc" authtype="1" type="mms" /> - <apn carrier="Lime Internet Postpaid" mcc="338" mnc="180" apn="internet" user="" password="" authtype="1" type="default,supl,dun" /> - <apn carrier="Lime Postpaid MMS" mcc="338" mnc="180" apn="multimedia" user="" password="" mmsproxy="10.20.5.34" mmsport="8799" mmsc="http://mmsc" authtype="1" type="mms" /> - <apn carrier="Orange World Caraïbe" mcc="340" mnc="01" apn="orangewap" user="orange" password="wap" proxy="10.0.0.10" port="8082" type="default,supl" /> - <apn carrier="Orange MMS Caraïbe" mcc="340" mnc="01" apn="orangewap" user="orange" password="orange" mmsc="http://193.251.160.246/servlets/mms" mmsproxy="10.0.0.10" mmsport="8082" type="mms" /> - <apn carrier="Digicel Web" mcc="340" mnc="20" apn="web.digicelfr.com" mmsc="http://mmc.digiceltt.com/servlets/mms" mmsproxy="172.20.6.12" mmsport="8080" type="default,supl,mms" /> - <apn carrier="Lime Internet Postpaid" mcc="342" mnc="60" apn="internet" user="" password="" type="default,supl,dun" /> - <apn carrier="Lime Postpaid MMS" mcc="342" mnc="60" apn="multimedia" user="" password="" mmsproxy="10.20.5.34" mmsport="8799" mmsc="http://mmsc" type="mms" /> - <apn carrier="Lime Internet Postpaid" mcc="344" mnc="92" apn="internet" user="" password="" type="default,supl,dun" /> - <apn carrier="Lime Postpaid MMS" mcc="344" mnc="92" apn="multimedia" user="" password="" mmsproxy="10.20.5.34" mmsport="8799" mmsc="http://mmsc" type="mms" /> - <apn carrier="Lime Internet Postpaid" mcc="346" mnc="14" apn="internet" user="" password="" type="default,supl,dun" /> - <apn carrier="Lime Postpaid MMS" mcc="346" mnc="14" apn="multimedia" user="" password="" mmsproxy="10.20.5.34" mmsport="8799" mmsc="http://mmsc" type="mms" /> - <apn carrier="Lime Internet Postpaid" mcc="348" mnc="17" apn="internet" user="" password="" type="default,supl,dun" /> - <apn carrier="Lime Postpaid MMS" mcc="348" mnc="17" apn="multimedia" user="" password="" mmsproxy="10.20.5.34" mmsport="8799" mmsc="http://mmsc" type="mms" /> - <apn carrier="Lime Internet Postpaid" mcc="352" mnc="11" apn="internet" user="" password="" type="default,supl,dun" /> - <apn carrier="Lime Postpaid MMS" mcc="352" mnc="11" apn="multimedia" user="" password="" mmsproxy="10.20.5.34" mmsport="8799" mmsc="http://mmsc" type="mms" /> - <apn carrier="Lime Internet Postpaid" mcc="354" mnc="86" apn="internet" user="" password="" type="default,supl,dun" /> - <apn carrier="Lime Postpaid MMS" mcc="354" mnc="86" apn="multimedia" user="" password="" mmsproxy="10.20.5.34" mmsport="8799" mmsc="http://mmsc" type="mms" /> - <apn carrier="Lime Internet Postpaid" mcc="356" mnc="11" apn="internet" user="" password="" type="default,supl,dun" /> - <apn carrier="Lime Postpaid MMS" mcc="356" mnc="11" apn="multimedia" user="" password="" mmsproxy="10.20.5.34" mmsport="8799" mmsc="http://mmsc" type="mms" /> - <apn carrier="Lime Internet Postpaid" mcc="358" mnc="11" apn="internet" user="" password="" type="default,supl,dun" /> - <apn carrier="Lime Postpaid MMS" mcc="358" mnc="11" apn="multimedia" user="" password="" mmsproxy="10.20.5.34" mmsport="8799" mmsc="http://mmsc" type="mms" /> - <apn carrier="Lime Internet Postpaid" mcc="360" mnc="11" apn="internet" user="" password="" type="default,supl,dun" /> - <apn carrier="Lime Postpaid MMS" mcc="360" mnc="11" apn="multimedia" user="" password="" mmsproxy="10.20.5.34" mmsport="8799" mmsc="http://mmsc" type="mms" /> - <apn carrier="INTERNET Aruba" mcc="363" mnc="02" apn="web.digicelaruba.com" user="" password="" authtype="1" type="default,supl,dun" /> - <apn carrier="MMS Digicel" mcc="363" mnc="02" apn="wap" user="" password="" mmsproxy="172.16.7.12" mmsport="8080" mmsc="http://mms.digicelgroup.com" authtype="1" type="mms" /> - <apn carrier="INTERNET Aruba" mcc="363" mnc="020" apn="web.digicelaruba.com" user="" password="" authtype="1" type="default,supl,dun" /> - <apn carrier="MMS Digicel" mcc="363" mnc="020" apn="wap" user="" password="" mmsproxy="172.16.7.12" mmsport="8080" mmsc="http://mms.digicelgroup.com" authtype="1" type="mms" /> - <apn carrier="Lime Internet Postpaid" mcc="365" mnc="84" apn="internet" user="" password="" type="default,supl,dun" /> - <apn carrier="Lime Postpaid MMS" mcc="365" mnc="84" apn="multimedia" user="" password="" mmsproxy="10.20.5.34" mmsport="8799" mmsc="http://mmsc" type="mms" /> - <apn carrier="Lime Internet Postpaid" mcc="366" mnc="11" apn="internet" user="" password="" type="default,supl,dun" /> - <apn carrier="Lime Postpaid MMS" mcc="366" mnc="11" apn="multimedia" user="" password="" mmsproxy="10.20.5.34" mmsport="8799" mmsc="http://mmsc" type="mms" /> - <apn carrier="Internet" mcc="368" mnc="01" apn="internet" type="default,supl,dun" /> - <apn carrier="Cubacel MMS" mcc="368" mnc="01" apn="mms" mmsproxy="200.13.145.52" mmsport="8080" mmsc="http://mms.cubacel.cu" type="mms" /> - <apn carrier="Orange net" mcc="370" mnc="01" apn="orangenet.com.do" type="default,supl,dun" /> - <apn carrier="Orange MMS" mcc="370" mnc="01" apn="orangeworld" user="orange" password="orange" mmsproxy="172.16.126.70" mmsport="8080" mmsc="http://mms.orange.com.do/servlets/mms" authtype="1" type="mms" /> - <apn carrier="Internet Móvil Claro" mcc="370" mnc="02" apn="internet.ideasclaro.com.do" type="default,supl,dun" /> - <apn carrier="MMS" mcc="370" mnc="02" apn="internet.ideasclaro.com.do" mmsc="http://mms.ideasclaro.com.do/mms/wapenc" type="mms" /> - <apn carrier="Internet Móvil Claro" mcc="370" mnc="020" apn="internet.ideasclaro.com.do" type="default,supl,dun" /> - <apn carrier="MMS" mcc="370" mnc="020" apn="internet.ideasclaro.com.do" mmsc="http://mms.ideasclaro.com.do/mms/wapenc" type="mms" /> - <apn carrier="Viva Edge" mcc="370" mnc="04" apn="edge.viva.net.do" proxy="192.168.16.10" port="9401" user="viva" password="viva" authtype="1" type="default,supl,dun" /> - <apn carrier="Viva MMS" mcc="370" mnc="04" apn="mms.viva.net.do" user="viva" password="viva" mmsproxy="192.168.16.10" mmsport="9401" mmsc="http://10.200.16.4/mms/wapenc" authtype="1" type="mms" /> - <apn carrier="Bmobile internet" mcc="374" mnc="12" apn="internet" user="" password="" authtype="1" type="default,supl,dun" /> - <apn carrier="Bmobile mms" mcc="374" mnc="12" apn="mms" user="" password="" mmsproxy="192.168.210.104" mmsport="8080" mmsc="http://192.168.210.104/mmrelay.app" authtype="1" type="mms" /> - <apn carrier="Bmobile internet" mcc="374" mnc="120" apn="internet" user="" password="" authtype="1" type="default,supl,dun" /> - <apn carrier="Bmobile mms" mcc="374" mnc="120" apn="mms" user="" password="" mmsproxy="192.168.210.104" mmsport="8080" mmsc="http://192.168.210.104/mmrelay.app" authtype="1" type="mms" /> - <apn carrier="Bmobile internet" mcc="374" mnc="121" apn="internet" user="" password="" authtype="1" type="default,supl,dun" /> - <apn carrier="Bmobile mms" mcc="374" mnc="121" apn="mms" user="" password="" mmsproxy="192.168.210.104" mmsport="8080" mmsc="http://192.168.210.104/mmrelay.app" authtype="1" type="mms" /> - <apn carrier="Bmobile internet" mcc="374" mnc="122" apn="internet" user="" password="" authtype="1" type="default,supl,dun" /> - <apn carrier="Bmobile mms" mcc="374" mnc="122" apn="mms" user="" password="" mmsproxy="192.168.210.104" mmsport="8080" mmsc="http://192.168.210.104/mmrelay.app" authtype="1" type="mms" /> - <apn carrier="Bmobile internet" mcc="374" mnc="123" apn="internet" user="" password="" authtype="1" type="default,supl,dun" /> - <apn carrier="Bmobile mms" mcc="374" mnc="123" apn="mms" user="" password="" mmsproxy="192.168.210.104" mmsport="8080" mmsc="http://192.168.210.104/mmrelay.app" authtype="1" type="mms" /> - <apn carrier="Bmobile internet" mcc="374" mnc="124" apn="internet" user="" password="" authtype="1" type="default,supl,dun" /> - <apn carrier="Bmobile mms" mcc="374" mnc="124" apn="mms" user="" password="" mmsproxy="192.168.210.104" mmsport="8080" mmsc="http://192.168.210.104/mmrelay.app" authtype="1" type="mms" /> - <apn carrier="Bmobile internet" mcc="374" mnc="125" apn="internet" user="" password="" authtype="1" type="default,supl,dun" /> - <apn carrier="Bmobile mms" mcc="374" mnc="125" apn="mms" user="" password="" mmsproxy="192.168.210.104" mmsport="8080" mmsc="http://192.168.210.104/mmrelay.app" authtype="1" type="mms" /> - <apn carrier="Bmobile internet" mcc="374" mnc="126" apn="internet" user="" password="" authtype="1" type="default,supl,dun" /> - <apn carrier="Bmobile mms" mcc="374" mnc="126" apn="mms" user="" password="" mmsproxy="192.168.210.104" mmsport="8080" mmsc="http://192.168.210.104/mmrelay.app" authtype="1" type="mms" /> - <apn carrier="Bmobile internet" mcc="374" mnc="127" apn="internet" user="" password="" authtype="1" type="default,supl,dun" /> - <apn carrier="Bmobile mms" mcc="374" mnc="127" apn="mms" user="" password="" mmsproxy="192.168.210.104" mmsport="8080" mmsc="http://192.168.210.104/mmrelay.app" authtype="1" type="mms" /> - <apn carrier="Bmobile internet" mcc="374" mnc="128" apn="internet" user="" password="" authtype="1" type="default,supl,dun" /> - <apn carrier="Bmobile mms" mcc="374" mnc="128" apn="mms" user="" password="" mmsproxy="192.168.210.104" mmsport="8080" mmsc="http://192.168.210.104/mmrelay.app" authtype="1" type="mms" /> - <apn carrier="Bmobile internet" mcc="374" mnc="129" apn="internet" user="" password="" authtype="1" type="default,supl,dun" /> - <apn carrier="Bmobile mms" mcc="374" mnc="129" apn="mms" user="" password="" mmsproxy="192.168.210.104" mmsport="8080" mmsc="http://192.168.210.104/mmrelay.app" authtype="1" type="mms" /> - <apn carrier="INTERNET Trinidad" mcc="374" mnc="13" apn="web.digiceltt.com" user="" password="" authtype="1" type="default,supl,dun" /> - <apn carrier="MMS Trinidad" mcc="374" mnc="13" apn="wap.digiceltt.com" user="wap" password="wap" mmsproxy="172.20.6.12" mmsport="8080" mmsc="http://mmc.digiceltt.com/servlets/mms" authtype="1" type="mms" /> - <apn carrier="INTERNET Trinidad" mcc="374" mnc="130" apn="web.digiceltt.com" user="" password="" authtype="1" type="default,supl,dun" /> - <apn carrier="MMS Trinidad" mcc="374" mnc="130" apn="wap.digiceltt.com" user="wap" password="wap" mmsproxy="172.20.6.12" mmsport="8080" mmsc="http://mmc.digiceltt.com/servlets/mms" authtype="1" type="mms" /> - <apn carrier="Lime Internet Postpaid" mcc="376" mnc="35" apn="internet" user="" password="" type="default,supl,dun" /> - <apn carrier="Lime Postpaid MMS" mcc="376" mnc="35" apn="multimedia" user="" password="" mmsproxy="10.20.5.34" mmsport="8799" mmsc="http://mmsc" type="mms" /> - <apn carrier="Azercell" mcc="400" mnc="01" apn="default" type="default,supl" /> - <apn carrier="Bakcell" mcc="400" mnc="02" apn="default" type="default,supl" /> - <apn carrier="FONEX" mcc="400" mnc="03" apn="default" type="default,supl" /> - <apn carrier="Nar Mobile" mcc="400" mnc="04" apn="default" type="default,supl" /> - <apn carrier="Beeline Internet" mcc="401" mnc="01" apn="internet.beeline.kz" user="\@internet.beeline" password="beeline" authtype="1" type="default,supl" /> - <apn carrier="Beeline MMS" mcc="401" mnc="01" apn="mms.beeline.kz" user="\@mms.beeline" password="beeline" authtype="1" mmsc="http://mms.beeline.kz/mms/wapenc" mmsproxy="172.27.6.93" mmsport="8080" type="mms" /> - <apn carrier="DOS Internet" mcc="401" mnc="01" apn="internet.dos.kz" type="default,supl" /> - <apn carrier="Kcell Internet" mcc="401" mnc="02" apn="internet" type="default,supl" /> - <apn carrier="Kcell MMS" mcc="401" mnc="02" apn="mms" mmsc="http://mms.kcell.kz/post" mmsproxy="195.47.255.7" mmsport="8080" type="mms" /> - <apn carrier="Tele2 Internet" mcc="401" mnc="77" apn="internet" type="default,supl" /> - <apn carrier="Tele2 MMS" mcc="401" mnc="77" apn="mms" mmsc="http://mms.tele2.kz/mms/wapenc" mmsproxy="10.1.26.10" mmsport="8080" type="mms" /> - <apn carrier="B-Mobile" mcc="402" mnc="11" apn="default" type="default,supl" /> - <apn carrier="TashiCell" mcc="402" mnc="77" apn="default" type="default,supl" /> - <apn carrier="Vodafone live" mcc="404" mnc="01" apn="portalnmms" proxy="10.10.1.100" port="9401" type="default,supl" /> - <apn carrier="Vodafonemobileconnect" mcc="404" mnc="01" apn="www" type="default,supl" /> - <apn carrier="Vodafone_MMS" mcc="404" mnc="01" apn="portalnmms" mmsc="http://mms1.live.vodafone.in/mms/" mmsproxy="10.10.1.100" mmsport="9401" type="mms" /> - <apn carrier="AIRTEL LIVE" mcc="404" mnc="02" apn="airtelfun.com" proxy="100.1.200.99" port="8080" type="default,supl" /> - <apn carrier="Mobile Office" mcc="404" mnc="02" apn="airtelgprs.com" type="default,supl" /> - <apn carrier="Airtel MMS" mcc="404" mnc="02" apn="airtelmms.com" authtype="1" mmsc="http://100.1.201.171:10021/mmsc" mmsproxy="100.1.201.172" mmsport="8799" type="mms" /> - <apn carrier="Mobile Office" mcc="404" mnc="03" apn="airtelgprs.com" type="default,supl" /> - <apn carrier="AIRTEL LIVE" mcc="404" mnc="03" apn="airtelfun.com" proxy="100.1.200.99" port="8080" type="default,supl" /> - <apn carrier="Airtel MMS" mcc="404" mnc="03" apn="airtelmms.com" authtype="1" mmsc="http://100.1.201.171:10021/mmsc" mmsproxy="100.1.201.172" mmsport="8799" type="mms" /> - <apn carrier="Idea_Internet" mcc="404" mnc="04" apn="internet" type="default,supl" /> - <apn carrier="IDEA GPRS" mcc="404" mnc="04" apn="imis" proxy="10.4.42.15" port="8080" type="default,supl" /> - <apn carrier="IDEA MMS" mcc="404" mnc="04" apn="mmsc" mmsc="http://10.4.42.21:8002/" mmsproxy="10.4.42.15" mmsport="8080" type="mms" /> - <apn carrier="Vodafone_MMS" mcc="404" mnc="05" apn="portalnmms" mmsc="http://mms1.live.vodafone.in/mms/" mmsproxy="10.10.1.100" mmsport="9401" type="mms" /> - <apn carrier="Vodafonemobileconnect" mcc="404" mnc="05" apn="www" type="default,supl" /> - <apn carrier="Vodafone live" mcc="404" mnc="05" apn="portalnmms" proxy="10.10.1.100" port="9401" type="default,supl" /> - <apn carrier="Idea_Internet" mcc="404" mnc="07" apn="internet" type="default,supl" /> - <apn carrier="IDEA GPRS" mcc="404" mnc="07" apn="imis" proxy="10.4.42.15" port="8080" type="default,supl" /> - <apn carrier="IDEA MMS" mcc="404" mnc="07" apn="mmsc" mmsc="http://10.4.42.21:8002/" mmsproxy="10.4.42.15" mmsport="8080" type="mms" /> - <apn carrier="Reliance MMS" mcc="404" mnc="09" apn="mms" mmsc="http://10.239.221.47/mms/" mmsproxy="10.239.221.7" mmsport="8080" type="mms" /> - <apn carrier="Reliance Net" mcc="404" mnc="09" apn="smartnet" type="default,supl" /> - <apn carrier="Reliance WAP" mcc="404" mnc="09" apn="smartwap" proxy="10.239.221.7" port="8080" authtype="1" type="default,supl" /> - <apn carrier="Mobile Office" mcc="404" mnc="10" apn="airtelgprs.com" type="default,supl" /> - <apn carrier="AIRTEL LIVE" mcc="404" mnc="10" apn="airtelfun.com" proxy="100.1.200.99" port="8080" type="default,supl" /> - <apn carrier="Airtel MMS" mcc="404" mnc="10" apn="airtelmms.com" authtype="1" mmsc="http://100.1.201.171:10021/mmsc" mmsproxy="100.1.201.172" mmsport="8799" type="mms" /> - <apn carrier="Vodafone_MMS" mcc="404" mnc="11" apn="portalnmms" mmsc="http://mms1.live.vodafone.in/mms/" mmsproxy="10.10.1.100" mmsport="9401" type="mms" /> - <apn carrier="Vodafonemobileconnect" mcc="404" mnc="11" apn="www" type="default,supl" /> - <apn carrier="Vodafone live" mcc="404" mnc="11" apn="portalnmms" proxy="10.10.1.100" port="9401" type="default,supl" /> - <apn carrier="Idea_Internet" mcc="404" mnc="12" apn="internet" type="default,supl" /> - <apn carrier="IDEA GPRS" mcc="404" mnc="12" apn="imis" proxy="10.4.42.15" port="8080" type="default,supl" /> - <apn carrier="IDEA MMS" mcc="404" mnc="12" apn="mmsc" mmsc="http://10.4.42.21:8002/" mmsproxy="10.4.42.15" mmsport="8080" type="mms" /> - <apn carrier="Vodafone_MMS" mcc="404" mnc="13" apn="portalnmms" mmsc="http://mms1.live.vodafone.in/mms/" mmsproxy="10.10.1.100" mmsport="9401" type="mms" /> - <apn carrier="Vodafonemobileconnect" mcc="404" mnc="13" apn="www" type="default,supl" /> - <apn carrier="Vodafone live" mcc="404" mnc="13" apn="portalnmms" proxy="10.10.1.100" port="9401" type="default,supl" /> - <apn carrier="IDEA MMS" mcc="404" mnc="14" apn="mmsc" mmsc="http://10.11.12.180" mmsproxy="10.11.12.13" mmsport="8080" type="mms" /> - <apn carrier="Idea_Internet" mcc="404" mnc="14" apn="internet" type="default,supl" /> - <apn carrier="IDEA GPRS" mcc="404" mnc="14" apn="imis" proxy="10.11.12.13" port="8080" type="default,supl" /> - <apn carrier="Vodafone_MMS" mcc="404" mnc="15" apn="portalnmms" mmsc="http://mms1.live.vodafone.in/mms/" mmsproxy="10.10.1.100" mmsport="9401" type="mms" /> - <apn carrier="Vodafonemobileconnect" mcc="404" mnc="15" apn="www" type="default,supl" /> - <apn carrier="Vodafone live" mcc="404" mnc="15" apn="portalnmms" proxy="10.10.1.100" port="9401" type="default,supl" /> - <apn carrier="Mobile Office" mcc="404" mnc="16" apn="airtelgprs.com" type="default,supl" /> - <apn carrier="AIRTEL LIVE" mcc="404" mnc="16" apn="airtelfun.com" proxy="100.1.200.99" port="8080" type="default,supl" /> - <apn carrier="Airtel MMS" mcc="404" mnc="16" apn="airtelmms.com" authtype="1" mmsc="http://100.1.201.171:10021/mmsc" mmsproxy="100.1.201.172" mmsport="8799" type="mms" /> - <apn carrier="Aircel-GPRS-Postpaid" mcc="404" mnc="17" apn="aircelwebpost" type="default,supl" /> - <apn carrier="Pocket Internet-Postpaid" mcc="404" mnc="17" apn="aircelwappost" proxy="172.17.83.69" port="8080" type="default,supl" /> - <apn carrier="Pocket Internet-Prepaid" mcc="404" mnc="17" apn="aircelwap" proxy="172.17.83.69" port="8080" type="default,supl" /> - <apn carrier="Aircel-GPRS-Prepaid" mcc="404" mnc="17" apn="aircelweb" type="default,supl" /> - <apn carrier="Aircel-MMS" mcc="404" mnc="17" apn="aircelmms" mmsc="http://10.50.1.166/servlets/mms" mmsproxy="172.17.83.69" mmsport="8080" type="mms" /> - <apn carrier="Reliance MMS" mcc="404" mnc="18" apn="mms" mmsc="http://10.239.221.47/mms/" mmsproxy="10.239.221.7" mmsport="8080" type="mms" /> - <apn carrier="Reliance Net" mcc="404" mnc="18" apn="smartnet" type="default,supl" /> - <apn carrier="Reliance WAP" mcc="404" mnc="18" apn="smartwap" proxy="10.239.221.7" port="8080" authtype="1" type="default,supl" /> - <apn carrier="Idea_Internet" mcc="404" mnc="19" apn="internet" type="default,supl" /> - <apn carrier="IDEA GPRS" mcc="404" mnc="19" apn="imis" proxy="10.4.42.15" port="8080" type="default,supl" /> - <apn carrier="IDEA MMS" mcc="404" mnc="19" apn="mmsc" mmsc="http://10.4.42.21:8002/" mmsproxy="10.4.42.15" mmsport="8080" type="mms" /> - <apn carrier="Vodafone_MMS" mcc="404" mnc="20" apn="portalnmms" mmsc="http://mms1.live.vodafone.in/mms/" mmsproxy="10.10.1.100" mmsport="9401" type="mms" /> - <apn carrier="Vodafonemobileconnect" mcc="404" mnc="20" apn="www" type="default,supl" /> - <apn carrier="Vodafone live" mcc="404" mnc="20" apn="portalnmms" proxy="10.10.1.100" port="9401" type="default,supl" /> - <apn carrier="Loop Mobile MMS" mcc="404" mnc="21" apn="mizone" password="mmsc" mmsc="http://mms.loopmobile.in:8080" mmsproxy="10.0.0.10" mmsport="9401" type="mms" /> - <apn carrier="Loop Mobile" mcc="404" mnc="21" apn="www" type="default,supl" /> - <apn carrier="Idea_Internet" mcc="404" mnc="22" apn="internet" type="default,supl" /> - <apn carrier="IDEA GPRS" mcc="404" mnc="22" apn="imis" proxy="10.4.42.15" port="8080" type="default,supl" /> - <apn carrier="IDEA MMS" mcc="404" mnc="22" apn="mmsc" mmsc="http://10.4.42.21:8002/" mmsproxy="10.4.42.15" mmsport="8080" type="mms" /> - <apn carrier="Idea_Internet" mcc="404" mnc="24" apn="internet" type="default,supl" /> - <apn carrier="IDEA GPRS" mcc="404" mnc="24" apn="imis" proxy="10.4.42.15" port="8080" type="default,supl" /> - <apn carrier="IDEA MMS" mcc="404" mnc="24" apn="mmsc" mmsc="http://10.4.42.21:8002/" mmsproxy="10.4.42.15" mmsport="8080" type="mms" /> - <apn carrier="Aircel-GPRS-Postpaid" mcc="404" mnc="25" apn="aircelwebpost" type="default,supl" /> - <apn carrier="Pocket Internet-Postpaid" mcc="404" mnc="25" apn="aircelwappost" proxy="172.17.83.69" port="8080" type="default,supl" /> - <apn carrier="Pocket Internet-Prepaid" mcc="404" mnc="25" apn="aircelwap" proxy="172.17.83.69" port="8080" type="default,supl" /> - <apn carrier="Aircel-GPRS-Prepaid" mcc="404" mnc="25" apn="aircelweb" type="default,supl" /> - <apn carrier="Aircel-MMS" mcc="404" mnc="25" apn="aircelmms" mmsc="http://10.50.1.166/servlets/mms" mmsproxy="172.17.83.69" mmsport="8080" type="mms" /> - <apn carrier="Vodafone_MMS" mcc="404" mnc="27" apn="portalnmms" mmsc="http://mms1.live.vodafone.in/mms/" mmsproxy="10.10.1.100" mmsport="9401" type="mms" /> - <apn carrier="Vodafonemobileconnect" mcc="404" mnc="27" apn="www" type="default,supl" /> - <apn carrier="Vodafone live" mcc="404" mnc="27" apn="portalnmms" proxy="10.10.1.100" port="9401" type="default,supl" /> - <apn carrier="Aircel-GPRS-Postpaid" mcc="404" mnc="28" apn="aircelwebpost" type="default,supl" /> - <apn carrier="Pocket Internet-Postpaid" mcc="404" mnc="28" apn="aircelwappost" proxy="172.17.83.69" port="8080" type="default,supl" /> - <apn carrier="Pocket Internet-Prepaid" mcc="404" mnc="28" apn="aircelwap" proxy="172.17.83.69" port="8080" type="default,supl" /> - <apn carrier="Aircel-GPRS-Prepaid" mcc="404" mnc="28" apn="aircelweb" type="default,supl" /> - <apn carrier="Aircel-MMS" mcc="404" mnc="28" apn="aircelmms" mmsc="http://10.50.1.166/servlets/mms" mmsproxy="172.17.83.69" mmsport="8080" type="mms" /> - <apn carrier="Aircel-GPRS-Postpaid" mcc="404" mnc="29" apn="aircelwebpost" type="default,supl" /> - <apn carrier="Pocket Internet-Postpaid" mcc="404" mnc="29" apn="myaircelpost" proxy="172.17.83.69" port="8080" type="default,supl" /> - <apn carrier="Pocket Internet-Prepaid" mcc="404" mnc="29" apn="myaircel" proxy="172.17.83.69" port="8080" type="default,supl" /> - <apn carrier="Aircel-GPRS-Prepaid" mcc="404" mnc="29" apn="aircelweb" type="default,supl" /> - <apn carrier="Aircel-MMS" mcc="404" mnc="29" apn="aircelmms" mmsc="http://10.50.1.166/servlets/mms" mmsproxy="172.17.83.69" mmsport="8080" type="mms" /> - <apn carrier="Vodafone_MMS" mcc="404" mnc="30" apn="portalnmms" mmsc="http://mms1.live.vodafone.in/mms/" mmsproxy="10.10.1.100" mmsport="9401" type="mms" /> - <apn carrier="Vodafonemobileconnect" mcc="404" mnc="30" apn="www" type="default,supl" /> - <apn carrier="Vodafone live" mcc="404" mnc="30" apn="portalnmms" proxy="10.10.1.100" port="9401" type="default,supl" /> - <apn carrier="Mobile Office" mcc="404" mnc="31" apn="airtelgprs.com" type="default,supl" /> - <apn carrier="AIRTEL LIVE" mcc="404" mnc="31" apn="airtelfun.com" proxy="100.1.200.99" port="8080" type="default,supl" /> - <apn carrier="Airtel MMS" mcc="404" mnc="31" apn="airtelmms.com" authtype="1" mmsc="http://100.1.201.171:10021/mmsc" mmsproxy="100.1.201.172" mmsport="8799" type="mms" /> - <apn carrier="Aircel-GPRS-Postpaid" mcc="404" mnc="33" apn="aircelwebpost" type="default,supl" /> - <apn carrier="Pocket Internet-Postpaid" mcc="404" mnc="33" apn="myaircelpost" proxy="172.17.83.69" port="8080" type="default,supl" /> - <apn carrier="Pocket Internet-Prepaid" mcc="404" mnc="33" apn="myaircel" proxy="172.17.83.69" port="8080" type="default,supl" /> - <apn carrier="Aircel-GPRS-Prepaid" mcc="404" mnc="33" apn="aircelweb" type="default,supl" /> - <apn carrier="Aircel-MMS" mcc="404" mnc="33" apn="aircelmms" mmsc="http://10.50.1.166/servlets/mms" mmsproxy="172.17.83.69" mmsport="8080" type="mms" /> - <apn carrier="bsnlnet" mcc="404" mnc="34" apn="bsnlnet" authtype="1" type="default,supl" /> - <apn carrier="bsnllive" mcc="404" mnc="34" apn="bsnllive" proxy="10.220.67.131" port="8080" type="default,supl" /> - <apn carrier="bsnlmms" mcc="404" mnc="34" apn="bsnlmms" mmsc="http://bsnlmmsc.in:8514" mmsproxy="10.210.10.11" mmsport="8080" type="mms" /> - <apn carrier="Aircel-GPRS-Postpaid" mcc="404" mnc="35" apn="aircelwebpost" type="default,supl" /> - <apn carrier="Pocket Internet-Postpaid" mcc="404" mnc="35" apn="aircelwappost" proxy="172.17.83.69" port="8080" type="default,supl" /> - <apn carrier="Pocket Internet-Prepaid" mcc="404" mnc="35" apn="aircelwap" proxy="172.17.83.69" port="8080" type="default,supl" /> - <apn carrier="Aircel-GPRS-Prepaid" mcc="404" mnc="35" apn="aircelweb" type="default,supl" /> - <apn carrier="Aircel-MMS" mcc="404" mnc="35" apn="aircelmms" mmsc="http://10.50.1.166/servlets/mms" mmsproxy="172.17.83.69" mmsport="8080" type="mms" /> - <apn carrier="Reliance MMS" mcc="404" mnc="36" apn="mms" mmsc="http://10.239.221.47/mms/" mmsproxy="10.239.221.7" mmsport="8080" type="mms" /> - <apn carrier="Reliance Net" mcc="404" mnc="36" apn="smartnet" type="default,supl" /> - <apn carrier="Reliance WAP" mcc="404" mnc="36" apn="smartwap" proxy="10.239.221.7" port="8080" authtype="1" type="default,supl" /> - <apn carrier="Aircel-GPRS-Postpaid" mcc="404" mnc="37" apn="aircelwebpost" type="default,supl" /> - <apn carrier="Pocket Internet-Postpaid" mcc="404" mnc="37" apn="aircelwappost" proxy="172.17.83.69" port="8080" type="default,supl" /> - <apn carrier="Pocket Internet-Prepaid" mcc="404" mnc="37" apn="aircelwap" proxy="172.17.83.69" port="8080" type="default,supl" /> - <apn carrier="Aircel-GPRS-Prepaid" mcc="404" mnc="37" apn="aircelweb" type="default,supl" /> - <apn carrier="Aircel-MMS" mcc="404" mnc="37" apn="aircelmms" mmsc="http://10.50.1.166/servlets/mms" mmsproxy="172.17.83.69" mmsport="8080" type="mms" /> - <apn carrier="bsnlmms" mcc="404" mnc="38" apn="bsnlmms" mmsc="http://bsnlmmsc.in:8514" mmsproxy="10.210.10.11" mmsport="8080" type="mms" /> - <apn carrier="bsnlnet" mcc="404" mnc="38" apn="bsnlnet" type="default,supl" /> - <apn carrier="bsnllive" mcc="404" mnc="38" apn="bsnllive" proxy="10.220.67.131" port="8080" type="default,supl" /> - <apn carrier="Mobile Office" mcc="404" mnc="40" apn="airtelgprs.com" type="default,supl" /> - <apn carrier="AIRTEL LIVE" mcc="404" mnc="40" apn="airtelfun.com" proxy="100.1.200.99" port="8080" type="default,supl" /> - <apn carrier="Airtel MMS" mcc="404" mnc="40" apn="airtelmms.com" authtype="1" mmsc="http://100.1.201.171:10021/mmsc" mmsproxy="100.1.201.172" mmsport="8799" type="mms" /> - <apn carrier="Aircel-GPRS-Postpaid" mcc="404" mnc="41" apn="aircelgprs.po" type="default,supl" /> - <apn carrier="Aircel-GPRS-Prepaid" mcc="404" mnc="41" apn="aircelgprs.pr" type="default,supl" /> - <apn carrier="Pocket Internet-Postpaid" mcc="404" mnc="41" apn="aircelwap.po" proxy="192.168.35.201" port="8081" type="default,supl" /> - <apn carrier="Pocket Internet-Prepaid" mcc="404" mnc="41" apn="aircelwap.pr" proxy="192.168.35.201" port="8081" type="default,supl" /> - <apn carrier="Aircel-MMS-Postpaid" mcc="404" mnc="41" apn="aircelmms.po" mmsc="http://mmsc/mmrelay.app" mmsproxy="192.168.35.196" mmsport="8081" type="mms" /> - <apn carrier="Aircel-MMS-Prepaid" mcc="404" mnc="41" apn="aircelmms.pr" mmsc="http://mmsc/mmrelay.app" mmsproxy="192.168.35.196" mmsport="8081" type="mms" /> - <apn carrier="Aircel-GPRS-Postpaid" mcc="404" mnc="42" apn="aircelgprs.po" type="default,supl" /> - <apn carrier="Aircel-GPRS-Prepaid" mcc="404" mnc="42" apn="aircelgprs.pr" type="default,supl" /> - <apn carrier="Pocket Internet-Postpaid" mcc="404" mnc="42" apn="aircelwap.po" proxy="192.168.35.201" port="8081" type="default,supl" /> - <apn carrier="Pocket Internet-Prepaid" mcc="404" mnc="42" apn="aircelwap.pr" proxy="192.168.35.201" port="8081" type="default,supl" /> - <apn carrier="Aircel-MMS-Postpaid" mcc="404" mnc="42" apn="aircelmms.po" mmsc="http://mmsc/mmrelay.app" mmsproxy="192.168.35.196" mmsport="8081" type="mms" /> - <apn carrier="Aircel-MMS-Prepaid" mcc="404" mnc="42" apn="aircelmms.pr" mmsc="http://mmsc/mmrelay.app" mmsproxy="192.168.35.196" mmsport="8081" type="mms" /> - <apn carrier="Vodafone_MMS" mcc="404" mnc="43" apn="portalnmms" mmsc="http://mms1.live.vodafone.in/mms/" mmsproxy="10.10.1.100" mmsport="9401" type="mms" /> - <apn carrier="Vodafonemobileconnect" mcc="404" mnc="43" apn="www" type="default,supl" /> - <apn carrier="Vodafone live" mcc="404" mnc="43" apn="portalnmms" proxy="10.10.1.100" port="9401" type="default,supl" /> - <apn carrier="Idea_Internet" mcc="404" mnc="44" apn="internet" type="default,supl" /> - <apn carrier="IDEA GPRS" mcc="404" mnc="44" apn="imis" proxy="10.4.42.15" port="8080" type="default,supl" /> - <apn carrier="IDEA MMS" mcc="404" mnc="44" apn="mmsc" mmsc="http://10.4.42.21:8002" mmsproxy="10.4.42.15" mmsport="8080" type="mms" /> - <apn carrier="Mobile Office" mcc="404" mnc="45" apn="airtelgprs.com" type="default,supl" /> - <apn carrier="AIRTEL LIVE" mcc="404" mnc="45" apn="airtelfun.com" proxy="100.1.200.99" port="8080" type="default,supl" /> - <apn carrier="Airtel MMS" mcc="404" mnc="45" apn="airtelmms.com" authtype="1" mmsc="http://100.1.201.171:10021/mmsc" mmsproxy="100.1.201.172" mmsport="8799" type="mms" /> - <apn carrier="Vodafone_MMS" mcc="404" mnc="46" apn="portalnmms" mmsc="http://mms1.live.vodafone.in/mms/" mmsproxy="10.10.1.100" mmsport="9401" type="mms" /> - <apn carrier="Vodafonemobileconnect" mcc="404" mnc="46" apn="www" type="default,supl" /> - <apn carrier="Vodafone live" mcc="404" mnc="46" apn="portalnmms" proxy="10.10.1.100" port="9401" type="default,supl" /> - <apn carrier="Mobile Office" mcc="404" mnc="49" apn="airtelgprs.com" type="default,supl" /> - <apn carrier="AIRTEL LIVE" mcc="404" mnc="49" apn="airtelfun.com" proxy="100.1.200.99" port="8080" type="default,supl" /> - <apn carrier="Airtel MMS" mcc="404" mnc="49" apn="airtelmms.com" authtype="1" mmsc="http://100.1.201.171:10021/mmsc" mmsproxy="100.1.201.172" mmsport="8799" type="mms" /> - <apn carrier="Reliance MMS" mcc="404" mnc="50" apn="mms" mmsc="http://10.239.221.47/mms/" mmsproxy="10.239.221.7" mmsport="8080" type="mms" /> - <apn carrier="Reliance Net" mcc="404" mnc="50" apn="smartnet" type="default,supl" /> - <apn carrier="Reliance WAP" mcc="404" mnc="50" apn="smartwap" proxy="10.239.221.7" port="8080" authtype="1" type="default,supl" /> - <apn carrier="bsnlmms" mcc="404" mnc="51" apn="bsnlmms" mmsc="http://bsnlmmsc.in:8514" mmsproxy="10.210.10.11" mmsport="8080" type="mms" /> - <apn carrier="bsnlnet" mcc="404" mnc="51" apn="bsnlnet" type="default,supl" /> - <apn carrier="bsnllive" mcc="404" mnc="51" apn="bsnllive" proxy="10.220.67.131" port="8080" type="default,supl" /> - <apn carrier="Reliance MMS" mcc="404" mnc="52" apn="mms" mmsc="http://10.239.221.47/mms/" mmsproxy="10.239.221.7" mmsport="8080" type="mms" /> - <apn carrier="Reliance Net" mcc="404" mnc="52" apn="smartnet" type="default,supl" /> - <apn carrier="Reliance WAP" mcc="404" mnc="52" apn="smartwap" proxy="10.239.221.7" port="8080" authtype="1" type="default,supl" /> - <apn carrier="bsnlmms" mcc="404" mnc="53" apn="bsnlmms" mmsc="http://bsnlmmsc.in:8514" mmsproxy="10.210.10.11" mmsport="8080" type="mms" /> - <apn carrier="bsnlnet" mcc="404" mnc="53" apn="bsnlnet" type="default,supl" /> - <apn carrier="bsnllive" mcc="404" mnc="53" apn="bsnllive" proxy="10.220.67.131" port="8080" type="default,supl" /> - <apn carrier="bsnlmms" mcc="404" mnc="54" apn="bsnlmms" mmsc="http://bsnlmmsc.in:8514" mmsproxy="10.210.10.11" mmsport="8080" type="mms" /> - <apn carrier="bsnlnet" mcc="404" mnc="54" apn="bsnlnet" type="default,supl" /> - <apn carrier="bsnllive" mcc="404" mnc="54" apn="bsnllive" proxy="10.220.67.131" port="8080" type="default,supl" /> - <apn carrier="bsnlmms" mcc="404" mnc="55" apn="bsnlmms" mmsc="http://bsnlmmsc.in:8514" mmsproxy="10.210.10.11" mmsport="8080" type="mms" /> - <apn carrier="bsnlnet" mcc="404" mnc="55" apn="bsnlnet" type="default,supl" /> - <apn carrier="bsnllive" mcc="404" mnc="55" apn="bsnllive" proxy="10.220.67.131" port="8080" type="default,supl" /> - <apn carrier="Idea_Internet" mcc="404" mnc="56" apn="internet" type="default,supl" /> - <apn carrier="IDEA GPRS" mcc="404" mnc="56" apn="imis" proxy="10.4.42.15" port="8080" type="default,supl" /> - <apn carrier="IDEA MMS" mcc="404" mnc="56" apn="mmsc" mmsc="http://10.4.42.21:8002/" mmsproxy="10.4.42.15" mmsport="8080" type="mms" /> - <apn carrier="bsnlmms" mcc="404" mnc="57" apn="bsnlmms" mmsc="http://bsnlmmsc.in:8514" mmsproxy="10.210.10.11" mmsport="8080" type="mms" /> - <apn carrier="bsnlnet" mcc="404" mnc="57" apn="bsnlnet" type="default,supl" /> - <apn carrier="bsnllive" mcc="404" mnc="57" apn="bsnllive" proxy="10.220.67.131" port="8080" type="default,supl" /> - <apn carrier="bsnlmms" mcc="404" mnc="58" apn="bsnlmms" mmsc="http://bsnlmmsc.in:8514" mmsproxy="10.210.10.11" mmsport="8080" type="mms" /> - <apn carrier="bsnlnet" mcc="404" mnc="58" apn="bsnlnet" type="default,supl" /> - <apn carrier="bsnllive" mcc="404" mnc="58" apn="bsnllive" proxy="10.220.67.131" port="8080" type="default,supl" /> - <apn carrier="bsnlmms" mcc="404" mnc="59" apn="bsnlmms" mmsc="http://bsnlmmsc.in:8514" mmsproxy="10.210.10.11" mmsport="8080" type="mms" /> - <apn carrier="bsnlnet" mcc="404" mnc="59" apn="bsnlnet" type="default,supl" /> - <apn carrier="bsnllive" mcc="404" mnc="59" apn="bsnllive" proxy="10.220.67.131" port="8080" type="default,supl" /> - <apn carrier="Vodafone_MMS" mcc="404" mnc="60" apn="portalnmms" mmsc="http://mms1.live.vodafone.in/mms/" mmsproxy="10.10.1.100" mmsport="9401" type="mms" /> - <apn carrier="Vodafonemobileconnect" mcc="404" mnc="60" apn="www" type="default,supl" /> - <apn carrier="Vodafone live" mcc="404" mnc="60" apn="portalnmms" proxy="10.10.1.100" port="9401" type="default,supl" /> - <apn carrier="bsnlmms" mcc="404" mnc="62" apn="bsnlmms" mmsc="http://bsnlmmsc.in:8514" mmsproxy="10.210.10.11" mmsport="8080" type="mms" /> - <apn carrier="bsnlnet" mcc="404" mnc="62" apn="bsnlnet" type="default,supl" /> - <apn carrier="bsnllive" mcc="404" mnc="62" apn="bsnllive" proxy="10.220.67.131" port="8080" type="default,supl" /> - <apn carrier="bsnlmms" mcc="404" mnc="64" apn="bsnlmms" mmsc="http://bsnlmmsc.in:8514" mmsproxy="10.210.10.11" mmsport="8080" type="mms" /> - <apn carrier="bsnlnet" mcc="404" mnc="64" apn="bsnlnet" type="default,supl" /> - <apn carrier="bsnllive" mcc="404" mnc="64" apn="bsnllive" proxy="10.220.67.131" port="8080" type="default,supl" /> - <apn carrier="bsnlmms" mcc="404" mnc="66" apn="bsnlmms" mmsc="http://bsnlmmsc.in:8514" mmsproxy="10.210.10.11" mmsport="8080" type="mms" /> - <apn carrier="bsnlnet" mcc="404" mnc="66" apn="bsnlnet" type="default,supl" /> - <apn carrier="bsnllive" mcc="404" mnc="66" apn="bsnllive" proxy="10.220.67.131" port="8080" type="default,supl" /> - <apn carrier="Reliance MMS" mcc="404" mnc="67" apn="mms" mmsc="http://10.239.221.47/mms/" mmsproxy="10.239.221.7" mmsport="8080" type="mms" /> - <apn carrier="Reliance Net" mcc="404" mnc="67" apn="smartnet" type="default,supl" /> - <apn carrier="Reliance WAP" mcc="404" mnc="67" apn="smartwap" proxy="10.239.221.7" port="8080" authtype="1" type="default,supl" /> - <apn carrier="Dolphin_Delhi MMS" mcc="404" mnc="68" apn="gprsmtnldel" user="mtnl" password="mtnl123" mmsc="http://172.16.31.136/mms/" mmsproxy="172.16.31.10" mmsport="80" type="mms" /> - <apn carrier="Dolphin_Delhi" mcc="404" mnc="68" apn="gprsmtnldel" user="mtnl" password="mtnl123" type="default,supl" /> - <apn carrier="Dolphin_Delhi_3G MMS" mcc="404" mnc="68" apn="mtnl3g" user="mtnl" password="mtnl123" mmsc="http://172.16.31.165/mms/" mmsproxy="172.16.31.10" mmsport="9401" type="mms" /> - <apn carrier="Dolphin_Delhi_3G" mcc="404" mnc="68" apn="mtnl3g" user="mtnl" password="mtnl123" type="default,supl" /> - <apn carrier="Dolphin_Mumbai MMS" mcc="404" mnc="69" apn="gprsmtnlmum" user="mtnl" password="mtnl123" mmsc="http://172.16.39.140/mms/" mmsproxy="172.16.39.10" mmsport="80" type="mms" /> - <apn carrier="Dolphin_Mumbai" mcc="404" mnc="69" apn="gprsmtnlmum" user="mtnl" password="mtnl123" type="default,supl" /> - <apn carrier="Dolphin_Mumbai_3G MMS" mcc="404" mnc="69" apn="mtnl3g" user="mtnl" password="mtnl123" mmsc="http://172.16.31.165/mms/" mmsproxy="172.16.39.10" mmsport="9401" type="mms" /> - <apn carrier="Dolphin_Mumbai_3G" mcc="404" mnc="69" apn="mtnl3g" user="mtnl" password="mtnl123" type="default,supl" /> - <apn carrier="Mobile Office" mcc="404" mnc="70" apn="airtelgprs.com" type="default,supl" /> - <apn carrier="AIRTEL LIVE" mcc="404" mnc="70" apn="airtelfun.com" proxy="100.1.200.99" port="8080" type="default,supl" /> - <apn carrier="Airtel MMS" mcc="404" mnc="70" apn="airtelmms.com" authtype="1" mmsc="http://100.1.201.171:10021/mmsc" mmsproxy="100.1.201.172" mmsport="8799" type="mms" /> - <apn carrier="bsnlmms" mcc="404" mnc="71" apn="bsnlmms" mmsc="http://bsnlmmsc.in:8514" mmsproxy="10.210.10.11" mmsport="8080" type="mms" /> - <apn carrier="bsnlnet" mcc="404" mnc="71" apn="bsnlnet" type="default,supl" /> - <apn carrier="bsnllive" mcc="404" mnc="71" apn="bsnllive" proxy="10.220.67.131" port="8080" type="default,supl" /> - <apn carrier="bsnlmms" mcc="404" mnc="72" apn="bsnlmms" mmsc="http://bsnlmmsc.in:8514" mmsproxy="10.210.10.11" mmsport="8080" type="mms" /> - <apn carrier="bsnlnet" mcc="404" mnc="72" apn="bsnlnet" type="default,supl" /> - <apn carrier="bsnllive" mcc="404" mnc="72" apn="bsnllive" proxy="10.220.67.131" port="8080" type="default,supl" /> - <apn carrier="bsnlmms" mcc="404" mnc="73" apn="bsnlmms" mmsc="http://bsnlmmsc.in:8514" mmsproxy="10.210.10.11" mmsport="8080" type="mms" /> - <apn carrier="bsnlnet" mcc="404" mnc="73" apn="bsnlnet" type="default,supl" /> - <apn carrier="bsnllive" mcc="404" mnc="73" apn="bsnllive" proxy="10.220.67.131" port="8080" type="default,supl" /> - <apn carrier="bsnlmms" mcc="404" mnc="74" apn="bsnlmms" mmsc="http://bsnlmmsc.in:8514" mmsproxy="10.210.10.11" mmsport="8080" type="mms" /> - <apn carrier="bsnlnet" mcc="404" mnc="74" apn="bsnlnet" type="default,supl" /> - <apn carrier="bsnllive" mcc="404" mnc="74" apn="bsnllive" proxy="10.220.67.131" port="8080" type="default,supl" /> - <apn carrier="bsnlmms" mcc="404" mnc="75" apn="bsnlmms" mmsc="http://bsnlmmsc.in:8514" mmsproxy="10.210.10.11" mmsport="8080" type="mms" /> - <apn carrier="bsnlnet" mcc="404" mnc="75" apn="bsnlnet" type="default,supl" /> - <apn carrier="bsnllive" mcc="404" mnc="75" apn="bsnllive" proxy="10.220.67.131" port="8080" type="default,supl" /> - <apn carrier="bsnlmms" mcc="404" mnc="76" apn="bsnlmms" mmsc="http://bsnlmmsc.in:8514" mmsproxy="10.210.10.11" mmsport="8080" type="mms" /> - <apn carrier="bsnlnet" mcc="404" mnc="76" apn="bsnlnet" type="default,supl" /> - <apn carrier="bsnllive" mcc="404" mnc="76" apn="bsnllive" proxy="10.220.67.131" port="8080" type="default,supl" /> - <apn carrier="bsnlmms" mcc="404" mnc="77" apn="bsnlmms" mmsc="http://bsnlmmsc.in:8514" mmsproxy="10.210.10.11" mmsport="8080" type="mms" /> - <apn carrier="bsnlnet" mcc="404" mnc="77" apn="bsnlnet" type="default,supl" /> - <apn carrier="bsnllive" mcc="404" mnc="77" apn="bsnllive" proxy="10.220.67.131" port="8080" type="default,supl" /> - <apn carrier="Idea_Internet" mcc="404" mnc="78" apn="internet" type="default,supl" /> - <apn carrier="IDEA GPRS" mcc="404" mnc="78" apn="imis" proxy="10.4.42.15" port="8080" type="default,supl" /> - <apn carrier="IDEA MMS" mcc="404" mnc="78" apn="mmsc" mmsc="http://10.4.42.21:8002/" mmsproxy="10.4.42.15" mmsport="8080" type="mms" /> - <apn carrier="bsnlmms" mcc="404" mnc="79" apn="bsnlmms" mmsc="http://bsnlmmsc.in:8514" mmsproxy="10.210.10.11" mmsport="8080" type="mms" /> - <apn carrier="bsnlnet" mcc="404" mnc="79" apn="bsnlnet" type="default,supl" /> - <apn carrier="bsnllive" mcc="404" mnc="79" apn="bsnllive" proxy="10.220.67.131" port="8080" type="default,supl" /> - <apn carrier="bsnlmms" mcc="404" mnc="80" apn="bsnlmms" mmsc="http://bsnlmmsc.in:8514" mmsproxy="10.210.10.11" mmsport="8080" type="mms" /> - <apn carrier="bsnlnet" mcc="404" mnc="80" apn="bsnlnet" type="default,supl" /> - <apn carrier="bsnllive" mcc="404" mnc="80" apn="bsnllive" proxy="10.220.67.131" port="8080" type="default,supl" /> - <apn carrier="bsnlmms" mcc="404" mnc="81" apn="bsnlmms" mmsc="http://bsnlmmsc.in:8514" mmsproxy="10.210.10.11" mmsport="8080" type="mms" /> - <apn carrier="bsnlnet" mcc="404" mnc="81" apn="bsnlnet" type="default,supl" /> - <apn carrier="bsnllive" mcc="404" mnc="81" apn="bsnllive" proxy="10.220.67.131" port="8080" type="default,supl" /> - <apn carrier="Idea_Internet" mcc="404" mnc="82" apn="internet" type="default,supl" /> - <apn carrier="IDEA GPRS" mcc="404" mnc="82" apn="imis" proxy="10.4.42.15" port="8080" type="default,supl" /> - <apn carrier="IDEA MMS" mcc="404" mnc="82" apn="mmsc" mmsc="http://10.4.42.21:8002/" mmsproxy="10.4.42.15" mmsport="8080" type="mms" /> - <apn carrier="Reliance MMS" mcc="404" mnc="83" apn="mms" mmsc="http://10.239.221.47/mms/" mmsproxy="10.239.221.7" mmsport="8080" type="mms" /> - <apn carrier="Reliance Net" mcc="404" mnc="83" apn="smartnet" type="default,supl" /> - <apn carrier="Reliance WAP" mcc="404" mnc="83" apn="smartwap" proxy="10.239.221.7" port="8080" authtype="1" type="default,supl" /> - <apn carrier="Vodafone_MMS" mcc="404" mnc="84" apn="portalnmms" mmsc="http://mms1.live.vodafone.in/mms/" mmsproxy="10.10.1.100" mmsport="9401" type="mms" /> - <apn carrier="Vodafonemobileconnect" mcc="404" mnc="84" apn="www" type="default,supl" /> - <apn carrier="Vodafone live" mcc="404" mnc="84" apn="portalnmms" proxy="10.10.1.100" port="9401" type="default,supl" /> - <apn carrier="Reliance MMS" mcc="404" mnc="85" apn="mms" mmsc="http://10.239.221.47/mms/" mmsproxy="10.239.221.7" mmsport="8080" type="mms" /> - <apn carrier="Reliance Net" mcc="404" mnc="85" apn="smartnet" type="default,supl" /> - <apn carrier="Reliance WAP" mcc="404" mnc="85" apn="smartwap" proxy="10.239.221.7" port="8080" authtype="1" type="default,supl" /> - <apn carrier="Vodafone_MMS" mcc="404" mnc="86" apn="portalnmms" mmsc="http://mms1.live.vodafone.in/mms/" mmsproxy="10.10.1.100" mmsport="9401" type="mms" /> - <apn carrier="Vodafonemobileconnect" mcc="404" mnc="86" apn="www" type="default,supl" /> - <apn carrier="Vodafone live" mcc="404" mnc="86" apn="portalnmms" proxy="10.10.1.100" port="9401" type="default,supl" /> - <apn carrier="Idea_Internet" mcc="404" mnc="87" apn="internet" type="default,supl" /> - <apn carrier="IDEA GPRS" mcc="404" mnc="87" apn="imis" proxy="10.4.42.15" port="8080" type="default,supl" /> - <apn carrier="IDEA MMS" mcc="404" mnc="87" apn="mmsc" mmsc="http://10.4.42.21:8002/" mmsproxy="10.4.42.15" mmsport="8080" type="mms" /> - <apn carrier="Vodafone_MMS" mcc="404" mnc="88" apn="portalnmms" mmsc="http://mms1.live.vodafone.in/mms/" mmsproxy="10.10.1.100" mmsport="9401" type="mms" /> - <apn carrier="Vodafonemobileconnect" mcc="404" mnc="88" apn="www" type="default,supl" /> - <apn carrier="Vodafone live" mcc="404" mnc="88" apn="portalnmms" proxy="10.10.1.100" port="9401" type="default,supl" /> - <apn carrier="Idea_Internet" mcc="404" mnc="89" apn="internet" type="default,supl" /> - <apn carrier="IDEA GPRS" mcc="404" mnc="89" apn="imis" proxy="10.4.42.15" port="8080" type="default,supl" /> - <apn carrier="IDEA MMS" mcc="404" mnc="89" apn="mmsc" mmsc="http://10.4.42.21:8002/" mmsproxy="10.4.42.15" mmsport="8080" type="mms" /> - <apn carrier="Mobile Office" mcc="404" mnc="90" apn="airtelgprs.com" type="default,supl" /> - <apn carrier="AIRTEL LIVE" mcc="404" mnc="90" apn="airtelfun.com" proxy="100.1.200.99" port="8080" type="default,supl" /> - <apn carrier="Airtel MMS" mcc="404" mnc="90" apn="airtelmms.com" authtype="1" mmsc="http://100.1.201.171:10021/mmsc" mmsproxy="100.1.201.172" mmsport="8799" type="mms" /> - <apn carrier="Aircel-GPRS-Postpaid" mcc="404" mnc="91" apn="aircelwebpost" type="default,supl" /> - <apn carrier="Pocket Internet-Postpaid" mcc="404" mnc="91" apn="aircelwappost" proxy="172.17.83.69" port="8080" type="default,supl" /> - <apn carrier="Pocket Internet-Prepaid" mcc="404" mnc="91" apn="aircelwap" proxy="172.17.83.69" port="8080" type="default,supl" /> - <apn carrier="Aircel-GPRS-Prepaid" mcc="404" mnc="91" apn="aircelweb" type="default,supl" /> - <apn carrier="Aircel-MMS" mcc="404" mnc="91" apn="aircelmms" mmsc="http://10.50.1.166/servlets/mms" mmsproxy="172.17.83.69" mmsport="8080" type="mms" /> - <apn carrier="Mobile Office" mcc="404" mnc="92" apn="airtelgprs.com" type="default,supl" /> - <apn carrier="AIRTEL LIVE" mcc="404" mnc="92" apn="airtelfun.com" proxy="100.1.200.99" port="8080" type="default,supl" /> - <apn carrier="Airtel MMS" mcc="404" mnc="92" apn="airtelmms.com" authtype="1" mmsc="http://100.1.201.171:10021/mmsc" mmsproxy="100.1.201.172" mmsport="8799" type="mms" /> - <apn carrier="Mobile Office" mcc="404" mnc="93" apn="airtelgprs.com" type="default,supl" /> - <apn carrier="AIRTEL LIVE" mcc="404" mnc="93" apn="airtelfun.com" proxy="100.1.200.99" port="8080" type="default,supl" /> - <apn carrier="Airtel MMS" mcc="404" mnc="93" apn="airtelmms.com" authtype="1" mmsc="http://100.1.201.171:10021/mmsc" mmsproxy="100.1.201.172" mmsport="8799" type="mms" /> - <apn carrier="Mobile Office" mcc="404" mnc="94" apn="airtelgprs.com" type="default,supl" /> - <apn carrier="AIRTEL LIVE" mcc="404" mnc="94" apn="airtelfun.com" proxy="100.1.200.99" port="8080" type="default,supl" /> - <apn carrier="Airtel MMS" mcc="404" mnc="94" apn="airtelmms.com" authtype="1" mmsc="http://100.1.201.171:10021/mmsc" mmsproxy="100.1.201.172" mmsport="8799" type="mms" /> - <apn carrier="Mobile Office" mcc="404" mnc="95" apn="airtelgprs.com" type="default,supl" /> - <apn carrier="AIRTEL LIVE" mcc="404" mnc="95" apn="airtelfun.com" proxy="100.1.200.99" port="8080" type="default,supl" /> - <apn carrier="Airtel MMS" mcc="404" mnc="95" apn="airtelmms.com" authtype="1" mmsc="http://100.1.201.171:10021/mmsc" mmsproxy="100.1.201.172" mmsport="8799" type="mms" /> - <apn carrier="Mobile Office" mcc="404" mnc="96" apn="airtelgprs.com" type="default,supl" /> - <apn carrier="AIRTEL LIVE" mcc="404" mnc="96" apn="airtelfun.com" proxy="100.1.200.99" port="8080" type="default,supl" /> - <apn carrier="Airtel MMS" mcc="404" mnc="96" apn="airtelmms.com" authtype="1" mmsc="http://100.1.201.171:10021/mmsc" mmsproxy="100.1.201.172" mmsport="8799" type="mms" /> - <apn carrier="Mobile Office" mcc="404" mnc="97" apn="airtelgprs.com" type="default,supl" /> - <apn carrier="AIRTEL LIVE" mcc="404" mnc="97" apn="airtelfun.com" proxy="100.1.200.99" port="8080" type="default,supl" /> - <apn carrier="Airtel MMS" mcc="404" mnc="97" apn="airtelmms.com" authtype="1" mmsc="http://100.1.201.171:10021/mmsc" mmsproxy="100.1.201.172" mmsport="8799" type="mms" /> - <apn carrier="Mobile Office" mcc="404" mnc="98" apn="airtelgprs.com" type="default,supl" /> - <apn carrier="AIRTEL LIVE" mcc="404" mnc="98" apn="airtelfun.com" proxy="100.1.200.99" port="8080" type="default,supl" /> - <apn carrier="Airtel MMS" mcc="404" mnc="98" apn="airtelmms.com" authtype="1" mmsc="http://100.1.201.171:10021/mmsc" mmsproxy="100.1.201.172" mmsport="8799" type="mms" /> - <apn carrier="Reliance MMS" mcc="405" mnc="01" apn="rcommms" mmsc="http://mmsc.rcom.co.in/mms/" mmsproxy="10.239.221.5" mmsport="8080" type="mms" /> - <apn carrier="Netconnect" mcc="405" mnc="01" apn="rcomnet" type="default,supl" /> - <apn carrier="RelianceMbWorld" mcc="405" mnc="01" apn="rcomwap" proxy="10.239.221.5" port="8080" type="default,supl" /> - <apn carrier="Reliance MMS" mcc="405" mnc="03" apn="rcommms" mmsc="http://mmsc.rcom.co.in/mms/" mmsproxy="10.239.221.5" mmsport="8080" type="mms" /> - <apn carrier="Netconnect" mcc="405" mnc="03" apn="rcomnet" type="default,supl" /> - <apn carrier="RelianceMbWorld" mcc="405" mnc="03" apn="rcomwap" proxy="10.239.221.5" port="8080" type="default,supl" /> - <apn carrier="Reliance MMS" mcc="405" mnc="04" apn="rcommms" mmsc="http://mmsc.rcom.co.in/mms/" mmsproxy="10.239.221.5" mmsport="8080" type="mms" /> - <apn carrier="Netconnect" mcc="405" mnc="04" apn="rcomnet" type="default,supl" /> - <apn carrier="RelianceMbWorld" mcc="405" mnc="04" apn="rcomwap" proxy="10.239.221.5" port="8080" type="default,supl" /> - <apn carrier="Reliance MMS" mcc="405" mnc="05" apn="rcommms" mmsc="http://mmsc.rcom.co.in/mms/" mmsproxy="10.239.221.5" mmsport="8080" type="mms" /> - <apn carrier="Netconnect" mcc="405" mnc="05" apn="rcomnet" type="default,supl" /> - <apn carrier="RelianceMbWorld" mcc="405" mnc="05" apn="rcomwap" proxy="10.239.221.5" port="8080" type="default,supl" /> - <apn carrier="Reliance MMS" mcc="405" mnc="06" apn="rcommms" mmsc="http://mmsc.rcom.co.in/mms/" mmsproxy="10.239.221.5" mmsport="8080" type="mms" /> - <apn carrier="Netconnect" mcc="405" mnc="06" apn="rcomnet" type="default,supl" /> - <apn carrier="RelianceMbWorld" mcc="405" mnc="06" apn="rcomwap" proxy="10.239.221.5" port="8080" type="default,supl" /> - <apn carrier="Reliance MMS" mcc="405" mnc="07" apn="rcommms" mmsc="http://mmsc.rcom.co.in/mms/" mmsproxy="10.239.221.5" mmsport="8080" type="mms" /> - <apn carrier="Netconnect" mcc="405" mnc="07" apn="rcomnet" type="default,supl" /> - <apn carrier="RelianceMbWorld" mcc="405" mnc="07" apn="rcomwap" proxy="10.239.221.5" port="8080" type="default,supl" /> - <apn carrier="Reliance MMS" mcc="405" mnc="08" apn="rcommms" mmsc="http://mmsc.rcom.co.in/mms/" mmsproxy="10.239.221.5" mmsport="8080" type="mms" /> - <apn carrier="Netconnect" mcc="405" mnc="08" apn="rcomnet" type="default,supl" /> - <apn carrier="RelianceMbWorld" mcc="405" mnc="08" apn="rcomwap" proxy="10.239.221.5" port="8080" type="default,supl" /> - <apn carrier="Reliance MMS" mcc="405" mnc="09" apn="rcommms" mmsc="http://mmsc.rcom.co.in/mms/" mmsproxy="10.239.221.5" mmsport="8080" type="mms" /> - <apn carrier="Netconnect" mcc="405" mnc="09" apn="rcomnet" type="default,supl" /> - <apn carrier="RelianceMbWorld" mcc="405" mnc="09" apn="rcomwap" proxy="10.239.221.5" port="8080" type="default,supl" /> - <apn carrier="Reliance MMS" mcc="405" mnc="10" apn="rcommms" mmsc="http://mmsc.rcom.co.in/mms/" mmsproxy="10.239.221.5" mmsport="8080" type="mms" /> - <apn carrier="Netconnect" mcc="405" mnc="10" apn="rcomnet" type="default,supl" /> - <apn carrier="RelianceMbWorld" mcc="405" mnc="10" apn="rcomwap" proxy="10.239.221.5" port="8080" type="default,supl" /> - <apn carrier="Reliance MMS" mcc="405" mnc="11" apn="rcommms" mmsc="http://mmsc.rcom.co.in/mms/" mmsproxy="10.239.221.5" mmsport="8080" type="mms" /> - <apn carrier="Netconnect" mcc="405" mnc="11" apn="rcomnet" type="default,supl" /> - <apn carrier="RelianceMbWorld" mcc="405" mnc="11" apn="rcomwap" proxy="10.239.221.5" port="8080" type="default,supl" /> - <apn carrier="Reliance MMS" mcc="405" mnc="12" apn="rcommms" mmsc="http://mmsc.rcom.co.in/mms/" mmsproxy="10.239.221.5" mmsport="8080" type="mms" /> - <apn carrier="Netconnect" mcc="405" mnc="12" apn="rcomnet" type="default,supl" /> - <apn carrier="RelianceMbWorld" mcc="405" mnc="12" apn="rcomwap" proxy="10.239.221.5" port="8080" type="default,supl" /> - <apn carrier="Reliance MMS" mcc="405" mnc="13" apn="rcommms" mmsc="http://mmsc.rcom.co.in/mms/" mmsproxy="10.239.221.5" mmsport="8080" type="mms" /> - <apn carrier="Netconnect" mcc="405" mnc="13" apn="rcomnet" type="default,supl" /> - <apn carrier="RelianceMbWorld" mcc="405" mnc="13" apn="rcomwap" proxy="10.239.221.5" port="8080" type="default,supl" /> - <apn carrier="Reliance MMS" mcc="405" mnc="14" apn="rcommms" mmsc="http://mmsc.rcom.co.in/mms/" mmsproxy="10.239.221.5" mmsport="8080" type="mms" /> - <apn carrier="Netconnect" mcc="405" mnc="14" apn="rcomnet" type="default,supl" /> - <apn carrier="RelianceMbWorld" mcc="405" mnc="14" apn="rcomwap" proxy="10.239.221.5" port="8080" type="default,supl" /> - <apn carrier="Reliance MMS" mcc="405" mnc="15" apn="rcommms" mmsc="http://mmsc.rcom.co.in/mms/" mmsproxy="10.239.221.5" mmsport="8080" type="mms" /> - <apn carrier="Netconnect" mcc="405" mnc="15" apn="rcomnet" type="default,supl" /> - <apn carrier="RelianceMbWorld" mcc="405" mnc="15" apn="rcomwap" proxy="10.239.221.5" port="8080" type="default,supl" /> - <apn carrier="Reliance MMS" mcc="405" mnc="17" apn="rcommms" mmsc="http://mmsc.rcom.co.in/mms/" mmsproxy="10.239.221.5" mmsport="8080" type="mms" /> - <apn carrier="Netconnect" mcc="405" mnc="17" apn="rcomnet" type="default,supl" /> - <apn carrier="RelianceMbWorld" mcc="405" mnc="17" apn="rcomwap" proxy="10.239.221.5" port="8080" type="default,supl" /> - <apn carrier="Reliance MMS" mcc="405" mnc="18" apn="rcommms" mmsc="http://mmsc.rcom.co.in/mms/" mmsproxy="10.239.221.5" mmsport="8080" type="mms" /> - <apn carrier="Netconnect" mcc="405" mnc="18" apn="rcomnet" type="default,supl" /> - <apn carrier="RelianceMbWorld" mcc="405" mnc="18" apn="rcomwap" proxy="10.239.221.5" port="8080" type="default,supl" /> - <apn carrier="Reliance MMS" mcc="405" mnc="19" apn="rcommms" mmsc="http://mmsc.rcom.co.in/mms/" mmsproxy="10.239.221.5" mmsport="8080" type="mms" /> - <apn carrier="Netconnect" mcc="405" mnc="19" apn="rcomnet" type="default,supl" /> - <apn carrier="RelianceMbWorld" mcc="405" mnc="19" apn="rcomwap" proxy="10.239.221.5" port="8080" type="default,supl" /> - <apn carrier="Reliance MMS" mcc="405" mnc="20" apn="rcommms" mmsc="http://mmsc.rcom.co.in/mms/" mmsproxy="10.239.221.5" mmsport="8080" type="mms" /> - <apn carrier="Netconnect" mcc="405" mnc="20" apn="rcomnet" type="default,supl" /> - <apn carrier="RelianceMbWorld" mcc="405" mnc="20" apn="rcomwap" proxy="10.239.221.5" port="8080" type="default,supl" /> - <apn carrier="Reliance MMS" mcc="405" mnc="21" apn="rcommms" mmsc="http://mmsc.rcom.co.in/mms/" mmsproxy="10.239.221.5" mmsport="8080" type="mms" /> - <apn carrier="Netconnect" mcc="405" mnc="21" apn="rcomnet" type="default,supl" /> - <apn carrier="RelianceMbWorld" mcc="405" mnc="21" apn="rcomwap" proxy="10.239.221.5" port="8080" type="default,supl" /> - <apn carrier="Reliance MMS" mcc="405" mnc="22" apn="rcommms" mmsc="http://mmsc.rcom.co.in/mms/" mmsproxy="10.239.221.5" mmsport="8080" type="mms" /> - <apn carrier="Netconnect" mcc="405" mnc="22" apn="rcomnet" type="default,supl" /> - <apn carrier="RelianceMbWorld" mcc="405" mnc="22" apn="rcomwap" proxy="10.239.221.5" port="8080" type="default,supl" /> - <apn carrier="Reliance MMS" mcc="405" mnc="23" apn="rcommms" mmsc="http://mmsc.rcom.co.in/mms/" mmsproxy="10.239.221.5" mmsport="8080" type="mms" /> - <apn carrier="Netconnect" mcc="405" mnc="23" apn="rcomnet" type="default,supl" /> - <apn carrier="RelianceMbWorld" mcc="405" mnc="23" apn="rcomwap" proxy="10.239.221.5" port="8080" type="default,supl" /> - <apn carrier="TATA DOCOMO DIVE-IN" mcc="405" mnc="025" apn="TATA.DOCOMO.DIVE.IN" proxy="10.124.94.7" port="8080" type="default,supl" /> - <apn carrier="TATA DOCOMO INTERNET" mcc="405" mnc="025" apn="TATA.DOCOMO.INTERNET" type="default,supl" /> - <apn carrier="TATA DOCOMO MMS" mcc="405" mnc="025" apn="TATA.DOCOMO.MMS" mmsc="http://mmsc/" mmsproxy="10.124.26.94" mmsport="8799" type="mms" /> - <apn carrier="TATA DOCOMO INTERNET" mcc="405" mnc="026" apn="TATA.DOCOMO.INTERNET" type="default,supl" /> - <apn carrier="TATA DOCOMO DIVE-IN" mcc="405" mnc="026" apn="TATA.DOCOMO.DIVE.IN" proxy="10.124.94.7" port="8080" type="default,supl" /> - <apn carrier="TATA DOCOMO MMS" mcc="405" mnc="026" apn="TATA.DOCOMO.MMS" mmsc="http://mmsc/" mmsproxy="10.124.26.94" mmsport="8799" type="mms" /> - <apn carrier="TATA DOCOMO INTERNET" mcc="405" mnc="027" apn="TATA.DOCOMO.INTERNET" type="default,supl" /> - <apn carrier="TATA DOCOMO DIVE-IN" mcc="405" mnc="027" apn="TATA.DOCOMO.DIVE.IN" proxy="10.124.94.7" port="8080" type="default,supl" /> - <apn carrier="TATA DOCOMO MMS" mcc="405" mnc="027" apn="TATA.DOCOMO.MMS" mmsc="http://mmsc/" mmsproxy="10.124.26.94" mmsport="8799" type="mms" /> - <apn carrier="TATA DOCOMO INTERNET" mcc="405" mnc="028" apn="TATA.DOCOMO.INTERNET" type="default,supl" /> - <apn carrier="TATA DOCOMO DIVE-IN" mcc="405" mnc="028" apn="TATA.DOCOMO.DIVE.IN" proxy="10.124.94.7" port="8080" type="default,supl" /> - <apn carrier="TATA DOCOMO MMS" mcc="405" mnc="028" apn="TATA.DOCOMO.MMS" mmsc="http://mmsc/" mmsproxy="10.124.26.94" mmsport="8799" type="mms" /> - <apn carrier="TATA DOCOMO INTERNET" mcc="405" mnc="029" apn="TATA.DOCOMO.INTERNET" type="default,supl" /> - <apn carrier="TATA DOCOMO DIVE-IN" mcc="405" mnc="029" apn="TATA.DOCOMO.DIVE.IN" proxy="10.124.94.7" port="8080" type="default,supl" /> - <apn carrier="TATA DOCOMO MMS" mcc="405" mnc="029" apn="TATA.DOCOMO.MMS" mmsc="http://mmsc/" mmsproxy="10.124.26.94" mmsport="8799" type="mms" /> - <apn carrier="TATA DOCOMO INTERNET" mcc="405" mnc="030" apn="TATA.DOCOMO.INTERNET" type="default,supl" /> - <apn carrier="TATA DOCOMO DIVE-IN" mcc="405" mnc="030" apn="TATA.DOCOMO.DIVE.IN" proxy="10.124.94.7" port="8080" type="default,supl" /> - <apn carrier="TATA DOCOMO MMS" mcc="405" mnc="030" apn="TATA.DOCOMO.MMS" mmsc="http://mmsc/" mmsproxy="10.124.26.94" mmsport="8799" type="mms" /> - <apn carrier="TATA DOCOMO INTERNET" mcc="405" mnc="031" apn="TATA.DOCOMO.INTERNET" type="default,supl" /> - <apn carrier="TATA DOCOMO DIVE-IN" mcc="405" mnc="031" apn="TATA.DOCOMO.DIVE.IN" proxy="10.124.94.7" port="8080" type="default,supl" /> - <apn carrier="TATA DOCOMO MMS" mcc="405" mnc="031" apn="TATA.DOCOMO.MMS" mmsc="http://mmsc/" mmsproxy="10.124.26.94" mmsport="8799" type="mms" /> - <apn carrier="TATA DOCOMO INTERNET" mcc="405" mnc="032" apn="TATA.DOCOMO.INTERNET" type="default,supl" /> - <apn carrier="TATA DOCOMO DIVE-IN" mcc="405" mnc="032" apn="TATA.DOCOMO.DIVE.IN" proxy="10.124.94.7" port="8080" type="default,supl" /> - <apn carrier="TATA DOCOMO MMS" mcc="405" mnc="032" apn="TATA.DOCOMO.MMS" mmsc="http://mmsc/" mmsproxy="10.124.26.94" mmsport="8799" type="mms" /> - <apn carrier="TATA DOCOMO INTERNET" mcc="405" mnc="033" apn="TATA.DOCOMO.INTERNET" type="default,supl" /> - <apn carrier="TATA DOCOMO DIVE-IN" mcc="405" mnc="033" apn="TATA.DOCOMO.DIVE.IN" proxy="10.124.94.7" port="8080" type="default,supl" /> - <apn carrier="TATA DOCOMO MMS" mcc="405" mnc="033" apn="TATA.DOCOMO.MMS" mmsc="http://mmsc/" mmsproxy="10.124.26.94" mmsport="8799" type="mms" /> - <apn carrier="TATA DOCOMO INTERNET" mcc="405" mnc="034" apn="TATA.DOCOMO.INTERNET" type="default,supl" /> - <apn carrier="TATA DOCOMO DIVE-IN" mcc="405" mnc="034" apn="TATA.DOCOMO.DIVE.IN" proxy="10.124.94.7" port="8080" type="default,supl" /> - <apn carrier="TATA DOCOMO MMS" mcc="405" mnc="034" apn="TATA.DOCOMO.MMS" mmsc="http://mmsc/" mmsproxy="10.124.26.94" mmsport="8799" type="mms" /> - <apn carrier="TATA DOCOMO INTERNET" mcc="405" mnc="035" apn="TATA.DOCOMO.INTERNET" type="default,supl" /> - <apn carrier="TATA DOCOMO DIVE-IN" mcc="405" mnc="035" apn="TATA.DOCOMO.DIVE.IN" proxy="10.124.94.7" port="8080" type="default,supl" /> - <apn carrier="TATA DOCOMO MMS" mcc="405" mnc="035" apn="TATA.DOCOMO.MMS" mmsc="http://mmsc/" mmsproxy="10.124.26.94" mmsport="8799" type="mms" /> - <apn carrier="TATA DOCOMO INTERNET" mcc="405" mnc="036" apn="TATA.DOCOMO.INTERNET" type="default,supl" /> - <apn carrier="TATA DOCOMO DIVE-IN" mcc="405" mnc="036" apn="TATA.DOCOMO.DIVE.IN" proxy="10.124.94.7" port="8080" type="default,supl" /> - <apn carrier="TATA DOCOMO MMS" mcc="405" mnc="036" apn="TATA.DOCOMO.MMS" mmsc="http://mmsc/" mmsproxy="10.124.26.94" mmsport="8799" type="mms" /> - <apn carrier="TATA DOCOMO INTERNET" mcc="405" mnc="037" apn="TATA.DOCOMO.INTERNET" type="default,supl" /> - <apn carrier="TATA DOCOMO DIVE-IN" mcc="405" mnc="037" apn="TATA.DOCOMO.DIVE.IN" proxy="10.124.94.7" port="8080" type="default,supl" /> - <apn carrier="TATA DOCOMO MMS" mcc="405" mnc="037" apn="TATA.DOCOMO.MMS" mmsc="http://mmsc/" mmsproxy="10.124.26.94" mmsport="8799" type="mms" /> - <apn carrier="TATA DOCOMO INTERNET" mcc="405" mnc="038" apn="TATA.DOCOMO.INTERNET" type="default,supl" /> - <apn carrier="TATA DOCOMO DIVE-IN" mcc="405" mnc="038" apn="TATA.DOCOMO.DIVE.IN" proxy="10.124.94.7" port="8080" type="default,supl" /> - <apn carrier="TATA DOCOMO MMS" mcc="405" mnc="038" apn="TATA.DOCOMO.MMS" mmsc="http://mmsc/" mmsproxy="10.124.26.94" mmsport="8799" type="mms" /> - <apn carrier="TATA DOCOMO INTERNET" mcc="405" mnc="039" apn="TATA.DOCOMO.INTERNET" type="default,supl" /> - <apn carrier="TATA DOCOMO DIVE-IN" mcc="405" mnc="039" apn="TATA.DOCOMO.DIVE.IN" proxy="10.124.94.7" port="8080" type="default,supl" /> - <apn carrier="TATA DOCOMO MMS" mcc="405" mnc="039" apn="TATA.DOCOMO.MMS" mmsc="http://mmsc/" mmsproxy="10.124.26.94" mmsport="8799" type="mms" /> - <apn carrier="TATA DOCOMO INTERNET" mcc="405" mnc="040" apn="TATA.DOCOMO.INTERNET" type="default,supl" /> - <apn carrier="TATA DOCOMO DIVE-IN" mcc="405" mnc="040" apn="TATA.DOCOMO.DIVE.IN" proxy="10.124.94.7" port="8080" type="default,supl" /> - <apn carrier="TATA DOCOMO MMS" mcc="405" mnc="040" apn="TATA.DOCOMO.MMS" mmsc="http://mmsc/" mmsproxy="10.124.26.94" mmsport="8799" type="mms" /> - <apn carrier="TATA DOCOMO INTERNET" mcc="405" mnc="041" apn="TATA.DOCOMO.INTERNET" type="default,supl" /> - <apn carrier="TATA DOCOMO DIVE-IN" mcc="405" mnc="041" apn="TATA.DOCOMO.DIVE.IN" proxy="10.124.94.7" port="8080" type="default,supl" /> - <apn carrier="TATA DOCOMO MMS" mcc="405" mnc="041" apn="TATA.DOCOMO.MMS" mmsc="http://mmsc/" mmsproxy="10.124.26.94" mmsport="8799" type="mms" /> - <apn carrier="TATA DOCOMO INTERNET" mcc="405" mnc="042" apn="TATA.DOCOMO.INTERNET" type="default,supl" /> - <apn carrier="TATA DOCOMO DIVE-IN" mcc="405" mnc="042" apn="TATA.DOCOMO.DIVE.IN" proxy="10.124.94.7" port="8080" type="default,supl" /> - <apn carrier="TATA DOCOMO MMS" mcc="405" mnc="042" apn="TATA.DOCOMO.MMS" mmsc="http://mmsc/" mmsproxy="10.124.26.94" mmsport="8799" type="mms" /> - <apn carrier="TATA DOCOMO INTERNET" mcc="405" mnc="043" apn="TATA.DOCOMO.INTERNET" type="default,supl" /> - <apn carrier="TATA DOCOMO DIVE-IN" mcc="405" mnc="043" apn="TATA.DOCOMO.DIVE.IN" proxy="10.124.94.7" port="8080" type="default,supl" /> - <apn carrier="TATA DOCOMO MMS" mcc="405" mnc="043" apn="TATA.DOCOMO.MMS" mmsc="http://mmsc/" mmsproxy="10.124.26.94" mmsport="8799" type="mms" /> - <apn carrier="TATA DOCOMO INTERNET" mcc="405" mnc="044" apn="TATA.DOCOMO.INTERNET" type="default,supl" /> - <apn carrier="TATA DOCOMO DIVE-IN" mcc="405" mnc="044" apn="TATA.DOCOMO.DIVE.IN" proxy="10.124.94.7" port="8080" type="default,supl" /> - <apn carrier="TATA DOCOMO MMS" mcc="405" mnc="044" apn="TATA.DOCOMO.MMS" mmsc="http://mmsc/" mmsproxy="10.124.26.94" mmsport="8799" type="mms" /> - <apn carrier="TATA DOCOMO INTERNET" mcc="405" mnc="045" apn="TATA.DOCOMO.INTERNET" type="default,supl" /> - <apn carrier="TATA DOCOMO DIVE-IN" mcc="405" mnc="045" apn="TATA.DOCOMO.DIVE.IN" proxy="10.124.94.7" port="8080" type="default,supl" /> - <apn carrier="TATA DOCOMO MMS" mcc="405" mnc="045" apn="TATA.DOCOMO.MMS" mmsc="http://mmsc/" mmsproxy="10.124.26.94" mmsport="8799" type="mms" /> - <apn carrier="TATA DOCOMO INTERNET" mcc="405" mnc="046" apn="TATA.DOCOMO.INTERNET" type="default,supl" /> - <apn carrier="TATA DOCOMO DIVE-IN" mcc="405" mnc="046" apn="TATA.DOCOMO.DIVE.IN" proxy="10.124.94.7" port="8080" type="default,supl" /> - <apn carrier="TATA DOCOMO MMS" mcc="405" mnc="046" apn="TATA.DOCOMO.MMS" mmsc="http://mmsc/" mmsproxy="10.124.26.94" mmsport="8799" type="mms" /> - <apn carrier="TATA DOCOMO INTERNET" mcc="405" mnc="047" apn="TATA.DOCOMO.INTERNET" type="default,supl" /> - <apn carrier="TATA DOCOMO DIVE-IN" mcc="405" mnc="047" apn="TATA.DOCOMO.DIVE.IN" proxy="10.124.94.7" port="8080" type="default,supl" /> - <apn carrier="TATA DOCOMO MMS" mcc="405" mnc="047" apn="TATA.DOCOMO.MMS" mmsc="http://mmsc/" mmsproxy="10.124.26.94" mmsport="8799" type="mms" /> - <apn carrier="Mobile Office" mcc="405" mnc="51" apn="airtelgprs.com" type="default,supl" /> - <apn carrier="AIRTEL LIVE" mcc="405" mnc="51" apn="airtelfun.com" proxy="100.1.200.99" port="8080" type="default,supl" /> - <apn carrier="Airtel MMS" mcc="405" mnc="51" apn="airtelmms.com" authtype="1" mmsc="http://100.1.201.171:10021/mmsc" mmsproxy="100.1.201.172" mmsport="8799" type="mms" /> - <apn carrier="Mobile Office" mcc="405" mnc="52" apn="airtelgprs.com" type="default,supl" /> - <apn carrier="AIRTEL LIVE" mcc="405" mnc="52" apn="airtelfun.com" proxy="100.1.200.99" port="8080" type="default,supl" /> - <apn carrier="Airtel MMS" mcc="405" mnc="52" apn="airtelmms.com" authtype="1" mmsc="http://100.1.201.171:10021/mmsc" mmsproxy="100.1.201.172" mmsport="8799" type="mms" /> - <apn carrier="Mobile Office" mcc="405" mnc="53" apn="airtelgprs.com" type="default,supl" /> - <apn carrier="AIRTEL LIVE" mcc="405" mnc="53" apn="airtelfun.com" proxy="100.1.200.99" port="8080" type="default,supl" /> - <apn carrier="Airtel MMS" mcc="405" mnc="53" apn="airtelmms.com" authtype="1" mmsc="http://100.1.201.171:10021/mmsc" mmsproxy="100.1.201.172" mmsport="8799" type="mms" /> - <apn carrier="Mobile Office" mcc="405" mnc="54" apn="airtelgprs.com" type="default,supl" /> - <apn carrier="AIRTEL LIVE" mcc="405" mnc="54" apn="airtelfun.com" proxy="100.1.200.99" port="8080" type="default,supl" /> - <apn carrier="Airtel MMS" mcc="405" mnc="54" apn="airtelmms.com" authtype="1" mmsc="http://100.1.201.171:10021/mmsc" mmsproxy="100.1.201.172" mmsport="8799" type="mms" /> - <apn carrier="Mobile Office" mcc="405" mnc="55" apn="airtelgprs.com" type="default,supl" /> - <apn carrier="AIRTEL LIVE" mcc="405" mnc="55" apn="airtelfun.com" proxy="100.1.200.99" port="8080" type="default,supl" /> - <apn carrier="Airtel MMS" mcc="405" mnc="55" apn="airtelmms.com" authtype="1" mmsc="http://100.1.201.171:10021/mmsc" mmsproxy="100.1.201.172" mmsport="8799" type="mms" /> - <apn carrier="Mobile Office" mcc="405" mnc="56" apn="airtelgprs.com" type="default,supl" /> - <apn carrier="AIRTEL LIVE" mcc="405" mnc="56" apn="airtelfun.com" proxy="100.1.200.99" port="8080" type="default,supl" /> - <apn carrier="Airtel MMS" mcc="405" mnc="56" apn="airtelmms.com" authtype="1" mmsc="http://100.1.201.171:10021/mmsc" mmsproxy="100.1.201.172" mmsport="8799" type="mms" /> - <apn carrier="Vodafone_MMS" mcc="405" mnc="66" apn="portalnmms" mmsc="http://mms1.live.vodafone.in/mms/" mmsproxy="10.10.1.100" mmsport="9401" type="mms" /> - <apn carrier="Vodafonemobileconnect" mcc="405" mnc="66" apn="www" type="default,supl" /> - <apn carrier="Vodafone live" mcc="405" mnc="66" apn="portalnmms" proxy="10.10.1.100" port="9401" type="default,supl" /> - <apn carrier="Vodafone_MMS" mcc="405" mnc="67" apn="portalnmms" mmsc="http://mms1.live.vodafone.in/mms/" mmsproxy="10.10.1.100" mmsport="9401" type="mms" /> - <apn carrier="Vodafonemobileconnect" mcc="405" mnc="67" apn="www" type="default,supl" /> - <apn carrier="Vodafone live" mcc="405" mnc="67" apn="portalnmms" proxy="10.10.1.100" port="9401" type="default,supl" /> - <apn carrier="Idea_Internet" mcc="405" mnc="70" apn="internet" type="default,supl" /> - <apn carrier="IDEA GPRS" mcc="405" mnc="70" apn="imis" proxy="10.4.42.15" port="8080" type="default,supl" /> - <apn carrier="IDEA MMS" mcc="405" mnc="70" apn="mmsc" mmsc="http://10.4.42.21:8002/" mmsproxy="10.4.42.15" mmsport="8080" type="mms" /> - <apn carrier="Vodafone_MMS" mcc="405" mnc="750" apn="portalnmms" mmsc="http://mms1.live.vodafone.in/mms/" mmsproxy="10.10.1.100" mmsport="9401" type="mms" /> - <apn carrier="Vodafonemobileconnect" mcc="405" mnc="750" apn="www" type="default,supl" /> - <apn carrier="Vodafone live" mcc="405" mnc="750" apn="portalnmms" proxy="10.10.1.100" port="9401" type="default,supl" /> - <apn carrier="Vodafone_MMS" mcc="405" mnc="751" apn="portalnmms" mmsc="http://mms1.live.vodafone.in/mms/" mmsproxy="10.10.1.100" mmsport="9401" type="mms" /> - <apn carrier="Vodafonemobileconnect" mcc="405" mnc="751" apn="www" type="default,supl" /> - <apn carrier="Vodafone live" mcc="405" mnc="751" apn="portalnmms" proxy="10.10.1.100" port="9401" type="default,supl" /> - <apn carrier="Vodafone_MMS" mcc="405" mnc="752" apn="portalnmms" mmsc="http://mms1.live.vodafone.in/mms/" mmsproxy="10.10.1.100" mmsport="9401" type="mms" /> - <apn carrier="Vodafonemobileconnect" mcc="405" mnc="752" apn="www" type="default,supl" /> - <apn carrier="Vodafone live" mcc="405" mnc="752" apn="portalnmms" proxy="10.10.1.100" port="9401" type="default,supl" /> - <apn carrier="Vodafone_MMS" mcc="405" mnc="753" apn="portalnmms" mmsc="http://mms1.live.vodafone.in/mms/" mmsproxy="10.10.1.100" mmsport="9401" type="mms" /> - <apn carrier="Vodafonemobileconnect" mcc="405" mnc="753" apn="www" type="default,supl" /> - <apn carrier="Vodafone live" mcc="405" mnc="753" apn="portalnmms" proxy="10.10.1.100" port="9401" type="default,supl" /> - <apn carrier="Vodafone_MMS" mcc="405" mnc="754" apn="portalnmms" mmsc="http://mms1.live.vodafone.in/mms/" mmsproxy="10.10.1.100" mmsport="9401" type="mms" /> - <apn carrier="Vodafonemobileconnect" mcc="405" mnc="754" apn="www" type="default,supl" /> - <apn carrier="Vodafone live" mcc="405" mnc="754" apn="portalnmms" proxy="10.10.1.100" port="9401" type="default,supl" /> - <apn carrier="Vodafone_MMS" mcc="405" mnc="755" apn="portalnmms" mmsc="http://mms1.live.vodafone.in/mms/" mmsproxy="10.10.1.100" mmsport="9401" type="mms" /> - <apn carrier="Vodafonemobileconnect" mcc="405" mnc="755" apn="www" type="default,supl" /> - <apn carrier="Vodafone live" mcc="405" mnc="755" apn="portalnmms" proxy="10.10.1.100" port="9401" type="default,supl" /> - <apn carrier="Vodafone_MMS" mcc="405" mnc="756" apn="portalnmms" mmsc="http://mms1.live.vodafone.in/mms/" mmsproxy="10.10.1.100" mmsport="9401" type="mms" /> - <apn carrier="Vodafonemobileconnect" mcc="405" mnc="756" apn="www" type="default,supl" /> - <apn carrier="Vodafone live" mcc="405" mnc="756" apn="portalnmms" proxy="10.10.1.100" port="9401" type="default,supl" /> - <apn carrier="Idea_Internet" mcc="405" mnc="799" apn="internet" type="default,supl" /> - <apn carrier="IDEA GPRS" mcc="405" mnc="799" apn="imis" proxy="10.4.42.15" port="8080" type="default,supl" /> - <apn carrier="IDEA MMS" mcc="405" mnc="799" apn="mmsc" mmsc="http://10.4.42.21:8002/" mmsproxy="10.4.42.15" mmsport="8080" type="mms" /> - <apn carrier="Aircel-GPRS" mcc="405" mnc="800" apn="aircelgprs" type="default,supl" /> - <apn carrier="Pocket Internet" mcc="405" mnc="800" apn="aircelwap" proxy="172.17.83.69" port="8080" type="default,supl" /> - <apn carrier="Aircel-MMS" mcc="405" mnc="800" apn="aircelmms" mmsc="http://10.50.1.166/servlets/mms" mmsproxy="172.17.83.69" mmsport="8080" type="mms" /> - <apn carrier="Aircel-GPRS" mcc="405" mnc="801" apn="aircelgprs" type="default,supl" /> - <apn carrier="Pocket Internet" mcc="405" mnc="801" apn="aircelwap" proxy="192.168.35.201" port="8081" type="default,supl" /> - <apn carrier="Aircel-MMS" mcc="405" mnc="801" apn="aircelmms" mmsc="http://mmsc/mmrelay.app" mmsproxy="192.168.35.196" mmsport="8081" type="mms" /> - <apn carrier="Aircel-GPRS" mcc="405" mnc="802" apn="aircelgprs" type="default,supl" /> - <apn carrier="Pocket Internet" mcc="405" mnc="802" apn="aircelwap" proxy="172.17.83.69" port="8080" type="default,supl" /> - <apn carrier="Aircel-MMS" mcc="405" mnc="802" apn="aircelmms" mmsc="http://10.50.1.166/servlets/mms" mmsproxy="172.17.83.69" mmsport="8080" type="mms" /> - <apn carrier="Aircel-GPRS" mcc="405" mnc="803" apn="aircelgprs" type="default,supl" /> - <apn carrier="Pocket Internet" mcc="405" mnc="803" apn="aircelwap" proxy="192.168.35.201" port="8081" type="default,supl" /> - <apn carrier="Aircel-MMS" mcc="405" mnc="803" apn="aircelmms" mmsc="http://mmsc/mmrelay.app" mmsproxy="192.168.35.196" mmsport="8081" type="mms" /> - <apn carrier="Aircel-GPRS" mcc="405" mnc="804" apn="aircelgprs" type="default,supl" /> - <apn carrier="Pocket Internet" mcc="405" mnc="804" apn="aircelwap" proxy="172.17.83.69" port="8080" type="default,supl" /> - <apn carrier="Aircel-MMS" mcc="405" mnc="804" apn="aircelmms" mmsc="http://10.50.1.166/servlets/mms" mmsproxy="172.17.83.69" mmsport="8080" type="mms" /> - <apn carrier="Aircel-GPRS" mcc="405" mnc="805" apn="aircelgprs" type="default,supl" /> - <apn carrier="Pocket Internet" mcc="405" mnc="805" apn="aircelwap" proxy="172.17.83.69" port="8080" type="default,supl" /> - <apn carrier="Aircel-MMS" mcc="405" mnc="805" apn="aircelmms" mmsc="http://10.50.1.166/servlets/mms" mmsproxy="172.17.83.69" mmsport="8080" type="mms" /> - <apn carrier="Aircel-GPRS" mcc="405" mnc="806" apn="aircelgprs" type="default,supl" /> - <apn carrier="Pocket Internet" mcc="405" mnc="806" apn="aircelwap" proxy="172.17.83.69" port="8080" type="default,supl" /> - <apn carrier="Aircel-MMS" mcc="405" mnc="806" apn="aircelmms" mmsc="http://10.50.1.166/servlets/mms" mmsproxy="172.17.83.69" mmsport="8080" type="mms" /> - <apn carrier="Aircel-GPRS" mcc="405" mnc="807" apn="aircelgprs" type="default,supl" /> - <apn carrier="Pocket Internet" mcc="405" mnc="807" apn="aircelwap" proxy="172.17.83.69" port="8080" type="default,supl" /> - <apn carrier="Aircel-MMS" mcc="405" mnc="807" apn="aircelmms" mmsc="http://10.50.1.166/servlets/mms" mmsproxy="172.17.83.69" mmsport="8080" type="mms" /> - <apn carrier="Aircel-GPRS" mcc="405" mnc="808" apn="aircelgprs" type="default,supl" /> - <apn carrier="Pocket Internet" mcc="405" mnc="808" apn="aircelwap" proxy="172.17.83.69" port="8080" type="default,supl" /> - <apn carrier="Aircel-MMS" mcc="405" mnc="808" apn="aircelmms" mmsc="http://10.50.1.166/servlets/mms" mmsproxy="172.17.83.69" mmsport="8080" type="mms" /> - <apn carrier="Aircel-GPRS" mcc="405" mnc="809" apn="aircelgprs" type="default,supl" /> - <apn carrier="Pocket Internet" mcc="405" mnc="809" apn="aircelwap" proxy="192.168.35.201" port="8081" type="default,supl" /> - <apn carrier="Aircel-MMS" mcc="405" mnc="809" apn="aircelmms" mmsc="http://mmsc/mmrelay.app" mmsproxy="192.168.35.196" mmsport="8081" type="mms" /> - <apn carrier="Aircel-GPRS" mcc="405" mnc="810" apn="aircelgprs" type="default,supl" /> - <apn carrier="Pocket Internet" mcc="405" mnc="810" apn="aircelwap" proxy="172.17.83.69" port="8080" type="default,supl" /> - <apn carrier="Aircel-MMS" mcc="405" mnc="810" apn="aircelmms" mmsc="http://10.50.1.166/servlets/mms" mmsproxy="172.17.83.69" mmsport="8080" type="mms" /> - <apn carrier="Aircel-GPRS" mcc="405" mnc="811" apn="aircelgprs" type="default,supl" /> - <apn carrier="Pocket Internet" mcc="405" mnc="811" apn="aircelwap" proxy="172.17.83.69" port="8080" type="default,supl" /> - <apn carrier="Aircel-MMS" mcc="405" mnc="811" apn="aircelmms" mmsc="http://10.50.1.166/servlets/mms" mmsproxy="172.17.83.69" mmsport="8080" type="mms" /> - <apn carrier="Aircel-GPRS" mcc="405" mnc="812" apn="aircelgprs" type="default,supl" /> - <apn carrier="Pocket Internet" mcc="405" mnc="812" apn="aircelwap" proxy="172.17.83.69" port="8080" type="default,supl" /> - <apn carrier="Aircel-MMS" mcc="405" mnc="812" apn="aircelmms" mmsc="http://10.50.1.166/servlets/mms" mmsproxy="172.17.83.69" mmsport="8080" type="mms" /> - <apn carrier="Uninor Internet" mcc="405" mnc="813" apn="uninor" authtype="1" type="default,supl" /> - <apn carrier="Uninor Wap" mcc="405" mnc="813" apn="uninor" proxy="10.58.10.58" port="8080" type="default,supl" /> - <apn carrier="Uninor MMS" mcc="405" mnc="813" apn="uninor" mmsc="http://10.58.2.120" mmsproxy="10.58.10.59" mmsport="8080" type="mms" /> - <apn carrier="Uninor Internet" mcc="405" mnc="814" apn="uninor" authtype="1" type="default,supl" /> - <apn carrier="Uninor Wap" mcc="405" mnc="814" apn="uninor" proxy="10.58.10.58" port="8080" type="default,supl" /> - <apn carrier="Uninor MMS" mcc="405" mnc="814" apn="uninor" mmsc="http://10.58.2.120" mmsproxy="10.58.10.59" mmsport="8080" type="mms" /> - <apn carrier="Uninor Internet" mcc="405" mnc="815" apn="uninor" authtype="1" type="default,supl" /> - <apn carrier="Uninor Wap" mcc="405" mnc="815" apn="uninor" proxy="10.58.10.58" port="8080" type="default,supl" /> - <apn carrier="Uninor MMS" mcc="405" mnc="815" apn="uninor" mmsc="http://10.58.2.120" mmsproxy="10.58.10.59" mmsport="8080" type="mms" /> - <apn carrier="Uninor Internet" mcc="405" mnc="816" apn="uninor" authtype="1" type="default,supl" /> - <apn carrier="Uninor Wap" mcc="405" mnc="816" apn="uninor" proxy="10.58.10.58" port="8080" type="default,supl" /> - <apn carrier="Uninor MMS" mcc="405" mnc="816" apn="uninor" mmsc="http://10.58.2.120" mmsproxy="10.58.10.59" mmsport="8080" type="mms" /> - <apn carrier="Uninor Internet" mcc="405" mnc="817" apn="uninor" authtype="1" type="default,supl" /> - <apn carrier="Uninor Wap" mcc="405" mnc="817" apn="uninor" proxy="10.58.10.58" port="8080" type="default,supl" /> - <apn carrier="Uninor MMS" mcc="405" mnc="817" apn="uninor" mmsc="http://10.58.2.120" mmsproxy="10.58.10.59" mmsport="8080" type="mms" /> - <apn carrier="Uninor Internet" mcc="405" mnc="818" apn="uninor" authtype="1" type="default,supl" /> - <apn carrier="Uninor Wap" mcc="405" mnc="818" apn="uninor" proxy="10.58.10.58" port="8080" type="default,supl" /> - <apn carrier="Uninor MMS" mcc="405" mnc="818" apn="uninor" mmsc="http://10.58.2.120" mmsproxy="10.58.10.59" mmsport="8080" type="mms" /> - <apn carrier="Uninor Internet" mcc="405" mnc="819" apn="uninor" authtype="1" type="default,supl" /> - <apn carrier="Uninor Wap" mcc="405" mnc="819" apn="uninor" proxy="10.58.10.58" port="8080" type="default,supl" /> - <apn carrier="Uninor MMS" mcc="405" mnc="819" apn="uninor" mmsc="http://10.58.2.120" mmsproxy="10.58.10.59" mmsport="8080" type="mms" /> - <apn carrier="Uninor Internet" mcc="405" mnc="820" apn="uninor" authtype="1" type="default,supl" /> - <apn carrier="Uninor Wap" mcc="405" mnc="820" apn="uninor" proxy="10.58.10.58" port="8080" type="default,supl" /> - <apn carrier="Uninor MMS" mcc="405" mnc="820" apn="uninor" mmsc="http://10.58.2.120" mmsproxy="10.58.10.59" mmsport="8080" type="mms" /> - <apn carrier="Uninor Internet" mcc="405" mnc="821" apn="uninor" authtype="1" type="default,supl" /> - <apn carrier="Uninor Wap" mcc="405" mnc="821" apn="uninor" proxy="10.58.10.58" port="8080" type="default,supl" /> - <apn carrier="Uninor MMS" mcc="405" mnc="821" apn="uninor" mmsc="http://10.58.2.120" mmsproxy="10.58.10.59" mmsport="8080" type="mms" /> - <apn carrier="Uninor Internet" mcc="405" mnc="822" apn="uninor" authtype="1" type="default,supl" /> - <apn carrier="Uninor Wap" mcc="405" mnc="822" apn="uninor" proxy="10.58.10.58" port="8080" type="default,supl" /> - <apn carrier="Uninor MMS" mcc="405" mnc="822" apn="uninor" mmsc="http://10.58.2.120" mmsproxy="10.58.10.59" mmsport="8080" type="mms" /> - <apn carrier="Videocon MMS" mcc="405" mnc="823" apn="vgprs.com" mmsc="http://10.202.4.119:10021/mmsc/" mmsproxy="10.202.5.145" mmsport="8799" type="mms" /> - <apn carrier="Videocon" mcc="405" mnc="823" apn="vinternet.com" type="default,supl" /> - <apn carrier="Videocon MMS" mcc="405" mnc="824" apn="vgprs.com" mmsc="http://10.202.4.119:10021/mmsc/" mmsproxy="10.202.5.145" mmsport="8799" type="mms" /> - <apn carrier="Videocon" mcc="405" mnc="824" apn="vinternet.com" type="default,supl" /> - <apn carrier="Videocon MMS" mcc="405" mnc="825" apn="vgprs.com" mmsc="http://10.202.4.119:10021/mmsc/" mmsproxy="10.202.5.145" mmsport="8799" type="mms" /> - <apn carrier="Videocon" mcc="405" mnc="825" apn="vinternet.com" type="default,supl" /> - <apn carrier="Videocon MMS" mcc="405" mnc="826" apn="vgprs.com" mmsc="http://10.202.4.119:10021/mmsc/" mmsproxy="10.202.5.145" mmsport="8799" type="mms" /> - <apn carrier="Videocon" mcc="405" mnc="826" apn="vinternet.com" type="default,supl" /> - <apn carrier="Videocon MMS" mcc="405" mnc="827" apn="vgprs.com" mmsc="http://10.202.4.119:10021/mmsc/" mmsproxy="10.202.5.145" mmsport="8799" type="mms" /> - <apn carrier="Videocon" mcc="405" mnc="827" apn="vinternet.com" type="default,supl" /> - <apn carrier="Videocon MMS" mcc="405" mnc="828" apn="vgprs.com" mmsc="http://10.202.4.119:10021/mmsc/" mmsproxy="10.202.5.145" mmsport="8799" type="mms" /> - <apn carrier="Videocon" mcc="405" mnc="828" apn="vinternet.com" type="default,supl" /> - <apn carrier="Videocon MMS" mcc="405" mnc="829" apn="vgprs.com" mmsc="http://10.202.4.119:10021/mmsc/" mmsproxy="10.202.5.145" mmsport="8799" type="mms" /> - <apn carrier="Videocon" mcc="405" mnc="829" apn="vinternet.com" type="default,supl" /> - <apn carrier="Videocon MMS" mcc="405" mnc="830" apn="vgprs.com" mmsc="http://10.202.4.119:10021/mmsc/" mmsproxy="10.202.5.145" mmsport="8799" type="mms" /> - <apn carrier="Videocon" mcc="405" mnc="830" apn="vinternet.com" type="default,supl" /> - <apn carrier="Videocon MMS" mcc="405" mnc="831" apn="vgprs.com" mmsc="http://10.202.4.119:10021/mmsc/" mmsproxy="10.202.5.145" mmsport="8799" type="mms" /> - <apn carrier="Videocon" mcc="405" mnc="831" apn="vinternet.com" type="default,supl" /> - <apn carrier="Videocon MMS" mcc="405" mnc="832" apn="vgprs.com" mmsc="http://10.202.4.119:10021/mmsc/" mmsproxy="10.202.5.145" mmsport="8799" type="mms" /> - <apn carrier="Videocon" mcc="405" mnc="832" apn="vinternet.com" type="default,supl" /> - <apn carrier="Videocon MMS" mcc="405" mnc="833" apn="vgprs.com" mmsc="http://10.202.4.119:10021/mmsc/" mmsproxy="10.202.5.145" mmsport="8799" type="mms" /> - <apn carrier="Videocon" mcc="405" mnc="833" apn="vinternet.com" type="default,supl" /> - <apn carrier="Videocon MMS" mcc="405" mnc="834" apn="vgprs.com" mmsc="http://10.202.4.119:10021/mmsc/" mmsproxy="10.202.5.145" mmsport="8799" type="mms" /> - <apn carrier="Videocon" mcc="405" mnc="834" apn="vinternet.com" type="default,supl" /> - <apn carrier="Videocon MMS" mcc="405" mnc="835" apn="vgprs.com" mmsc="http://10.202.4.119:10021/mmsc/" mmsproxy="10.202.5.145" mmsport="8799" type="mms" /> - <apn carrier="Videocon" mcc="405" mnc="835" apn="vinternet.com" type="default,supl" /> - <apn carrier="Videocon MMS" mcc="405" mnc="836" apn="vgprs.com" mmsc="http://10.202.4.119:10021/mmsc/" mmsproxy="10.202.5.145" mmsport="8799" type="mms" /> - <apn carrier="Videocon" mcc="405" mnc="836" apn="vinternet.com" type="default,supl" /> - <apn carrier="Videocon MMS" mcc="405" mnc="837" apn="vgprs.com" mmsc="http://10.202.4.119:10021/mmsc/" mmsproxy="10.202.5.145" mmsport="8799" type="mms" /> - <apn carrier="Videocon" mcc="405" mnc="837" apn="vinternet.com" type="default,supl" /> - <apn carrier="Videocon MMS" mcc="405" mnc="838" apn="vgprs.com" mmsc="http://10.202.4.119:10021/mmsc/" mmsproxy="10.202.5.145" mmsport="8799" type="mms" /> - <apn carrier="Videocon" mcc="405" mnc="838" apn="vinternet.com" type="default,supl" /> - <apn carrier="Videocon MMS" mcc="405" mnc="839" apn="vgprs.com" mmsc="http://10.202.4.119:10021/mmsc/" mmsproxy="10.202.5.145" mmsport="8799" type="mms" /> - <apn carrier="Videocon" mcc="405" mnc="839" apn="vinternet.com" type="default,supl" /> - <apn carrier="Videocon MMS" mcc="405" mnc="840" apn="vgprs.com" mmsc="http://10.202.4.119:10021/mmsc/" mmsproxy="10.202.5.145" mmsport="8799" type="mms" /> - <apn carrier="Videocon" mcc="405" mnc="840" apn="vinternet.com" type="default,supl" /> - <apn carrier="Videocon MMS" mcc="405" mnc="841" apn="vgprs.com" mmsc="http://10.202.4.119:10021/mmsc/" mmsproxy="10.202.5.145" mmsport="8799" type="mms" /> - <apn carrier="Videocon" mcc="405" mnc="841" apn="vinternet.com" type="default,supl" /> - <apn carrier="Videocon MMS" mcc="405" mnc="842" apn="vgprs.com" mmsc="http://10.202.4.119:10021/mmsc/" mmsproxy="10.202.5.145" mmsport="8799" type="mms" /> - <apn carrier="Videocon" mcc="405" mnc="842" apn="vinternet.com" type="default,supl" /> - <apn carrier="Videocon MMS" mcc="405" mnc="843" apn="vgprs.com" mmsc="http://10.202.4.119:10021/mmsc/" mmsproxy="10.202.5.145" mmsport="8799" type="mms" /> - <apn carrier="Videocon" mcc="405" mnc="843" apn="vinternet.com" type="default,supl" /> - <apn carrier="Uninor Internet" mcc="405" mnc="844" apn="uninor" authtype="1" type="default,supl" /> - <apn carrier="Uninor Wap" mcc="405" mnc="844" apn="uninor" proxy="10.58.10.58" port="8080" type="default,supl" /> - <apn carrier="Uninor MMS" mcc="405" mnc="844" apn="uninor" mmsc="http://10.58.2.120" mmsproxy="10.58.10.59" mmsport="8080" type="mms" /> - <apn carrier="Idea_Internet" mcc="405" mnc="845" apn="internet" type="default,supl" /> - <apn carrier="IDEA GPRS" mcc="405" mnc="845" apn="imis" proxy="10.4.42.15" port="8080" type="default,supl" /> - <apn carrier="IDEA MMS" mcc="405" mnc="845" apn="mmsc" mmsc="http://10.4.42.21:8002/" mmsproxy="10.4.42.15" mmsport="8080" type="mms" /> - <apn carrier="Idea_Internet" mcc="405" mnc="846" apn="internet" type="default,supl" /> - <apn carrier="IDEA GPRS" mcc="405" mnc="846" apn="imis" proxy="10.4.42.15" port="8080" type="default,supl" /> - <apn carrier="IDEA MMS" mcc="405" mnc="846" apn="mmsc" mmsc="http://10.4.42.21:8002/" mmsproxy="10.4.42.15" mmsport="8080" type="mms" /> - <apn carrier="Idea_Internet" mcc="405" mnc="847" apn="internet" type="default,supl" /> - <apn carrier="IDEA GPRS" mcc="405" mnc="847" apn="imis" proxy="10.4.42.15" port="8080" type="default,supl" /> - <apn carrier="IDEA MMS" mcc="405" mnc="847" apn="mmsc" mmsc="http://10.4.42.21:8002/" mmsproxy="10.4.42.15" mmsport="8080" type="mms" /> - <apn carrier="Idea_Internet" mcc="405" mnc="848" apn="internet" type="default,supl" /> - <apn carrier="IDEA GPRS" mcc="405" mnc="848" apn="imis" proxy="10.4.42.15" port="8080" type="default,supl" /> - <apn carrier="IDEA MMS" mcc="405" mnc="848" apn="mmsc" mmsc="http://10.4.42.21:8002/" mmsproxy="10.4.42.15" mmsport="8080" type="mms" /> - <apn carrier="Idea_Internet" mcc="405" mnc="849" apn="internet" type="default,supl" /> - <apn carrier="IDEA GPRS" mcc="405" mnc="849" apn="imis" proxy="10.4.42.15" port="8080" type="default,supl" /> - <apn carrier="IDEA MMS" mcc="405" mnc="849" apn="mmsc" mmsc="http://10.4.42.21:8002/" mmsproxy="10.4.42.15" mmsport="8080" type="mms" /> - <apn carrier="Idea_Internet" mcc="405" mnc="850" apn="internet" type="default,supl" /> - <apn carrier="IDEA GPRS" mcc="405" mnc="850" apn="imis" proxy="10.4.42.15" port="8080" type="default,supl" /> - <apn carrier="IDEA MMS" mcc="405" mnc="850" apn="mmsc" mmsc="http://10.4.42.21:8002/" mmsproxy="10.4.42.15" mmsport="8080" type="mms" /> - <apn carrier="Idea_Internet" mcc="405" mnc="851" apn="internet" type="default,supl" /> - <apn carrier="IDEA GPRS" mcc="405" mnc="851" apn="imis" proxy="10.4.42.15" port="8080" type="default,supl" /> - <apn carrier="IDEA MMS" mcc="405" mnc="851" apn="mmsc" mmsc="http://10.4.42.21:8002/" mmsproxy="10.4.42.15" mmsport="8080" type="mms" /> - <apn carrier="Idea_Internet" mcc="405" mnc="852" apn="internet" type="default,supl" /> - <apn carrier="IDEA GPRS" mcc="405" mnc="852" apn="imis" proxy="10.4.42.15" port="8080" type="default,supl" /> - <apn carrier="IDEA MMS" mcc="405" mnc="852" apn="mmsc" mmsc="http://10.4.42.21:8002/" mmsproxy="10.4.42.15" mmsport="8080" type="mms" /> - <apn carrier="Idea_Internet" mcc="405" mnc="853" apn="internet" type="default,supl" /> - <apn carrier="IDEA GPRS" mcc="405" mnc="853" apn="imis" proxy="10.4.42.15" port="8080" type="default,supl" /> - <apn carrier="IDEA MMS" mcc="405" mnc="853" apn="mmsc" mmsc="http://10.4.42.21:8002/" mmsproxy="10.4.42.15" mmsport="8080" type="mms" /> - <apn carrier="Uninor Internet" mcc="405" mnc="875" apn="uninor" authtype="1" type="default,supl" /> - <apn carrier="Uninor Wap" mcc="405" mnc="875" apn="uninor" proxy="10.58.10.58" port="8080" type="default,supl" /> - <apn carrier="Uninor MMS" mcc="405" mnc="875" apn="uninor" mmsc="http://10.58.2.120" mmsproxy="10.58.10.59" mmsport="8080" type="mms" /> - <apn carrier="Uninor Internet" mcc="405" mnc="876" apn="uninor" authtype="1" type="default,supl" /> - <apn carrier="Uninor Wap" mcc="405" mnc="876" apn="uninor" proxy="10.58.10.58" port="8080" type="default,supl" /> - <apn carrier="Uninor MMS" mcc="405" mnc="876" apn="uninor" mmsc="http://10.58.2.120" mmsproxy="10.58.10.59" mmsport="8080" type="mms" /> - <apn carrier="Uninor Internet" mcc="405" mnc="877" apn="uninor" authtype="1" type="default,supl" /> - <apn carrier="Uninor Wap" mcc="405" mnc="877" apn="uninor" proxy="10.58.10.58" port="8080" type="default,supl" /> - <apn carrier="Uninor MMS" mcc="405" mnc="877" apn="uninor" mmsc="http://10.58.2.120" mmsproxy="10.58.10.59" mmsport="8080" type="mms" /> - <apn carrier="Uninor Internet" mcc="405" mnc="878" apn="uninor" authtype="1" type="default,supl" /> - <apn carrier="Uninor Wap" mcc="405" mnc="878" apn="uninor" proxy="10.58.10.58" port="8080" type="default,supl" /> - <apn carrier="Uninor MMS" mcc="405" mnc="878" apn="uninor" mmsc="http://10.58.2.120" mmsproxy="10.58.10.59" mmsport="8080" type="mms" /> - <apn carrier="Uninor Internet" mcc="405" mnc="879" apn="uninor" authtype="1" type="default,supl" /> - <apn carrier="Uninor Wap" mcc="405" mnc="879" apn="uninor" proxy="10.58.10.58" port="8080" type="default,supl" /> - <apn carrier="Uninor MMS" mcc="405" mnc="879" apn="uninor" mmsc="http://10.58.2.120" mmsproxy="10.58.10.59" mmsport="8080" type="mms" /> - <apn carrier="Uninor Internet" mcc="405" mnc="880" apn="uninor" authtype="1" type="default,supl" /> - <apn carrier="Uninor Wap" mcc="405" mnc="880" apn="uninor" proxy="10.58.10.58" port="8080" type="default,supl" /> - <apn carrier="Uninor MMS" mcc="405" mnc="880" apn="uninor" mmsc="http://10.58.2.120" mmsproxy="10.58.10.59" mmsport="8080" type="mms" /> - <apn carrier="STEL" mcc="405" mnc="881" apn="gprs.stel.in" type="default,supl" /> - <apn carrier="STEL" mcc="405" mnc="882" apn="gprs.stel.in" type="default,supl" /> - <apn carrier="STEL" mcc="405" mnc="883" apn="gprs.stel.in" type="default,supl" /> - <apn carrier="STEL" mcc="405" mnc="884" apn="gprs.stel.in" type="default,supl" /> - <apn carrier="STEL" mcc="405" mnc="885" apn="gprs.stel.in" type="default,supl" /> - <apn carrier="STEL" mcc="405" mnc="886" apn="gprs.stel.in" type="default,supl" /> - <apn carrier="IDEA" mcc="405" mnc="908" apn="internet" type="default,supl" /> - <apn carrier="IDEA MMS" mcc="405" mnc="908" apn="mmsc" mmsc="http://10.4.42.21:8002/" mmsproxy="10.4.42.15" mmsport="8080" type="mms" /> - <apn carrier="IDEA" mcc="405" mnc="909" apn="internet" type="default,supl" /> - <apn carrier="IDEA MMS" mcc="405" mnc="909" apn="mmsc" mmsc="http://10.4.42.21:8002/" mmsproxy="10.4.42.15" mmsport="8080" type="mms" /> - <apn carrier="IDEA" mcc="405" mnc="910" apn="internet" type="default,supl" /> - <apn carrier="IDEA MMS" mcc="405" mnc="910" apn="mmsc" mmsc="http://10.4.42.21:8002/" mmsproxy="10.4.42.15" mmsport="8080" type="mms" /> - <apn carrier="IDEA" mcc="405" mnc="911" apn="internet" type="default,supl" /> - <apn carrier="IDEA MMS" mcc="405" mnc="911" apn="mmsc" mmsc="http://10.4.42.21:8002/" mmsproxy="10.4.42.15" mmsport="8080" type="mms" /> - <apn carrier="Cheers" mcc="405" mnc="912" apn="internet" type="default,supl" /> - <apn carrier="Cheers" mcc="405" mnc="913" apn="internet" type="default,supl" /> - <apn carrier="Cheers" mcc="405" mnc="914" apn="internet" type="default,supl" /> - <apn carrier="Cheers" mcc="405" mnc="915" apn="internet" type="default,supl" /> - <apn carrier="Cheers" mcc="405" mnc="916" apn="internet" type="default,supl" /> - <apn carrier="Cheers" mcc="405" mnc="917" apn="internet" type="default,supl" /> - <apn carrier="Cheers" mcc="405" mnc="918" apn="internet" type="default,supl" /> - <apn carrier="Cheers" mcc="405" mnc="919" apn="internet" type="default,supl" /> - <apn carrier="Cheers" mcc="405" mnc="920" apn="internet" type="default,supl" /> - <apn carrier="Cheers" mcc="405" mnc="921" apn="internet" type="default,supl" /> - <apn carrier="Cheers" mcc="405" mnc="922" apn="internet" type="default,supl" /> - <apn carrier="Cheers" mcc="405" mnc="923" apn="internet" type="default,supl" /> - <apn carrier="Cheers" mcc="405" mnc="924" apn="internet" type="default,supl" /> - <apn carrier="Uninor Internet" mcc="405" mnc="925" apn="uninor" authtype="1" type="default,supl" /> - <apn carrier="Uninor Wap" mcc="405" mnc="925" apn="uninor" proxy="10.58.10.58" port="8080" type="default,supl" /> - <apn carrier="Uninor MMS" mcc="405" mnc="925" apn="uninor" mmsc="http://10.58.2.120" mmsproxy="10.58.10.59" mmsport="8080" type="mms" /> - <apn carrier="Uninor Internet" mcc="405" mnc="926" apn="uninor" authtype="1" type="default,supl" /> - <apn carrier="Uninor Wap" mcc="405" mnc="926" apn="uninor" proxy="10.58.10.58" port="8080" type="default,supl" /> - <apn carrier="Uninor MMS" mcc="405" mnc="926" apn="uninor" mmsc="http://10.58.2.120" mmsproxy="10.58.10.59" mmsport="8080" type="mms" /> - <apn carrier="Uninor Internet" mcc="405" mnc="927" apn="uninor" authtype="1" type="default,supl" /> - <apn carrier="Uninor Wap" mcc="405" mnc="927" apn="uninor" proxy="10.58.10.58" port="8080" type="default,supl" /> - <apn carrier="Uninor MMS" mcc="405" mnc="927" apn="uninor" mmsc="http://10.58.2.120" mmsproxy="10.58.10.59" mmsport="8080" type="mms" /> - <apn carrier="Uninor Internet" mcc="405" mnc="928" apn="uninor" authtype="1" type="default,supl" /> - <apn carrier="Uninor Wap" mcc="405" mnc="928" apn="uninor" proxy="10.58.10.58" port="8080" type="default,supl" /> - <apn carrier="Uninor MMS" mcc="405" mnc="928" apn="uninor" mmsc="http://10.58.2.120" mmsproxy="10.58.10.59" mmsport="8080" type="mms" /> - <apn carrier="Uninor Internet" mcc="405" mnc="929" apn="uninor" authtype="1" type="default,supl" /> - <apn carrier="Uninor Wap" mcc="405" mnc="929" apn="uninor" proxy="10.58.10.58" port="8080" type="default,supl" /> - <apn carrier="Uninor MMS" mcc="405" mnc="929" apn="uninor" mmsc="http://10.58.2.120" mmsproxy="10.58.10.59" mmsport="8080" type="mms" /> - <apn carrier="Cheers" mcc="405" mnc="930" apn="internet" type="default,supl" /> - <apn carrier="Cheers" mcc="405" mnc="931" apn="internet" type="default,supl" /> - <apn carrier="Videocon MMS" mcc="405" mnc="932" apn="vgprs.com" mmsc="http://10.202.4.119:10021/mmsc/" mmsproxy="10.202.5.145" mmsport="8799" type="mms" /> - <apn carrier="Videocon" mcc="405" mnc="932" apn="vinternet.com" type="default,supl" /> - <apn carrier="Mobilink WAP GPRS" mcc="410" mnc="01" apn="connect.mobilinkworld.com" user="Mobilink" password="Mobilink" type="default,supl" /> - <apn carrier="Mobilink MMS" mcc="410" mnc="01" apn="mms.mobilinkworld.com" user="Mobilink" password="Mobilink" mmsc="http://mms/" mmsproxy="172.25.20.12" mmsport="8080" type="mms" /> - <apn carrier="Ufone WAP" mcc="410" mnc="03" apn="Ufone.internet" type="default,supl" /> - <apn carrier="Ufone MMS" mcc="410" mnc="03" apn="Ufone.mms" mmsc="http://www.ufonemms.com:80/" mmsproxy="172.16.13.27" mmsport="8080" type="mms" /> - <apn carrier="ZONG WAP" mcc="410" mnc="04" apn="zonginternet" type="default,supl" /> - <apn carrier="ZONG MMS" mcc="410" mnc="04" apn="zongmms" mmsc="http://10.81.6.11:8080" mmsproxy="10.81.6.33" mmsport="8000" type="mms" /> - <apn carrier="Telenor WAP" mcc="410" mnc="06" apn="internet" type="default,supl" /> - <apn carrier="Telenor MMS" mcc="410" mnc="06" apn="mms" user="Telenor" password="Telenor" mmsc="http://mmstelenor" mmsproxy="172.18.19.11" mmsport="8080" type="mms" /> - <apn carrier="Warid WAP" mcc="410" mnc="07" apn="Wap.warid" type="default,supl" /> - <apn carrier="Warid MMS" mcc="410" mnc="07" apn="mms.warid" mmsc="http://10.4.0.132/servlets/MMS" mmsproxy="10.4.2.1" mmsport="8080" type="mms" /> - <apn carrier="AWCC" mcc="412" mnc="01" apn="default" type="default,supl" /> - <apn carrier="Roshan" mcc="412" mnc="20" apn="default" type="default,supl" /> - <apn carrier="MTN" mcc="412" mnc="40" apn="default" type="default,supl" /> - <apn carrier="Etisalat" mcc="412" mnc="50" apn="default" type="default,supl" /> - <apn carrier="Mobitel" mcc="413" mnc="01" apn="default" type="default,supl" /> - <apn carrier="Dialog" mcc="413" mnc="02" apn="default" type="default,supl" /> - <apn carrier="Etisalat" mcc="413" mnc="03" apn="default" type="default,supl" /> - <apn carrier="Airtel" mcc="413" mnc="05" apn="default" type="default,supl" /> - <apn carrier="Hutch" mcc="413" mnc="08" apn="default" type="default,supl" /> - <apn carrier="MPT" mcc="414" mnc="01" apn="default" type="default,supl" /> - <apn carrier="Alfa Internet" mcc="415" mnc="01" user="mic1" password="mic1" apn="internet.mic1.com.lb" type="default,supl" /> - <apn carrier="Alfawap" mcc="415" mnc="01" apn="wap.mic1.com.lb" user="mic1" password="mic1" proxy="192.168.23.50" port="80" type="default,supl" /> - <apn carrier="Alfa MMS" mcc="415" mnc="01" user="mic1" password="mic1" apn="mms.mic1.com.lb" mmsc="http://mms.mic1.com.lb" mmsproxy="192.168.23.51" mmsport="8080" type="mms" /> - <apn carrier="touch" mcc="415" mnc="03" apn="touch" type="default,supl" /> - <apn carrier="touch_WAP" mcc="415" mnc="03" apn="wap" proxy="192.168.4.11" port="80" type="default,supl" /> - <apn carrier="touch_MMS" mcc="415" mnc="03" user="touch" apn="mms" mmsc="http://mms:8088/mms/" mmsproxy="192.168.4.103" mmsport="80" type="mms" /> - <apn carrier="Zain JO Internet" mcc="416" mnc="01" apn="zain" user="zain" password="zain" authtype="1" type="default,supl" /> - <apn carrier="Zain JO WAP" mcc="416" mnc="01" apn="zain" user="zain" password="zain" authtype="1" proxy="192.168.55.10" port="80" type="default,supl" /> - <apn carrier="Zain JO Streaming" mcc="416" mnc="01" apn="Zain" user="zain" password="zain" authtype="1" type="default,supl" /> - <apn carrier="Zain JO MMS" mcc="416" mnc="01" apn="zain" user="zain" password="zain" authtype="1" mmsc="http://mms.jo.zain.com" mmsproxy="192.168.55.10" mmsport="80" type="mms" /> - <apn carrier="Umniah internet" mcc="416" mnc="03" apn="net" type="default,supl" /> - <apn carrier="Umniah WAP" mcc="416" mnc="03" apn="wap" proxy="10.1.1.10" port="8080" type="default,supl" /> - <apn carrier="Umniah MMS" mcc="416" mnc="03" apn="mms" mmsc="http://mms.umniah.com/" mmsproxy="10.1.1.10" mmsport="8080" type="mms" /> - <apn carrier="Orange MMS" mcc="416" mnc="770" apn="mms.orange.jo" user="mmc" password="mmc" authtype="1" mmsc="http://172.16.1.96/servlets/mms" mmsproxy="172.16.1.2" mmsport="8080" type="mms" /> - <apn carrier="Orange Internet" mcc="416" mnc="770" apn="net.orange.jo" user="net" password="net" authtype="1" type="default,supl" /> - <apn carrier="Orange WAP" mcc="416" mnc="770" apn="wap.orange.jo" user="wap" password="wap" authtype="1" proxy="172.16.1.2" port="8080" type="default,supl" /> - <apn carrier="Orange MMS" mcc="416" mnc="77" apn="mms.orange.jo" user="mmc" password="mmc" authtype="1" mmsc="http://172.16.1.96/servlets/mms" mmsproxy="172.16.1.2" mmsport="8080" type="mms" /> - <apn carrier="Orange Internet" mcc="416" mnc="77" apn="net.orange.jo" user="net" password="net" authtype="1" type="default,supl" /> - <apn carrier="Orange WAP" mcc="416" mnc="77" apn="wap.orange.jo" user="wap" password="wap" authtype="1" proxy="172.16.1.2" port="8080" type="default,supl" /> - <apn carrier="Syriatel Net" mcc="417" mnc="01" apn="net.syriatel.com" type="default,supl" /> - <apn carrier="Syriatel MMS" mcc="417" mnc="01" apn="mms.syriatel.com" mmsc="http://mymms.syriatel.com/" mmsproxy="172.20.5.6" mmsport="80" type="mms" /> - <apn carrier="MTN WAP" mcc="417" mnc="02" apn="internet" type="default,supl" /> - <apn carrier="MTN MMS" mcc="417" mnc="02" apn="mms" mmsc="http://mms/" mmsproxy="10.110.0.134" mmsport="8799" type="mms" /> - <apn carrier="Asiacell GPRS" mcc="418" mnc="05" apn="net.asiacell.com" type="default,supl" /> - <apn carrier="Asiacell MMS" mcc="418" mnc="05" apn="wap.asiacell.com" mmsc="http://192.168.107.10:19090/was" mmsproxy="192.168.107.50" mmsport="8080" type="mms" /> - <apn carrier="SanaTel" mcc="418" mnc="08" apn="default" type="default,supl" /> - <apn carrier="ZAIN-GPRS" mcc="418" mnc="20" apn="internet" user="atheer" password="atheer" authtype="1" type="default,supl" /> - <apn carrier="Zain-MMS" mcc="418" mnc="20" apn="MMS" user="atheer" password="atheer" authtype="1" mmsc="http://mms:8002/" mmsproxy="172.29.11.12" mmsport="8080" type="mms" /> - <apn carrier="ZainHURI - SNPT" mcc="418" mnc="30" apn="default" type="default,supl" /> - <apn carrier="Korek 9595" mcc="418" mnc="40" apn="internet.korek.com" type="default,supl" /> - <apn carrier="Korek 9191" mcc="418" mnc="40" apn="net.korek.com" user="korek" password="korek" type="default,supl" /> - <apn carrier="Korek 9494" mcc="418" mnc="40" apn="internet.korek.com" type="default,supl" /> - <apn carrier="KOREK MMS" mcc="418" mnc="40" apn="mms.korek.com" user="korek" password="korek" authtype="1" mmsc="http://mms.korektel.com/mms/wapenc" mmsproxy="192.168.18.187" mmsport="8080" type="mms" /> - <apn carrier="Mobitel" mcc="418" mnc="45" apn="default" type="default,supl" /> - <apn carrier="Itisaluna" mcc="418" mnc="62" apn="default" type="default,supl" /> - <apn carrier="Omnnea" mcc="418" mnc="92" apn="default" type="default,supl" /> - <apn carrier="MI" mcc="419" mnc="02" apn="pps" user="pps" password="pps" type="default,supl" /> - <apn carrier="Zain WAP" mcc="419" mnc="02" apn="pps" user="pps" password="pps" authtype="3" proxy="10.43.4.5" port="8080" type="default,supl" /> - <apn carrier="MMS" mcc="419" mnc="02" apn="pps" user="mms" password="mms" authtype="3" mmsc="http://mms.zain" mmsproxy="176.0.0.65" mmsport="8080" type="mms" /> - <apn carrier="Internet Action" mcc="419" mnc="03" apn="action.wataniya.com" type="default,supl" /> - <apn carrier="WAPAction" mcc="419" mnc="03" apn="wap.wataniya.com" proxy="194.126.53.64" port="8080" type="default,supl" /> - <apn carrier="Wataniya MMS" mcc="419" mnc="03" apn="mms.wataniya.com" mmsc="http://action.wataniya.com" mmsproxy="194.126.53.64" mmsport="8080" type="mms" /> - <apn carrier="VIVA MMS" mcc="419" mnc="04" apn="VIVA" mmsc="http://172.16.128.80:38090/was" mmsproxy="172.16.128.228" mmsport="8080" type="mms" /> - <apn carrier="VIVA INTERNET" mcc="419" mnc="04" apn="VIVA" proxy="172.16.128.228" port="8080" type="default,supl" /> - <apn carrier="STC - GPRS" mcc="420" mnc="01" apn="jawalnet.com.sa" type="default,supl" /> - <apn carrier="STC MMS" mcc="420" mnc="01" apn="mms.net.sa" mmsc="http://mms.net.sa:8002/" mmsproxy="10.1.1.1" mmsport="8080" type="mms" /> - <apn carrier="Mobily WEB" mcc="420" mnc="03" apn="web1" type="default,supl" /> - <apn carrier="Mobily prepaid - GPRS" mcc="420" mnc="03" apn="wap2" proxy="10.3.2.133" port="8080" type="default,supl" /> - <apn carrier="Mobily postpaid - GPRS" mcc="420" mnc="03" apn="wap1" proxy="10.3.2.133" port="8080" type="default,supl" /> - <apn carrier="Mobily WEB 2" mcc="420" mnc="03" apn="web2" type="default,supl" /> - <apn carrier="Mobily MMS Postpaid" mcc="420" mnc="03" apn="mms1" mmsc="http://10.3.3.133:9090/was" mmsproxy="10.3.2.133" mmsport="8080" type="mms" /> - <apn carrier="Mobily MMS Prepaid" mcc="420" mnc="03" apn="mms2" mmsc="http://10.3.3.133:9090/was" mmsproxy="10.3.2.133" mmsport="8080" type="mms" /> - <apn carrier="zain-Internet Wap" mcc="420" mnc="04" apn="zain" type="default,supl" /> - <apn carrier="zain WAP" mcc="420" mnc="04" apn="zain" proxy="10.122.200.10" port="8080" type="default,supl" /> - <apn carrier="zain-mms" mcc="420" mnc="04" apn="zain" mmsc="http://10.122.200.12:8002" mmsproxy="10.122.200.10" mmsport="8080" type="mms" /> - <apn carrier="SabaFon" mcc="421" mnc="01" apn="default" type="default,supl" /> - <apn carrier="MTN" mcc="421" mnc="02" apn="default" type="default,supl" /> - <apn carrier="Yemen Mobile" mcc="421" mnc="03" apn="default" type="default,supl" /> - <apn carrier="HiTS-UNITEL" mcc="421" mnc="04" apn="default" type="default,supl" /> - <apn carrier="Oman Mobile MMS" mcc="422" mnc="02" apn="mms" user="mms" password="mms" authtype="1" mmsc="http://mmsc.omanmobile.om:10021/mmsc" mmsproxy="192.168.203.35" mmsport="8080" type="mms" /> - <apn carrier="Oman Mobile Internet" mcc="422" mnc="02" apn="taif" user="taif" password="taif" authtype="1" type="default,supl" /> - <apn carrier="Nawras MMS" mcc="422" mnc="03" apn="mms.nawras.com.om" user="test" password="test" authtype="1" mmsc="http://10.128.240.16/servlets/mms" mmsproxy="10.128.240.19" mmsport="8080" type="mms" /> - <apn carrier="Nawras Internet" mcc="422" mnc="03" apn="isp.nawras.com.om" user="test" password="test" authtype="1" type="default,supl" /> - <apn carrier="Etisalat Data Package" mcc="424" mnc="02" apn="etisalat.ae" authtype="1" type="default,supl" /> - <apn carrier="Weyak Wap" mcc="424" mnc="02" apn="etisalat" proxy="10.12.0.32" port="8080" authtype="1" type="default,supl" /> - <apn carrier="Etisalat MMS" mcc="424" mnc="02" apn="etisalat" mmsc="http://mms/servlets/mms" mmsproxy="10.12.0.32" mmsport="8080" authtype="1" type="mms" /> - <apn carrier="du Internet" mcc="424" mnc="03" apn="du" type="default,supl" /> - <apn carrier="du WAP" mcc="424" mnc="03" apn="du" proxy="10.19.18.4" port="8080" type="default,supl" /> - <apn carrier="du MMS" mcc="424" mnc="03" apn="du" mmsc="http://mms.du.ae:8002" mmsproxy="10.19.18.4" mmsport="8080" type="mms" /> - <apn carrier="3G Portal" mcc="425" mnc="01" apn="uwap.orange.co.il" mmsc="http://192.168.220.15/servlets/mms" mmsport="8080" type="default,supl,mms" /> - <apn carrier="DUN" mcc="425" mnc="01" apn="modem.orange.net.il" type="default,supl" /> - <apn carrier="Cellcom Internet" mcc="425" mnc="02" apn="sphone" type="default,supl" /> - <apn carrier="Cellcom MMS" mcc="425" mnc="02" apn="mms" mmsc="http://mms.cellcom.co.il" mmsproxy="vwapm2.ain.co.il" mmsport="8080" type="mms" /> - <apn carrier="Multimedia Pelephone" mcc="425" mnc="03" apn="mms.pelephone.net.il" user="pcl@3g" password="pcl" authtype="3" mmsc="http://mmsu.pelephone.net.il" mmsproxy="10.170.252.104" mmsport="9093" type="mms" /> - <apn carrier="Sphone Pelephone" mcc="425" mnc="03" apn="sphone.pelephone.net.il" user="pcl@3g" password="pcl" authtype="2" type="default,supl" /> - <apn carrier="Jawwal WAP" mcc="425" mnc="05" apn="wap" proxy="213.244.118.129" port="8080" type="default,supl" /> - <apn carrier="Jawwal MMS" mcc="425" mnc="05" apn="mms" mmsc="http://mms.jawwal.ps/servlets/mms" mmsproxy="213.244.118.129" mmsport="8080" type="mms" /> - <apn carrier="Internet" mcc="425" mnc="06" apn="internet" proxy="10.100.129.111" port="8080" type="default,supl" /> - <apn carrier="Wataniya_mms" mcc="425" mnc="06" apn="mms" mmsc="http://mms.wataniya.ps/servlets/mms" mmsproxy="10.100.129.111" mmsport="8080" type="mms" /> - <apn carrier="Internet HOT mobile" mcc="425" mnc="07" apn="net.hotm" type="default,supl" /> - <apn carrier="MMS HOT mobile" mcc="425" mnc="07" apn="mms.hotm" mmsc="http://mms.hotmobile.co.il" mmsproxy="80.246.131.99" mmsport="80" type="mms" /> - <apn carrier="GolanTelecom Internet" mcc="425" mnc="08" apn="internet.golantelecom.net.il" type="default,supl" /> - <apn carrier="GolanTelecom MMS" mcc="425" mnc="08" apn="mms.golantelecom.net.il" mmsc="http://mmsc.golantelecom.co.il" mmsproxy="10.224.228.81" mmsport="80" type="mms" /> - <apn carrier="Alon Internet" mcc="425" mnc="14" apn="data.youphone.co.il" mmsc="http://192.168.220.15/servlets/mms" type="default,supl,mms" /> - <apn carrier="Home Cellular Internet" mcc="425" mnc="15" apn="hcminternet" type="default,supl" /> - <apn carrier="Home Cellular MMS" mcc="425" mnc="15" apn="hcmMMS" mmsc="http://82.166.164.229:9000/mmsc" mmsproxy="82.166.164.229" mmsport="8898" type="mms" /> - <apn carrier="Rami Levi 3G" mcc="425" mnc="16" apn="internet.rl" type="default,supl" /> - <apn carrier="Rami Levi Multimedia" mcc="425" mnc="16" apn="mms.pelephone.net.il" mmsc="http://mmsu.pelephone.net.il" mmsproxy="10.170.252.104" mmsport="9093" type="mms" /> - <apn carrier="Batelco Internet" mcc="426" mnc="01" apn="internet.batelco.com" type="default,supl" /> - <apn carrier="Batelco WAP" mcc="426" mnc="01" apn="wap.batelco.com" user="wap" password="wap" authtype="0" proxy="192.168.1.2" port="80" type="default,supl" /> - <apn carrier="Batelco MMS" mcc="426" mnc="01" apn="mms.batelco.com" user="mms" password="mms" authtype="0" mmsc="http://192.168.36.10/servlets/mms" mmsproxy="192.168.1.2" mmsport="80" type="mms" /> - <apn carrier="Zain BH Internet" mcc="426" mnc="02" apn="internet" user="internet" password="internet" authtype="0" type="default,supl" /> - <apn carrier="Zain BH WAP" mcc="426" mnc="02" apn="wap" user="wap" password="wap" authtype="0" proxy="172.18.85.33" port="80" type="default,supl" /> - <apn carrier="Zain BH MMS" mcc="426" mnc="02" apn="mms" user="mms" password="mms" authtype="0" mmsc="http://172.18.83.129:80/" mmsproxy="172.18.85.34" mmsport="80" type="mms" /> - <apn carrier="VIVAGPRS" mcc="426" mnc="04" apn="viva.bh" type="default,supl" /> - <apn carrier="VIVAWAP" mcc="426" mnc="04" apn="vivawap.bh" proxy="172.18.142.36" port="8080" type="default,supl" /> - <apn carrier="VIVAMMS" mcc="426" mnc="04" apn="vivawap.bh" mmsc="http://mms.viva.com.bh:38090" mmsproxy="172.18.142.36" mmsport="8080" type="mms" /> - <apn carrier="Mozaic Mob" mcc="427" mnc="01" apn="gprs.qtel" user="gprs" password="gprs" authtype="1" proxy="10.23.8.3" port="8080" type="default,supl" /> - <apn carrier="Qtel MMS" mcc="427" mnc="01" apn="mms.qtel" user="10" password="11" authtype="1" mmsproxy="10.23.8.3" mmsport="8080" mmsc="http://mmsr.qtelmms.qa" type="mms" /> - <apn carrier="Voda internet" mcc="427" mnc="02" apn="web.vodafone.com.qa" type="default,supl" /> - <apn carrier="VFQ MMS" mcc="427" mnc="02" apn="vodafone.com.qa" mmsc="http://mms.vodafone.com.qa/mmsc" mmsproxy="10.101.97.102" mmsport="80" type="mms" /> - <apn carrier="Unitel" mcc="428" mnc="88" apn="default" type="default,supl" /> - <apn carrier="Skytel" mcc="428" mnc="91" apn="default" type="default,supl" /> - <apn carrier="G.Mobile" mcc="428" mnc="98" apn="default" type="default,supl" /> - <apn carrier="MobiCom" mcc="428" mnc="99" apn="default" type="default,supl" /> - <apn carrier="Namaste / NT Mobile" mcc="429" mnc="01" apn="default" type="default,supl" /> - <apn carrier="Ncell" mcc="429" mnc="02" apn="default" type="default,supl" /> - <apn carrier="Sky/C-Phone" mcc="429" mnc="03" apn="default" type="default,supl" /> - <apn carrier="SmartCell" mcc="429" mnc="04" apn="default" type="default,supl" /> - <apn carrier="MCI-GPRS" mcc="432" mnc="11" apn="mcinet" type="default,supl" /> - <apn carrier="MCCI MMS" mcc="432" mnc="11" apn="mcinet" mmsc="http://192.168.193.134:38090/was" mmsproxy="192.168.194.73" mmsport="8080" type="mms" /> - <apn carrier="MCI-GPRS" mcc="432" mnc="14" apn="mcinet" type="default,supl" /> - <apn carrier="MCCI MMS" mcc="432" mnc="14" apn="MCI-GPRS" mmsport="38090" mmsc="http://192.168.193.134" type="mms" /> - <apn carrier="MCI-GPRS" mcc="432" mnc="19" apn="mcinet" type="default,supl" /> - <apn carrier="MCCI MMS" mcc="432" mnc="19" apn="MCI-GPRS" mmsport="38090" mmsc="http://192.168.193.134" type="mms" /> - <apn carrier="rightel" mcc="432" mnc="20" apn="rightel" type="default,supl" /> - <apn carrier="RighTel-MMS" mcc="432" mnc="20" apn="RighTel-WAP" mmsc="http://10.200.40.55:38090/was" mmsproxy="10.200.39.10" mmsport="8080" type="mms" /> - <apn carrier="Irancell-GPRS" mcc="432" mnc="35" apn="mtnirancell" proxy="10.131.26.138" port="8080" type="default,supl" /> - <apn carrier="Irancell-MMS" mcc="432" mnc="35" apn="mtnirancell" mmsc="http://mms:8002" mmsproxy="10.131.26.138" mmsport="8080" type="mms" /> - <apn carrier="MCI-GPRS" mcc="432" mnc="70" apn="mcinet" type="default,supl" /> - <apn carrier="MCCI MMS" mcc="432" mnc="70" apn="mcinet" mmsc="http://192.168.193.134:38090/was" mmsproxy="192.168.194.73" mmsport="8080" type="mms" /> - <apn carrier="MCI-GPRS" mcc="432" mnc="93" apn="mcinet" type="default,supl" /> - <apn carrier="MCCI MMS" mcc="432" mnc="93" apn="MCI-GPRS" mmsport="38090" mmsc="http://192.168.193.134" type="mms" /> - <apn carrier="Beeline-UZB Internet" mcc="434" mnc="04" apn="internet.beeline.uz" user="beeline" password="beeline" authtype="1" type="default,supl" /> - <apn carrier="Beeline-UZB MMS" mcc="434" mnc="04" apn="mms.beeline.uz" user="beeline" password="beeline" authtype="1" mmsc="http://mms" mmsproxy="172.30.30.166" mmsport="8080" type="mms" /> - <apn carrier="UCELL Internet" mcc="434" mnc="05" apn="internet" type="default,supl" /> - <apn carrier="UCELL MMS" mcc="434" mnc="05" apn="mms" mmsc="http://mmsc:8002/" mmsproxy="10.64.164.10" mmsport="8080" type="mms" /> - <apn carrier="Perfectum Mobile" mcc="434" mnc="06" apn="default" type="default,supl" /> - <apn carrier="MTS-UZB Internet" mcc="434" mnc="07" apn="net.mts.uz" user="mts" password="mts" authtype="1" type="default,supl" /> - <apn carrier="MTS-UZB MMS" mcc="434" mnc="07" apn="mms.mts.uz" mmsc="http://mmsc/was" mmsproxy="10.10.0.10" mmsport="8080" type="mms" /> - <apn carrier="Tcell" mcc="436" mnc="01" apn="default" type="default,supl" /> - <apn carrier="Tcell" mcc="436" mnc="02" apn="default" type="default,supl" /> - <apn carrier="Megafon" mcc="436" mnc="03" apn="default" type="default,supl" /> - <apn carrier="Babilon-M" mcc="436" mnc="04" apn="default" type="default,supl" /> - <apn carrier="Tacom" mcc="436" mnc="05" apn="default" type="default,supl" /> - <apn carrier="Tcell" mcc="436" mnc="12" apn="default" type="default,supl" /> - <apn carrier="Beeline" mcc="437" mnc="01" apn="default" type="default,supl" /> - <apn carrier="Fonex" mcc="437" mnc="03" apn="default" type="default,supl" /> - <apn carrier="MegaCom" mcc="437" mnc="05" apn="default" type="default,supl" /> - <apn carrier="O!" mcc="437" mnc="09" apn="default" type="default,supl" /> - <apn carrier="MTS (BARASH Communication)" mcc="438" mnc="01" apn="default" type="default,supl" /> - <apn carrier="TM-Cell" mcc="438" mnc="02" apn="default" type="default,supl" /> - <apn carrier="mopera U" mcc="440" mnc="10" apn="mopera.net" user="" server="" password="" mmsc="" /> - <apn carrier="b-mobile 3G・4G 1GB/Fair" mcc="440" mnc="10" apn="bmobile.ne.jp" user="bmobile@fr" server="" password="bmobile" authtype="3" mmsc="" /> - <apn carrier="b-mobile 3G・4G U300" mcc="440" mnc="10" apn="bmobile.ne.jp" user="bmobile@u300" server="" password="bmobile" authtype="3" mmsc="" /> - <apn carrier="b-mobile スマホ電話" mcc="440" mnc="10" apn="bmobile.ne.jp" user="bmobile@spd" server="" password="bmobile" authtype="3" mmsc="" /> - <apn carrier="b-mobile 4G カメレオンSIM" mcc="440" mnc="10" apn="bmobile.ne.jp" user="bmobile@cm" server="" password="bmobile" authtype="3" mmsc="" /> - <apn carrier="IIJmio" mcc="440" mnc="10" apn="iijmio.jp" user="mio@iij" server="" password="iij" authtype="3" mmsc="" /> - <apn carrier="Application" mcc="440" mnc="20" apn="plus.acs.jp" user="plusw6q9tattkmpk" password="msfbbam83bsdetxb" mmsproxy="andmms.plusacs.ne.jp" mmsport="8080" mmsc="http://mms-s" type="default,mms,supl" authtype="2" /> - <apn carrier="SKT LTE INTERNET" mcc="450" mnc="05" apn="lte.sktelecom.com" type="ia,default,mms,supl,fota,cbs" mmsc="http://omms.nate.com:9082/oma_mms" mmsproxy="smart.nate.com" mmsport="9093" server="*" /> - <apn carrier="SKT 3G INTERNET" mcc="450" mnc="05" apn="web.sktelecom.com" type="default,mms,supl,fota,cbs" mmsc="http://omms.nate.com:9082/oma_mms" mmsproxy="smart.nate.com" mmsport="9093" server="*" /> - <apn carrier="SKT LTE Roaming" mcc="450" mnc="05" apn="lte-roaming.sktelecom.com" mmsc="http://omms.nate.com:9082/oma_mms" mmsproxy="smart.nate.com" mmsport="9093" server="*" /> - <apn carrier="SKT 3G Roaming" mcc="450" mnc="05" apn="roaming.sktelecom.com" mmsc="http://omms.nate.com:9082/oma_mms" mmsproxy="smart.nate.com" mmsport="9093" server="*" /> - <apn carrier="SKT 3G INTERNET" mcc="450" mnc="11" apn="web.sktelecom.com" type="default,mms,supl,fota,cbs" mmsc="http://omms.nate.com:9082/oma_mms" mmsproxy="smart.nate.com" mmsport="9093" server="*" /> - <apn carrier="SKT LTE Roaming" mcc="450" mnc="11" apn="lte-roaming.sktelecom.com" mmsc="http://omms.nate.com:9082/oma_mms" mmsproxy="smart.nate.com" mmsport="9093" server="*" /> - <apn carrier="SKT 3G Roaming" mcc="450" mnc="11" apn="roaming.sktelecom.com" mmsc="http://omms.nate.com:9082/oma_mms" mmsproxy="smart.nate.com" mmsport="9093" server="*" /> - <apn carrier="LG uplus IMS" mcc="450" mnc="06" apn="ims.lguplus.co.kr" type="ia,ims" mmsc="http://omammsc.uplus.co.kr:9084" protocol="IPV4V6" /> - <apn carrier="LG uplus" mcc="450" mnc="06" apn="internet.lguplus.co.kr" type="default,mms,supl,fota,cbs" mmsc="http://omammsc.uplus.co.kr:9084" protocol="IPV4V6" /> - <apn carrier="LG uplus LTE Roaming" mcc="450" mnc="06" apn="lte-roaming.lguplus.co.kr" mmsc="http://omammsc.uplus.co.kr:9084" authtype="0" /> - <apn carrier="LG uplus Roaming" mcc="450" mnc="06" apn="wroaming.lguplus.co.kr" mmsc="http://omammsc.uplus.co.kr:9084" authtype="0" /> - <apn carrier="KT LTE INTERNET" mcc="450" mnc="08" apn="lte150.ktfwing.com" type="ia,default,mms,supl,fota,cbs" mmsc="http://mmsc.ktfwing.com:9082" port="80" server="*" /> - <apn carrier="KT 3G INTERNET" mcc="450" mnc="08" apn="alwayson-r6.ktfwing.com" type="default,mms,supl,fota,cbs" mmsc="http://mmsc.ktfwing.com:9082" port="80" server="*" /> - <apn carrier="Mobi-wap-gprs 2" mcc="452" mnc="01" apn="m-wap" user="mms" password="mms" authtype="1" type="default,supl" /> - <apn carrier="Mobi-wap-gprs 1" mcc="452" mnc="01" apn="m-wap" user="mms" password="mms" authtype="1" proxy="203.162.21.107" port="8080" type="default,supl" /> - <apn carrier="Mobi-gprs-mms" mcc="452" mnc="01" apn="m-i090" user="mms" password="mms" authtype="1" mmsc="http://203.162.21.114/mmsc" mmsproxy="203.162.21.114" mmsport="8080" type="mms" /> - <apn carrier="Vina-wap-gprs" mcc="452" mnc="02" apn="m3-world" user="mms" password="mms" authtype="1" type="default,supl" /> - <apn carrier="Vina-gprs-mms" mcc="452" mnc="02" apn="m3-mms" user="mms" password="mms" authtype="1" mmsc="http://mms.vinaphone.com.vn" mmsproxy="10.1.10.46" mmsport="8000" type="mms" /> - <apn carrier="Viettel-wap-gprs 1" mcc="452" mnc="04" apn="v-internet" type="default,supl" /> - <apn carrier="Viettel-wap-gprs 2" mcc="452" mnc="04" apn="v-wap" proxy="192.168.233.10" port="8080" type="default,supl" /> - <apn carrier="Viettel-gprs-mms" mcc="452" mnc="04" apn="v-mms" mmsc="http://mms.viettelmobile.com.vn/mms/wapenc" mmsproxy="192.168.233.10" mmsport="8080" type="mms" /> - <apn carrier="Vietnamobile_GPRS3" mcc="452" mnc="05" apn="internet" type="default,supl" /> - <apn carrier="Vietnamobile_GPRS1" mcc="452" mnc="05" apn="wap" proxy="10.10.128.44" port="8080" type="default,supl" /> - <apn carrier="Vietnamobile_GPRS2" mcc="452" mnc="05" apn="wap" type="default,supl" /> - <apn carrier="Vietnamobile_MMS" mcc="452" mnc="05" apn="mms" mmsc="http://10.10.128.58/servlets/mms" mmsproxy="10.10.128.44" mmsport="8080" type="mms" /> - <apn carrier="Gmobile-wap-gprs2" mcc="452" mnc="07" apn="internet" type="default,supl" /> - <apn carrier="Gmobile-wap-gprs" mcc="452" mnc="07" apn="internet" proxy="10.16.70.199" port="8080" type="default,supl" /> - <apn carrier="Gmobile-gprs-mms" mcc="452" mnc="07" apn="mms" mmsc="http://mms" mmsproxy="10.16.70.199" mmsport="8080" type="mms" /> - <apn carrier="Gmobile MMS" mcc="452" mnc="07" apn="mms" user="mms" password="mms" authtype="2" mmsc="http://mms" mmsproxy="10.16.70.199" mmsport="8080" type="mms" /> - <apn carrier="e-internet" mcc="452" mnc="08" apn="e-internet" type="default,supl" /> - <apn carrier="e-wap" mcc="452" mnc="08" apn="e-wap" proxy="10.18.2.183" port="8080" type="default,supl" /> - <apn carrier="e-mms" mcc="452" mnc="08" apn="e-mms" mmsc="http://10.18.2.172:38090" mmsproxy="10.18.2.183" mmsport="8080" type="mms" /> - <apn carrier="1O1O" mcc="454" mnc="00" apn="mobile" mmsproxy="192.168.59.51" mmsport="8080" mmsc="http://192.168.58.171:8002" authtype="3" type="default,supl,mms" /> - <apn carrier="one2free" mcc="454" mnc="00" apn="mobile" mmsproxy="192.168.59.51" mmsport="8080" mmsc="http://192.168.58.171:8002" authtype="3" type="default,supl,mms" /> - <apn carrier="NWMOBILE" mcc="454" mnc="00" apn="NWMOBILE" mmsproxy="192.168.59.61" mmsport="8080" mmsc="http://192.168.58.171:8002" authtype="3" type="default,supl,mms" /> - <apn carrier="1O1O" mcc="454" mnc="02" apn="mobile" mmsproxy="192.168.59.51" mmsport="8080" mmsc="http://192.168.58.171:8002" authtype="3" type="default,supl,mms" /> - <apn carrier="one2free" mcc="454" mnc="02" apn="mobile" mmsproxy="192.168.59.51" mmsport="8080" mmsc="http://192.168.58.171:8002" authtype="3" type="default,supl,mms" /> - <apn carrier="NWMOBILE" mcc="454" mnc="02" apn="NWMOBILE" mmsproxy="192.168.59.61" mmsport="8080" mmsc="http://192.168.58.171:8002" authtype="3" type="default,supl,mms" /> - <apn carrier="3 LTE" mcc="454" mnc="03" apn="mobile.lte.three.com.hk" mmsc="http://mms.um.three.com.hk:10021/mmsc" mmsproxy="mms.three.com.hk" mmsport="8799" authtype="1" type="default,supl,mms" /> - <apn carrier="3" mcc="454" mnc="03" apn="mobile.three.com.hk" mmsc="http://mms.um.three.com.hk:10021/mmsc" mmsproxy="mms.three.com.hk" mmsport="8799" authtype="1" type="default,supl,mms" /> - <apn carrier="3(2G) MMS" mcc="454" mnc="04" apn="mms-g.three.com.hk" mmsc="http://10.30.15.51:10021/mmsc" mmsproxy="10.30.15.53" mmsport="8080" type="mms" /> - <apn carrier="3(2G) GPRS" mcc="454" mnc="04" apn="web-g.three.com.hk" proxy="10.30.3.151" port="8080" type="default,supl" /> - <apn carrier="SmarTone" mcc="454" mnc="06" apn="SmarTone" mmsc="http://mms.smartone.com/server" mmsproxy="10.9.9.9" mmsport="8080" authtype="3" type="default,supl,mms" /> - <apn carrier="one2free" mcc="454" mnc="10" apn="hkcsl" mmsc="http://192.168.58.171:8002" mmsproxy="192.168.59.51" mmsport="8080" authtype="3" type="default,supl,mms" /> - <apn carrier="CMHK MMS" mcc="454" mnc="12" apn="cmhk" mmsc="http://mms.hk.chinamobile.com/mms" type="mms" /> - <apn carrier="CMHK Data" mcc="454" mnc="12" apn="cmhk" type="default,supl" /> - <apn carrier="CMHK MMS" mcc="454" mnc="13" apn="cmhk" mmsc="http://mms.hk.chinamobile.com/mms" type="mms" /> - <apn carrier="CMHK Data" mcc="454" mnc="13" apn="cmhk" type="default,supl" /> - <apn carrier="SmarTone" mcc="454" mnc="15" apn="SmarTone" mmsproxy="10.9.9.9" mmsport="8080" mmsc="http://mms.smartone.com/server" authtype="3" type="default,supl,mms" /> - <apn carrier="PCCW-HKT" mcc="454" mnc="16" apn="pccw" mmsc="http://3gmms.pccwmobile.com:8080/was" mmsproxy="10.140.14.10" mmsport="8080" authtype="1" type="default,supl,mms" /> - <apn carrier="SmarTone" mcc="454" mnc="17" apn="SmarTone" mmsproxy="10.9.9.9" mmsport="8080" mmsc="http://mms.smartone.com/server" authtype="3" type="default,supl,mms" /> - <apn carrier="1O1O" mcc="454" mnc="18" apn="mobile" mmsproxy="192.168.59.51" mmsport="8080" mmsc="http://192.168.58.171:8002" authtype="3" type="default,supl,mms" /> - <apn carrier="one2free" mcc="454" mnc="18" apn="mobile" mmsproxy="192.168.59.51" mmsport="8080" mmsc="http://192.168.58.171:8002" authtype="3" type="default,supl,mms" /> - <apn carrier="NWMOBILE" mcc="454" mnc="18" apn="NWMOBILE" mmsproxy="192.168.59.61" mmsport="8080" mmsc="http://192.168.58.171:8002" authtype="3" type="default,supl,mms" /> - <apn carrier="PCCW-HKT" mcc="454" mnc="19" apn="pccw" mmsc="http://3gmms.pccwmobile.com:8080/was" mmsproxy="10.140.14.10" mmsport="8080" authtype="1" type="default,supl,mms" /> - <apn carrier="SmarTone Macau" mcc="455" mnc="00" apn="smartgprs" mmsc="http://momms.smartone.com/dmog/mo" mmsproxy="10.9.9.29" mmsport="8080" authtype="3" type="default,supl,mms" /> - <apn carrier="CTM Data" mcc="455" mnc="01" apn="ctm-mobile" type="default,supl" /> - <apn carrier="CTM MMS" mcc="455" mnc="01" apn="ctmmms" mmsc="http://mms.wap.ctm.net:8002" mmsproxy="192.168.99.3" mmsport="8080" type="mms" /> - <apn carrier="CTM (Prepaid)" mcc="455" mnc="01" apn="ctmprepaid" mmsc="http://mms.wap.ctm.net:8002" mmsproxy="192.168.99.3" mmsport="8080" type="default,supl,mms" /> - <apn carrier="3 Macau" mcc="455" mnc="03" apn="mobile.three.com.mo" mmsc="http://mms.three.com.mo:10021/mmsc" mmsproxy="mms.three.com.mo" mmsport="8080" authtype="1" type="default,supl,mms" /> - <apn carrier="CTM Data" mcc="455" mnc="04" apn="ctm-mobile" type="default,supl" /> - <apn carrier="CTM MMS" mcc="455" mnc="04" apn="ctmmms" mmsc="http://mms.wap.ctm.net:8002" mmsproxy="192.168.99.3" mmsport="8080" type="mms" /> - <apn carrier="CTM (Prepaid)" mcc="455" mnc="04" apn="ctmprepaid" mmsc="http://mms.wap.ctm.net:8002" mmsproxy="192.168.99.3" mmsport="8080" type="default,supl,mms" /> - <apn carrier="3 Macau" mcc="455" mnc="05" apn="mobile.three.com.mo" mmsc="http://mms.three.com.mo:10021/mmsc" mmsproxy="mms.three.com.mo" mmsport="8080" authtype="1" type="default,supl,mms" /> - <apn carrier="Cellcard" mcc="456" mnc="01" apn="default" type="default,supl" /> - <apn carrier="Smart" mcc="456" mnc="02" apn="default" type="default,supl" /> - <apn carrier="qb" mcc="456" mnc="04" apn="default" type="default,supl" /> - <apn carrier="Star-Cell" mcc="456" mnc="05" apn="default" type="default,supl" /> - <apn carrier="Smart" mcc="456" mnc="06" apn="default" type="default,supl" /> - <apn carrier="Metfone" mcc="456" mnc="08" apn="default" type="default,supl" /> - <apn carrier="Beeline" mcc="456" mnc="09" apn="default" type="default,supl" /> - <apn carrier="Excell" mcc="456" mnc="11" apn="default" type="default,supl" /> - <apn carrier="Cellcard" mcc="456" mnc="18" apn="default" type="default,supl" /> - <apn carrier="LTC" mcc="457" mnc="01" apn="default" type="default,supl" /> - <apn carrier="ETL" mcc="457" mnc="02" apn="default" type="default,supl" /> - <apn carrier="Unitel" mcc="457" mnc="03" apn="default" type="default,supl" /> - <apn carrier="Beeline" mcc="457" mnc="08" apn="default" type="default,supl" /> - <apn carrier="中国移动 (China Mobile) GPRS" mcc="460" mnc="00" apn="cmnet" type="default,supl" /> - <apn carrier="中国移动 (China Mobile) WAP" mcc="460" mnc="00" apn="cmwap" proxy="10.0.0.172" port="80" type="default,supl" /> - <apn carrier="中国移动彩信 (China Mobile)" mcc="460" mnc="00" apn="cmwap" proxy="10.0.0.172" port="80" mmsc="http://mmsc.monternet.com" mmsproxy="10.0.0.172" mmsport="80" type="mms" /> - <apn carrier="沃3G连接互联网 (China Unicom)" mcc="460" mnc="01" apn="3gnet" type="default,supl" /> - <apn carrier="沃3G手机上网 (China Unicom)" mcc="460" mnc="01" apn="3gwap" proxy="10.0.0.172" port="80" type="default,supl" /> - <apn carrier="联通2GNET上网 (China Unicom)" mcc="460" mnc="01" apn="uninet" type="default,supl" /> - <apn carrier="联通彩信 (China Unicom)" mcc="460" mnc="01" apn="3gwap" mmsc="http://mmsc.myuni.com.cn" mmsproxy="10.0.0.172" mmsport="80" type="mms" /> - <apn carrier="联通2g彩信 (China Unicom)" mcc="460" mnc="01" apn="uniwap" mmsc="http://mmsc.myuni.com.cn" mmsproxy="10.0.0.172" mmsport="80" type="mms" /> - <apn carrier="中国移动 (China Mobile) GPRS" mcc="460" mnc="02" apn="cmnet" type="default,supl" /> - <apn carrier="中国移动 (China Mobile) WAP" mcc="460" mnc="02" apn="cmwap" proxy="10.0.0.172" port="80" type="default,supl" /> - <apn carrier="中国移动彩信 (China Mobile)" mcc="460" mnc="02" apn="cmwap" proxy="10.0.0.172" port="80" mmsc="http://mmsc.monternet.com" mmsproxy="10.0.0.172" mmsport="80" type="mms" /> - <apn carrier="中国移动 (China Mobile) GPRS" mcc="460" mnc="07" apn="cmnet" type="default,supl" /> - <apn carrier="中国移动 (China Mobile) WAP" mcc="460" mnc="07" apn="cmwap" proxy="10.0.0.172" port="80" type="default,supl" /> - <apn carrier="中国移动彩信 (China Mobile)" mcc="460" mnc="07" apn="cmwap" proxy="10.0.0.172" port="80" mmsc="http://mmsc.monternet.com" mmsproxy="10.0.0.172" mmsport="80" type="mms" /> - <apn carrier="遠傳電信(Far EasTone) (MMS)" mcc="466" mnc="01" apn="fetnet01" mmsc="http://mms" mmsproxy="210.241.199.199" mmsport="9201" type="mms" /> - <apn carrier="遠傳電信(Far EasTone) (Internet)" mcc="466" mnc="01" apn="internet" type="default,supl" /> - <apn carrier="和信電訊(KGT-Online) (Internet)" mcc="466" mnc="88" apn="internet" type="default,supl" /> - <apn carrier="和信電訊(KGT-Online) (MMS)" mcc="466" mnc="88" apn="kgtmms" mmsc="http://mms.kgtmms.net.tw/mms/wapenc" mmsproxy="172.28.33.5" mmsport="8080" type="mms" /> - <apn carrier="威寶電信(VIBO) (vibo)" mcc="466" mnc="89" apn="vibo" type="default,supl" /> - <apn carrier="威寶電信(VIBO) (internet)" mcc="466" mnc="89" apn="internet" type="default,supl" /> - <apn carrier="威寶電信(VIBO) (viboone)" mcc="466" mnc="89" apn="viboone" type="default,supl" /> - <apn carrier="威寶電信(VIBO) (MMS)" mcc="466" mnc="89" apn="vibo" mmsc="http://mms" mmsproxy="172.24.128.36" mmsport="8080" type="mms" /> - <apn carrier="中華電信(Chunghwa) (Internet)" mcc="466" mnc="92" apn="internet" type="default,supl" /> - <apn carrier="中華電信(Chunghwa) (MMS)" mcc="466" mnc="92" apn="emome" mmsc="http://mms.emome.net:8002" mmsproxy="10.1.1.1" mmsport="8080" type="mms" /> - <apn carrier="台灣大哥大(TW Mobile) (Internet)" mcc="466" mnc="93" apn="Internet" type="default,supl" /> - <apn carrier="台灣大哥大(TW Mobile) (MMS)" mcc="466" mnc="93" apn="MMS" mmsc="http://mms.catch.net.tw" mmsproxy="10.1.1.2" mmsport="80" type="mms" /> - <apn carrier="台灣大哥大(TW Mobile) (Internet)" mcc="466" mnc="97" apn="Internet" type="default,supl" /> - <apn carrier="台灣大哥大(TW Mobile) (MMS)" mcc="466" mnc="97" apn="MMS" mmsc="http://mms.catch.net.tw" mmsproxy="10.1.1.2" mmsport="80" type="mms" /> - <apn carrier="台灣大哥大(TW Mobile) (Internet)" mcc="466" mnc="99" apn="Internet" type="default,supl" /> - <apn carrier="台灣大哥大(TW Mobile) (MMS)" mcc="466" mnc="99" apn="mms" mmsc="http://mms.catch.net.tw" mmsproxy="10.1.1.2" mmsport="80" type="mms" /> - <apn carrier="Dhiraagu" mcc="472" mnc="01" apn="default" type="default,supl" /> - <apn carrier="Wataniya" mcc="472" mnc="02" apn="default" type="default,supl" /> - <apn carrier="DiGi Internet" mcc="502" mnc="10" apn="diginet" type="default,supl" /> - <apn carrier="DiGi MMS" mcc="502" mnc="10" apn="digimms" user="mms" password="mms" mmsc="http://mms.digi.com.my/servlets/mms" mmsproxy="203.92.128.160" mmsport="80" authtype="1" type="mms" /> - <apn carrier="Maxis Internet" mcc="502" mnc="12" apn="max4g" user="maxis" password="wap" mmsproxy="202.75.133.49" mmsport="80" mmsc="http://172.16.74.100:10021/mmsc" authtype="1" type="default,supl,mms" /> - <apn carrier="Celcom Internet" mcc="502" mnc="13" apn="celcom4g" mmsproxy="10.128.1.242" mmsport="8080" mmsc="http://mms.celcom.net.my" type="default,supl,mms" /> - <apn carrier="Maxis Internet" mcc="502" mnc="142" apn="max4g" user="maxis" password="wap" mmsproxy="202.75.133.49" mmsport="80" mmsc="http://172.16.74.100:10021/mmsc" authtype="1" type="default,supl,mms" /> - <apn carrier="DiGi Internet" mcc="502" mnc="143" apn="diginet" type="default,supl" /> - <apn carrier="DiGi MMS" mcc="502" mnc="143" apn="digimms" user="mms" password="mms" mmsc="http://mms.digi.com.my/servlets/mms" mmsproxy="203.92.128.160" mmsport="80" authtype="1" type="mms" /> - <apn carrier="Celcom Internet" mcc="502" mnc="145" apn="celcom4g" mmsproxy="10.128.1.242" mmsport="8080" mmsc="http://mms.celcom.net.my" type="default,supl,mms" /> - <apn carrier="DiGi Internet" mcc="502" mnc="146" apn="diginet" type="default,supl" /> - <apn carrier="DiGi MMS" mcc="502" mnc="146" apn="digimms" user="mms" password="mms" mmsc="http://mms.digi.com.my/servlets/mms" mmsproxy="203.92.128.160" mmsport="80" authtype="1" type="mms" /> - <apn carrier="Maxis Internet" mcc="502" mnc="147" apn="max4g" user="maxis" password="wap" mmsproxy="202.75.133.49" mmsport="80" mmsc="http://172.16.74.100:10021/mmsc" authtype="1" type="default,supl,mms" /> - <apn carrier="Celcom Internet" mcc="502" mnc="148" apn="celcom4g" mmsproxy="10.128.1.242" mmsport="8080" mmsc="http://mms.celcom.net.my" type="default,supl,mms" /> - <apn carrier="DiGi MMS" mcc="502" mnc="16" apn="digimms" user="mms" password="mms" mmsc="http://mms.digi.com.my/servlets/mms" mmsproxy="203.92.128.160" mmsport="80" authtype="1" type="mms" /> - <apn carrier="DiGi Internet" mcc="502" mnc="16" apn="diginet" type="default,supl" /> - <apn carrier="Maxis Internet" mcc="502" mnc="17" apn="max4g" user="maxis" password="wap" mmsproxy="202.75.133.49" mmsport="80" mmsc="http://172.16.74.100:10021/mmsc" authtype="1" type="default,supl,mms" /> - <apn carrier="U Mobile Internet" mcc="502" mnc="18" apn="my3g" mmsproxy="10.30.5.11" mmsport="8080" mmsc="http://10.30.3.11/servlets/mms" type="default,supl,mms" /> - <apn carrier="Celcom Internet" mcc="502" mnc="19" apn="celcom4g" mmsproxy="10.128.1.242" mmsport="8080" mmsc="http://mms.celcom.net.my" type="default,supl,mms" /> - <apn carrier="Telstra Internet" mcc="505" mnc="01" apn="telstra.wap" type="default,supl" /> - <apn carrier="Telstra MMS" mcc="505" mnc="01" apn="telstra.mms" type="mms" mmsc="http://mmsc.telstra.com:8002/" mmsproxy="10.1.1.180" mmsport="80" /> - <apn carrier="Optus Yes Internet" mcc="505" mnc="02" apn="yesinternet" type="default,supl" /> - <apn carrier="Optus Business Mobile Broadband" mcc="505" mnc="02" apn="yesbusiness" /> - <apn carrier="Optus Internet" mcc="505" mnc="02" apn="internet" type="default" /> - <apn carrier="Optus MMS" mcc="505" mnc="02" apn="mms" mmsc="http://mmsc.optus.com.au:8002/" mmsproxy="61.88.190.10" mmsport="8070" type="mms" /> - <apn carrier="Virgin Internet" mcc="505" mnc="02" apn="virgininternet" type="default" proxy="202.139.83.152" port="8070" mvno_match_data="505029" mvno_type="imsi" /> - <apn carrier="Virgin MMS" mcc="505" mnc="02" apn="virginmms" type="mms" mmsc="http://mms.virginvibe.com.au:8002" mmsproxy="202.139.83.152" mmsport="8070" mvno_match_data="505029" mvno_type="imsi" /> - <apn carrier="Vodafone live!" mcc="505" mnc="03" apn="live.vodafone.com" mmsc="http://pxt.vodafone.net.au/pxtsend" mmsproxy="10.202.2.60" mmsport="8080" type="default,supl,mms" /> - <apn carrier="Telstra MMS" mcc="505" mnc="11" apn="Telstra.mms" mmsc="http://mmsc.telstra.com:8002" mmsproxy="10.1.1.180" mmsport="80" type="mms" /> - <apn carrier="Telstra Internet" mcc="505" mnc="11" apn="Telstra.wap" type="default,supl" /> - <apn carrier="Telstra MMS" mcc="505" mnc="71" apn="Telstra.mms" mmsc="http://mmsc.telstra.com:8002" mmsproxy="10.1.1.180" mmsport="80" type="mms" /> - <apn carrier="Telstra Internet" mcc="505" mnc="71" apn="Telstra.wap" type="default,supl" /> - <apn carrier="Telstra MMS" mcc="505" mnc="72" apn="Telstra.mms" mmsc="http://mmsc.telstra.com:8002" mmsproxy="10.1.1.180" mmsport="80" type="mms" /> - <apn carrier="Telstra Internet" mcc="505" mnc="72" apn="Telstra.wap" type="default,supl" /> - <apn carrier="Optus Internet" mcc="505" mnc="90" apn="internet" type="default,supl" /> - <apn carrier="Optus MMS" mcc="505" mnc="90" apn="mms" mmsc="http://mmsc.optus.com.au:8002/" mmsproxy="61.88.190.10" mmsport="8070" type="mms" /> - <apn carrier="Vodafone Live!" mcc="505" mnc="99" apn="live.vodafone.com" mmsc="http://pxt.vodafone.net.au/pxtsend" mmsproxy="10.202.2.60" mmsport="8080" /> - <apn carrier="Indosat-SNS" mcc="510" mnc="01" apn="indosatgprs" authtype="1" type="default,supl" /> - <apn carrier="Indosat GPRS" mcc="510" mnc="01" apn="indosatgprs" user="indosat" password="indosat" authtype="1" proxy="10.19.19.19" port="8080" type="default,supl" /> - <apn carrier="Indosat MMS" mcc="510" mnc="01" apn="indosatmms" user="indosat" password="indosat" authtype="1" mmsc="http://mmsc.indosat.com" mmsproxy="10.19.19.19" mmsport="8080" type="mms" /> - <apn carrier="AXIS-SNS" mcc="510" mnc="08" apn="AXIS" authtype="1" type="default,supl" /> - <apn carrier="AXISwap" mcc="510" mnc="08" apn="AXIS" user="axis" password="123456" proxy="10.8.3.8" port="8080" type="default,supl" authtype="1" /> - <apn carrier="AXISmms" mcc="510" mnc="08" apn="AXISmms" user="axis" password="123456" mmsc="http://mmsc.axis" mmsproxy="10.8.3.8" mmsport="8080" type="mms" authtype="1" /> - <apn carrier="TSEL-SNS" mcc="510" mnc="10" apn="internet" type="default,supl" /> - <apn carrier="TSEL-WAP" mcc="510" mnc="10" apn="telkomsel" user="wap" password="wap123" authtype="1" proxy="10.1.89.130" port="8000" type="default,supl" /> - <apn carrier="TSEL-MMS" mcc="510" mnc="10" apn="mms" user="wap" password="wap123" authtype="1" mmsc="http://mms.telkomsel.com" mmsproxy="10.1.89.150" mmsport="8000" type="mms" /> - <apn carrier="Internet" mcc="510" mnc="11" apn="internet" authtype="1" type="default,supl" /> - <apn carrier="XL-MMS" mcc="510" mnc="11" apn="www.xlmms.net" user="xlgprs" password="proxl" authtype="1" mmsc="http://mmc.xl.net.id/servlets/mms" mmsproxy="202.152.240.50" mmsport="8080" type="mms" /> - <apn carrier="Indosat-SNS" mcc="510" mnc="21" apn="indosatgprs" authtype="1" type="default,supl" /> - <apn carrier="Indosat GPRS" mcc="510" mnc="21" apn="indosatgprs" user="indosat" password="indosat" authtype="1" proxy="10.19.19.19" port="8080" type="default,supl" /> - <apn carrier="Indosat MMS" mcc="510" mnc="21" apn="indosatmms" user="indosat" password="indosat" authtype="1" mmsc="http://mmsc.indosat.com" mmsproxy="10.19.19.19" mmsport="8080" type="mms" /> - <apn carrier="3-SNS" mcc="510" mnc="89" apn="3gprs" authtype="1" type="default,supl" /> - <apn carrier="3GPRS" mcc="510" mnc="89" apn="3gprs" user="3gprs" password="3gprs" authtype="1" proxy="10.4.0.10" port="3128" type="default,supl" /> - <apn carrier="3MMS" mcc="510" mnc="89" apn="3mms" user="3mms" password="3mms" authtype="1" mmsc="http://mms.three.co.id" mmsproxy="10.4.0.10" mmsport="3128" type="mms" /> - <apn carrier="Telin" mcc="514" mnc="01" apn="default" type="default,supl" /> - <apn carrier="Timor Telecom" mcc="514" mnc="02" apn="default" type="default,supl" /> - <apn carrier="Viettel Timor-Leste" mcc="514" mnc="03" apn="default" type="default,supl" /> - <apn carrier="myGlobe Internet" mcc="515" mnc="02" apn="internet.globe.com.ph" type="default,supl" /> - <apn carrier="myGlobe INET" mcc="515" mnc="02" apn="http.globe.com.ph" type="default,supl" /> - <apn carrier="myGlobe Connect" mcc="515" mnc="02" apn="www.globe.com.ph" proxy="203.177.42.214" port="8080" type="default,supl" /> - <apn carrier="myGlobe MMS" mcc="515" mnc="02" apn="mms.globe.com.ph" mmsc="http://192.40.100.22:10021/mmsc" mmsproxy="203.177.42.214" mmsport="8080" type="mms" /> - <apn carrier="SMARTLTE" mcc="515" mnc="03" apn="smartlte" type="default,supl" /> - <apn carrier="SMART INTERNET" mcc="515" mnc="03" apn="internet" type="default,supl" /> - <apn carrier="Smart GPRS" mcc="515" mnc="03" apn="Smart1" proxy="10.102.61.46" port="8080" type="default,supl" /> - <apn carrier="Smart MMS" mcc="515" mnc="03" apn="mms" mmsc="http://10.102.61.238:8002" mmsproxy="10.102.61.46" mmsport="8080" type="mms" /> - <apn carrier="Sun Internet" mcc="515" mnc="05" apn="minternet" type="default,supl" /> - <apn carrier="SUN WAP GPRS" mcc="515" mnc="05" apn="wap" proxy="202.138.159.78" port="8080" type="default,supl" /> - <apn carrier="Sun SBW" mcc="515" mnc="05" apn="fbband" type="default,supl" /> - <apn carrier="Sun Streaming" mcc="515" mnc="05" apn="minternet" type="default,supl" /> - <apn carrier="SUN MMS" mcc="515" mnc="05" apn="mms" mmsc="http://mmscenter.suncellular.com.ph" mmsproxy="202.138.159.78" mmsport="8080" type="mms" /> - <apn carrier="CAT3G INTERNET" mcc="520" mnc="00" apn="internet" type="default,supl" /> - <apn carrier="CAT3G MMS" mcc="520" mnc="00" apn="catmms" mmsc="http://mms.cat3g.com:8002/" mmsproxy="10.4.7.39" mmsport="8080" type="mms" /> - <apn carrier="TRUE-H INTERNET" mcc="520" mnc="00" apn="internet" user="true" password="true" authtype="1" type="default,supl" mvno_match_data="01" mvno_type="gid" /> - <apn carrier="TRUE-H MMS" mcc="520" mnc="00" apn="hmms" user="true" password="true" authtype="1" mmsc="http://mms.trueh.com:8002/" mmsproxy="10.4.7.39" mmsport="8080" type="mms" mvno_match_data="01" mvno_type="gid" /> - <apn carrier="AIS Internet" mcc="520" mnc="01" apn="internet" authtype="0" type="default,supl" /> - <apn carrier="AIS MMS" mcc="520" mnc="01" apn="multimedia" mmsc="http://mms.mobilelife.co.th" mmsproxy="203.170.229.34" mmsport="8080" type="mms" /> - <apn carrier="AIS Internet" mcc="520" mnc="03" apn="internet" authtype="0" type="default,supl" /> - <apn carrier="AIS MMS" mcc="520" mnc="03" apn="multimedia" mmsc="http://mms.mobilelife.co.th" mmsproxy="203.170.229.34" mmsport="8080" type="mms" /> - <apn carrier="TRUE-H INTERNET" mcc="520" mnc="04" apn="internet" user="true" password="true" authtype="1" type="default,supl" /> - <apn carrier="TRUE-H MMS" mcc="520" mnc="04" apn="hmms" user="true" password="true" authtype="1" mmsc="http://mms.trueh.com:8002/" mmsproxy="10.4.7.39" mmsport="8080" type="mms" /> - <apn carrier="dtac Internet" mcc="520" mnc="05" apn="www.dtac.co.th" type="default,supl" /> - <apn carrier="dtac MMS" mcc="520" mnc="05" apn="mms" mmsc="http://mms2.dtac.co.th:8002/" mmsproxy="10.10.10.10" mmsport="8080" type="mms" /> - <apn carrier="TOT 3G Internet" mcc="520" mnc="15" apn="internet" type="default,supl" /> - <apn carrier="TOT 3G MMS" mcc="520" mnc="15" apn="mms" mmsc="http://mms.tot3g.net:8002" mmsproxy="192.168.0.72" mmsport="8080" type="mms" /> - <apn carrier="dtac MMS" mcc="520" mnc="18" apn="mms" mmsc="http://mms.dtac.co.th:8002/" mmsproxy="10.10.10.10" mmsport="8080" type="mms" /> - <apn carrier="dtac Internet" mcc="520" mnc="18" apn="www.dtac.co.th" type="default,supl" /> - <apn carrier="TRUE INTERNET" mcc="520" mnc="99" apn="internet" user="true" password="true" authtype="1" type="default,supl" /> - <apn carrier="TRUE MMS" mcc="520" mnc="99" apn="hmms" user="true" password="true" authtype="1" mmsc="http://mms.truelife.com:8002/" mmsproxy="10.4.7.39" mmsport="8080" type="mms" /> - <apn carrier="SingTel (PostPaid)" mcc="525" mnc="01" apn="e-ideas" mmsproxy="165.21.42.84" mmsport="8080" mmsc="http://mms.singtel.com:10021/mmsc" type="default,supl,mms" /> - <apn carrier="SingTel (PrePaid)" mcc="525" mnc="01" apn="hicard" mmsproxy="165.21.42.84" mmsport="8080" mmsc="http://mms.singtel.com:10021/mmsc" type="default,supl,mms" /> - <apn carrier="SingTel (PostPaid)" mcc="525" mnc="02" apn="e-ideas" mmsproxy="165.21.42.84" mmsport="8080" mmsc="http://mms.singtel.com:10021/mmsc" type="default,supl,mms" /> - <apn carrier="SingTel (PrePaid)" mcc="525" mnc="02" apn="hicard" mmsproxy="165.21.42.84" mmsport="8080" mmsc="http://mms.singtel.com:10021/mmsc" type="default,supl,mms" /> - <apn carrier="Sunsurf Mobile" mcc="525" mnc="03" apn="sunsurf" type="default,supl" /> - <apn carrier="M1 WAP" mcc="525" mnc="03" apn="miworld" user="65" password="user123" proxy="172.16.1.23" port="8081" authtype="1" type="default,supl" /> - <apn carrier="M1 MMS(3G)" mcc="525" mnc="03" apn="miworld" user="65" password="user123" mmsc="http://mmsgw:8002" mmsproxy="172.16.14.10" mmsport="8080" authtype="1" type="mms" /> - <apn carrier="Sunsurf Mobile" mcc="525" mnc="04" apn="sunsurf" type="default,supl" /> - <apn carrier="M1 WAP" mcc="525" mnc="04" apn="miworld" user="65" password="user123" authtype="1" proxy="172.16.1.23" port="8081" type="default,supl" /> - <apn carrier="M1 MMS(3G)" mcc="525" mnc="04" apn="miworld" user="65" password="user123" authtype="1" mmsc="http://mmsgw:8002" mmsproxy="172.16.14.10" mmsport="8080" type="mms" /> - <apn carrier="SH Data Postpaid" mcc="525" mnc="05" apn="shwap" type="default,supl" /> - <apn carrier="SH MMS Postpaid" mcc="525" mnc="05" apn="shmms" mmsc="http://mms.starhubgee.com.sg:8002/" mmsproxy="10.12.1.80" mmsport="80" type="mms" /> - <apn carrier="B-Mobile" mcc="528" mnc="02" apn="default" type="default,supl" /> - <apn carrier="VFNZ Gateway" mcc="530" mnc="01" apn="live.vodafone.com" mmsc="http://pxt.vodafone.net.nz/pxtsend" mmsproxy="172.30.38.3" mmsport="8080" type="mms" /> - <apn carrier="VFNZ Internet" mcc="530" mnc="01" apn="vodafone" type="default,supl" /> - <apn carrier="TelecomData" mcc="530" mnc="05" apn="wap.telecom.co.nz" type="default,supl" /> - <apn carrier="TelecomContent" mcc="530" mnc="05" apn="wap.telecom.co.nz" proxy="210.55.11.73" port="80" type="default,supl" /> - <apn carrier="TelecomMMS" mcc="530" mnc="05" apn="wap.telecom.co.nz" mmsc="http://lsmmsc.xtra.co.nz" mmsproxy="210.55.11.73" mmsport="80" type="mms" /> - <apn carrier="2Degrees Internet" mcc="530" mnc="24" apn="internet" type="default,supl" /> - <apn carrier="2Degrees MMS" mcc="530" mnc="24" apn="mms" mmsc="http://mms.2degreesmobile.net.nz:48090" mmsproxy="118.148.1.118" mmsport="8080" type="mms" /> - <apn carrier="Digicel" mcc="536" mnc="02" apn="default" type="default,supl" /> - <apn carrier="BeMobile" mcc="537" mnc="01" apn="default" type="default,supl" /> - <apn carrier="PNG WAP" mcc="537" mnc="03" apn="wap.digicelpng.com" proxy="10.149.83.116" port="8080" type="default,supl" /> - <apn carrier="PNG WEB" mcc="537" mnc="03" apn="internet.digicelpng.com" type="default,supl" /> - <apn carrier="PNG MMS" mcc="537" mnc="03" apn="wap.digicelpng.com" mmsc="http://mms.digicelpng.com:8990" mmsproxy="10.149.83.116" mmsport="8080" type="mms" /> - <apn carrier="U-Call" mcc="539" mnc="01" apn="default" type="default,supl" /> - <apn carrier="Shoreline Communication" mcc="539" mnc="43" apn="default" type="default,supl" /> - <apn carrier="Digicel" mcc="539" mnc="88" apn="default" type="default,supl" /> - <apn carrier="BREEZE" mcc="540" mnc="01" apn="default" type="default,supl" /> - <apn carrier="BeMobile" mcc="540" mnc="02" apn="default" type="default,supl" /> - <apn carrier="AIL" mcc="541" mnc="00" apn="default" type="default,supl" /> - <apn carrier="SMILE" mcc="541" mnc="01" apn="default" type="default,supl" /> - <apn carrier="Digicel" mcc="541" mnc="05" apn="default" type="default,supl" /> - <apn carrier="Vodafone" mcc="542" mnc="01" apn="default" type="default,supl" /> - <apn carrier="Digicel" mcc="542" mnc="02" apn="default" type="default,supl" /> - <apn carrier="Bluesky" mcc="544" mnc="11" apn="default" type="default,supl" /> - <apn carrier="Kiribati - TSKL" mcc="545" mnc="01" apn="default" type="default,supl" /> - <apn carrier="Kiribati - Frigate Net" mcc="545" mnc="09" apn="default" type="default,supl" /> - <apn carrier="Mobilis" mcc="546" mnc="01" apn="default" type="default,supl" /> - <apn carrier="Vini" mcc="547" mnc="20" apn="default" type="default,supl" /> - <apn carrier="Telecom Cook" mcc="548" mnc="01" apn="default" type="default,supl" /> - <apn carrier="Digicel" mcc="549" mnc="01" apn="default" type="default,supl" /> - <apn carrier="Bluesky" mcc="549" mnc="27" apn="default" type="default,supl" /> - <apn carrier="FSMTC" mcc="550" mnc="01" apn="default" type="default,supl" /> - <apn carrier="MINTA" mcc="551" mnc="01" apn="default" type="default,supl" /> - <apn carrier="PNCC" mcc="552" mnc="01" apn="default" type="default,supl" /> - <apn carrier="Palau Mobile" mcc="552" mnc="80" apn="default" type="default,supl" /> - <apn carrier="Mobinil Web" mcc="602" mnc="01" apn="mobinilweb" type="default,supl" /> - <apn carrier="Mobinil WAP" mcc="602" mnc="01" apn="mobinilwap" proxy="62.241.155.45" port="8080" type="default,supl" /> - <apn carrier="Mobinil MMS" mcc="602" mnc="01" apn="mobinilmms" mmsc="http://10.7.13.24:8002" mmsproxy="62.241.155.45" mmsport="8080" type="mms" /> - <apn carrier="vodafone internet" mcc="602" mnc="02" apn="internet.vodafone.net" user="internet" password="internet" authtype="3" type="default,supl" /> - <apn carrier="Vodafone WAP" mcc="602" mnc="02" apn="wap.vodafone.com.eg" user="wap" password="wap" authtype="3" proxy="163.121.178.2" port="8080" type="default,supl" /> - <apn carrier="Vodafone MMS" mcc="602" mnc="02" apn="mms.vodafone.com.eg" user="mms" password="mms" authtype="1" mmsc="http://mms.vodafone.com.eg/servlets/mms" mmsproxy="163.121.178.2" mmsport="8080" type="mms" /> - <apn carrier="Etisalat WAP" mcc="602" mnc="03" apn="etisalat" proxy="10.71.130.29" port="8080" type="default,supl" /> - <apn carrier="Etisalat MMS" mcc="602" mnc="03" apn="etisalat" mmsc="http://10.71.131.7:38090" mmsproxy="10.71.130.29" mmsport="8080" type="mms" /> - <apn carrier="mobilis wap" mcc="603" mnc="01" apn="wap" proxy="172.25.49.2" port="8080" user="wap" password="wap" authtype="1" type="default,supl" /> - <apn carrier="Mobilis internet" mcc="603" mnc="01" apn="internet" user="internet" password="internet" authtype="1" type="default,supl" /> - <apn carrier="Mobilis mms" mcc="603" mnc="01" apn="mms" user="mms" password="mms" authtype="1" mmsc="http://172.25.49.9/servlets/mms" mmsproxy="172.25.49.2" mmsport="8080" type="mms" /> - <apn carrier="djezzy.internet" mcc="603" mnc="02" apn="djezzy.internet" type="default,supl" /> - <apn carrier="djezzy.mms" mcc="603" mnc="02" apn="djezzy.mms" user="mms" password="mms" mmsc="http://172.24.97.152:6021/mmsc" mmsproxy="172.24.97.158" mmsport="8799" type="mms" /> - <apn carrier="nedjmawap" mcc="603" mnc="03" apn="nedjmawap" proxy="192.168.52.2" port="3128" user="wap" password="wap" authtype="1" type="default,supl" /> - <apn carrier="Nedjma.dz" mcc="603" mnc="03" apn="internet" user="nedjma" password="nedjma" type="default,supl" /> - <apn carrier="nedjmamms" mcc="603" mnc="03" apn="nedjmamms" user="mms" password="mms" authtype="1" mmsc="http://10.10.111.1" mmsproxy="192.168.52.3" mmsport="3128" type="mms" /> - <apn carrier="Internet" mcc="604" mnc="00" apn="internet1.meditel.ma" user="MEDINET" password="MEDINET" authtype="1" type="default,supl" /> - <apn carrier="Imedia" mcc="604" mnc="00" apn="wap.meditel.ma" proxy="10.8.8.8" port="8080" user="MEDIWAP" password="MEDIWAP" authtype="1" type="default,supl" /> - <apn carrier="GPRS MMS" mcc="604" mnc="00" apn="mms.meditel.ma" user="MEDIMMS" password="MEDIMMS" authtype="1" mmsc="http://mms.meditel.ma:8088/mms" mmsproxy="10.8.8.9" mmsport="8080" type="mms" /> - <apn carrier="MobileZone" mcc="604" mnc="01" apn="wap.iamgprs.ma" proxy="212.217.54.133" port="8080" type="default,supl" /> - <apn carrier="Internet Mobile" mcc="604" mnc="01" apn="www.iamgprs1.ma" type="default,supl" /> - <apn carrier="MMS IAM" mcc="604" mnc="01" apn="mmsiam" mmsc="http://mms:8002/" mmsproxy="10.16.35.50" mmsport="8080" type="mms" /> - <apn carrier="WEB" mcc="604" mnc="02" apn="www.wana.ma" type="default,supl" /> - <apn carrier="WAP" mcc="604" mnc="02" apn="www.wana.ma" proxy="10.86.0.10" port="8080" type="default,supl" /> - <apn carrier="MMS" mcc="604" mnc="02" apn="mms.wana.ma" mmsc="http://mms.wana.ma:38090" mmsproxy="10.86.0.10" mmsport="8080" type="mms" /> - <apn carrier="weborange" mcc="605" mnc="01" apn="weborange" type="default,supl" /> - <apn carrier="MMS Orange" mcc="605" mnc="01" apn="mms.otun" mmsc="http://mms.orange.tn" mmsproxy="10.12.1.52" mmsport="8080" type="mms" /> - <apn carrier="Internet" mcc="605" mnc="02" apn="internet.tn" type="default,supl" /> - <apn carrier="Internet Portail" mcc="605" mnc="02" apn="gprs.tn" user="gprs" password="gprs" authtype="1" type="default,supl" /> - <apn carrier="Tunisie Telecom MMS" mcc="605" mnc="02" apn="mms.tn" user="mms@tt1" password="mms" authtype="1" mmsc="http://192.168.0.3:19090/was" mmsproxy="192.168.0.2" mmsport="8080" type="mms" /> - <apn carrier="Tunisiana-Internet" mcc="605" mnc="03" apn="internet.tunisiana.com" authtype="1" type="default,supl" /> - <apn carrier="MMS Tunisiana" mcc="605" mnc="03" apn="mms.tunisiana.com" user="mms" password="mms" authtype="1" mmsc="http://mmsc.tunisiana.com" mmsproxy="10.3.2.100" mmsport="80" type="mms" /> - <apn carrier="Libyana" mcc="606" mnc="00" apn="default" type="default,supl" /> - <apn carrier="Madar" mcc="606" mnc="01" apn="default" type="default,supl" /> - <apn carrier="Al-Jeel Phone" mcc="606" mnc="02" apn="default" type="default,supl" /> - <apn carrier="Libya Phone" mcc="606" mnc="03" apn="default" type="default,supl" /> - <apn carrier="Hatef Libya" mcc="606" mnc="06" apn="default" type="default,supl" /> - <apn carrier="Gamcel" mcc="607" mnc="01" apn="default" type="default,supl" /> - <apn carrier="Africel" mcc="607" mnc="02" apn="default" type="default,supl" /> - <apn carrier="Comium" mcc="607" mnc="03" apn="default" type="default,supl" /> - <apn carrier="QCell" mcc="607" mnc="04" apn="default" type="default,supl" /> - <apn carrier="Orange MMS SN" mcc="608" mnc="01" apn="mms" user="mms" password="mms" mmsc="http://mmsalize/servlets/mms" mmsproxy="172.16.30.9" mmsport="8080" type="mms" /> - <apn carrier="Orange Wap SN" mcc="608" mnc="01" apn="wap" user="wap" password="wap" proxy="172.16.30.9" port="8080" type="default" /> - <apn carrier="Orange Web SN" mcc="608" mnc="01" apn="internet" user="internet" password="internet" type="default" /> - <apn carrier="Tigo Internet SN" mcc="608" mnc="02" apn="web.sentel.com" type="default,supl" /> - <apn carrier="Expresso Internet SN" mcc="608" mnc="03" apn="expresso" user="wap" password="wap" proxy="10.71.123.69" port="8080" type="default" /> - <apn carrier="Mattel" mcc="609" mnc="01" apn="default" type="default,supl" /> - <apn carrier="Chinguitel" mcc="609" mnc="02" apn="default" type="default,supl" /> - <apn carrier="Mauritel" mcc="609" mnc="10" apn="default" type="default,supl" /> - <apn carrier="Orange ML MMS" mcc="610" mnc="02" apn="mms" user="mms" password="mms" mmsc="http://10.109.6.2/servlets/mms" mmsproxy="10.109.4.35" mmsport="8080" type="mms" /> - <apn carrier="Orange Wap ML" mcc="610" mnc="02" apn="wap" user="wap" password="wap" proxy="10.109.4.35" port="8080" type="default" /> - <apn carrier="Orange S.A." mcc="611" mnc="01" apn="default" type="default,supl" /> - <apn carrier="Sotelgui" mcc="611" mnc="02" apn="default" type="default,supl" /> - <apn carrier="Telecel Guinee" mcc="611" mnc="03" apn="default" type="default,supl" /> - <apn carrier="MTN" mcc="611" mnc="04" apn="default" type="default,supl" /> - <apn carrier="Cellcom" mcc="611" mnc="05" apn="default" type="default,supl" /> - <apn carrier="Moov Internet CI" mcc="612" mnc="02" apn="moov" user="web" password="web" proxy="10.172.11.17" port="8080" type="default" /> - <apn carrier="OWORLD CI" mcc="612" mnc="03" apn="orangeciwap" user="wap" password="wap" proxy="172.20.4.33" port="8080" type="default" /> - <apn carrier="Omms CI" mcc="612" mnc="03" apn="orangecimms" user="mms" password="mms" mmsc="http://172.20.6.1/servlets/mms" mmsproxy="172.20.4.33" mmsport="8080" type="mms" /> - <apn carrier="Koz Internet CI" mcc="612" mnc="04" apn="gprs.koz.ci" user="web" password="web" proxy="10.20.3.10" port="8080" type="default" /> - <apn carrier="MTN Internet CI" mcc="612" mnc="05" apn="web.mtn.ci" user="vide" password="vide" type="default" /> - <apn carrier="Telmob" mcc="613" mnc="01" apn="default" type="default,supl" /> - <apn carrier="Airtel" mcc="613" mnc="02" apn="default" type="default,supl" /> - <apn carrier="Telecel Faso" mcc="613" mnc="03" apn="default" type="default,supl" /> - <apn carrier="Orange MMS" apn="orange.mms" user="orange" password="orange" mmsc="http://10.10.10.35:38090/was" mmsproxy="10.10.10.36" mmsport="8080" mcc="614" mnc="04" type="mms" /> - <apn carrier="Orange Internet" apn="orange.ne" mcc="614" mnc="04" type="default" /> - <apn carrier="Togo Cell" mcc="615" mnc="01" apn="default" type="default,supl" /> - <apn carrier="Moov" mcc="615" mnc="03" apn="default" type="default,supl" /> - <apn carrier="Libercom" mcc="616" mnc="01" apn="default" type="default,supl" /> - <apn carrier="Moov" mcc="616" mnc="02" apn="default" type="default,supl" /> - <apn carrier="MTN" mcc="616" mnc="03" apn="default" type="default,supl" /> - <apn carrier="BBCOM" mcc="616" mnc="04" apn="default" type="default,supl" /> - <apn carrier="Glo" mcc="616" mnc="05" apn="default" type="default,supl" /> - <apn carrier="Orange MMS" apn="orangemms" user="mmsc" password="mmsc" mmsc="http://10.2.1.20:8514" mmsproxy="10.2.1.20" mmsport="8080" mcc="617" mnc="01" type="mms" /> - <apn carrier="Orange Internet" apn="orange" mcc="617" mnc="01" type="default" /> - <apn carrier="Lonestar Cell" mcc="618" mnc="01" apn="default" type="default,supl" /> - <apn carrier="Libercell" mcc="618" mnc="02" apn="default" type="default,supl" /> - <apn carrier="Comium" mcc="618" mnc="04" apn="default" type="default,supl" /> - <apn carrier="Cellcom" mcc="618" mnc="07" apn="default" type="default,supl" /> - <apn carrier="LIBTELCO" mcc="618" mnc="20" apn="default" type="default,supl" /> - <apn carrier="Airtel" mcc="619" mnc="01" apn="default" type="default,supl" /> - <apn carrier="Tigo" mcc="619" mnc="02" apn="default" type="default,supl" /> - <apn carrier="Africell" mcc="619" mnc="03" apn="default" type="default,supl" /> - <apn carrier="Comium" mcc="619" mnc="04" apn="default" type="default,supl" /> - <apn carrier="Africell" mcc="619" mnc="05" apn="default" type="default,supl" /> - <apn carrier="Mobitel" mcc="619" mnc="25" apn="default" type="default,supl" /> - <apn carrier="MTN Internet GH" apn="internet" mcc="620" mnc="01" type="default" /> - <apn carrier="Vodafone Internet GH" apn="browse" mcc="620" mnc="02" type="default" /> - <apn carrier="Tigo Internet GH" apn="web.tigo.com.gh" mcc="620" mnc="03" type="default" /> - <apn carrier="Airtel Internet GH" apn="wap" mcc="620" mnc="06" proxy="10.93.85.88" port="9201" type="default" /> - <apn carrier="Glo Internet GH" apn="glowap" mcc="620" mnc="07" user="glo" password="glo" authtype="1" proxy="10.161.85.4" port="8799" type="default" /> - <apn carrier="Airtel Internet" mcc="621" mnc="20" apn="internet.ng.zain.com" user="internet" password="internet" authtype="1" port="8080" type="default,supl" /> - <apn carrier="Airtel MMS" mcc="621" mnc="20" apn="mms.ng.zain.com" user="mms" password="mms" authtype="1" mmsc="http://10.210.3.239:9800/mm1" mmsproxy="172.18.254.5" type="mms" /> - <apn carrier="Airtel WAP" mcc="621" mnc="20" apn="wap.ng.zain.com" user="wap" password="wap" authtype="1" proxy="172.18.254.5" port="8080" type="default,supl" /> - <apn carrier="MTN WAP" mcc="621" mnc="30" apn="web.gprs.mtnnigeria.net" user="web" password="web" authtype="1" proxy="10.199.212.2" port="8080" type="default,supl" /> - <apn carrier="MTN ACESS" mcc="621" mnc="30" apn="web.gprs.mtnnigeria.net" user="web" password="web" authtype="1" type="default,supl" /> - <apn carrier="MTN MMS" mcc="621" mnc="30" apn="web.gprs.mtnnigeria.net" mmsc="http://10.199.212.8/servlets/mms" mmsproxy="10.199.212.2" type="mms" /> - <apn carrier="Glo Direct" mcc="621" mnc="50" apn="glosecure" user="gprs" password="gprs" authtype="1" type="default,supl" /> - <apn carrier="Glo MMS" mcc="621" mnc="50" apn="glomms" user="mms" password="mms" authtype="1" mmsc="http://mms.gloworld.com/mmsc" mmsproxy="10.100.82.4" mmsport="8080" type="mms" /> - <apn carrier="etisalat WAP" mcc="621" mnc="60" apn="etisalat" proxy="10.71.170.5" port="8080" type="default,supl" /> - <apn carrier="etisalat MMS" mcc="621" mnc="60" apn="etisalat" mmsc="http://10.71.170.30:38090/was" type="mms" /> - <apn carrier="Airtel" mcc="622" mnc="01" apn="default" type="default,supl" /> - <apn carrier="Tawali" mcc="622" mnc="02" apn="default" type="default,supl" /> - <apn carrier="Tigo" mcc="622" mnc="03" apn="default" type="default,supl" /> - <apn carrier="Salam" mcc="622" mnc="04" apn="default" type="default,supl" /> - <apn carrier="CTP" mcc="623" mnc="01" apn="default" type="default,supl" /> - <apn carrier="TC" mcc="623" mnc="02" apn="default" type="default,supl" /> - <apn carrier="Orange" mcc="623" mnc="03" apn="default" type="default,supl" /> - <apn carrier="Nationlink" mcc="623" mnc="04" apn="default" type="default,supl" /> - <apn carrier="CVMOVEL" mcc="625" mnc="01" apn="default" type="default,supl" /> - <apn carrier="T+" mcc="625" mnc="02" apn="default" type="default,supl" /> - <apn carrier="CSTmovel" mcc="626" mnc="01" apn="default" type="default,supl" /> - <apn carrier="Orange GQ" mcc="627" mnc="01" apn="default" type="default,supl" /> - <apn carrier="Hits GQ" mcc="627" mnc="03" apn="default" type="default,supl" /> - <apn carrier="Libertis" mcc="628" mnc="01" apn="default" type="default,supl" /> - <apn carrier="Moov" mcc="628" mnc="02" apn="default" type="default,supl" /> - <apn carrier="Airtel" mcc="628" mnc="03" apn="default" type="default,supl" /> - <apn carrier="Azur" mcc="628" mnc="04" apn="default" type="default,supl" /> - <apn carrier="Airtel" mcc="629" mnc="01" apn="default" type="default,supl" /> - <apn carrier="Libertis Telecom" mcc="629" mnc="10" apn="default" type="default,supl" /> - <apn carrier="Vodacom Internet CD" mcc="630" mnc="01" apn="vodanet" port="8080" type="default" /> - <apn carrier="Tigo Internet CD" mcc="630" mnc="89" apn="wap.tigo.cd" type="default" /> - <apn carrier="UNITEL" mcc="631" mnc="02" apn="default" type="default,supl" /> - <apn carrier="MOVICEL" mcc="631" mnc="04" apn="default" type="default,supl" /> - <apn carrier="Areeba" mcc="632" mnc="02" apn="default" type="default,supl" /> - <apn carrier="Orange" mcc="632" mnc="03" apn="default" type="default,supl" /> - <apn carrier="Guinetel" mcc="632" mnc="07" apn="default" type="default,supl" /> - <apn carrier="Cable & Wireless" mcc="633" mnc="01" apn="default" type="default,supl" /> - <apn carrier="Mediatech International" mcc="633" mnc="02" apn="default" type="default,supl" /> - <apn carrier="Airtel" mcc="633" mnc="10" apn="default" type="default,supl" /> - <apn carrier="Zain SD" mcc="634" mnc="01" apn="default" type="default,supl" /> - <apn carrier="MTN" mcc="634" mnc="02" apn="default" type="default,supl" /> - <apn carrier="Sudani One" mcc="634" mnc="07" apn="default" type="default,supl" /> - <apn carrier="Privet Network" mcc="634" mnc="09" apn="default" type="default,supl" /> - <apn carrier="MTN" mcc="635" mnc="10" apn="default" type="default,supl" /> - <apn carrier="Rwandatel" mcc="635" mnc="12" apn="default" type="default,supl" /> - <apn carrier="Tigo" mcc="635" mnc="13" apn="default" type="default,supl" /> - <apn carrier="Airtel" mcc="635" mnc="14" apn="default" type="default,supl" /> - <apn carrier="ETH-MTN" mcc="636" mnc="01" apn="default" type="default,supl" /> - <apn carrier="Telesom" mcc="637" mnc="01" apn="default" type="default,supl" /> - <apn carrier="Somafone" mcc="637" mnc="04" apn="default" type="default,supl" /> - <apn carrier="Nationlink" mcc="637" mnc="10" apn="default" type="default,supl" /> - <apn carrier="Hormuud" mcc="637" mnc="25" apn="default" type="default,supl" /> - <apn carrier="Golis" mcc="637" mnc="30" apn="default" type="default,supl" /> - <apn carrier="Unittel" mcc="637" mnc="57" apn="default" type="default,supl" /> - <apn carrier="Nationlink Telecom" mcc="637" mnc="60" apn="default" type="default,supl" /> - <apn carrier="Somtel" mcc="637" mnc="71" apn="default" type="default,supl" /> - <apn carrier="Telcom" mcc="637" mnc="82" apn="default" type="default,supl" /> - <apn carrier="Evatis" mcc="638" mnc="01" apn="default" type="default,supl" /> - <apn carrier="safaricom GPRS" mcc="639" mnc="02" apn="safaricom" user="saf" password="data" authtype="1" proxy="172.22.2.38" port="8080" type="default,supl" /> - <apn carrier="safaricom mms" mcc="639" mnc="02" apn="safaricom" user="saf" password="data" authtype="1" mmsproxy="172.22.2.38" mmsport="8080" mmsc="http://mms.gprs.safaricom.com" type="mms" /> - <apn carrier="Airtel Internet" mcc="639" mnc="03" apn="internet" type="default,supl" /> - <apn carrier="Airtel mms" mcc="639" mnc="03" apn="mms" mmsc="http://mms.ke.airtel.com:8002" mmsproxy="172.30.9.8" mmsport="8080" authtype="1" type="mms" /> - <apn carrier="Airtel" mcc="639" mnc="03" apn="ke.celtel.com" type="default,supl" /> - <apn carrier="mms" mcc="639" mnc="03" apn="ke.celtel.com" mmsproxy="172.30.8.50" mmsport="8080" mmsc="http://mms.ke.celtel.com/servlets/mms" type="mms" /> - <apn carrier="Yu Internet" mcc="639" mnc="05" apn="Internet" proxy="10.4.16.6" port="8080" mmsproxy="10.4.16.6" mmsport="8080" mmsc="http://10.4.16.22/servlets/mms" type="default,supl,mms" /> - <apn carrier="Yu WAP" mcc="639" mnc="05" apn="Yu internet" type="default,supl" /> - <apn carrier="Yu mms" mcc="639" mnc="05" apn="Yu" mmsproxy="10.4.16.6" mmsport="8080" mmsc="http://10.4.16.22/servlets/mms" type="mms" /> - <apn carrier="Orange Internet" mcc="639" mnc="07" apn="bew.orange.co.ke" type="default,supl" /> - <apn carrier="Orange MMS" mcc="639" mnc="07" apn="mms.orange.co.ke" mmsproxy="10.36.17.130" mmsport="8080" mmsc="http://10.36.16.5/servlets/mms" authtype="1" type="mms" /> - <apn carrier="Vodacom WAP" mcc="640" mnc="04" apn="Wap" proxy="10.154.0.8" port="9401" type="default,supl" /> - <apn carrier="Vodacom MMS" mcc="640" mnc="04" apn="mms" mmsc="http://10.154.0.12/mms/" type="mms" /> - <apn carrier="Airtel Internet UG" apn="internet" mcc="641" mnc="01" type="default" /> - <apn carrier="MTN Internet UG" apn="yellopix.mtn.co.ug" mcc="641" mnc="10" proxy="10.120.0.138" port="8080" type="default" /> - <apn carrier="UTL Internet UG" apn="utweb" mcc="641" mnc="11" proxy="10.76.101.51" port="8080" type="default" /> - <apn carrier="Orange Internet UG" mcc="641" mnc="14" apn="orange.ug" type="default" /> - <apn carrier="Orange MMS" mcc="641" mnc="14" apn="orangemms" mmsc="http://mms/" type="mms" /> - <apn carrier="Warid Telecom Internet UG" apn="web.waridtel.co.ug" mcc="641" mnc="22" proxy="10.5.27.80" port="8080" type="default" /> - <apn carrier="Spacetel" mcc="642" mnc="01" apn="default" type="default,supl" /> - <apn carrier="Tempo" mcc="642" mnc="02" apn="default" type="default,supl" /> - <apn carrier="Onatel" mcc="642" mnc="03" apn="default" type="default,supl" /> - <apn carrier="Smart Mobile" mcc="642" mnc="07" apn="default" type="default,supl" /> - <apn carrier="HiTs Telecom" mcc="642" mnc="08" apn="default" type="default,supl" /> - <apn carrier="Leo" mcc="642" mnc="82" apn="default" type="default,supl" /> - <apn carrier="mCel" mcc="643" mnc="01" apn="default" type="default,supl" /> - <apn carrier="Movitel" mcc="643" mnc="03" apn="default" type="default,supl" /> - <apn carrier="Vodacom" mcc="643" mnc="04" apn="default" type="default,supl" /> - <apn carrier="Airtel" mcc="645" mnc="01" apn="default" type="default,supl" /> - <apn carrier="MTN" mcc="645" mnc="02" apn="default" type="default,supl" /> - <apn carrier="ZAMTEL" mcc="645" mnc="03" apn="default" type="default,supl" /> - <apn carrier="Orange World re" mcc="647" mnc="00" apn="orangerun" user="orange" password="orange" type="default,supl" /> - <apn carrier="Orange MMS Réunion" mcc="647" mnc="00" apn="orangerun.acte" user="orange" password="orange" mmsc="http://mms.orange.re" mmsproxy="192.168.10.200" mmsport="8080" type="mms" /> - <apn carrier="OnlyWap" mcc="647" mnc="02" apn="onlywap" user="only" password="only" authtype="1" proxy="10.4.85.50" port="8080" type="default,supl" /> - <apn carrier="OnlyMMS" mcc="647" mnc="02" apn="onlymms" user="only" password="only" authtype="1" mmsc="http://10.4.85.50:8514" mmsproxy="10.4.85.50" mmsport="8080" type="mms" /> - <apn carrier="Full Internet SRR" mcc="647" mnc="10" apn="sl2sfr" type="default,supl" /> - <apn carrier="MMS" mcc="647" mnc="10" apn="mmssfr" user="mms" password="mms" mmsc="http://mms" mmsproxy="10.0.224.145" mmsport="8080" type="mms" /> - <apn carrier="GPRS SRR" mcc="647" mnc="10" apn="wapsfr" user="wap" password="wap" proxy="10.0.224.161" port="8080" type="default,supl" /> - <apn carrier="Coriolis WAP" mcc="647" mnc="10" apn="fnetcoriolis" type="default,supl" mvno_match_data="12" mvno_type="gid" /> - <apn carrier="Coriolis MMS" mcc="647" mnc="10" mmsc="http://mmscoriolis" mmsproxy="10.143.156.6" mmsport="8080" apn="mmscoriolis" type="mms" mvno_match_data="12" mvno_type="gid" /> - <apn carrier="Telecel" mcc="648" mnc="03" apn="default" type="default,supl" /> - <apn carrier="Econet" mcc="648" mnc="04" apn="default" type="default,supl" /> - <apn carrier="MTC" mcc="649" mnc="01" apn="default" type="default,supl" /> - <apn carrier="switch" mcc="649" mnc="02" apn="default" type="default,supl" /> - <apn carrier="Leo" mcc="649" mnc="03" apn="default" type="default,supl" /> - <apn carrier="TNM" mcc="650" mnc="01" apn="default" type="default,supl" /> - <apn carrier="Airtel" mcc="650" mnc="10" apn="default" type="default,supl" /> - <apn carrier="VCL Internet GPRS" mcc="651" mnc="01" apn="internet" type="default,supl" /> - <apn carrier="VCL MMS GPRS" mcc="651" mnc="01" apn="mms" mmsc="http://mmsc.vodacom4me.co.ls" mmsproxy="10.113.63.11" mmsport="8080" type="mms" /> - <apn carrier="Swazi MTN" mcc="653" mnc="10" apn="default" type="default,supl" /> - <apn carrier="HURI - SNPT" mcc="654" mnc="01" apn="default" type="default,supl" /> - <apn carrier="LTE.Vodacom" mcc="655" mnc="01" apn="lte.vodacom.za" type="default,supl" /> - <apn carrier="MMS.Vodacom" mcc="655" mnc="01" apn="lte.vodacom.za" mmsc="http://mmsc.vodacom4me.co.za" mmsproxy="196.6.128.13" mmsport="8080" type="mms" /> - <apn carrier="Smart.Vodacom" mcc="655" mnc="01" apn="internet" type="default,supl" /> - <apn carrier="MMS.Vodacom" mcc="655" mnc="01" apn="mms.vodacom.net" mmsc="http://mmsc.vodacom4me.co.za" mmsproxy="196.6.128.13" mmsport="8080" type="mms" /> - <apn carrier="Telkom Mobile Internet" mcc="655" mnc="02" apn="internet" type="default,supl" /> - <apn carrier="Telkom Mobile MMS" mcc="655" mnc="02" apn="mms" mmsc="http://mms.8ta.com:38090/was" mmsproxy="41.151.254.162" mmsport="8080" type="mms" /> - <apn carrier="Cell C GPRS" mcc="655" mnc="07" apn="internet" proxy="196.31.116.250" port="8080" type="default,supl" /> - <apn carrier="Cell C MMS" mcc="655" mnc="07" apn="mms" mmsc="http://mms.cmobile.co.za/" mmsproxy="196.31.116.250" mmsport="8080" type="mms" /> - <apn carrier="VIRGIN_INTERNET_1" mcc="655" mnc="07" apn="vdata" proxy="196.31.116.241" port="8080" type="default,supl" mvno_match_data="6550710" mvno_type="imsi" /> - <apn carrier="VIRGIN_INTERNET_2" mcc="655" mnc="07" apn="vdata" proxy="196.31.116.241" port="9201" type="default,supl" mvno_match_data="6550710" mvno_type="imsi" /> - <apn carrier="Virgin_MMS_1" mcc="655" mnc="07" apn="vmms" mmsc="http://mms.virginmobile.co.za" mmsproxy="196.31.116.242" mmsport="8080" type="mms" mvno_match_data="6550710" mvno_type="imsi" /> - <apn carrier="Virgin_MMS_2" mcc="655" mnc="07" apn="vmms" mmsc="http://mms.virginmobile.co.za" mmsproxy="196.31.116.242" mmsport="9201" type="mms" mvno_match_data="6550710" mvno_type="imsi" /> - <apn carrier="RBM Internet" mcc="655" mnc="07" apn="mobile.redbullmobile.co.za" proxy="196.31.116.250" port="8080" type="default,supl" mvno_match_data="6550713" mvno_type="imsi" /> - <apn carrier="Redbull MMS" mcc="655" mnc="07" apn="mms" mmsc="http://mms.cmobile.co.za/" mmsproxy="196.31.116.250" mmsport="8080" type="mms" mvno_match_data="6550713" mvno_type="imsi" /> - <apn carrier="MTN GPRS" mcc="655" mnc="10" apn="myMTN" user="mtnwap" password="mtnwap" authtype="1" type="default,supl" /> - <apn carrier="MTN MMS" mcc="655" mnc="10" apn="myMTN" user="mtnmms" password="mtnmms" authtype="1" mmsc="http://mms.mtn.co.za/mms/wapenc" mmsproxy="196.11.240.241" mmsport="8080" type="mms" /> - <apn carrier="Eritel" mcc="657" mnc="01" apn="default" type="default,supl" /> - <apn carrier="DigiCell" mcc="702" mnc="67" apn="default" type="default,supl" /> - <apn carrier="Smart" mcc="702" mnc="99" apn="default" type="default,supl" /> - <apn carrier="Internet CLARO" mcc="704" mnc="01" apn="internet.ideasclaro" type="default,supl,dun" /> - <apn carrier="MMS CLARO" mcc="704" mnc="01" apn="mms.ideasclaro" mmsproxy="216.230.133.66" mmsport="8080" mmsc="http://mms.ideasclaro.com:8002" type="mms" /> - <apn carrier="Broadband TIGO" mcc="704" mnc="02" apn="broadband.tigo.gt" type="default,supl,dun" /> - <apn carrier="MMS TIGO" mcc="704" mnc="02" apn="mms.tigo.gt" mmsproxy="10.16.17.12" mmsport="8888" mmsc="http://mms" type="mms" /> - <apn carrier="Movistar INTERNET" mcc="704" mnc="03" apn="internet.movistar.gt" user="movistargt" password="movistargt" authtype="1" type="default,supl,dun" /> - <apn carrier="Movistar MMS" mcc="704" mnc="03" apn="mms.movistar.gt" user="movistargt" password="movistargt" mmsproxy="10.12.22.1" mmsport="80" mmsc="http://mms.movistar.gt" authtype="1" type="mms" /> - <apn carrier="Movistar INTERNET" mcc="704" mnc="030" apn="internet.movistar.gt" user="movistargt" password="movistargt" authtype="1" type="default,supl,dun" /> - <apn carrier="Movistar MMS" mcc="704" mnc="030" apn="mms.movistar.gt" user="movistargt" password="movistargt" mmsproxy="10.12.22.1" mmsport="80" mmsc="http://mms.movistar.gt" authtype="1" type="mms" /> - <apn carrier="Internet CLARO" mcc="706" mnc="01" apn="internet.ideasclaro" type="default,supl,dun" /> - <apn carrier="MMS CLARO" mcc="706" mnc="01" apn="mms.ideasclaro" mmsproxy="216.230.133.66" mmsport="8080" mmsc="http://mms.ideasclaro.com:8002" type="mms" /> - <apn carrier="Digicel Internet" mcc="706" mnc="02" apn="web.digicelsv.com" type="default,supl,dun" /> - <apn carrier="MMS" mcc="706" mnc="02" apn="wap.digicelsv.com" mmsproxy="172.26.5.12" mmsport="8080" mmsc="http://mmc.digiceljamaica.com/servlets/mms" type="mms" /> - <apn carrier="Internet Tigo" mcc="706" mnc="03" apn="internet.tigo.sv" type="default,supl,dun" /> - <apn carrier="MMS Tigo" mcc="706" mnc="03" apn="mms.tigo.sv" mmsproxy="10.16.17.12" mmsport="8888" mmsc="http://mms" type="mms" /> - <apn carrier="Movistar INTERNET" mcc="706" mnc="04" apn="internet.movistar.sv" user="movistarsv" password="movistarsv" authtype="1" type="default,supl,dun" /> - <apn carrier="Movistar MMS" mcc="706" mnc="04" apn="mms.movistar.sv" user="movistarsv" password="movistarsv" mmsproxy="10.12.20.1" mmsport="80" mmsc="http://mms.movistar.sv" authtype="1" type="mms" /> - <apn carrier="Movistar INTERNET" mcc="706" mnc="040" apn="internet.movistar.sv" user="movistarsv" password="movistarsv" authtype="1" type="default,supl,dun" /> - <apn carrier="Movistar MMS" mcc="706" mnc="040" apn="mms.movistar.sv" user="movistarsv" password="movistarsv" mmsproxy="10.12.20.1" mmsport="80" mmsc="http://mms.movistar.sv" authtype="1" type="mms" /> - <apn carrier="Internet Claro" mcc="708" mnc="00" apn="internet.ideasclaro" type="default,supl,dun" /> - <apn carrier="MMS Claro" mcc="708" mnc="00" apn="mms.ideasclaro" mmsproxy="10.6.32.2" mmsport="8080" mmsc="http://10.6.32.27/servlets/mms" type="mms" /> - <apn carrier="Internet Claro" mcc="708" mnc="001" apn="internet.ideasclaro" type="default,supl,dun" /> - <apn carrier="MMS Claro" mcc="708" mnc="001" apn="mms.ideasclaro" mmsproxy="10.6.32.2" mmsport="8080" mmsc="http://10.6.32.27/servlets/mms" type="mms" /> - <apn carrier="INTERNET TIGO" mcc="708" mnc="02" apn="internet.tigo.hn" type="default,supl,dun" /> - <apn carrier="MMS TIGO" mcc="708" mnc="02" apn="mms.tigo.hn" mmsproxy="10.16.17.12" mmsport="8888" mmsc="http://mms" type="mms" /> - <apn carrier="INTERNET TIGO" mcc="708" mnc="020" apn="internet.tigo.hn" type="default,supl,dun" /> - <apn carrier="MMS TIGO" mcc="708" mnc="020" apn="mms.tigo.hn" mmsproxy="10.16.17.12" mmsport="8888" mmsc="http://mms" type="mms" /> - <apn carrier="Enitel WEB" mcc="710" mnc="21" apn="internet.ideasalo.ni" user="internet" password="internet" authtype="1" type="default,supl,dun" /> - <apn carrier="Enitel MMS" mcc="710" mnc="21" apn="mms.indeasalo.ni" user="mms" password="mms" mmsproxy="10.6.32.2" mmsport="8080" mmsc="http://10.6.32.27/servlets/mms" authtype="1" type="mms" /> - <apn carrier="Movistar INTERNET" mcc="710" mnc="30" apn="internet.movistar.ni" user="movistarni" password="movistarni" authtype="1" type="default,supl,dun" /> - <apn carrier="Movistar MMS" mcc="710" mnc="30" apn="mms.movistar.ni" user="movistarni" password="movistarni" mmsproxy="10.12.23.1" mmsport="80" mmsc="http://mms.movistar.ni" authtype="1" type="mms" /> - <apn carrier="Movistar INTERNET" mcc="710" mnc="300" apn="internet.movistar.ni" user="movistarni" password="movistarni" authtype="1" type="default,supl,dun" /> - <apn carrier="Movistar MMS" mcc="710" mnc="300" apn="mms.movistar.ni" user="movistarni" password="movistarni" mmsproxy="10.12.23.1" mmsport="80" mmsc="http://mms.movistar.ni" authtype="1" type="mms" /> - <apn carrier="Enitel WEB" mcc="710" mnc="73" apn="internet.ideasalo.ni" user="internet" password="internet" authtype="1" type="default,supl,dun" /> - <apn carrier="Enitel MMS" mcc="710" mnc="73" apn="mms.indeasalo.ni" user="mms" password="mms" mmsproxy="10.6.32.2" mmsport="8080" mmsc="http://10.6.32.27/servlets/mms" authtype="1" type="mms" /> - <apn carrier="Enitel WEB" mcc="710" mnc="730" apn="internet.ideasalo.ni" user="internet" password="internet" authtype="1" type="default,supl,dun" /> - <apn carrier="Enitel MMS" mcc="710" mnc="730" apn="mms.indeasalo.ni" user="mms" password="mms" mmsproxy="10.6.32.2" mmsport="8080" mmsc="http://10.6.32.27/servlets/mms" authtype="1" type="mms" /> - <apn carrier="Kolbi 3G" mcc="712" mnc="01" apn="kolbi3g" type="default,supl,dun" /> - <apn carrier="Kolbi Multimedia" mcc="712" mnc="01" apn="kolbimundo" mmsproxy="10.184.202.24" mmsport="8080" mmsc="http://mmsice" type="mms" /> - <apn carrier="Kolbi 3G" mcc="712" mnc="02" apn="kolbi3g" type="default,supl,dun" /> - <apn carrier="Kolbi Multimedia" mcc="712" mnc="02" apn="kolbimundo" mmsproxy="10.184.202.24" mmsport="8080" mmsc="http://mmsice" type="mms" /> - <apn carrier="Internet CLARO CR" mcc="712" mnc="03" apn="internet.ideasclaro" user="" password="" type="default,supl,dun" /> - <apn carrier="MMS CLARO CR" mcc="712" mnc="03" apn="mms.ideasclaro" user="" password="" mmsproxy="216.230.133.66" mmsport="8080" mmsc="http://mms.ideasclaro.com:8002" type="mms" /> - <apn carrier="Movistar INTERNET" mcc="712" mnc="04" apn="internet.movistar.cr" user="movistarcr" password="movistarcr" authtype="1" type="default,supl,dun" /> - <apn carrier="Movistar MMS" mcc="712" mnc="04" apn="mms.movistar.cr" user="movistarcr" password="movistarcr" mmsproxy="10.221.79.83" mmsport="80" mmsc="http://mms.movistar.cr" authtype="1" type="mms" /> - <apn carrier="Internet Tuyo" mcc="712" mnc="019" apn="tm7datos" type="default,supl,dun" /> - <apn carrier="MMS Tuyo" mcc="712" mnc="019" apn="tm7mms" mmsproxy="10.186.181.5" mmsport="3128" mmsc="http://mmsc.tuyomovil.com:1981" type="mms" /> - <apn carrier="Internet Tuyo" mcc="712" mnc="190" apn="tm7datos" type="default,supl,dun" /> - <apn carrier="MMS Tuyo" mcc="712" mnc="190" apn="tm7mms" mmsproxy="10.186.181.5" mmsport="3128" mmsc="http://mmsc.tuyomovil.com:1981" type="mms" /> - <apn carrier="Internet Fulmovil" mcc="712" mnc="20" apn="datos.fulmovil.cr" type="default,supl,dun" /> - <apn carrier="Wap" mcc="714" mnc="01" apn="apn01.cwpanama.com.pa" type="default,supl,dun" /> - <apn carrier="Mms" mcc="714" mnc="01" apn="apn02.cwpanama.com.pa" mmsproxy="172.25.3.5" mmsport="8080" mmsc="http://mms.zonamovil.com.pa" type="mms" /> - <apn carrier="Movistar INTERNET" mcc="714" mnc="02" apn="internet.movistar.pa" user="movistarpa" password="movistarpa" authtype="1" type="default,supl,dun" /> - <apn carrier="Movistar MMS" mcc="714" mnc="02" apn="mms.movistar.pa" user="movistarpamms" password="movistarpa" mmsproxy="10.12.21.1" mmsport="80" mmsc="http://mms.movistar.pa" authtype="1" type="mms" /> - <apn carrier="Movistar INTERNET" mcc="714" mnc="020" apn="internet.movistar.pa" user="movistarpa" password="movistarpa" authtype="1" type="default,supl,dun" /> - <apn carrier="Movistar MMS" mcc="714" mnc="020" apn="mms.movistar.pa" user="movistarpamms" password="movistarpa" mmsproxy="10.12.21.1" mmsport="80" mmsc="http://mms.movistar.pa" authtype="1" type="mms" /> - <apn carrier="WEB Claro" mcc="714" mnc="03" apn="web.claro.com.pa" user="CLAROWEB" password="CLAROWEB" authtype="1" type="default,supl,dun" /> - <apn carrier="MMS Claro" mcc="714" mnc="03" apn="mms.claro.com.pa" user="CLAROMMS" password="CLAROMMS" mmsproxy="10.240.3.129" mmsport="8799" mmsc="http://www.claro.com.pa/mms/" authtype="1" type="mms" /> - <apn carrier="Digicel Internet" mcc="714" mnc="04" apn="web.digicelpanama.com" type="default,supl,dun" /> - <apn carrier="MMS" mcc="714" mnc="04" apn="wap.digicelpanama.com" mmsproxy="172.27.99.99" mmsport="8080" mmsc="http://mmc.digicelpanama.com/servlets/mms" type="mms" /> - <apn carrier="Movistar INTERNET" mcc="716" mnc="06" apn="movistar.pe" user="movistar@datos" password="movistar" authtype="1" type="default,supl,dun" /> - <apn carrier="Movistar MMS" mcc="716" mnc="06" apn="mms.movistar.pe" user="movistar@mms" password="movistar" mmsproxy="200.4.196.118" mmsport="8080" mmsc="http://mmsc.telefonicamovistar.com.pe:8088/mms/" authtype="1" type="mms" /> - <apn carrier="CLARO DATOS" mcc="716" mnc="10" apn="claro.pe" user="claro" password="claro" authtype="1" type="default,supl,dun" /> - <apn carrier="CLARO MMS" mcc="716" mnc="10" apn="mms.claro.pe" user="claro" password="claro" mmsproxy="192.168.231.30" mmsport="80" mmsc="http://claro/servlets/mms" authtype="1" type="mms" /> - <apn carrier="Movistar WAP" mcc="722" mnc="07" apn="wap.gprs.unifon.com.ar" user="wap" password="wap" proxy="200.5.68.10" port="8080" authtype="1" type="default,supl,dun" /> - <apn carrier="Movistar MMS" mcc="722" mnc="07" apn="mms.gprs.unifon.com.ar" user="mms" password="mms" mmsproxy="200.68.32.239" mmsport="8080" mmsc="http://mms.movistar.com.ar" authtype="1" type="mms" /> - <apn carrier="Claro AR" mcc="722" mnc="31" apn="igprs.claro.com.ar" mmsc="http://mms.claro.com.ar" type="default,supl,dun,mms" /> - <apn carrier="Claro AR" mcc="722" mnc="310" apn="igprs.claro.com.ar" mmsc="http://mms.claro.com.ar" type="default,supl,dun,mms" /> - <apn carrier="Personal Datos" mcc="722" mnc="34" apn="datos.personal.com" user="datos" password="datos" authtype="1" type="default,supl,dun" /> - <apn carrier="Personal MMS" mcc="722" mnc="34" apn="mms" user="mms" password="mms" mmsproxy="172.25.7.31" mmsport="8080" mmsc="http://mms.personal.com" authtype="1" type="mms" /> - <apn carrier="Personal Datos" mcc="722" mnc="341" apn="datos.personal.com" user="datos" password="datos" authtype="1" type="default,supl,dun" /> - <apn carrier="Personal MMS" mcc="722" mnc="341" apn="mms" user="mms" password="mms" mmsproxy="172.25.7.31" mmsport="8080" mmsc="http://mms.personal.com" authtype="1" type="mms" /> - <apn carrier="TIM Connect" mcc="724" mnc="02" apn="timbrasil.br" user="tim" password="tim" mmsc="http://mms.tim.br" mmsproxy="200.179.66.242" mmsport="8080" authtype="1" protocol="IPV4V6" type="default,supl,mms" /> - <apn carrier="TIM Connect" mcc="724" mnc="03" apn="timbrasil.br" user="tim" password="tim" mmsc="http://mms.tim.br" mmsproxy="200.179.66.242" mmsport="8080" authtype="1" protocol="IPV4V6" type="default,supl,mms" /> - <apn carrier="TIM Connect" mcc="724" mnc="04" apn="timbrasil.br" user="tim" password="tim" mmsc="http://mms.tim.br" mmsproxy="200.179.66.242" mmsport="8080" authtype="1" protocol="IPV4V6" type="default,supl,mms" /> - <apn carrier="Java Session" mcc="724" mnc="05" apn="java.claro.com.br" user="claro" password="claro" type="default,supl" /> - <apn carrier="Claro Foto" mcc="724" mnc="05" apn="mms.claro.com.br" user="claro" password="claro" mmsc="http://mms.claro.com.br" mmsproxy="200.169.126.10" mmsport="8799" authtype="1" type="mms" /> - <apn carrier="Vivo MMS" mcc="724" mnc="06" apn="mms.vivo.com.br" user="vivo" password="vivo" mmsc="http://termnat.vivomms.com.br:8088/mms" mmsproxy="200.142.130.104" mmsport="80" authtype="1" protocol="IPV4V6" type="mms" /> - <apn carrier="Vivo Internet" mcc="724" mnc="06" apn="zap.vivo.com.br" user="vivo" password="vivo" authtype="1" protocol="IPV4V6" type="default,supl" /> - <apn carrier="Vivo Internet" mcc="724" mnc="10" apn="zap.vivo.com.br" user="vivo" password="vivo" authtype="1" protocol="IPV4V6" type="default,supl" /> - <apn carrier="Vivo MMS" mcc="724" mnc="10" apn="mms.vivo.com.br" user="vivo" password="vivo" mmsc="http://termnat.vivomms.com.br:8088/mms" mmsproxy="200.142.130.104" mmsport="80" authtype="1" protocol="IPV4V6" type="mms" /> - <apn carrier="Vivo MMS" mcc="724" mnc="11" apn="mms.vivo.com.br" user="vivo" password="vivo" mmsc="http://termnat.vivomms.com.br:8088/mms" mmsproxy="200.142.130.104" mmsport="80" authtype="1" protocol="IPV4V6" type="mms" /> - <apn carrier="Vivo Internet" mcc="724" mnc="11" apn="zap.vivo.com.br" user="vivo" password="vivo" authtype="1" protocol="IPV4V6" type="default,supl" /> - <apn carrier="Oi GPRS Internet" mcc="724" mnc="16" apn="gprs.oi.com.br" protocol="IPV4V6" type="default,supl" /> - <apn carrier="MMS GPRS" mcc="724" mnc="16" apn="mmsgprs.oi.com.br" user="oimms" password="oioioi" mmsc="http://200.222.42.204:8002" mmsproxy="192.168.10.50" mmsport="3128" authtype="1" protocol="IPV4V6" type="mms" /> - <apn carrier="Vivo Internet" mcc="724" mnc="23" apn="zap.vivo.com.br" user="vivo" password="vivo" authtype="1" protocol="IPV4V6" type="default,supl" /> - <apn carrier="Vivo MMS" mcc="724" mnc="23" apn="mms.vivo.com.br" user="vivo" password="vivo" mmsc="http://termnat.vivomms.com.br:8088/mms" mmsproxy="200.142.130.104" mmsport="80" authtype="1" protocol="IPV4V6" type="mms" /> - <apn carrier="Oi GPRS Internet" mcc="724" mnc="31" apn="gprs.oi.com.br" protocol="IPV4V6" type="default,supl" /> - <apn carrier="MMS GPRS" mcc="724" mnc="31" apn="mmsgprs.oi.com.br" user="oimms" password="oioioi" mmsc="http://200.222.42.204:8002" mmsproxy="192.168.10.50" mmsport="3128" authtype="1" protocol="IPV4V6" type="mms" /> - <apn carrier="Internet Movil" mcc="730" mnc="01" apn="bam.entelpcs.cl" user="entelpcs" password="entelpcs" authtype="1" type="default,supl,dun" /> - <apn carrier="MMS Entel" mcc="730" mnc="01" apn="mms.entelpcs.cl" user="entelpcs" password="entelpcs" mmsproxy="10.99.0.10" mmsport="8080" mmsc="http://mmsc.entelpcs.cl" authtype="1" type="mms" /> - <apn carrier="Internet Movil" mcc="730" mnc="10" apn="bam.entelpcs.cl" user="entelpcs" password="entelpcs" authtype="1" type="default,supl,dun" /> - <apn carrier="MMS Entel" mcc="730" mnc="10" apn="mms.entelpcs.cl" user="entelpcs" password="entelpcs" mmsproxy="10.99.0.10" mmsport="8080" mmsc="http://mmsc.entelpcs.cl" authtype="1" type="mms" /> - <apn carrier="Movistar APLICACIONES" mcc="730" mnc="02" apn="wap.tmovil.cl" user="wap" password="wap" authtype="1" type="default,supl,dun" /> - <apn carrier="Movistar MMS" mcc="730" mnc="02" apn="mms.tmovil.cl" user="mms" password="mms" mmsproxy="172.17.8.10" mmsport="8080" mmsc="http://mms.movistar.cl" authtype="1" type="mms" /> - <apn carrier="Banda Ancha Movil" mcc="730" mnc="03" apn="bam.clarochile.cl" user="clarochile" password="clarochile" authtype="1" type="default,supl,dun" /> - <apn carrier="MMS Claro" mcc="730" mnc="03" apn="mms.clarochile.cl" user="clarochile" password="clarochile" mmsproxy="172.23.200.200" mmsport="8080" mmsc="http://mms.clarochile.cl" authtype="1" type="mms" /> - <apn carrier="web" mcc="730" mnc="07" apn="web.gtdmovil.cl" user="webgtd" password="webgtd" authtype="1" type="default,supl,dun" /> - <apn carrier="Internet" mcc="730" mnc="08" apn="movil.vtr.com" user="vtrmovil" password="vtrmovil" authtype="2" type="default,supl,dun" /> - <apn carrier="Wap" mcc="730" mnc="08" apn="wap.vtr.com" proxy="192.168.94.210" port="9028" user="" password="" authtype="0" type="default,supl,dun" /> - <apn carrier="MMS" mcc="730" mnc="08" apn="mms.vtr.com" user="mms" password="" mmsc="http://192.168.94.162:19090/was" mmsproxy="192.168.94.210" mmsport="9028" authtype="0" type="mms" /> - <apn carrier="Internet Movil" mcc="730" mnc="10" apn="bam.entelpcs.cl" user="entelpcs" password="entelpcs" authtype="1" type="default,supl,dun" /> - <apn carrier="MMS Entel PCS" mcc="730" mnc="10" apn="mms.entelpcs.cl" user="entelpcs" password="entelpcs" mmsc="http://mmsc.entelpcs.cl" mmsproxy="10.99.0.10" mmsport="8080" authtype="1" type="mms" /> - <apn carrier="COMCEL" mcc="732" mnc="101" apn="internet.comcel.com.co" user="COMCELWEB" password="COMCELWEB" authtype="1" type="default,supl,dun" /> - <apn carrier="MMS Comcel 3GSM" mcc="732" mnc="101" apn="mms.comcel.com.co" user="COMCELMMS" password="COMCELMMS" mmsproxy="198.228.90.225" mmsport="8799" mmsc="http://www.comcel.com.co/mms/" authtype="1" type="mms" /> - <apn carrier="TIGO WEB" mcc="732" mnc="103" apn="web.colombiamovil.com.co" user="" password="" authtype="1" type="default,supl,dun" /> - <apn carrier="TIGO Multimedia" mcc="732" mnc="103" apn="mms.colombiamovil.com.co" user="mms-cm1900" password="mms-cm1900" mmsproxy="190.102.206.48" mmsport="8080" mmsc="http://mms.ola.com.co" authtype="1" type="mms" /> - <apn carrier="TIGO WEB" mcc="732" mnc="111" apn="web.colombiamovil.com.co" user="" password="" authtype="1" type="default,supl,dun" /> - <apn carrier="TIGO Multimedia" mcc="732" mnc="111" apn="mms.colombiamovil.com.co" user="mms-cm1900" password="mms-cm1900" mmsproxy="190.102.206.48" mmsport="8080" mmsc="http://mms.ola.com.co" authtype="1" type="mms" /> - <apn carrier="Movistar INTERNET" mcc="732" mnc="123" apn="internet.movistar.com.co" user="movistar" password="movistar" authtype="1" type="default,supl,dun" /> - <apn carrier="Movistar MMS" mcc="732" mnc="123" apn="mms.movistar.com.co" user="movistar" password="movistar" mmsproxy="192.168.222.7" mmsport="9001" mmsc="http://mms.movistar.com.co" authtype="1" type="mms" /> - <apn carrier="Digitel 412" mcc="734" mnc="01" apn="internet.digitel.ve" type="default,supl,dun" /> - <apn carrier="MMS" mcc="734" mnc="01" apn="expresate.digitel.ve" mmsproxy="10.99.0.10" mmsport="8080" mmsc="http://mms.412.com.ve/servlets/mms" type="mms" /> - <apn carrier="Digitel 412" mcc="734" mnc="02" apn="internet.digitel.ve" type="default,supl,dun" /> - <apn carrier="MMS" mcc="734" mnc="02" apn="expresate.digitel.ve" mmsproxy="10.99.0.10" mmsport="8080" mmsc="http://mms.412.com.ve/servlets/mms" type="mms" /> - <apn carrier="Digitel 412" mcc="734" mnc="03" apn="internet.digitel.ve" type="default,supl,dun" /> - <apn carrier="MMS" mcc="734" mnc="03" apn="expresate.digitel.ve" mmsproxy="10.99.0.10" mmsport="8080" mmsc="http://mms.412.com.ve/servlets/mms" type="mms" /> - <apn carrier="Movistar INTERNET" mcc="734" mnc="04" apn="internet.movistar.ve" type="default,supl,dun" /> - <apn carrier="Movistar MMS" mcc="734" mnc="04" apn="mms.movistar.ve" mmsproxy="200.35.64.73" mmsport="9001" mmsc="http://mms.movistar.com.ve:8088/mms" type="mms" /> - <apn carrier="Movistar WAP" mcc="734" mnc="04" apn="wap.movistar.ve" mmsproxy="200.35.64.73" mmsport="9001" type="default,supl,dun" /> - <apn carrier="MODEM" mcc="734" mnc="06" apn="int.movilnet.com.ve" type="default,supl,dun" /> - <apn carrier="MMS" mcc="734" mnc="06" apn="mm.movilnet.com.ve" mmsproxy="192.168.16.12" mmsport="8080" mmsc="http://mms2.movilnet.com.ve/servlets/mms" type="mms" /> - <apn carrier="VIVA3G" mcc="736" mnc="01" apn="internet.nuevatel.com" user="" password="" proxy="192.168.101.4" port="3128" authtype="1" type="default,supl,dun" /> - <apn carrier="VIVAMMS" mcc="736" mnc="01" apn="mms.nuevatel.com" user="" password="" mmsproxy="192.168.101.4" mmsport="3128" mmsc="http://mmsgw.nuevatel.com:1981" authtype="1" type="mms" /> - <apn carrier="ENTEL WAP GPRS" mcc="736" mnc="02" apn="wap.movil.com.bo" user="" password="" proxy="172.27.7.10" port="8080" authtype="1" type="default,supl,dun" /> - <apn carrier="ENTEL MMS GPRS" mcc="736" mnc="02" apn="mms.movil.com.bo" user="" password="" mmsproxy="172.27.7.10" mmsport="8080" mmsc="http://mms.movil.com.bo/servlets/mms" authtype="1" type="mms" /> - <apn carrier="WAPTIGO" mcc="736" mnc="03" apn="wap.tigo.bo" user="" password="" proxy="172.25.100.8" port="8080" authtype="1" type="default,supl,dun" /> - <apn carrier="MMSTIGO" mcc="736" mnc="03" apn="mms.tigo.bo" user="" password="" mmsproxy="172.25.100.8" mmsport="8080" mmsc="http://mms" authtype="1" type="mms" /> - <apn carrier="Digicel" mcc="738" mnc="01" apn="default" type="default,supl" /> - <apn carrier="GT&T Cellink Plus" mcc="738" mnc="02" apn="default" type="default,supl" /> - <apn carrier="Movistar INTERNET" mcc="740" mnc="00" apn="internet.movistar.com.ec" user="movistar" password="movistar" authtype="1" type="default,supl,dun" /> - <apn carrier="Movistar MMS" mcc="740" mnc="00" apn="mms.movistar.com.ec" user="movistar" password="movistar" mmsproxy="10.3.5.50" mmsport="9001" mmsc="http://mms.movistar.com.ec:8088/mms/" authtype="1" type="mms" /> - <apn carrier="Internet Claro" mcc="740" mnc="01" apn="internet.claro.com.ec" type="default,supl,dun" /> - <apn carrier="MMS Claro" mcc="740" mnc="01" apn="mms.claro.com.ec" user="portamms" password="portamms2003" mmsproxy="216.250.208.94" mmsport="8799" mmsc="http://iesmms.porta.com.ec/" authtype="1" type="mms" /> - <apn carrier="Internet Claro" mcc="740" mnc="010" apn="internet.claro.com.ec" type="default,supl,dun" /> - <apn carrier="MMS Claro" mcc="740" mnc="010" apn="mms.claro.com.ec" user="portamms" password="portamms2003" mmsproxy="216.250.208.94" mmsport="8799" mmsc="http://iesmms.porta.com.ec/" authtype="1" type="mms" /> - <apn carrier="CNT 3G" mcc="740" mnc="02" apn="internet3gsp.alegro.net.ec" type="default,supl,dun" /> - <apn carrier="CNT MMS" mcc="740" mnc="02" apn="mms.alegro.net.ec" mmsproxy="10.4.85.3" mmsport="8080" mmsc="http://mms.alegro.net.ec/mms/" type="mms" /> - <apn carrier="VOX INTERNET" mcc="744" mnc="01" apn="vox.internet" authtype="1" type="default,supl,dun" /> - <apn carrier="VOX MMS" mcc="744" mnc="01" apn="vox.mms" user="vox" password="vox" mmsproxy="172.24.97.29" mmsport="8080" mmsc="http://mms.vox.com.py/mmsc" authtype="1" type="mms" /> - <apn carrier="Claro PY" mcc="744" mnc="02" apn="igprs.claro.com.py" user="ctigprs" password="ctigprs999" authtype="1" type="default,supl,dun" /> - <apn carrier="MMS GPRS PY" mcc="744" mnc="02" apn="mms.ctimovil.com.py" user="ctimms" password="ctimms999" mmsproxy="170.51.255.240" mmsport="8080" mmsc="http://mms.ctimovil.com.py" authtype="1" type="mms" /> - <apn carrier="TIGO PY" mcc="744" mnc="04" apn="internet.tigo.py" authtype="1" type="default,supl,dun" /> - <apn carrier="MMS Tigo" mcc="744" mnc="04" apn="mms.tigo.py" user="tigo" password="tigo" mmsproxy="10.16.17.12" mmsport="8888" mmsc="http://mms" authtype="1" type="mms" /> - <apn carrier="Personal Datos Py" mcc="744" mnc="05" apn="internet" user="personal" password="personal" authtype="1" type="default,supl,dun" /> - <apn carrier="Personal MMS Py" mcc="744" mnc="05" apn="mms" user="mms" password="mms" mmsproxy="172.16.192.7" mmsport="8080" mmsc="http://mms" authtype="1" type="mms" /> - <apn carrier="Telesur" mcc="746" mnc="02" apn="default" type="default,supl" /> - <apn carrier="wapANCEL" mcc="748" mnc="01" apn="wap" proxy="200.40.246.2" port="3128" user="" password="" authtype="1" type="default,supl,dun" /> - <apn carrier="mmsANCEL" mcc="748" mnc="01" apn="mms" user="" password="" mmsproxy="200.40.246.2" mmsport="3128" mmsc="http://mmsc.mms.ancelutil.com.uy" authtype="1" type="mms" /> - <apn carrier="gprsANCEL" mcc="748" mnc="01" apn="gprs.ancel" authtype="1" type="default,supl,dun" /> - <apn carrier="Movistar INTERNET" mcc="748" mnc="07" apn="webapn.movistar.com.uy" user="movistar" password="movistar" authtype="1" type="default,supl,dun" /> - <apn carrier="Movistar MMS" mcc="748" mnc="07" apn="apnmms.movistar.com.uy" user="mmsuy" password="mmsuy" mmsproxy="10.0.2.29" mmsport="8080" mmsc="http://mmsc.movistar.com.uy" authtype="1" type="mms" /> - <apn carrier="Claro UY" mcc="748" mnc="10" apn="igprs.claro.com.uy" user="ctigprs" password="ctigprs999" authtype="1" type="default,supl,dun" /> - <apn carrier="MMS GPRS UY" mcc="748" mnc="10" apn="mms.ctimovil.com.uy" user="ctimms" password="ctimms999" mmsproxy="170.51.255.240" mmsport="8080" mmsc="http://mms.ctimovil.com.uy" authtype="1" type="mms" /> - <apn carrier="Orange Armenia MMS" mcc="283" mnc="10" apn="mms" mmsc="http://mms/" mmsproxy="192.168.220.251" mmsport="3128" type="mms" authtype="1" /> - <apn carrier="Orange Armenia Internet" mcc="283" mnc="10" apn="Internet" type="default" authtype="1" /> - <apn carrier="Orange BW MMS" mcc="652" mnc="02" apn="mms.orange.co.bw" mmsc="http://10.0.0.242/servlets/mms" mmsproxy="10.0.0.226" mmsport="8080" type="mms" /> - <apn carrier="Orange WAP BW" mcc="652" mnc="02" apn="internet.orange.co.bw" proxy="10.0.0.226" port="8080" type="default" /> - <apn carrier="Orangeweb" mcc="340" mnc="01" apn="orangeweb" user="orange" password="orange" type="default" /> - <apn carrier="Orange CM" mcc="624" mnc="02" apn="orangecmgprs" user="orange" password="orange" proxy="192.168.122.101" port="8080" mmsc="http://mms.orange.cm" mmsproxy="192.168.122.101" mmsport="8080" type="default,mms" /> - <apn carrier="Orange net KE" mcc="639" mnc="07" apn="bew.orange.co.ke" type="default" /> - <apn carrier="Orange RE" mcc="647" mnc="00" apn="orangerun" user="orange" password="orange" type="default" /> - <apn carrier="Orange MG MMS" mcc="646" mnc="02" apn="orangemms" user="mms" password="orange" mmsc="http://10.152.10.70.38090" mmsproxy="10.150.0.115" mmsport="8080" type="mms" /> - <apn carrier="Orange World MG" mcc="646" mnc="02" apn="orangeworld" user="world" password="orange" proxy="10.150.0.115" port="8080" type="default" /> - <apn carrier="Verizon" mcc="310" mnc="004" apn="internet" type="default,mms,dun" mmsc="http://mms.vtext.com/servlets/mms" protocol="IPV4V6" /> - <apn carrier="Verizon Internet" mcc="310" mnc="004" apn="VZWINTERNET" type="default,dun" protocol="IPV4V6" roaming_protocol="IPV4V6" /> - <apn carrier="Verizon FOTA" mcc="310" mnc="004" apn="VZWADMIN" type="fota" protocol="IPV4V6" roaming_protocol="IPV4V6" /> - <apn carrier="Verizon IMS" mcc="310" mnc="004" apn="VZWIMS" type="ims" protocol="IPV4V6" roaming_protocol="IPV4V6" /> - <apn carrier="Verizon CBS" mcc="310" mnc="004" apn="VZWAPP" type="cbs,mms" mmsc="http://mms.vtext.com/servlets/mms" protocol="IPV4V6" roaming_protocol="IPV4V6" /> - <apn carrier="Verizon" mcc="310" mnc="012" apn="vzwinternet" type="internet,mms" mmsc="http://mms.vtext.com/servlets/mms" port="80" /> - <apn carrier="LTE - Verizon Internet" mcc="311" mnc="480" apn="VZWINTERNET" type="default,dun" protocol="IPV4V6" roaming_protocol="IPV4V6" bearer="6" /> - <apn carrier="LTE - Verizon Internet" mcc="311" mnc="480" apn="VZWINTERNET" type="default,dun" protocol="IPV4V6" roaming_protocol="IPV4V6" bearer="7" /> - <apn carrier="LTE - Verizon Internet" mcc="311" mnc="480" apn="VZWINTERNET" type="default,dun" protocol="IPV4V6" roaming_protocol="IPV4V6" bearer="8" /> - <apn carrier="LTE - Verizon Internet" mcc="311" mnc="480" apn="VZWINTERNET" type="default,dun" protocol="IPV4V6" roaming_protocol="IPV4V6" bearer="12" /> - <apn carrier="LTE - Verizon Internet" mcc="311" mnc="480" apn="VZWINTERNET" type="default,dun" protocol="IPV4V6" roaming_protocol="IPV4V6" bearer="14" /> - <apn carrier="LTE - Verizon FOTA" mcc="311" mnc="480" apn="VZWADMIN" type="fota" protocol="IPV4V6" roaming_protocol="IPV4V6" bearer="14" /> - <apn carrier="LTE - Verizon IMS" mcc="311" mnc="480" apn="VZWIMS" type="ims" protocol="IPV4V6" roaming_protocol="IPV4V6" bearer="14" /> - <apn carrier="Verizon" mcc="311" mnc="480" apn="VZWAPP" type="cbs,mms" mmsc="http://mms.vtext.com/servlets/mms" protocol="IPV4V6" roaming_protocol="IPV4V6" bearer="14" /> - <apn carrier="LTE - VZW Roaming Internet" mcc="204" mnc="04" apn="VZWINTERNET" type="default,dun" protocol="IPV4V6" roaming_protocol="IPV4V6" bearer="14" /> - <apn carrier="LTE - VZW Roaming FOTA" mcc="204" mnc="04" apn="VZWADMIN" type="fota" protocol="IPV4V6" roaming_protocol="IPV4V6" bearer="14" /> - <apn carrier="LTE - VZW Roaming IMS" mcc="204" mnc="04" apn="VZWIMS" type="ims" protocol="IPV4V6" roaming_protocol="IPV4V6" bearer="14" /> - <apn carrier="LTE - VZW Roaming CBS" mcc="204" mnc="04" apn="VZWAPP" type="cbs,mms" mmsc="http://mms.vtext.com/servlets/mms" protocol="IPV4V6" roaming_protocol="IPV4V6" bearer="14" /> - <apn carrier="LTE - Test Internet" mcc="001" mnc="01" apn="VZWINTERNET" type="default,dun" protocol="IPV4V6" roaming_protocol="IPV4V6" bearer="14" /> - <apn carrier="LTE - Test FOTA" mcc="001" mnc="01" apn="VZWADMIN" type="fota" protocol="IPV4V6" roaming_protocol="IPV4V6" bearer="14" /> - <apn carrier="LTE - Test IMS" mcc="001" mnc="01" apn="VZWIMS" type="ims" protocol="IPV4V6" roaming_protocol="IPV4V6" bearer="14" /> - <apn carrier="LTE - Test CBS" mcc="001" mnc="01" apn="VZWAPP" type="cbs,mms" mmsc="http://mms.vtext.com/servlets/mms" protocol="IPV4V6" roaming_protocol="IPV4V6" bearer="14" /> - <apn carrier="LTE - VZW Test Internet" mcc="001" mnc="010" apn="VZWINTERNET" type="default,dun" protocol="IPV4V6" roaming_protocol="IPV4V6" bearer="14" /> - <apn carrier="LTE - VZW Test FOTA" mcc="001" mnc="010" apn="VZWADMIN" type="fota" protocol="IPV4V6" roaming_protocol="IPV4V6" bearer="14" /> - <apn carrier="LTE - VZW Test IMS" mcc="001" mnc="010" apn="VZWIMS" type="ims" protocol="IPV4V6" roaming_protocol="IPV4V6" bearer="14" /> - <apn carrier="LTE - VZW Test CBS" mcc="001" mnc="010" apn="VZWAPP" type="cbs,mms" mmsc="http://mms.vtext.com/servlets/mms" protocol="IPV4V6" roaming_protocol="IPV4V6" bearer="14" /> - <apn carrier="LTE - VZW Test Internet" mcc="246" mnc="81" apn="VZWINTERNET" type="default,dun" protocol="IPV4V6" roaming_protocol="IPV4V6" bearer="14" /> - <apn carrier="LTE - VZW Test FOTA" mcc="246" mnc="81" apn="VZWADMIN" type="fota" protocol="IPV4V6" roaming_protocol="IPV4V6" bearer="14" /> - <apn carrier="LTE - VZW Test IMS" mcc="246" mnc="81" apn="VZWIMS" type="ims" protocol="IPV4V6" roaming_protocol="IPV4V6" bearer="14" /> - <apn carrier="LTE - VZW Test CBS" mcc="246" mnc="81" apn="VZWAPP" type="cbs,mms" mmsc="http://mms.vtext.com/servlets/mms" protocol="IPV4V6" roaming_protocol="IPV4V6" bearer="14" /> - <apn carrier="LTE - VZW Test Internet" mcc="246" mnc="081" apn="VZWINTERNET" type="default,dun" protocol="IPV4V6" roaming_protocol="IPV4V6" bearer="14" /> - <apn carrier="LTE - VZW Test FOTA" mcc="246" mnc="081" apn="VZWADMIN" type="fota" protocol="IPV4V6" roaming_protocol="IPV4V6" bearer="14" /> - <apn carrier="LTE - VZW Test IMS" mcc="246" mnc="081" apn="VZWIMS" type="ims" protocol="IPV4V6" roaming_protocol="IPV4V6" bearer="14" /> - <apn carrier="LTE - VZW Test CBS" mcc="246" mnc="081" apn="VZWAPP" type="cbs,mms" mmsc="http://mms.vtext.com/servlets/mms" protocol="IPV4V6" roaming_protocol="IPV4V6" bearer="14" /> - <apn carrier="EHRPD - Verizon Internet" mcc="311" mnc="480" apn="VZWINTERNET" type="default,dun" protocol="IPV4V6" roaming_protocol="IPV4V6" bearer="13" /> - <apn carrier="EHRPD - Verizon FOTA" mcc="311" mnc="480" apn="VZWADMIN" type="fota" protocol="IPV4V6" roaming_protocol="IPV4V6" bearer="13" /> - <apn carrier="EHRPD - Verizon IMS" mcc="311" mnc="480" apn="VZWIMS" type="ims" protocol="IPV4V6" roaming_protocol="IPV4V6" bearer="13" /> - <apn carrier="EHRPD - VZW Roaming Internet" mcc="204" mnc="04" apn="VZWINTERNET" type="default,dun" protocol="IPV4V6" roaming_protocol="IPV4V6" bearer="13" /> - <apn carrier="EHRPD - VZW Roaming FOTA" mcc="204" mnc="04" apn="VZWADMIN" type="fota" protocol="IPV4V6" roaming_protocol="IPV4V6" bearer="13" /> - <apn carrier="EHRPD - VZW Roaming IMS" mcc="204" mnc="04" apn="VZWIMS" type="ims" protocol="IPV4V6" roaming_protocol="IPV4V6" bearer="13" /> - <apn carrier="EHRPD - VZW Roaming CBS" mcc="204" mnc="04" apn="VZWAPP" type="cbs,mms" mmsc="http://mms.vtext.com/servlets/mms" protocol="IPV4V6" roaming_protocol="IPV4V6" bearer="13" /> - <apn carrier="EHRPD - Test Internet" mcc="001" mnc="01" apn="VZWINTERNET" type="default,dun" protocol="IPV4V6" roaming_protocol="IPV4V6" bearer="13" /> - <apn carrier="EHRPD - Test FOTA" mcc="001" mnc="01" apn="VZWADMIN" type="fota" protocol="IPV4V6" roaming_protocol="IPV4V6" bearer="13" /> - <apn carrier="EHRPD - Test IMS" mcc="001" mnc="01" apn="VZWIMS" type="ims" protocol="IPV4V6" roaming_protocol="IPV4V6" bearer="13" /> - <apn carrier="EHRPD - Test CBS" mcc="001" mnc="01" apn="VZWAPP" type="cbs,mms" mmsc="http://mms.vtext.com/servlets/mms" protocol="IPV4V6" roaming_protocol="IPV4V6" bearer="13" /> - <apn carrier="EHRPD - VZW Test Internet" mcc="001" mnc="010" apn="VZWINTERNET" type="default,dun" protocol="IPV4V6" roaming_protocol="IPV4V6" bearer="13" /> - <apn carrier="EHRPD - VZW Test FOTA" mcc="001" mnc="010" apn="VZWADMIN" type="fota" protocol="IPV4V6" roaming_protocol="IPV4V6" bearer="13" /> - <apn carrier="EHRPD - VZW Test IMS" mcc="001" mnc="010" apn="VZWIMS" type="ims" protocol="IPV4V6" roaming_protocol="IPV4V6" bearer="13" /> - <apn carrier="EHRPD - VZW Test CBS" mcc="001" mnc="010" apn="VZWAPP" type="cbs,mms" mmsc="http://mms.vtext.com/servlets/mms" protocol="IPV4V6" roaming_protocol="IPV4V6" bearer="13" /> - <apn carrier="EHRPD - VZW Test Internet" mcc="246" mnc="81" apn="VZWINTERNET" type="default,dun" protocol="IPV4V6" roaming_protocol="IPV4V6" bearer="13" /> - <apn carrier="EHRPD - VZW Test FOTA" mcc="246" mnc="81" apn="VZWADMIN" type="fota" protocol="IPV4V6" roaming_protocol="IPV4V6" bearer="13" /> - <apn carrier="EHRPD - VZW Test IMS" mcc="246" mnc="81" apn="VZWIMS" type="ims" protocol="IPV4V6" roaming_protocol="IPV4V6" bearer="13" /> - <apn carrier="EHRPD - VZW Test CBS" mcc="246" mnc="81" apn="VZWAPP" type="cbs,mms" mmsc="http://mms.vtext.com/servlets/mms" protocol="IPV4V6" roaming_protocol="IPV4V6" bearer="13" /> - <apn carrier="EHRPD - VZW Test Internet" mcc="246" mnc="081" apn="VZWINTERNET" type="default,dun" protocol="IPV4V6" roaming_protocol="IPV4V6" bearer="13" /> - <apn carrier="EHRPD - VZW Test FOTA" mcc="246" mnc="081" apn="VZWADMIN" type="fota" protocol="IPV4V6" roaming_protocol="IPV4V6" bearer="13" /> - <apn carrier="EHRPD - VZW Test IMS" mcc="246" mnc="081" apn="VZWIMS" type="ims" protocol="IPV4V6" roaming_protocol="IPV4V6" bearer="13" /> - <apn carrier="EHRPD - VZW Test CBS" mcc="246" mnc="081" apn="VZWAPP" type="cbs,mms" mmsc="http://mms.vtext.com/servlets/mms" protocol="IPV4V6" roaming_protocol="IPV4V6" bearer="13" /> - <apn carrier="Megafon MMS" mcc="250" mnc="02" apn="mms" user="mms" password="mms" mmsc="http://mmsc:8002" mmsproxy="10.10.10.10" mmsport="8080" authtype="1" type="mms" /> - <apn carrier="Megafon MMS" mcc="250" mnc="002" apn="mms" user="mms" password="mms" mmsc="http://mmsc:8002" mmsproxy="10.10.10.10" mmsport="8080" authtype="1" type="mms" /> - <apn carrier="Megafon MMS" mcc="250" mnc="02" apn="mms" user="mms" password="mms" mmsc="http://mmsc:8002" mmsproxy="10.10.10.10" mmsport="8080" authtype="0" type="mms" /> - <apn carrier="Megafon MMS" mcc="250" mnc="002" apn="mms" user="mms" password="mms" mmsc="http://mmsc:8002" mmsproxy="10.10.10.10" mmsport="8080" authtype="0" type="mms" /> - <apn carrier="MetroPCS LTE" mcc="311" mnc="660" apn="internet.metropcs" user="" password="" mmsc="http://mms.metropcs.net:3128/mmsc" mmsproxy="" mmsport="" authtype="0" type="default,hipri,admin,mms" /> - <apn carrier="MetroPCS IMS" mcc="311" mnc="660" apn="ims.metropcs" user="" password="" mmsc="http://mms.metropcs.net:3128/mmsc" mmsproxy="" mmsport="" authtype="0" type="ims" /> - <apn carrier="LTE INTERNET" mcc="310" mnc="090" apn="4g.mycricket.com" user="" password="" mmsc="http://mms.mycricket.com/servlets/mms" mmsproxy="" mmsport="" authtype="0" type="default,dun,mms" /> - <apn carrier="LTE INTERNET" mcc="310" mnc="90" apn="4g.mycricket.com" user="" password="" mmsc="http://mms.mycricket.com/servlets/mms" mmsproxy="" mmsport="" authtype="0" type="default,dun,mms" /> - <apn carrier="LTE ADMIN" mcc="310" mnc="090" apn="Apnota.4g.mycricket.com" user="" password="" mmsc="http://mms.mycricket.com/servlets/mms" mmsproxy="" mmsport="" authtype="0" type="default,dun,mms" /> - <apn carrier="LTE ADMIN" mcc="310" mnc="90" apn="Apnota.4g.mycricket.com" user="" password="" mmsc="http://mms.mycricket.com/servlets/mms" mmsproxy="" mmsport="" authtype="0" type="default,dun,mms" /> - <apn carrier="LTE DNSADMIN" mcc="310" mnc="090" apn="apndnsota.4g.mycricket.com" user="" password="" mmsc="http://mms.mycricket.com/servlets/mms" mmsproxy="" mmsport="" authtype="0" type="fota" /> - <apn carrier="LTE DNSADMIN" mcc="310" mnc="90" apn="apndnsota.4g.mycricket.com" user="" password="" mmsc="http://mms.mycricket.com/servlets/mms" mmsproxy="" mmsport="" authtype="0" type="fota" /> - <apn carrier="Virgin Mobile" mcc="311" mnc="490" apn="0" user="" password="" mmsc="http://mmsc.vmobl.com:8088/mms?" mmsproxy="205.239.233.136" mmsport="81" authtype="0" type="mms" /> - <apn carrier="USCC" mcc="311" mnc="220" apn="internet" user="" password="" mmsc="http://mmsc1.uscc.net/mmsc/MMS" mmsproxy="" mmsport="80" authtype="3" type="mms" /> - <apn carrier="USCC" mcc="311" mnc="220" apn="internet" user="" password="" mmsc="http://mmsc1.uscc.net/mmsc/MMS" mmsproxy="" mmsport="80" authtype="3" type="mms" /> - <apn carrier="USCC INTERNET" mcc="311" mnc="580" apn="usccinternet" user="" password="" mmsc="http://mmsc1.uscc.net/mmsc/MMS" mmsproxy="" mmsport="" type="default,dun,mms,fota" /> - <apn carrier="USCC INTERNET 2" mcc="311" mnc="225" apn="usccinternet" user="" password="" mmsc="http://mmsc1.uscc.net/mmsc/MMS" mmsproxy="" mmsport="" type="default,dun,mms,fota" /> - <apn carrier="3" mcc="454" mnc="04" apn="mobile.three.com.hk" user="" password="" mmsc="http://mms.um.three.com.hk:10021/mmsc" mmsproxy="mms.three.com.hk" mmsport="8799" type="" /> - <apn carrier="3" mcc="454" mnc="004" apn="mobile.three.com.hk" user="" password="" mmsc="http://mms.um.three.com.hk:10021/mmsc" mmsproxy="mms.three.com.hk" mmsport="8799" type="" /> - <apn carrier="CMHK MMS" mcc="454" mnc="012" apn="cmhk" mmsc="http://mms.hk.chinamobile.com/mms" type="mms" /> - <apn carrier="CMHK MMS" mcc="454" mnc="013" apn="cmhk" mmsc="http://mms.hk.chinamobile.com/mms" type="mms" /> - <apn carrier="one2free" mcc="454" mnc="18" apn="hkcsl" mmsc="http://192.168.58.171:8002" mmsproxy="192.168.59.51" mmsport="8080" authtype="3" type="default,supl,mms" /> - <apn carrier="one2free" mcc="454" mnc="018" apn="hkcsl" mmsc="http://192.168.58.171:8002" mmsproxy="192.168.59.51" mmsport="8080" authtype="3" type="default,supl,mms" /> - <apn carrier="one2free" mcc="454" mnc="02" apn="hkcsl" mmsc="http://192.168.58.171:8002" mmsproxy="192.168.59.51" mmsport="8080" authtype="3" type="default,supl,mms" /> - <apn carrier="one2free" mcc="454" mnc="002" apn="hkcsl" mmsc="http://192.168.58.171:8002" mmsproxy="192.168.59.51" mmsport="8080" authtype="3" type="default,supl,mms" /> - <apn carrier="one2free" mcc="454" mnc="00" apn="hkcsl" mmsc="http://192.168.58.171:8002" mmsproxy="192.168.59.51" mmsport="8080" authtype="3" type="default,supl,mms" /> - <apn carrier="one2free" mcc="454" mnc="000" apn="hkcsl" mmsc="http://192.168.58.171:8002" mmsproxy="192.168.59.51" mmsport="8080" authtype="3" type="default,supl,mms" /> - <apn carrier="PCCW-HKT" mcc="454" mnc="20" apn="pccw" mmsc="http://3gmms.pccwmobile.com:8080/was" mmsproxy="10.140.14.10" mmsport="8080" authtype="1" type="default,supl,mms" /> - <apn carrier="PCCW-HKT" mcc="454" mnc="020" apn="pccw" mmsc="http://3gmms.pccwmobile.com:8080/was" mmsproxy="10.140.14.10" mmsport="8080" authtype="1" type="default,supl,mms" /> - <apn carrier="PCCW-HKT" mcc="454" mnc="29" apn="pccw" mmsc="http://3gmms.pccwmobile.com:8080/was" mmsproxy="10.140.14.10" mmsport="8080" authtype="1" type="default,supl,mms" /> - <apn carrier="PCCW-HKT" mcc="454" mnc="029" apn="pccw" mmsc="http://3gmms.pccwmobile.com:8080/was" mmsproxy="10.140.14.10" mmsport="8080" authtype="1" type="default,supl,mms" /> - <apn carrier="PCCW-HKT" mcc="454" mnc="20" apn="pccw" mmsc="http://mms.pccw-hkt.com:8080" mmsproxy="10.140.14.10" mmsport="8080" authtype="1" type="default,supl,mms" /> - <apn carrier="PCCW-HKT" mcc="454" mnc="020" apn="pccw" mmsc="http://mms.pccw-hkt.com:8080" mmsproxy="10.140.14.10" mmsport="8080" authtype="1" type="default,supl,mms" /> - <apn carrier="PCCW-HKT" mcc="454" mnc="29" apn="pccw" mmsc="http://mms.pccw-hkt.com:8080" mmsproxy="10.140.14.10" mmsport="8080" authtype="1" type="default,supl,mms" /> - <apn carrier="PCCW-HKT" mcc="454" mnc="029" apn="pccw" mmsc="http://mms.pccw-hkt.com:8080" mmsproxy="10.140.14.10" mmsport="8080" authtype="1" type="default,supl,mms" /> - <apn carrier="PCCW-HKT" mcc="454" mnc="16" apn="pccw" mmsc="http://mms.pccw-hkt.com:8080" mmsproxy="10.140.14.10" mmsport="8080" authtype="1" type="default,supl,mms" /> - <apn carrier="PCCW-HKT" mcc="454" mnc="016" apn="pccw" mmsc="http://mms.pccw-hkt.com:8080" mmsproxy="10.140.14.10" mmsport="8080" authtype="1" type="default,supl,mms" /> - <apn carrier="PCCW-HKT" mcc="454" mnc="19" apn="pccw" mmsc="http://mms.pccw-hkt.com:8080" mmsproxy="10.140.14.10" mmsport="8080" authtype="1" type="default,supl,mms" /> - <apn carrier="PCCW-HKT" mcc="454" mnc="019" apn="pccw" mmsc="http://mms.pccw-hkt.com:8080" mmsproxy="10.140.14.10" mmsport="8080" authtype="1" type="default,supl,mms" /> - <apn carrier="CTBC" mcc="724" mnc="32" apn="mms.ctbc.br" mmsc="http://mms.ctbccelular.com.br/was" mmsproxy="172.29.7.70" mmsport="8080" authtype="1" type="default,supl,mms" /> - <apn carrier="CTBC" mcc="724" mnc="032" apn="mms.ctbc.br" mmsc="http://mms.ctbccelular.com.br/was" mmsproxy="172.29.7.70" mmsport="8080" authtype="1" type="default,supl,mms" /> - <apn carrier="CTBC" mcc="724" mnc="33" apn="mms.ctbc.br" mmsc="http://mms.ctbccelular.com.br/was" mmsproxy="172.29.7.70" mmsport="8080" authtype="1" type="default,supl,mms" /> - <apn carrier="CTBC" mcc="724" mnc="033" apn="mms.ctbc.br" mmsc="http://mms.ctbccelular.com.br/was" mmsproxy="172.29.7.70" mmsport="8080" authtype="1" type="default,supl,mms" /> - <apn carrier="CTBC" mcc="724" mnc="34" apn="mms.ctbc.br" mmsc="http://mms.ctbccelular.com.br/was" mmsproxy="172.29.7.70" mmsport="8080" authtype="1" type="default,supl,mms" /> - <apn carrier="CTBC" mcc="724" mnc="034" apn="mms.ctbc.br" mmsc="http://mms.ctbccelular.com.br/was" mmsproxy="172.29.7.70" mmsport="8080" authtype="1" type="default,supl,mms" /> - <apn carrier="Nextel" mcc="724" mnc="39" apn="mms.nextel3g.net.br" mmsc="http://3gmms.nextel3g.net.br" mmsproxy="129.192.129.104" mmsport="8080" authtype="1" type="mms" /> - <apn carrier="Nextel" mcc="724" mnc="039" apn="mms.nextel3g.net.br" mmsc="http://3gmms.nextel3g.net.br" mmsproxy="129.192.129.104" mmsport="8080" authtype="1" type="mms" /> - <apn carrier="Sercomtel" mcc="724" mnc="15" apn="mms.sercomtel.com.br" mmsc="http://mms.claro.com.br" mmsproxy="200.169.126.10" mmsport="8799" authtype="1" type="mms" /> - <apn carrier="Sercomtel" mcc="724" mnc="015" apn="mms.sercomtel.com.br" mmsc="http://mms.claro.com.br" mmsproxy="200.169.126.10" mmsport="8799" authtype="1" type="mms" /> - <apn carrier="Vivo MMS" mcc="724" mnc="01" apn="mms.vivo.com.br" user="vivo" password="vivo" mmsc="http://termnat.vivomms.com.br:8088/mms" mmsproxy="200.142.130.104" mmsport="80" authtype="1" protocol="IPV4V6" type="mms" /> - <apn carrier="Vivo MMS" mcc="724" mnc="01" apn="mms.vivo.com.br" user="vivo" password="vivo" mmsc="http://termnat.vivomms.com.br:8088/mms" mmsproxy="200.142.130.104" mmsport="80" authtype="1" protocol="IPV4V6" type="mms" /> - <apn carrier="Vivo MMS" mcc="724" mnc="001" apn="mms.vivo.com.br" user="vivo" password="vivo" mmsc="http://termnat.vivomms.com.br:8088/mms" mmsproxy="200.142.130.104" mmsport="80" authtype="1" protocol="IPV4V6" type="mms" /> - <apn carrier="Vivo MMS" mcc="724" mnc="19" apn="mms.vivo.com.br" user="vivo" password="vivo" mmsc="http://termnat.vivomms.com.br:8088/mms" mmsproxy="200.142.130.104" mmsport="80" authtype="1" protocol="IPV4V6" type="mms" /> - <apn carrier="Vivo MMS" mcc="724" mnc="019" apn="mms.vivo.com.br" user="vivo" password="vivo" mmsc="http://termnat.vivomms.com.br:8088/mms" mmsproxy="200.142.130.104" mmsport="80" authtype="1" protocol="IPV4V6" type="mms" /> - <apn carrier="Boost Mobile" mcc="311" mnc="870" mmsc="http://mm.myboostmobile.com" mmsproxy="68.28.31.7" mmsport="80" type="mms"/> - - <!-- SPRINT --> - <apn carrier="Sprint" mcc="310" mnc="120" apn="sprint" type="default,supl,mms,ims,cbs" mmsc="http://mms.sprintpcs.com" mmsproxy="68.28.31.7" mmsport="80" bearer="6" /> - <apn carrier="Sprint" mcc="312" mnc="530" apn="sprint" mmsc="http://mms.sprintpcs.com" mmsproxy="68.28.31.7" mmsport="80" type="mms" /> - <apn carrier="Sprint" mcc="311" mnc="490" apn="sprint" mmsc="http://mms.sprintpcs.com" mmsproxy="68.28.31.7" mmsport="80" type="mms" /> - - <!-- SOLAVEI --> - <apn carrier="Solavei" mcc="310" mnc="260" mmsc="http://solavei.mmsmvno.com/mms/wapenc" type="mms" /> - - <!-- NET10 --> - <!-- http://www.net10byop.com/program.php --> - <apn carrier="net10" mcc="310" mnc="410" apn="wap.tracfone" mmsc="http://mms.tracfone.com" type="mms" /> - - <!-- AT&T --> - <!-- See here for explanation of names: http://apn-settings.com/us/att-apn-settings/ --> - <apn carrier="AT&T 4G" mcc="310" mnc="410" apn="phone" type="default,mms,supl,fota" mmsc="http://mmsc.mobile.att.net" mmsproxy="proxy.mobile.att.net" mmsport="80" /> - <apn carrier="AT&T 3G/WAP" mcc="310" mnc="410" apn="wap.cingular" proxy="wireless.cingular.com" port="80" server="cingulargprs.com" mmsc="http://mmsc.cingular.com/" mmsproxy="wireless.cingular.com" type="default,supl,mms" /> - - <!-- Grameenphone --> - <apn carrier="Grameenphone" mcc="470" mnc="01" mmsc="http://mmsc.grameenphone.com/servlets/mms" type="mms" /> - - <!-- Airtel --> - <apn carrier="Airtel" mcc="470" mnc="07" mmsc="http://100.1.201.171:10021/mmsc" mmsproxy="100.1.201.172" mmsport="8799" type="mms" /> - - <!-- Straight Talk --> - <apn carrier="Straight Talk" mcc="310" mnc="410" mmsc="http://mms-tf.net" mmsproxy="mms3.tracfone.com" mmsport="80" type="mms"/> - - <!-- SMARTFREN --> - <!-- Note: they have to use different APNs based on what their phone number is... so we'll show - them both and hope they figure it out --> - <apn carrier="SMARTFREN 0881, 0882" mcc="510" mnc="09" mmsc="http://mmsc-jkt.smart-telecom.co.id" mmsproxy="10.17.27.250" mmsport="8080" type="mms" /> - <apn carrier="SMARTFREN 0887, 0888, 0889" mcc="510" mnc="09" mmsc="http://mmsc2.smartfren.com" mmsproxy="10.17.27.250" mmsport="8080" type="mms" /> - - <!-- Cricket --> - <apn carrier="Cricket" mcc="310" mnc="16" apn="wap.mycricket.com" user="\@mycricket.com" password="cricket" mmsc="http://mms.mycricket.com/servlets/mms" mmsproxy="" mmsport="" authtype="2" type="" /> - <apn carrier="Cricket" mcc="310" mnc="016" apn="wap.mycricket.com" user="\@mycricket.com" password="cricket" mmsc="http://mms.mycricket.com/servlets/mms" mmsproxy="" mmsport="" authtype="2" type="" /> - <apn carrier="Cricket" mcc="310" mnc="410" mmsc="http://mmsc.aiowireless.net" mmsproxy="proxy.aiowireless.net" mmsport="80" type="mms"/> - <apn carrier="Cricket" mcc="310" mnc="150" mmsc="http://mmsc.aiowireless.net" mmsproxy="proxy.aiowireless.net" mmsport="80" type="mms"/> - - <!-- TIGO --> - <!-- https://configredmovil.wordpress.com/tigo-apn/ --> - <apn carrier="TIGO" mcc="640" mnc="02" mmsc="http://mms" mmsproxy="10.16.17.12" mmsport="8888" type="mms"/> - - <!-- DSTCom --> - <apn carrier="DSTCom" mcc="528" mnc="11" mmsc="http://mms.dst.com.bn/mmsc" mmsproxy="10.100.6.101" mmsport="3130" type="mms" /> - - <!-- Vodacom (Mozambique) --> - <apn carrier="Vodacom" mcc="643" mnc="04" mmsc="http://mms.vm.co.mz" mmsproxy="10.201.47.14" mmsport="9201" type="mms" /> - - <!-- Virgin Mobile --> - <apn carrier="Virgin Mobile" mcc="310" mnc="000" mmsc="http://mmsc.vmobl.com:8088/mms?" mmsproxy="205.239.233.136" mmsport="81" type="mms" /> - - <!-- H2O --> - <!-- https://www.h2owirelessnow.com/mainControl.php?page=dataManualConfig --> - <apn carrier="H2O" mcc="310" mnc="410" mmsc="http://mmsc.cingular.com" mmsproxy="66.209.11.33" mmsport="80" type="mms" /> - - <!-- SpeakOut --> - <apn carrier="SpeakOut" mcc="302" mnc="720" mmsc="http://mms.gprs.rogers.com" mmsproxy="mmsproxy.rogers.com" mmsport="80" type="mms" /> - - <!-- Gibtel --> - <!-- http://wiki.melberi.com/2013/06/gibtelecom-gprs-mms-apn-settings-for.html#.VXI9FlxViko --> - <apn carrier="Gibtel" mcc="266" mnc="01" mmsc="http://mms:8081/" mmsproxy="172.017.000.005" mmsport="8080" type="mms" /> - - <!-- Ting --> - <apn carrier="Ting" mcc="310" mnc="260" mmsc="http://wholesale.mmsmvno.com/mms/wapenc" type="mms" /> - - <!-- Family Mobile --> - <!-- https://www.myfamilymobile.com/Support/DeviceSupport/DeviceSupport.aspx?device=a649a78a-bd94-457c-90a3-7c8b7ac7b1f8 --> - <apn carrier="Family Mobile" mcc="310" mnc="260" mmsc="http://wirelessfour.mmsmvno.com/mms/wapenc" type="mms" /> - - <!-- Dialog Mobile --> - <!-- http://www.mobilepctimes.com/2013/03/how-to-activate-gprs-and-mms-on-dialog.html --> - <apn carrier="Dialog Mobile" mcc="413" mnc="02" mmsc="http://mms.dialog.lk:3130/mmsc" mmsproxy="192.168.122.002" mmsport="8080" type="mms" /> - - <!-- NCell (nepal) --> - <apn carrier="Ncell" mcc="492" mnc="02" mmsc="http://10.68.1.149" mmsproxy="10.68.1.149" mmsport="8080" type="mms" /> -</apns> diff --git a/QKSMS/src/main/res/xml/google_analytics_tracker.xml b/QKSMS/src/main/res/xml/google_analytics_tracker.xml deleted file mode 100644 index 31a0cabcc..000000000 --- a/QKSMS/src/main/res/xml/google_analytics_tracker.xml +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> - -<resources> - <integer name="ga_sessionTimeout">300</integer> - <bool name="ga_autoActivityTracking">true</bool> - <string name="ga_trackingId">0</string> -</resources> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml/mms_config.xml b/QKSMS/src/main/res/xml/mms_config.xml deleted file mode 100644 index 19b13fe9b..000000000 --- a/QKSMS/src/main/res/xml/mms_config.xml +++ /dev/null @@ -1,112 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2009 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> - -<!-- Version History - version 1 - initial version. - version 2 - added recipientLimit. - version 3 - added min/max recycler values. - version 4 - added sms to mms text threshold. ---> - -<mms_config version="4"> - <!-- Flag indicating whether MMS should be enabled --> - <bool name="enabledMMS">true</bool> - - <!-- Maximum number of SMS message to save per thread before auto-delete kicks in. - This is the default value. --> - <int name="defaultSMSMessagesPerThread">500</int> - - <!-- Maximum number of MMS message to save per thread before auto-delete kicks in. - This is the default value. --> - <int name="defaultMMSMessagesPerThread">50</int> - - <!-- Minimum value for the number of messages kept per conversation. The user can never - set the limit below this value. --> - <int name="minMessageCountPerThread">10</int> - - <!-- Maximum value for the number of messages kept per conversation. The user can never - set the limit above this value. --> - <int name="maxMessageCountPerThread">5000</int> - - <!-- UAProf URL --> - <string name="uaProfUrl">http://www.google.com/oha/rdf/ua-profile-kila.xml</string> - - <!-- Maximum number of recipients allowed per message. Use a value of -1 - to indicate no limit. --> - <int name="recipientLimit">-1</int> - - <!-- If true, The text message over 160 characters will be sent in multi part. - If false, The text message over 160 characters will be sent - via multi media message. --> - <bool name="enableMultipartSMS">true</bool> - - <!-- If true, the text message will be split every 160 characters. - If false, the text will never be split before being sent. --> - <bool name="enableSplitSMS">false</bool> - - <!-- If enableMultipartSMS is true and smsToMmsTextThreshold > 1, then multi-part SMS messages - will be converted into a single mms message. For example, if the mms_config.xml file - specifies <int name="smsToMmsTextThreshold">7</int>, then on the 8th sms segment, the - message will be converted to an mms. --> - <int name="smsToMmsTextThreshold">-1</int> - - <!-- If true, The mms support slide duration. - If false, The mms does not support slide duration and we have to - set duration value. --> - <bool name="enableSlideDuration">true</bool> - - <!-- Maximum length for message text. Use a value of -1 - to indicate default value --> - <int name="maxMessageTextSize">-1</int> - - <!-- Hide Sprint VVM text messages. --> - <bool name="enableSprintVVM">false</bool> - - <!-- Default apn settings --> - <string name="mmsc"> </string> - <string name="mmsproxy"> </string> - <string name="mmsport"> </string> - - <!-- User-Agent parameter used in MMS http request --> - <!-- this is default to "Android-Mms/0.1". Override if necessary. Optional --> - <!-- - <string name="userAgent">Android-Mms/0.1</string> - --> - - <!-- UAProf parameter tag name --> - <!-- this is default to "x-wap-profile". Override if necessary. Optional --> - <!-- - <string name="uaProfTagName">x-wap-profile</string> - --> - - <!-- Reference for additional http parameters used in MMS http request. - Parameters are seperated by '|'. Optional. - --> - <!-- - <string name="httpParams"> - x-up-calling-line-id: ##LINE1##|x-carrier-magic: http://magic.google.com - </string> - --> - - <!-- Reference for the substitution key to be used when adding the users telephone number - (Line1) to the httpPrams at runtime. Optional. - --> - <!-- - <string name="httpParamsLine1Key">##LINE1##</string> - --> - - -</mms_config> diff --git a/QKSMS/src/main/res/xml/settings.xml b/QKSMS/src/main/res/xml/settings.xml deleted file mode 100644 index 4e0c11acd..000000000 --- a/QKSMS/src/main/res/xml/settings.xml +++ /dev/null @@ -1,183 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> - <Preference - android:defaultValue="-16746133" - android:key="pref_key_theme" /> - <Preference - android:defaultValue="@bool/hasL" - android:key="pref_key_status_tint" /> - <Preference - android:defaultValue="false" - android:key="pref_key_navigation_tint" /> - <Preference - android:defaultValue="false" - android:key="pref_key_night" /> - <Preference - android:defaultValue="false" - android:key="pref_key_night_amoled" /> - <Preference - android:defaultValue="true" - android:key="pref_key_colour_sent" /> - <Preference - android:defaultValue="false" - android:key="pref_key_colour_received" /> - <Preference - android:defaultValue="false" - android:key="pref_key_hide_avatar_conversations" /> - <Preference - android:defaultValue="true" - android:key="pref_key_hide_avatar_sent" /> - <Preference - android:defaultValue="false" - android:key="pref_key_hide_avatar_received" /> - <Preference - android:defaultValue="0" - android:key="pref_key_font_family" /> - <Preference - android:defaultValue="1" - android:key="pref_key_font_size" /> - <Preference - android:defaultValue="0" - android:key="pref_key_font_weight" /> - <Preference - android:defaultValue="false" - android:key="pref_key_message_count" /> - <Preference - android:defaultValue="false" - android:key="pref_key_24h" /> - <Preference - android:defaultValue="false" - android:key="pref_key_return" /> - - <!-- GENERAL --> - <Preference - android:defaultValue="true" - android:key="pref_key_auto_emoji" /> - <Preference - android:defaultValue="true" - android:key="pref_key_compose_favorites" /> - <Preference - android:defaultValue="false" - android:key="pref_key_prox_sensor_calling" /> - <Preference - android:defaultValue="0" - android:key="pref_key_enter_button" /> - <Preference - android:defaultValue="false" - android:key="pref_key_delivery" /> - <Preference - android:defaultValue="true" - android:key="pref_key_delivery_vibrate" /> - <Preference - android:defaultValue="false" - android:key="pref_key_mobile_only" /> - <Preference - android:defaultValue="false" - android:key="pref_key_delete_old_messages" /> - <Preference - android:defaultValue="7" - android:key="pref_key_delete_old_unread_messages" /> - <Preference - android:defaultValue="7" - android:key="pref_key_delete_old_read_messages" /> - <Preference - android:defaultValue="false" - android:key="pref_key_strip_unicode" /> - <Preference - android:defaultValue="false" - android:key="pref_key_split" /> - <Preference - android:defaultValue="true" - android:key="pref_key_split_counter" /> - <Preference - android:defaultValue="false" - android:key="pref_key_endlessjabber" /> - - <!-- NOTIFICATIONS --> - <Preference - android:defaultValue="true" - android:key="pref_key_notifications" /> - <Preference - android:defaultValue="true" - android:key="pref_key_led" /> - <Preference - android:defaultValue="-48060" - android:key="pref_key_theme_led" /> - <Preference - android:defaultValue="false" - android:key="pref_key_wake" /> - <Preference - android:defaultValue="true" - android:key="pref_key_ticker" /> - <Preference - android:defaultValue="0" - android:key="pref_key_notification_private" /> - <Preference - android:defaultValue="true" - android:key="pref_key_vibration" /> - <Preference - android:defaultValue="content://settings/system/notification_sound" - android:key="pref_key_ringtone" /> - <Preference - android:defaultValue="false" - android:key="pref_key_notification_call" /> - <Preference - android:defaultValue="false" - android:key="pref_key_dismiss_read" /> - - <!-- QKSMS+ --> - <Preference - android:defaultValue="false" - android:key="pref_key_delayed" /> - <Preference - android:defaultValue="false" - android:key="pref_key_night_auto" /> - <Preference - android:defaultValue="6:00" - android:key="pref_key_day_start" /> - <Preference - android:defaultValue="21:00" - android:key="pref_key_night_start" /> - - <!-- MMS --> - <Preference - android:defaultValue="false" - android:key="pref_key_compose_group" /> - <Preference - android:defaultValue="true" - android:key="pref_key_auto_data" /> - <Preference - android:defaultValue="false" - android:key="pref_key_long_as_mms" /> - <Preference - android:defaultValue="3" - android:key="pref_key_long_as_mms_after" /> - <Preference - android:defaultValue="300kb" - android:key="pref_mms_max_attachment_size" /> - - <!-- QUICKREPLY --> - <Preference - android:defaultValue="@bool/preN" - android:key="pref_key_quickreply_enabled" /> - <Preference - android:defaultValue="true" - android:key="pref_key_quickreply_dismiss" /> - - <!-- QUICKCOMPOSE --> - <Preference - android:defaultValue="false" - android:key="pref_key_quickcompose" /> - - <!-- ADVANCED --> - <Preference - android:defaultValue="false" - android:key="pref_key_system_bar_flat" /> - <Preference - android:defaultValue="false" - android:key="pref_key_status_compat" /> - <Preference - android:defaultValue="false" - android:key="pref_key_navigation_compat" /> - -</PreferenceScreen> diff --git a/QKSMS/src/main/res/xml/settings_about.xml b/QKSMS/src/main/res/xml/settings_about.xml deleted file mode 100644 index 852d5ecbf..000000000 --- a/QKSMS/src/main/res/xml/settings_about.xml +++ /dev/null @@ -1,47 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> - <PreferenceCategory - android:layout="@layout/list_item_preference_category" - android:title="@string/pref_category_about"> - <Preference - android:key="pref_key_version" - android:layout="@layout/list_item_preference" - android:title="@string/pref_about_version_title" /> - <Preference - android:key="pref_key_changelog" - android:layout="@layout/list_item_preference" - android:summary="@string/pref_changelog_summary" - android:title="@string/title_changelog" /> - <Preference - android:key="pref_key_authors" - android:layout="@layout/list_item_preference" - android:summary="@string/pref_about_authors_summary" - android:title="@string/pref_about_authors_title" /> - <Preference - android:key="pref_key_thanks" - android:layout="@layout/list_item_preference" - android:summary="@string/pref_about_thanks_summary" - android:title="@string/pref_about_thanks_title" /> - <Preference - android:key="pref_key_google_plus" - android:layout="@layout/list_item_preference" - android:title="@string/pref_about_gplus_title" - android:summary="@string/pref_about_gplus_summary" /> - <Preference - android:key="pref_key_github" - android:layout="@layout/list_item_preference" - android:title="@string/pref_about_github_title" - android:summary="@string/pref_about_github_summary" /> - <Preference - android:key="pref_key_crowdin" - android:layout="@layout/list_item_preference" - android:title="@string/pref_about_crowdin_title" - android:summary="@string/pref_about_crowdin_summary" /> - <Preference - android:icon="@drawable/ic_donate" - android:key="pref_key_donate" - android:layout="@layout/list_item_preference" - android:summary="@string/pref_donate_summary" - android:title="@string/pref_donate_title" /> - </PreferenceCategory> -</PreferenceScreen> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml/settings_appearance.xml b/QKSMS/src/main/res/xml/settings_appearance.xml deleted file mode 100644 index 333edc8ac..000000000 --- a/QKSMS/src/main/res/xml/settings_appearance.xml +++ /dev/null @@ -1,139 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> - -<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> - <PreferenceCategory - android:layout="@layout/list_item_preference_category" - android:title="@string/pref_subcat_theme"> - <Preference - android:defaultValue="-16746133" - android:key="pref_key_theme" - android:layout="@layout/list_item_preference" - android:summary="@string/pref_theme_summary_alt" - android:title="@string/pref_theme" /> - <Preference - android:defaultValue="false" - android:key="pref_key_icon" - android:layout="@layout/list_item_preference" - android:summary="@string/pref_icon_summary" - android:title="@string/pref_icon" /> - <ListPreference - android:defaultValue="light" - android:entries="@array/background_titles" - android:entryValues="@array/background_values" - android:key="pref_key_background" - android:layout="@layout/list_item_preference" - android:summary="@string/pref_background_summary" - android:title="@string/pref_background" /> - <Preference - android:key="pref_key_bubbles" - android:layout="@layout/list_item_preference" - android:summary="@string/pref_bubbles_summary" - android:title="@string/pref_bubbles" /> - </PreferenceCategory> - - <PreferenceCategory - android:layout="@layout/list_item_preference_category" - android:title="@string/pref_night_auto"> - <CheckBoxPreference - android:defaultValue="false" - android:key="pref_key_night_auto" - android:layout="@layout/list_item_preference" - android:summary="@string/pref_night_auto_summary" - android:title="@string/pref_night_auto" - android:widgetLayout="@layout/view_switch" /> - <Preference - android:defaultValue="6:00" - android:dependency="pref_key_night_auto" - android:key="pref_key_day_start" - android:layout="@layout/list_item_preference" - android:title="@string/pref_day_start" /> - <Preference - android:defaultValue="21:00" - android:dependency="pref_key_night_auto" - android:key="pref_key_night_start" - android:layout="@layout/list_item_preference" - android:title="@string/pref_night_start" /> - </PreferenceCategory> - - <PreferenceCategory - android:key="pref_key_category_appearance_system_bars" - android:layout="@layout/list_item_preference_category" - android:title="@string/pref_subcat_system_bars"> - <CheckBoxPreference - android:defaultValue="@bool/hasL" - android:key="pref_key_status_tint" - android:layout="@layout/list_item_preference" - android:title="@string/pref_status_tint" - android:widgetLayout="@layout/view_switch" /> - <CheckBoxPreference - android:defaultValue="false" - android:key="pref_key_navigation_tint" - android:layout="@layout/list_item_preference" - android:title="@string/pref_navigation_tint" - android:widgetLayout="@layout/view_switch" /> - </PreferenceCategory> - - <PreferenceCategory - android:layout="@layout/list_item_preference_category" - android:title="@string/pref_subcat_font"> - <ListPreference - android:defaultValue="0" - android:entries="@array/font_families" - android:entryValues="@array/font_family_codes" - android:key="pref_key_font_family" - android:layout="@layout/list_item_preference" - android:title="@string/pref_font_family" /> - <ListPreference - android:defaultValue="1" - android:entries="@array/font_sizes" - android:entryValues="@array/font_size_codes" - android:key="pref_key_font_size" - android:layout="@layout/list_item_preference" - android:title="@string/pref_font_size" /> - <ListPreference - android:defaultValue="0" - android:entries="@array/font_weights" - android:entryValues="@array/font_weight_codes" - android:key="pref_key_font_weight" - android:layout="@layout/list_item_preference" - android:title="@string/pref_font_weight" /> - </PreferenceCategory> - - <PreferenceCategory - android:layout="@layout/list_item_preference_category" - android:title="@string/pref_subcat_avatars"> - <CheckBoxPreference - android:defaultValue="false" - android:key="pref_key_hide_avatar_conversations" - android:layout="@layout/list_item_preference" - android:summary="@string/pref_hide_avatar_conversations_summary" - android:title="@string/pref_hide_avatar_conversations" - android:widgetLayout="@layout/view_switch" /> - <CheckBoxPreference - android:defaultValue="true" - android:key="pref_key_hide_avatar_sent" - android:layout="@layout/list_item_preference" - android:summary="@string/pref_hide_avatar_sent_summary" - android:title="@string/pref_hide_avatar_sent" - android:widgetLayout="@layout/view_switch" /> - <CheckBoxPreference - android:defaultValue="false" - android:key="pref_key_hide_avatar_received" - android:layout="@layout/list_item_preference" - android:summary="@string/pref_hide_avatar_received_summary" - android:title="@string/pref_hide_avatar_received" - android:widgetLayout="@layout/view_switch" /> - </PreferenceCategory> - - <PreferenceCategory - android:layout="@layout/list_item_preference_category" - android:title="@string/pref_category_general"> - <CheckBoxPreference - android:defaultValue="false" - android:key="pref_key_message_count" - android:layout="@layout/list_item_preference" - android:summary="@string/pref_message_count_summary" - android:title="@string/pref_message_count" - android:widgetLayout="@layout/view_switch" /> - </PreferenceCategory> -</PreferenceScreen> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml/settings_general.xml b/QKSMS/src/main/res/xml/settings_general.xml deleted file mode 100644 index e470f93b7..000000000 --- a/QKSMS/src/main/res/xml/settings_general.xml +++ /dev/null @@ -1,208 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> - -<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> - <PreferenceCategory - android:layout="@layout/list_item_preference_category" - android:title="@string/pref_delayed"> - <CheckBoxPreference - android:defaultValue="false" - android:key="pref_key_delayed" - android:layout="@layout/list_item_preference" - android:summary="@string/pref_delayed_summary" - android:title="@string/pref_delayed" - android:widgetLayout="@layout/view_switch" /> - <EditTextPreference - android:defaultValue="3" - android:dependency="pref_key_delayed" - android:inputType="number" - android:key="pref_key_delay_duration" - android:layout="@layout/list_item_preference" - android:summary="@string/pref_delayed_duration_summary" - android:title="@string/pref_delayed_duration" /> - </PreferenceCategory> - <PreferenceCategory - android:layout="@layout/list_item_preference_category" - android:title="@string/pref_delivery"> - <CheckBoxPreference - android:defaultValue="false" - android:key="pref_key_delivery" - android:layout="@layout/list_item_preference" - android:summary="@string/pref_delivery_summary" - android:title="@string/pref_delivery" - android:widgetLayout="@layout/view_switch" /> - <CheckBoxPreference - android:defaultValue="true" - android:dependency="pref_key_delivery" - android:key="pref_key_delivery_toast" - android:layout="@layout/list_item_preference" - android:summary="@string/pref_delivery_toast_summary" - android:title="@string/pref_delivery_toast" - android:widgetLayout="@layout/view_switch" /> - <CheckBoxPreference - android:defaultValue="true" - android:dependency="pref_key_delivery" - android:key="pref_key_delivery_vibrate" - android:layout="@layout/list_item_preference" - android:summary="@string/pref_delivery_vibrate_summary" - android:title="@string/pref_delivery_vibrate" - android:widgetLayout="@layout/view_switch" /> - </PreferenceCategory> - <PreferenceCategory - android:layout="@layout/list_item_preference_category" - android:title="@string/pref_delete_old_messages"> - <CheckBoxPreference - android:defaultValue="false" - android:key="pref_key_delete_old_messages" - android:layout="@layout/list_item_preference" - android:summary="@string/pref_delete_old_messages_summary" - android:title="@string/pref_delete_old_messages" - android:widgetLayout="@layout/view_switch" /> - <EditTextPreference - android:defaultValue="7" - android:inputType="number" - android:key="pref_key_delete_old_unread_messages" - android:layout="@layout/list_item_preference" - android:summary="@string/pref_delete_old_messages_unread_summary" - android:title="@string/pref_delete_old_messages_unread" /> - <EditTextPreference - android:defaultValue="7" - android:inputType="number" - android:key="pref_key_delete_old_read_messages" - android:layout="@layout/list_item_preference" - android:summary="@string/pref_delete_old_messages_read_summary" - android:title="@string/pref_delete_old_messages_read" /> - </PreferenceCategory> - <PreferenceCategory - android:layout="@layout/list_item_preference_category" - android:title="@string/pref_text"> - <CheckBoxPreference - android:defaultValue="false" - android:key="pref_key_auto_emoji" - android:layout="@layout/list_item_preference" - android:summary="@string/pref_auto_emoji_summary" - android:title="@string/pref_auto_emoji" - android:widgetLayout="@layout/view_switch" /> - <CheckBoxPreference - android:defaultValue="false" - android:key="pref_key_markdown_enabled" - android:layout="@layout/list_item_preference" - android:summary="@string/pref_markdown_enabled_summary" - android:title="@string/pref_markdown_enabled" - android:widgetLayout="@layout/view_switch" /> - <CheckBoxPreference - android:defaultValue="false" - android:key="pref_key_strip_unicode" - android:layout="@layout/list_item_preference" - android:summary="@string/pref_strip_unicode_summary" - android:title="@string/pref_strip_unicode" - android:widgetLayout="@layout/view_switch" /> - <CheckBoxPreference - android:defaultValue="false" - android:key="pref_key_split" - android:layout="@layout/list_item_preference" - android:summary="@string/pref_split_summary" - android:title="@string/pref_split" - android:widgetLayout="@layout/view_switch" /> - <CheckBoxPreference - android:defaultValue="true" - android:dependency="pref_key_split" - android:key="pref_key_split_counter" - android:layout="@layout/list_item_preference" - android:summary="@string/pref_split_counter_summary" - android:title="@string/pref_split_counter" - android:widgetLayout="@layout/view_switch" /> - </PreferenceCategory> - <PreferenceCategory - android:layout="@layout/list_item_preference_category" - android:title="@string/pref_category_blocking"> - <CheckBoxPreference - android:defaultValue="false" - android:key="pref_key_blocked_enabled" - android:layout="@layout/list_item_preference" - android:summary="@string/pref_blocked_conversations_summary" - android:title="@string/pref_blocked_conversations" - android:widgetLayout="@layout/view_switch" /> - <Preference - android:defaultValue="false" - android:dependency="pref_key_blocked_enabled" - android:key="pref_key_block_future" - android:layout="@layout/list_item_preference" - android:summary="@string/pref_block_future_summary" - android:title="@string/pref_block_future" /> - <CheckBoxPreference - android:defaultValue="false" - android:key="pref_key_should_i_answer" - android:layout="@layout/list_item_preference" - android:summary="@string/pref_should_i_answer_summary" - android:title="@string/pref_should_i_answer" - android:widgetLayout="@layout/view_switch" /> - </PreferenceCategory> - <PreferenceCategory - android:layout="@layout/list_item_preference_category" - android:title="@string/pref_category_general"> - <CheckBoxPreference - android:defaultValue="false" - android:key="pref_key_mobile_only" - android:layout="@layout/list_item_preference" - android:summary="@string/pref_mobile_only_summary" - android:title="@string/pref_mobile_only" - android:widgetLayout="@layout/view_switch" /> - <ListPreference - android:defaultValue="0" - android:entries="@array/enter_button_options" - android:entryValues="@array/enter_button_values" - android:key="pref_key_enter_button" - android:layout="@layout/list_item_preference" - android:summary="@string/pref_enter_button_summary" - android:title="@string/pref_enter_button" /> - <CheckBoxPreference - android:defaultValue="false" - android:key="pref_key_sent_timestamps" - android:layout="@layout/list_item_preference" - android:summary="@string/pref_sent_timestamps_summary" - android:title="@string/pref_sent_timestamps" - android:widgetLayout="@layout/view_switch" /> - <EditTextPreference - android:defaultValue="60" - android:dependency="pref_key_force_timestamps" - android:inputType="number" - android:key="pref_key_timestamp_delay" - android:layout="@layout/list_item_preference" - android:summary="@string/pref_key_timestamp_delay_summary" - android:title="@string/pref_key_timestamp_delay" /> - <CheckBoxPreference - android:defaultValue="false" - android:disableDependentsState="true" - android:key="pref_key_force_timestamps" - android:layout="@layout/list_item_preference" - android:summary="@string/pref_force_timestamps_summary" - android:title="@string/pref_force_timestamps" - android:widgetLayout="@layout/view_switch" /> - <CheckBoxPreference - android:defaultValue="true" - android:key="pref_key_compose_favorites" - android:layout="@layout/list_item_preference" - android:summary="@string/pref_compose_summary_favorites" - android:title="@string/pref_compose_favorites" - android:widgetLayout="@layout/view_switch" /> - <CheckBoxPreference - android:defaultValue="false" - android:key="pref_key_prox_sensor_calling" - android:layout="@layout/list_item_preference" - android:summary="@string/pref_prox_sensor_call_summary" - android:title="@string/pref_prox_sensor_call" - android:widgetLayout="@layout/view_switch" /> - <Preference - android:key="pref_key_qk_responses" - android:layout="@layout/list_item_preference" - android:summary="@string/pref_qk_responses_summary" - android:title="@string/pref_qk_responses" /> - <CheckBoxPreference - android:defaultValue="false" - android:key="pref_key_endlessjabber" - android:layout="@layout/list_item_preference" - android:summary="@string/pref_endlessjabber_summary" - android:title="@string/pref_yappy" - android:widgetLayout="@layout/view_switch" /> - </PreferenceCategory> -</PreferenceScreen> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml/settings_main.xml b/QKSMS/src/main/res/xml/settings_main.xml deleted file mode 100644 index 8b6bfb173..000000000 --- a/QKSMS/src/main/res/xml/settings_main.xml +++ /dev/null @@ -1,71 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> - -<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> - <Preference - android:defaultValue="-16746133" - android:key="pref_key_theme" - android:layout="@layout/list_item_preference" - android:summary="@string/pref_theme_summary_alt" - android:title="@string/pref_theme" /> - <ListPreference - android:defaultValue="light" - android:entries="@array/background_titles" - android:entryValues="@array/background_values" - android:key="pref_key_background" - android:layout="@layout/list_item_preference" - android:summary="@string/pref_background_summary" - android:title="@string/pref_background" /> - - <PreferenceCategory - android:layout="@layout/list_item_preference_category" - android:title="@string/pref_subcat_categories"> - <Preference - android:icon="@drawable/ic_palette" - android:key="pref_key_category_appearance" - android:layout="@layout/list_item_preference" - android:summary="@string/pref_category_summary_appearance" - android:title="@string/pref_category_appearance" /> - <Preference - android:icon="@drawable/ic_settings" - android:key="pref_key_category_general" - android:layout="@layout/list_item_preference" - android:summary="@string/pref_category_summary_general" - android:title="@string/pref_category_general" /> - <Preference - android:icon="@drawable/ic_notifications" - android:key="pref_key_category_notifications" - android:layout="@layout/list_item_preference" - android:summary="@string/pref_category_summary_notifications" - android:title="@string/pref_category_notifications" /> - <Preference - android:icon="@drawable/ic_photo" - android:key="pref_key_category_mms" - android:layout="@layout/list_item_preference" - android:summary="@string/pref_category_summary_mms" - android:title="@string/pref_category_mms" /> - <Preference - android:icon="@drawable/ic_reply" - android:key="pref_key_category_quickreply" - android:layout="@layout/list_item_preference" - android:summary="@string/pref_category_summary_quickreply" - android:title="@string/pref_category_quickreply" /> - <Preference - android:icon="@drawable/ic_compose" - android:key="pref_key_category_quickcompose" - android:layout="@layout/list_item_preference" - android:summary="@string/pref_category_summary_quickcompose" - android:title="@string/pref_category_quickcompose" /> - <Preference - android:icon="@drawable/ic_info_fill" - android:key="pref_key_category_about" - android:layout="@layout/list_item_preference" - android:summary="@string/pref_category_summary_about" - android:title="@string/pref_category_about" /> - <Preference - android:icon="@drawable/ic_donate" - android:key="pref_key_donate" - android:layout="@layout/list_item_preference" - android:summary="@string/pref_donate_summary" - android:title="@string/pref_donate_title" /> - </PreferenceCategory> -</PreferenceScreen> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml/settings_mms.xml b/QKSMS/src/main/res/xml/settings_mms.xml deleted file mode 100644 index 2546d5f21..000000000 --- a/QKSMS/src/main/res/xml/settings_mms.xml +++ /dev/null @@ -1,87 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> - <!--<Preference - android:key="pref_key_mms_enabled" - android:layout="@layout/preference" - android:summary="@string/pref_mms_enabled_summary" - android:title="@string/pref_mms_enabled" />--> - <CheckBoxPreference - android:defaultValue="false" - android:key="pref_key_compose_group" - android:layout="@layout/list_item_preference" - android:summary="@string/pref_compose_group_summary" - android:title="@string/pref_compose_group" - android:widgetLayout="@layout/view_switch" /> - <!--<CheckBoxPreference - android:defaultValue="true" - android:key="pref_key_auto_download" - android:layout="@layout/list_item_preference" - android:summary="@string/pref_auto_download_summary" - android:title="@string/pref_auto_download" - android:widgetLayout="@layout/view_switch" />--> - <CheckBoxPreference - android:defaultValue="true" - android:key="pref_key_auto_data" - android:layout="@layout/list_item_preference" - android:summary="@string/pref_auto_data_summary" - android:title="@string/pref_auto_data" - android:widgetLayout="@layout/view_switch" /> - <CheckBoxPreference - android:defaultValue="false" - android:key="pref_key_texts_as_mms" - android:layout="@layout/list_item_preference" - android:summary="@string/pref_send_texts_as_mms_summary" - android:title="@string/pref_send_texts_as_mms" - android:widgetLayout="@layout/view_switch" /> - <PreferenceCategory - android:layout="@layout/list_item_preference_category" - android:title="@string/pref_category_sending_mms"> - <CheckBoxPreference - android:defaultValue="false" - android:key="pref_key_long_as_mms" - android:layout="@layout/list_item_preference" - android:summary="@string/pref_long_as_mms_summary" - android:title="@string/pref_long_as_mms" - android:widgetLayout="@layout/view_switch" /> - <EditTextPreference - android:defaultValue="3" - android:dependency="pref_key_long_as_mms" - android:inputType="number" - android:key="pref_key_long_as_mms_after" - android:layout="@layout/list_item_preference" - android:summary="@string/pref_long_as_mms_after_summary" - android:title="@string/pref_long_as_mms_after" /> - <ListPreference - android:defaultValue="300kb" - android:entries="@array/max_mms_attachment_sizes" - android:entryValues="@array/max_mms_attachment_size_values" - android:key="pref_mms_max_attachment_size" - android:layout="@layout/list_item_preference" - android:title="@string/pref_max_mms_attachment_size" /> - </PreferenceCategory> - <PreferenceCategory - android:layout="@layout/list_item_preference_category" - android:title="@string/pref_category_mms_configuration"> - <Preference - android:key="pref_key_automatically_configure_mms" - android:layout="@layout/list_item_preference" - android:title="@string/pref_automatically_configure_mms" /> - <!--<Preference - android:key="pref_key_mms_contact_support" - android:layout="@layout/list_item_preference" - android:summary="@string/pref_mms_contact_support_summary" - android:title="@string/pref_mms_contact_support" />--> - <EditTextPreference - android:key="mmsc_url" - android:layout="@layout/list_item_preference" - android:title="@string/pref_mmsc_url" /> - <EditTextPreference - android:key="mms_proxy" - android:layout="@layout/list_item_preference" - android:title="@string/pref_mms_proxy" /> - <EditTextPreference - android:key="mms_port" - android:layout="@layout/list_item_preference" - android:title="@string/pref_mms_port" /> - </PreferenceCategory> -</PreferenceScreen> diff --git a/QKSMS/src/main/res/xml/settings_notifications.xml b/QKSMS/src/main/res/xml/settings_notifications.xml deleted file mode 100644 index fa36a305f..000000000 --- a/QKSMS/src/main/res/xml/settings_notifications.xml +++ /dev/null @@ -1,83 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> - -<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> - <PreferenceCategory - android:layout="@layout/list_item_preference_category" - android:title="@string/pref_category_notifications"> - <CheckBoxPreference - android:defaultValue="true" - android:key="pref_key_notifications" - android:layout="@layout/list_item_preference" - android:title="@string/pref_notifications" - android:widgetLayout="@layout/view_switch" /> - <CheckBoxPreference - android:defaultValue="true" - android:dependency="pref_key_notifications" - android:key="pref_key_led" - android:layout="@layout/list_item_preference" - android:title="@string/pref_led" - android:widgetLayout="@layout/view_switch" /> - <Preference - android:defaultValue="-48060" - android:dependency="pref_key_led" - android:key="pref_key_theme_led" - android:layout="@layout/list_item_preference" - android:title="@string/pref_theme_led" /> - <CheckBoxPreference - android:defaultValue="false" - android:dependency="pref_key_notifications" - android:key="pref_key_wake" - android:layout="@layout/list_item_preference" - android:summary="@string/pref_wake_summary" - android:title="@string/pref_wake" - android:widgetLayout="@layout/view_switch" /> - <CheckBoxPreference - android:defaultValue="@bool/preL" - android:dependency="pref_key_notifications" - android:key="pref_key_ticker" - android:layout="@layout/list_item_preference" - android:summary="@string/pref_ticker_summary" - android:title="@string/pref_ticker" - android:widgetLayout="@layout/view_switch" /> - <ListPreference - android:defaultValue="0" - android:entries="@array/notification_private_options" - android:entryValues="@array/enter_button_values" - android:key="pref_key_notification_private" - android:layout="@layout/list_item_preference" - android:summary="@string/pref_notifications_private_summary" - android:title="@string/pref_notifications_private" /> - <CheckBoxPreference - android:defaultValue="true" - android:dependency="pref_key_notifications" - android:key="pref_key_vibration" - android:layout="@layout/list_item_preference" - android:summary="@string/pref_vibration_summary" - android:title="@string/pref_vibration" - android:widgetLayout="@layout/view_switch" /> - <RingtonePreference - android:defaultValue="content://settings/system/notification_sound" - android:dependency="pref_key_notifications" - android:key="pref_key_ringtone" - android:layout="@layout/list_item_preference" - android:ringtoneType="notification" - android:summary="@string/pref_ringtone_summary" - android:title="@string/pref_ringtone" /> - <CheckBoxPreference - android:defaultValue="false" - android:dependency="pref_key_notifications" - android:key="pref_key_notification_call" - android:layout="@layout/list_item_preference" - android:summary="@string/pref_notification_call_summary" - android:title="@string/pref_notification_call" - android:widgetLayout="@layout/view_switch" /> - <CheckBoxPreference - android:defaultValue="false" - android:dependency="pref_key_notifications" - android:key="pref_key_dismiss_read" - android:layout="@layout/list_item_preference" - android:summary="@string/pref_dismiss_read_summary" - android:title="@string/pref_dimiss_read" - android:widgetLayout="@layout/view_switch" /> - </PreferenceCategory> -</PreferenceScreen> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml/settings_quickcompose.xml b/QKSMS/src/main/res/xml/settings_quickcompose.xml deleted file mode 100644 index 6c7959a2f..000000000 --- a/QKSMS/src/main/res/xml/settings_quickcompose.xml +++ /dev/null @@ -1,15 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> - -<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> - <PreferenceCategory - android:title="@string/pref_category_quickcompose" - android:layout="@layout/list_item_preference_category"> - <CheckBoxPreference - android:defaultValue="false" - android:key="pref_key_quickcompose" - android:layout="@layout/list_item_preference" - android:summary="@string/pref_quickcompose_summary" - android:title="@string/pref_quickcompose" - android:widgetLayout="@layout/view_switch" /> - </PreferenceCategory> -</PreferenceScreen> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml/settings_quickreply.xml b/QKSMS/src/main/res/xml/settings_quickreply.xml deleted file mode 100644 index ad18c2134..000000000 --- a/QKSMS/src/main/res/xml/settings_quickreply.xml +++ /dev/null @@ -1,22 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> - -<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> - <PreferenceCategory - android:layout="@layout/list_item_preference_category" - android:title="@string/pref_category_quickreply"> - <CheckBoxPreference - android:defaultValue="true" - android:key="pref_key_quickreply_enabled" - android:layout="@layout/list_item_preference" - android:summary="@string/pref_quickreply_enabled_summary" - android:title="@string/pref_quickreply_enabled" - android:widgetLayout="@layout/view_switch" /> - <CheckBoxPreference - android:defaultValue="true" - android:key="pref_key_quickreply_dismiss" - android:layout="@layout/list_item_preference" - android:summary="@string/pref_tap_to_quit_summary" - android:title="@string/pref_tap_to_quit" - android:widgetLayout="@layout/view_switch" /> - </PreferenceCategory> -</PreferenceScreen> \ No newline at end of file diff --git a/QKSMS/src/main/res/xml/widget_info.xml b/QKSMS/src/main/res/xml/widget_info.xml deleted file mode 100644 index 49eae7581..000000000 --- a/QKSMS/src/main/res/xml/widget_info.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" - android:initialLayout="@layout/widget" - android:minHeight="110dp" - android:minWidth="180dp" - android:previewImage="@drawable/widget_preview" - android:resizeMode="horizontal|vertical" - android:updatePeriodMillis="0" - android:widgetCategory="home_screen|keyguard" /> diff --git a/QKSMS/src/noAnalytics/java/com/moez/QKSMS/QKSMSApp.java b/QKSMS/src/noAnalytics/java/com/moez/QKSMS/QKSMSApp.java deleted file mode 100644 index be58f9852..000000000 --- a/QKSMS/src/noAnalytics/java/com/moez/QKSMS/QKSMSApp.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.moez.QKSMS; - -public class QKSMSApp extends QKSMSAppBase { -} diff --git a/QKSMS/src/noAnalytics/java/com/moez/QKSMS/common/AnalyticsManager.java b/QKSMS/src/noAnalytics/java/com/moez/QKSMS/common/AnalyticsManager.java deleted file mode 100644 index d05390c3c..000000000 --- a/QKSMS/src/noAnalytics/java/com/moez/QKSMS/common/AnalyticsManager.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.moez.QKSMS.common; - -import android.content.Context; - -public class AnalyticsManager implements AnalyticsManagerBase { - private AnalyticsManager() { - } - - private static class AnalyticsManagerHolder { - private final static AnalyticsManager INSTANCE = new AnalyticsManager(); - } - - public static AnalyticsManager getInstance() { - return AnalyticsManagerHolder.INSTANCE; - } - - @Override - public void init(Context context) { - - } - - @Override - public void sendEvent(String category, String action, String label) { - - } - - @Override - public void sendEvent(String category, String action, String label, long value) { - - } - - @Override - public void log(String msg) { - - } -} diff --git a/QKSMS/src/withAnalytics/java/com/moez/QKSMS/QKSMSApp.java b/QKSMS/src/withAnalytics/java/com/moez/QKSMS/QKSMSApp.java deleted file mode 100644 index ca463f9e5..000000000 --- a/QKSMS/src/withAnalytics/java/com/moez/QKSMS/QKSMSApp.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.moez.QKSMS; - -import com.crashlytics.android.Crashlytics; -import io.fabric.sdk.android.Fabric; - -public class QKSMSApp extends QKSMSAppBase { - @Override - public void onCreate() { - super.onCreate(); - Fabric.with(this, new Crashlytics()); - } -} diff --git a/QKSMS/src/withAnalytics/java/com/moez/QKSMS/common/AnalyticsManager.java b/QKSMS/src/withAnalytics/java/com/moez/QKSMS/common/AnalyticsManager.java deleted file mode 100644 index 3c826a86b..000000000 --- a/QKSMS/src/withAnalytics/java/com/moez/QKSMS/common/AnalyticsManager.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.moez.QKSMS.common; - -import android.content.Context; -import android.util.Log; - -import com.crashlytics.android.Crashlytics; -import com.google.android.gms.analytics.GoogleAnalytics; -import com.google.android.gms.analytics.HitBuilders; -import com.google.android.gms.analytics.Tracker; -import com.moez.QKSMS.R; - -public class AnalyticsManager implements AnalyticsManagerBase { - private AnalyticsManager() { - } - - private static class AnalyticsManagerHolder { - private final static AnalyticsManager INSTANCE = new AnalyticsManager(); - } - - public static AnalyticsManager getInstance() { - return AnalyticsManagerHolder.INSTANCE; - } - - private boolean mNeedsInit = true; - private Context mContext; - private Tracker mTracker; - - - public void init(Context context) { - if (LOCAL_LOGV) Log.v(TAG, "init called. mNeedsInit: " + mNeedsInit); - - if (mNeedsInit) { - mNeedsInit = false; - mContext = context; - - // Initialize tracker - GoogleAnalytics analytics = GoogleAnalytics.getInstance(mContext); - mTracker = analytics.newTracker(R.xml.google_analytics_tracker); - } - } - - public void sendEvent(String category, String action, String label) { - if (LOCAL_LOGV) Log.v(TAG, "sendEvent category:" + category + ", action:" + action + - ", label:" + label); - - HitBuilders.EventBuilder b = new HitBuilders.EventBuilder(); - if (category != null) b.setCategory(category); - if (action != null) b.setAction(action); - if (label != null) b.setLabel(label); - - mTracker.send(b.build()); - } - - public void sendEvent(String category, String action, String label, long value) { - if (LOCAL_LOGV) Log.v(TAG, "sendEvent category:" + category + ", action:" + action + - ", label:" + label + ", value:" + value); - - HitBuilders.EventBuilder b = new HitBuilders.EventBuilder(); - if (category != null) b.setCategory(category); - if (action != null) b.setAction(action); - if (label != null) b.setLabel(label); - b.setValue(value); - - mTracker.send(b.build()); - } - - @Override - public void log(String msg) { - Crashlytics.log(msg); - } -} diff --git a/README.md b/README.md deleted file mode 100644 index ff23fda7f..000000000 --- a/README.md +++ /dev/null @@ -1,112 +0,0 @@ -Disclaimer: The current condition of the codebase is quite poor *(I guess that's what happens when you start writing an app when you don't even know how to code yet)*. I'm in the process of rebuilding the app from scratch using Kotlin - I would recommend against making any pull requests until the new version is ready. ETA December 2017 - -# QKSMS - -[![Join the chat at https://gitter.im/moezbhatti/qksms](https://badges.gitter.im/moezbhatti/qksms.svg)](https://gitter.im/moezbhatti/qksms?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) -[![ZenHub](https://raw.githubusercontent.com/ZenHubIO/support/master/zenhub-badge.png)](https://zenhub.io) -[![Build Status](https://travis-ci.org/moezbhatti/qksms.svg?branch=master)](https://travis-ci.org/moezbhatti/qksms) - -QKSMS is an open source replacement to the [stock messaging app](https://github.com/android/platform_packages_apps_mms) on Android. It is currently available on the Google Play Store. - -[![Download on Google Play](http://i.imgur.com/rHhHvZw.png)](https://play.google.com/store/apps/details?id=com.moez.QKSMS) -[![Download on F-Droid](https://f-droid.org/wiki/images/0/06/F-Droid-button_get-it-on.png)](https://f-droid.org/repository/browse/?fdid=com.moez.QKSMS) - -<img src="http://i.imgur.com/uwWmDv9.png" width="216" height="384" /> -<img src="http://i.imgur.com/p7063VN.png" width="216" height="384" /> -<img src="http://i.imgur.com/Z8Rqb7A.png" width="216" height="384" /> - -# Contributing to QKSMS - -We highly encourage contributions to QKSMS; we want to make it as easy and streamlined as possible. If you have any suggestions on how we can improve our workflow, please feel free to contact me. - -Quite a bit of old code still needs to be cleaned up and refactored, so keep that in mind as you're digging through the source. If you find something that's just really crappy, let me know and I'll put it higher up on my list of stuff to clean up. I'll be focusing on improving code quality of existing code over the next couple weeks. - -### Collaboration - -We use GitHub issues to keep track of bugs and feature requests, but we communicate using [Slack](https://qklabs.slack.com/). To join the Slack group, send an email to team@qklabs.com with the subject `QK Labs Slack Invite` (no need to enter a body, we'll send an invite to your email address). If you plan on contributing at some point, we highly recommend joining the slack group because it gives you a direct way to communicate with the rest of the contributors. - -### Funds - -If you'd like to donate to help support the project, you can donate via [PayPal here](http://bit.ly/QKSMSDonation). - -### Translations - -Please do not perform translations directly on the source files. Pull requests for translations will not be accepted. If you would like to do translations for QKSMS, join the translation project on Crowdin: https://crowdin.com/project/qksms. - -Unfortunately I don't always have time to check notifications on Crowdin. If you'd like something checked or approved, send me a message on Slack and then I'll take a look - -### Development - -We encourage you to make pull requests. Whenever you make one, we'll review the code and test it to make sure that it fits the code style guidelines, and achieves what the pull request intends. We'll discuss any problems or potential improvements, and we'll merge it when we're both (or any number of willing participants) happy with the code. - -If you're new, we recommend that you look through the issues and try to fix some of the more simple sounding bugs to familiarize yourself with the codebase. - -If you'd like to work on a new feature, please create an issue so we can discuss the idea together before implementation begins. - -To learn about pull requests, please refer to the following guide: https://help.github.com/articles/using-pull-requests/. - -### Code style - -We follow the code style guidelines set by Google for contributors to AOSP: https://source.android.com/source/code-style.html - -The current codebase is far from being 100% at this standard, but updating existing code to follow the unified guidelines can be a good way to introduce yourself to the codebase and start getting familiar with it. - -Any new code written should follow these guidelines. - -# Bug Reports / Feature Requests - -We track issues and feature requests using GitHub issues. You can view existing issues and create your own here: https://github.com/moezbhatti/qksms/issues - -### How to help - -1. Report bugs -2. Help reproduce bugs -3. Make enhancement requests (it would be great if QKSMS...) - -#### Reporting bugs -A great bug report contains a description of the problem and steps to reproduce the problem. We need to know what we're looking for and where to look for it. If the QKSMS team can't reproduce a bug, we will work with testers to fix the problem. - -Bugs are given the red `bug` label. Bugs also may be given extra orange labels: - -`needs-info`: We need a better description of the problem. -`needs-repro`: We need someone who can reproduce the issue consistently. -`needs-review`: We need someone to verify that the bug has been squashed. - -##### Example bug report submission -> *This is a real bug as of the time of writing. Try reproducing it!* - -``` -### DESCRIPTION -Conversations aren't marked as read when they are opened from a notification. - -### STEPS -1. Long press on a conversation and press "Mark as unread" to reveal a notification. -2. Press the home button to put QKSMS in the background. -3. Pull down on the notification to open the notification drawer. -4. Tap on the body of the notification (not the buttons). -5. Tap on the back button to reveal the conversation list. - -### EXPECTED -The conversation is marked as read. - -### OBSERVATIONS -The conversation isn't marked as read. -``` - -#### Helping reproduce bugs -Reproducing a bug is important, since if we can't reproduce an issue then it's hard to figure out what's going wrong, and we can't know that we've fixed it. - -You can see bugs which need "repro steps" [here](https://github.com/moezbhatti/qksms/issues?q=is%3Aopen+is%3Aissue+label%3Aneeds-repro). If you see any bugs that you know how to reproduce (see above for example repro steps), then make a comment with the steps and we'll track the bug down! - -#### Making enhancement requests -There are no rules for enhancement requests. Your ideas are all awesome. Although we may not implement every suggestion, we love brainstorming with you and hearing your feedback. - -To make an enhancement request, add an "issue". - -# Contact - -QKSMS is developed and maintained by [Moez Bhatti](https://github.com/moezbhatti). Feel free to reach out to moez@qklabs.com - -# License - -QKSMS is released under the **The GNU General Public License v3.0 (GPLv3)**, which can be found in the `LICENSE` file in the root of this project. diff --git a/_config.yml b/_config.yml deleted file mode 100644 index 2f7efbeab..000000000 --- a/_config.yml +++ /dev/null @@ -1 +0,0 @@ -theme: jekyll-theme-minimal \ No newline at end of file diff --git a/build.gradle b/build.gradle deleted file mode 100644 index d6b39f58b..000000000 --- a/build.gradle +++ /dev/null @@ -1,8 +0,0 @@ -buildscript { - repositories { - jcenter() - } - dependencies { - classpath 'com.android.tools.build:gradle:2.3.0' - } -} diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index d5c591c9c532da774b062aa6d7ab16405ff8700a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50508 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%0DD3;W?!&t=FUIvF}Y7;NYDq6$vu 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 B*EIkD diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index c79603484..000000000 --- a/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,6 +0,0 @@ -#Mon May 01 19:15:04 PDT 2017 -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip diff --git a/gradlew b/gradlew deleted file mode 100755 index 91a7e269e..000000000 --- a/gradlew +++ /dev/null @@ -1,164 +0,0 @@ -#!/usr/bin/env bash - -############################################################################## -## -## Gradle start up script for UN*X -## -############################################################################## - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" - -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" - -warn ( ) { - echo "$*" -} - -die ( ) { - echo - echo "$*" - echo - exit 1 -} - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; -esac - -# For Cygwin, ensure paths are in UNIX format before anything is touched. -if $cygwin ; then - [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"` -fi - -# Attempt to set APP_HOME -# Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >&- -APP_HOME="`pwd -P`" -cd "$SAVED" >&- - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD="java" - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi -fi - -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi - -# For Cygwin, switch paths to Windows format before running java -if $cygwin ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi - # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" - fi - i=$((i+1)) - done - case $i in - (0) set -- ;; - (1) set -- "$args0" ;; - (2) set -- "$args0" "$args1" ;; - (3) set -- "$args0" "$args1" "$args2" ;; - (4) set -- "$args0" "$args1" "$args2" "$args3" ;; - (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac -fi - -# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules -function splitJvmOpts() { - JVM_OPTS=("$@") -} -eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS -JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" - -exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/gradlew.bat b/gradlew.bat deleted file mode 100644 index 8a0b282aa..000000000 --- a/gradlew.bat +++ /dev/null @@ -1,90 +0,0 @@ -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS= - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto init - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:init -@rem Get command-line arguments, handling Windowz variants - -if not "%OS%" == "Windows_NT" goto win9xME_args -if "%@eval[2+2]" == "4" goto 4NT_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* -goto execute - -:4NT_args -@rem Get arguments from the 4NT Shell from JP Software -set CMD_LINE_ARGS=%$ - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/settings.gradle b/settings.gradle deleted file mode 100644 index 6dbbe5f2a..000000000 --- a/settings.gradle +++ /dev/null @@ -1 +0,0 @@ -include ':QKSMS' -- GitLab

- * ThumbnailManager is used to asynchronously load pictures and create thumbnails. The thumbnails - * are stored in a local cache with SoftReferences. Once a thumbnail is loaded, it will call the - * passed in callback with the result. If a thumbnail is immediately available in the cache, - * the callback will be called immediately as well. - * - * Based on BooksImageManager by Virgil King. - */ -public class ThumbnailManager extends BackgroundLoaderManager { - private static final String TAG = "ThumbnailManager"; - - private static final boolean DEBUG_DISABLE_CACHE = false; - private static final boolean DEBUG_DISABLE_CALLBACK = false; - private static final boolean DEBUG_DISABLE_LOAD = false; - private static final boolean DEBUG_LONG_WAIT = false; - - private static final int COMPRESS_JPEG_QUALITY = 90; - - private final SimpleCache mThumbnailCache; - private final Context mContext; - private ImageCacheService mImageCacheService; - private static Bitmap mEmptyImageBitmap; - private static Bitmap mEmptyVideoBitmap; - - // NOTE: These type numbers are stored in the image cache, so it should not - // not be changed without resetting the cache. - public static final int TYPE_THUMBNAIL = 1; - public static final int TYPE_MICROTHUMBNAIL = 2; - - public static final int THUMBNAIL_TARGET_SIZE = 640; - - public ThumbnailManager(final Context context) { - super(context); - - mThumbnailCache = new SimpleCache<>(8, 16, 0.75f, true); - mContext = context; - - mEmptyImageBitmap = BitmapFactory.decodeResource(context.getResources(), - R.drawable.ic_error); - - mEmptyVideoBitmap = BitmapFactory.decodeResource(context.getResources(), - R.drawable.ic_error); - } - - /** - * getThumbnail must be called on the same thread that created ThumbnailManager. This is - * normally the UI thread. - * @param uri the uri of the image - * @param callback the callback to call when the thumbnail is fully loaded - * @return - */ - public ItemLoadedFuture getThumbnail(Uri uri, final ItemLoadedCallback callback) { - return getThumbnail(uri, false, callback); - } - - /** - * getVideoThumbnail must be called on the same thread that created ThumbnailManager. This is - * normally the UI thread. - * @param uri the uri of the image - * @param callback the callback to call when the thumbnail is fully loaded - * @return - */ - public ItemLoadedFuture getVideoThumbnail(Uri uri, - final ItemLoadedCallback callback) { - return getThumbnail(uri, true, callback); - } - - private ItemLoadedFuture getThumbnail(Uri uri, boolean isVideo, - final ItemLoadedCallback callback) { - if (uri == null) { - throw new NullPointerException(); - } - - final Bitmap thumbnail = DEBUG_DISABLE_CACHE ? null : mThumbnailCache.get(uri); - - final boolean thumbnailExists = thumbnail != null; - final boolean taskExists = mPendingTaskUris.contains(uri); - final boolean newTaskRequired = !thumbnailExists && !taskExists; - final boolean callbackRequired = callback != null; - - if (Log.isLoggable(LogTag.THUMBNAIL_CACHE, Log.DEBUG)) { - Log.v(TAG, "getThumbnail mThumbnailCache.get for uri: " + uri + " thumbnail: " + - thumbnail + " callback: " + callback + " thumbnailExists: " + - thumbnailExists + " taskExists: " + taskExists + - " newTaskRequired: " + newTaskRequired + - " callbackRequired: " + callbackRequired); - } - - if (thumbnailExists) { - if (callbackRequired && !DEBUG_DISABLE_CALLBACK) { - ImageLoaded imageLoaded = new ImageLoaded(thumbnail, isVideo); - callback.onItemLoaded(imageLoaded, null); - } - return new NullItemLoadedFuture(); - } - - if (callbackRequired) { - addCallback(uri, callback); - } - - if (newTaskRequired) { - mPendingTaskUris.add(uri); - Runnable task = new ThumbnailTask(uri, isVideo); - mExecutor.execute(task); - } - return new ItemLoadedFuture() { - private boolean mIsDone; - - @Override - public void cancel(Uri uri) { - cancelCallback(callback); - removeThumbnail(uri); // if the thumbnail is half loaded, force a reload next time - } - - @Override - public void setIsDone(boolean done) { - mIsDone = done; - } - - @Override - public boolean isDone() { - return mIsDone; - } - }; - } - - @Override - public synchronized void clear() { - super.clear(); - - mThumbnailCache.clear(); // clear in-memory cache - clearBackingStore(); // clear on-disk cache - } - - // Delete the on-disk cache, but leave the in-memory cache intact - public synchronized void clearBackingStore() { - if (mImageCacheService == null) { - // No need to call getImageCacheService() to renew the instance if it's null. - // It's enough to only delete the image cache files for the sake of safety. - CacheManager.clear(mContext); - } else { - getImageCacheService().clear(); - - // force a re-init the next time getImageCacheService requested - mImageCacheService = null; - } - } - - public void removeThumbnail(Uri uri) { - if (Log.isLoggable(TAG, Log.DEBUG)) { - Log.d(TAG, "removeThumbnail: " + uri); - } - if (uri != null) { - mThumbnailCache.remove(uri); - } - } - - @Override - public String getTag() { - return TAG; - } - - private synchronized ImageCacheService getImageCacheService() { - if (mImageCacheService == null) { - mImageCacheService = new ImageCacheService(mContext); - } - return mImageCacheService; - } - - public class ThumbnailTask implements Runnable { - private final Uri mUri; - private final boolean mIsVideo; - - public ThumbnailTask(Uri uri, boolean isVideo) { - if (uri == null) { - throw new NullPointerException(); - } - mUri = uri; - mIsVideo = isVideo; - } - - /** {@inheritDoc} */ - @Override - public void run() { - if (DEBUG_DISABLE_LOAD) { - return; - } - if (DEBUG_LONG_WAIT) { - try { - Thread.sleep(10000); - } catch (InterruptedException e) { - } - } - - Bitmap bitmap = null; - try { - bitmap = getBitmap(mIsVideo); - } catch (IllegalArgumentException e) { - Log.e(TAG, "Couldn't load bitmap for " + mUri, e); - } catch (OutOfMemoryError e) { - Log.e(TAG, "Couldn't load bitmap for " + mUri, e); - } - final Bitmap resultBitmap = bitmap; - - mCallbackHandler.post(new Runnable() { - @Override - public void run() { - final Set callbacks = mCallbacks.get(mUri); - if (callbacks != null) { - Bitmap bitmap = resultBitmap == null ? - (mIsVideo ? mEmptyVideoBitmap : mEmptyImageBitmap) - : resultBitmap; - - // Make a copy so that the callback can unregister itself - for (final ItemLoadedCallback callback : asList(callbacks)) { - if (Log.isLoggable(LogTag.THUMBNAIL_CACHE, Log.DEBUG)) { - Log.d(TAG, "Invoking item loaded callback " + callback); - } - if (!DEBUG_DISABLE_CALLBACK) { - ImageLoaded imageLoaded = new ImageLoaded(bitmap, mIsVideo); - callback.onItemLoaded(imageLoaded, null); - } - } - } else { - if (Log.isLoggable(TAG, Log.DEBUG)) { - Log.d(TAG, "No image callback!"); - } - } - - // Add the bitmap to the soft cache if the load succeeded. Don't cache the - // stand-ins for empty bitmaps. - if (resultBitmap != null) { - mThumbnailCache.put(mUri, resultBitmap); - if (Log.isLoggable(LogTag.THUMBNAIL_CACHE, Log.DEBUG)) { - Log.v(TAG, "in callback runnable: bitmap uri: " + mUri + - " width: " + resultBitmap.getWidth() + " height: " + - resultBitmap.getHeight() + " size: " + - resultBitmap.getByteCount()); - } - } - - mCallbacks.remove(mUri); - mPendingTaskUris.remove(mUri); - - if (Log.isLoggable(LogTag.THUMBNAIL_CACHE, Log.DEBUG)) { - Log.d(TAG, "Image task for " + mUri + "exiting " + mPendingTaskUris.size() - + " remain"); - } - } - }); - } - - private Bitmap getBitmap(boolean isVideo) { - ImageCacheService cacheService = getImageCacheService(); - - UriImage uriImage = new UriImage(mContext, mUri); - String path = uriImage.getPath(); - - if (path == null) { - return null; - } - - // We never want to store thumbnails of temp files in the thumbnail cache on disk - // because those temp filenames are recycled (and reused when capturing images - // or videos). - boolean isTempFile = TempFileProvider.isTempFile(path); - - ImageCacheService.ImageData data = null; - if (!isTempFile) { - data = cacheService.getImageData(path, TYPE_THUMBNAIL); - } - - if (data != null) { - Options options = new Options(); - options.inPreferredConfig = Config.ARGB_8888; - Bitmap bitmap = requestDecode(data.getData(), - data.getOffset(), data.getData().length - data.getOffset(), options); - if (bitmap == null) { - Log.w(TAG, "decode cached failed " + path); - } - return bitmap; - } else { - Bitmap bitmap; - if (isVideo) { - bitmap = getVideoBitmap(); - } else { - bitmap = onDecodeOriginal(mUri, TYPE_THUMBNAIL); - } - if (bitmap == null) { - Log.w(TAG, "decode orig failed " + path); - return null; - } - - bitmap = resizeDownBySideLength(bitmap, THUMBNAIL_TARGET_SIZE, true); - - if (!isTempFile) { - byte[] array = compressBitmap(bitmap); - cacheService.putImageData(path, TYPE_THUMBNAIL, array); - } - return bitmap; - } - } - - private Bitmap getVideoBitmap() { - // TODO Stagefright - /* REMOVED FOR STAGEFRIGHT BUG - MediaMetadataRetriever retriever = new MediaMetadataRetriever(); - try { - retriever.setDataSource(mContext, mUri); - return retriever.getFrameAtTime(-1); - } catch (RuntimeException ex) { - // Assume this is a corrupt video file. - } finally { - try { - retriever.release(); - } catch (RuntimeException ex) { - // Ignore failures while cleaning up. - } - } */ - return null; - } - - private byte[] compressBitmap(Bitmap bitmap) { - ByteArrayOutputStream os = new ByteArrayOutputStream(); - bitmap.compress(Bitmap.CompressFormat.JPEG, - COMPRESS_JPEG_QUALITY, os); - return os.toByteArray(); - } - - private Bitmap requestDecode(byte[] bytes, int offset, - int length, Options options) { - if (options == null) { - options = new Options(); - } - return ensureGLCompatibleBitmap( - BitmapFactory.decodeByteArray(bytes, offset, length, options)); - } - - private Bitmap resizeDownBySideLength( - Bitmap bitmap, int maxLength, boolean recycle) { - int srcWidth = bitmap.getWidth(); - int srcHeight = bitmap.getHeight(); - float scale = Math.min( - (float) maxLength / srcWidth, (float) maxLength / srcHeight); - if (scale >= 1.0f) return bitmap; - return resizeBitmapByScale(bitmap, scale, recycle); - } - - private Bitmap resizeBitmapByScale( - Bitmap bitmap, float scale, boolean recycle) { - int width = Math.round(bitmap.getWidth() * scale); - int height = Math.round(bitmap.getHeight() * scale); - if (width == bitmap.getWidth() - && height == bitmap.getHeight()) return bitmap; - Bitmap target = Bitmap.createBitmap(width, height, getConfig(bitmap)); - Canvas canvas = new Canvas(target); - canvas.scale(scale, scale); - Paint paint = new Paint(Paint.FILTER_BITMAP_FLAG | Paint.DITHER_FLAG); - canvas.drawBitmap(bitmap, 0, 0, paint); - if (recycle) bitmap.recycle(); - return target; - } - - private Config getConfig(Bitmap bitmap) { - Config config = bitmap.getConfig(); - if (config == null) { - config = Config.ARGB_8888; - } - return config; - } - - // TODO: This function should not be called directly from - // DecodeUtils.requestDecode(...), since we don't have the knowledge - // if the bitmap will be uploaded to GL. - private Bitmap ensureGLCompatibleBitmap(Bitmap bitmap) { - if (bitmap == null || bitmap.getConfig() != null) return bitmap; - Bitmap newBitmap = bitmap.copy(Config.ARGB_8888, false); - bitmap.recycle(); - return newBitmap; - } - - private Bitmap onDecodeOriginal(Uri uri, int type) { - Options options = new Options(); - options.inPreferredConfig = Config.ARGB_8888; - - return requestDecode(uri, options, THUMBNAIL_TARGET_SIZE); - } - - private void closeSilently(Closeable c) { - if (c == null) return; - try { - c.close(); - } catch (Throwable t) { - Log.w(TAG, "close fail", t); - } - } - - private Bitmap requestDecode(final Uri uri, Options options, int targetSize) { - if (options == null) options = new Options(); - - InputStream inputStream; - try { - inputStream = mContext.getContentResolver().openInputStream(uri); - } catch (FileNotFoundException e) { - Log.e(TAG, "Can't open uri: " + uri, e); - return null; - } - - options.inJustDecodeBounds = true; - BitmapFactory.decodeStream(inputStream, null, options); - closeSilently(inputStream); - - // No way to reset the stream. Have to open it again :-( - try { - inputStream = mContext.getContentResolver().openInputStream(uri); - } catch (FileNotFoundException e) { - Log.e(TAG, "Can't open uri: " + uri, e); - return null; - } - - options.inSampleSize = computeSampleSizeLarger( - options.outWidth, options.outHeight, targetSize); - options.inJustDecodeBounds = false; - - Bitmap result = BitmapFactory.decodeStream(inputStream, null, options); - closeSilently(inputStream); - - if (result == null) { - return null; - } - - // We need to resize down if the decoder does not support inSampleSize. - // (For example, GIF images.) - result = resizeDownIfTooBig(result, targetSize, true); - result = ensureGLCompatibleBitmap(result); - - int orientation = UriImage.getOrientation(mContext, uri); - // Rotate the bitmap if we need to. - if (result != null && orientation != 0) { - result = UriImage.rotateBitmap(result, orientation); - } - return result; - } - - // This computes a sample size which makes the longer side at least - // minSideLength long. If that's not possible, return 1. - private int computeSampleSizeLarger(int w, int h, - int minSideLength) { - int initialSize = Math.max(w / minSideLength, h / minSideLength); - if (initialSize <= 1) return 1; - - return initialSize <= 8 - ? prevPowerOf2(initialSize) - : initialSize / 8 * 8; - } - - // Returns the previous power of two. - // Returns the input if it is already power of 2. - // Throws IllegalArgumentException if the input is <= 0 - private int prevPowerOf2(int n) { - if (n <= 0) throw new IllegalArgumentException(); - return Integer.highestOneBit(n); - } - - // Resize the bitmap if each side is >= targetSize * 2 - private Bitmap resizeDownIfTooBig( - Bitmap bitmap, int targetSize, boolean recycle) { - int srcWidth = bitmap.getWidth(); - int srcHeight = bitmap.getHeight(); - float scale = Math.max( - (float) targetSize / srcWidth, (float) targetSize / srcHeight); - if (scale > 0.5f) return bitmap; - return resizeBitmapByScale(bitmap, scale, recycle); - } - } - - public static class ImageLoaded { - public final Bitmap mBitmap; - public final boolean mIsVideo; - - public ImageLoaded(Bitmap bitmap, boolean isVideo) { - mBitmap = bitmap; - mIsVideo = isVideo; - } - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/common/google/UriImage.java b/QKSMS/src/main/java/com/moez/QKSMS/common/google/UriImage.java deleted file mode 100644 index d7d71d22d..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/common/google/UriImage.java +++ /dev/null @@ -1,562 +0,0 @@ -/* - * Copyright (C) 2008 Esmertec AG. - * Copyright (C) 2008 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.moez.QKSMS.common.google; - -import android.content.ContentResolver; -import android.content.Context; -import android.content.UriMatcher; -import android.database.Cursor; -import android.database.sqlite.SQLiteException; -import android.database.sqlite.SqliteWrapper; -import android.graphics.Bitmap; -import android.graphics.Bitmap.CompressFormat; -import android.graphics.BitmapFactory; -import android.graphics.Matrix; -import android.net.Uri; -import android.provider.MediaStore.Images; -import android.provider.Telephony.Mms.Part; -import android.text.TextUtils; -import android.util.Log; -import android.webkit.MimeTypeMap; - -import com.google.android.mms.ContentType; -import com.google.android.mms.pdu_alt.PduPart; -import com.moez.QKSMS.LogTag; -import com.moez.QKSMS.exif.ExifInterface; -import com.moez.QKSMS.model.ImageModel; -import com.moez.QKSMS.transaction.SmsHelper; - -import java.io.ByteArrayOutputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; - -public class UriImage { - private static final int NUMBER_OF_RESIZE_ATTEMPTS = 4; - private static final String TAG = "Mms/image"; - private static final boolean DEBUG = false; - private static final boolean LOCAL_LOGV = false; - private static final int MMS_PART_ID = 12; - private static final UriMatcher sURLMatcher = new UriMatcher(UriMatcher.NO_MATCH); - static { - sURLMatcher.addURI("mms", "part/#", MMS_PART_ID); - } - - private final Context mContext; - private final Uri mUri; - private String mContentType; - private String mPath; - private String mSrc; - private int mWidth; - private int mHeight; - - public UriImage(Context context, Uri uri) { - if ((null == context) || (null == uri)) { - throw new IllegalArgumentException(); - } - - String scheme = uri.getScheme(); - if (scheme.equals("content")) { - initFromContentUri(context, uri); - } else if (uri.getScheme().equals("file")) { - initFromFile(context, uri); - } - - mContext = context; - mUri = uri; - - decodeBoundsInfo(); - - if (LOCAL_LOGV) { - Log.v(TAG, "UriImage uri: " + uri + " mPath: " + mPath + " mWidth: " + mWidth + - " mHeight: " + mHeight); - } - } - - private void initFromFile(Context context, Uri uri) { - mPath = uri.getPath(); - MimeTypeMap mimeTypeMap = MimeTypeMap.getSingleton(); - String extension = MimeTypeMap.getFileExtensionFromUrl(mPath); - if (TextUtils.isEmpty(extension)) { - // getMimeTypeFromExtension() doesn't handle spaces in filenames nor can it handle - // urlEncoded strings. Let's try one last time at finding the extension. - int dotPos = mPath.lastIndexOf('.'); - if (0 <= dotPos) { - extension = mPath.substring(dotPos + 1); - } - } - mContentType = mimeTypeMap.getMimeTypeFromExtension(extension); - // It's ok if mContentType is null. Eventually we'll show a toast telling the - // user the picture couldn't be attached. - - buildSrcFromPath(); - } - - private void buildSrcFromPath() { - mSrc = mPath.substring(mPath.lastIndexOf('/') + 1); - - if(mSrc.startsWith(".") && mSrc.length() > 1) { - mSrc = mSrc.substring(1); - } - - // Some MMSCs appear to have problems with filenames - // containing a space. So just replace them with - // underscores in the name, which is typically not - // visible to the user anyway. - mSrc = mSrc.replace(' ', '_'); - } - - private void initFromContentUri(Context context, Uri uri) { - ContentResolver resolver = context.getContentResolver(); - Cursor c = SqliteWrapper.query(context, resolver, - uri, null, null, null, null); - - mSrc = null; - if (c == null) { - throw new IllegalArgumentException( - "Query on " + uri + " returns null result."); - } - - try { - if ((c.getCount() != 1) || !c.moveToFirst()) { - throw new IllegalArgumentException( - "Query on " + uri + " returns 0 or multiple rows."); - } - - String filePath; - if (ImageModel.isMmsUri(uri)) { - filePath = c.getString(c.getColumnIndexOrThrow(Part.FILENAME)); - if (TextUtils.isEmpty(filePath)) { - filePath = c.getString( - c.getColumnIndexOrThrow(Part._DATA)); - } - mContentType = c.getString( - c.getColumnIndexOrThrow(Part.CONTENT_TYPE)); - } else { - filePath = uri.getPath(); - try { - mContentType = c.getString( - c.getColumnIndexOrThrow(Images.Media.MIME_TYPE)); // mime_type - } catch (IllegalArgumentException e) { - try { - mContentType = c.getString(c.getColumnIndexOrThrow("mimetype")); - } catch (IllegalArgumentException ex) { - mContentType = resolver.getType(uri); - Log.v(TAG, "initFromContentUri: " + uri + ", getType => " + mContentType); - } - } - - // use the original filename if possible - int nameIndex = c.getColumnIndex(Images.Media.DISPLAY_NAME); - if (nameIndex != -1) { - mSrc = c.getString(nameIndex); - if (!TextUtils.isEmpty(mSrc)) { - // Some MMSCs appear to have problems with filenames - // containing a space. So just replace them with - // underscores in the name, which is typically not - // visible to the user anyway. - mSrc = mSrc.replace(' ', '_'); - } else { - mSrc = null; - } - } - } - mPath = filePath; - if (mSrc == null) { - buildSrcFromPath(); - } - } catch (IllegalArgumentException e) { - Log.e(TAG, "initFromContentUri couldn't load image uri: " + uri, e); - } finally { - c.close(); - } - } - - private void decodeBoundsInfo() { - InputStream input = null; - try { - input = mContext.getContentResolver().openInputStream(mUri); - BitmapFactory.Options opt = new BitmapFactory.Options(); - opt.inJustDecodeBounds = true; - BitmapFactory.decodeStream(input, null, opt); - mWidth = opt.outWidth; - mHeight = opt.outHeight; - } catch (FileNotFoundException e) { - // Ignore - Log.e(TAG, "IOException caught while opening stream", e); - } finally { - if (null != input) { - try { - input.close(); - } catch (IOException e) { - // Ignore - Log.e(TAG, "IOException caught while closing stream", e); - } - } - } - } - - public String getContentType() { - return mContentType; - } - - public String getSrc() { - return mSrc; - } - - public String getPath() { - return mPath; - } - - public int getWidth() { - return mWidth; - } - - public int getHeight() { - return mHeight; - } - - /** - * Get a version of this image resized to fit the given dimension and byte-size limits. Note - * that the content type of the resulting PduPart may not be the same as the content type of - * this UriImage; always call @link PduPart#getContentType() to get the new content type. - * - * @param widthLimit The width limit, in pixels - * @param heightLimit The height limit, in pixels - * @param byteLimit The binary size limit, in bytes - * @return A new PduPart containing the resized image data - */ - public PduPart getResizedImageAsPart(int widthLimit, int heightLimit, int byteLimit) { - PduPart part = new PduPart(); - - byte[] data = getResizedImageData(mWidth, mHeight, - widthLimit, heightLimit, byteLimit, mUri, mContext); - if (data == null) { - if (LOCAL_LOGV) { - Log.v(TAG, "Resize image failed."); - } - return null; - } - - part.setData(data); - // getResizedImageData ALWAYS compresses to JPEG, regardless of the original content type - part.setContentType(ContentType.IMAGE_JPEG.getBytes()); - - return part; - } - - /** - * Resize and recompress the image such that it fits the given limits. The resulting byte - * array contains an image in JPEG format, regardless of the original image's content type. - * @param widthLimit The width limit, in pixels - * @param heightLimit The height limit, in pixels - * @param byteLimit The binary size limit, in bytes - * @return A resized/recompressed version of this image, in JPEG format - */ - public static byte[] getResizedImageData(int width, int height, - int widthLimit, int heightLimit, int byteLimit, Uri uri, Context context) { - int outWidth = width; - int outHeight = height; - - float scaleFactor = 1.F; - while ((outWidth * scaleFactor > widthLimit) || (outHeight * scaleFactor > heightLimit)) { - scaleFactor *= .75F; - } - - int orientation = getOrientation(context, uri); - - if (Log.isLoggable(LogTag.APP, Log.VERBOSE)) { - Log.v(TAG, "getResizedBitmap: wlimit=" + widthLimit + - ", hlimit=" + heightLimit + ", sizeLimit=" + byteLimit + - ", width=" + width + ", height=" + height + - ", initialScaleFactor=" + scaleFactor + - ", uri=" + uri + - ", orientation=" + orientation); - } - - InputStream input = null; - ByteArrayOutputStream os = null; - try { - int attempts = 1; - int sampleSize = 1; - BitmapFactory.Options options = new BitmapFactory.Options(); - int quality = SmsHelper.IMAGE_COMPRESSION_QUALITY; - Bitmap b = null; - - // In this loop, attempt to decode the stream with the best possible subsampling (we - // start with 1, which means no subsampling - get the original content) without running - // out of memory. - do { - input = context.getContentResolver().openInputStream(uri); - options.inSampleSize = sampleSize; - try { - b = BitmapFactory.decodeStream(input, null, options); - if (b == null) { - return null; // Couldn't decode and it wasn't because of an exception, - // bail. - } - } catch (OutOfMemoryError e) { - Log.w(TAG, "getResizedBitmap: img too large to decode (OutOfMemoryError), " + - "may try with larger sampleSize. Curr sampleSize=" + sampleSize); - sampleSize *= 2; // works best as a power of two - attempts++; - continue; - } finally { - if (input != null) { - try { - input.close(); - } catch (IOException e) { - Log.e(TAG, e.getMessage(), e); - } - } - } - } while (b == null && attempts < NUMBER_OF_RESIZE_ATTEMPTS); - - if (b == null) { - if (Log.isLoggable(LogTag.APP, Log.VERBOSE) - && attempts >= NUMBER_OF_RESIZE_ATTEMPTS) { - Log.v(TAG, "getResizedImageData: gave up after too many attempts to resize"); - } - return null; - } - - boolean resultTooBig = true; - attempts = 1; // reset count for second loop - // In this loop, we attempt to compress/resize the content to fit the given dimension - // and file-size limits. - do { - try { - if (options.outWidth > widthLimit || options.outHeight > heightLimit || - (os != null && os.size() > byteLimit)) { - // The decoder does not support the inSampleSize option. - // Scale the bitmap using Bitmap library. - int scaledWidth = (int)(outWidth * scaleFactor); - int scaledHeight = (int)(outHeight * scaleFactor); - - if (Log.isLoggable(LogTag.APP, Log.VERBOSE)) { - Log.v(TAG, "getResizedImageData: retry scaling using " + - "Bitmap.createScaledBitmap: w=" + scaledWidth + - ", h=" + scaledHeight); - } - - b = Bitmap.createScaledBitmap(b, scaledWidth, scaledHeight, false); - if (b == null) { - if (Log.isLoggable(LogTag.APP, Log.VERBOSE)) { - Log.v(TAG, "Bitmap.createScaledBitmap returned NULL!"); - } - return null; - } - } - - // Compress the image into a JPG. Start with MessageUtils.IMAGE_COMPRESSION_QUALITY. - // In case that the image byte size is still too large reduce the quality in - // proportion to the desired byte size. - if (os != null) { - try { - os.close(); - } catch (IOException e) { - Log.e(TAG, e.getMessage(), e); - } - } - os = new ByteArrayOutputStream(); - b.compress(CompressFormat.JPEG, quality, os); - int jpgFileSize = os.size(); - if (jpgFileSize > byteLimit) { - quality = (quality * byteLimit) / jpgFileSize; // watch for int division! - if (quality < SmsHelper.MINIMUM_IMAGE_COMPRESSION_QUALITY) { - quality = SmsHelper.MINIMUM_IMAGE_COMPRESSION_QUALITY; - } - - if (Log.isLoggable(LogTag.APP, Log.VERBOSE)) { - Log.v(TAG, "getResizedImageData: compress(2) w/ quality=" + quality); - } - - if (os != null) { - try { - os.close(); - } catch (IOException e) { - Log.e(TAG, e.getMessage(), e); - } - } - os = new ByteArrayOutputStream(); - b.compress(CompressFormat.JPEG, quality, os); - } - } catch (OutOfMemoryError e) { - Log.w(TAG, "getResizedImageData - image too big (OutOfMemoryError), will try " - + " with smaller scale factor, cur scale factor: " + scaleFactor); - // fall through and keep trying with a smaller scale factor. - } - if (Log.isLoggable(LogTag.APP, Log.VERBOSE)) { - Log.v(TAG, "attempt=" + attempts - + " size=" + (os == null ? 0 : os.size()) - + " width=" + outWidth * scaleFactor - + " height=" + outHeight * scaleFactor - + " scaleFactor=" + scaleFactor - + " quality=" + quality); - } - scaleFactor *= .75F; - attempts++; - resultTooBig = os == null || os.size() > byteLimit; - } while (resultTooBig && attempts < NUMBER_OF_RESIZE_ATTEMPTS); - if (!resultTooBig && orientation != 0) { - // Rotate the final bitmap if we need to. - try { - b = UriImage.rotateBitmap(b, orientation); - os = new ByteArrayOutputStream(); - b.compress(CompressFormat.JPEG, quality, os); - resultTooBig = os == null || os.size() > byteLimit; - } catch (OutOfMemoryError e) { - Log.w(TAG, "getResizedImageData - image too big (OutOfMemoryError)"); - if (os == null) { - return null; - } - } - } - - b.recycle(); // done with the bitmap, release the memory - if (Log.isLoggable(LogTag.APP, Log.VERBOSE) && resultTooBig) { - Log.v(TAG, "getResizedImageData returning NULL because the result is too big: " + - " requested max: " + byteLimit + " actual: " + os.size()); - } - - return resultTooBig ? null : os.toByteArray(); - } catch (FileNotFoundException e) { - Log.e(TAG, e.getMessage(), e); - return null; - } catch (OutOfMemoryError e) { - Log.e(TAG, e.getMessage(), e); - return null; - } finally { - if (input != null) { - try { - input.close(); - } catch (IOException e) { - Log.e(TAG, e.getMessage(), e); - } - } - if (os != null) { - try { - os.close(); - } catch (IOException e) { - Log.e(TAG, e.getMessage(), e); - } - } - } - } - - /** - * Bitmap rotation method - * - * @param bitmap The input bitmap - * @param degrees The rotation angle - */ - public static Bitmap rotateBitmap(Bitmap bitmap, int degrees) { - if (degrees != 0 && bitmap != null) { - final Matrix m = new Matrix(); - final int w = bitmap.getWidth(); - final int h = bitmap.getHeight(); - m.setRotate(degrees, (float) w / 2, (float) h / 2); - - try { - final Bitmap rotatedBitmap = Bitmap.createBitmap(bitmap, 0, 0, w, h, m, true); - if (bitmap != rotatedBitmap && rotatedBitmap != null) { - bitmap.recycle(); - bitmap = rotatedBitmap; - } - } catch (OutOfMemoryError ex) { - Log.e(TAG, "OOM in rotateBitmap", ex); - // We have no memory to rotate. Return the original bitmap. - } - } - - return bitmap; - } - - /** - * Returns the number of degrees to rotate the picture, based on the orientation tag in - * the exif data or the orientation column in the database. If there's no tag or column, - * 0 degrees is returned. - * - * @param context Used to get the ContentResolver - * @param uri Path to the image - */ - public static int getOrientation(Context context, Uri uri) { - long dur = System.currentTimeMillis(); - if (ContentResolver.SCHEME_FILE.equals(uri.getScheme()) || - sURLMatcher.match(uri) == MMS_PART_ID) { - // If the uri is a file or an mms part, we have to look at the exif data in the - // file for the orientation because there is no column in the db for the orientation. - try { - InputStream inputStream = context.getContentResolver().openInputStream(uri); - ExifInterface exif = new ExifInterface(); - try { - exif.readExif(inputStream); - Integer val = exif.getTagIntValue(ExifInterface.TAG_ORIENTATION); - if (val == null){ - return 0; - } - int orientation = - ExifInterface.getRotationForOrientationValue(val.shortValue()); - return orientation; - } catch (IOException e) { - Log.w(TAG, "Failed to read EXIF orientation", e); - } finally { - if (inputStream != null) { - try { - inputStream.close(); - } catch (IOException e) { - } - } - } - } catch (FileNotFoundException e) { - Log.e(TAG, "Can't open uri: " + uri, e); - } finally { - dur = System.currentTimeMillis() - dur; - if (Log.isLoggable(LogTag.APP, Log.VERBOSE)) { - Log.v(TAG, "UriImage.getOrientation (exif path) took: " + dur + " ms"); - } - } - } else { - // Try to get the orientation from the ORIENTATION column in the database. This is much - // faster than reading all the exif tags from the file. - Cursor cursor = null; - try { - cursor = context.getContentResolver().query(uri, - new String[] { - Images.ImageColumns.ORIENTATION - }, - null, null, null); - if (cursor.moveToNext()) { - int ori = cursor.getInt(0); - return ori; - } - } catch (SQLiteException e) { - } catch (IllegalArgumentException e) { - } finally { - if (cursor != null) { - cursor.close(); - } - dur = System.currentTimeMillis() - dur; - if (Log.isLoggable(LogTag.APP, Log.VERBOSE)) { - Log.v(TAG, "UriImage.getOrientation (db column path) took: " + dur + " ms"); - } - } - } - return 0; - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/common/utils/AddressUtils.java b/QKSMS/src/main/java/com/moez/QKSMS/common/utils/AddressUtils.java deleted file mode 100644 index 872ce0fff..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/common/utils/AddressUtils.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright (C) 2008 Esmertec AG. - * Copyright (C) 2008 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.moez.QKSMS.common.utils; - -import android.content.Context; -import android.database.Cursor; -import android.database.sqlite.SqliteWrapper; -import android.net.Uri; -import android.provider.Telephony.Mms; -import android.provider.Telephony.Mms.Addr; -import android.text.TextUtils; - -import com.google.android.mms.pdu_alt.EncodedStringValue; -import com.google.android.mms.pdu_alt.PduHeaders; -import com.google.android.mms.pdu_alt.PduPersister; -import com.google.i18n.phonenumbers.PhoneNumberUtil; -import com.moez.QKSMS.QKSMSApp; -import com.moez.QKSMS.R; - -public class AddressUtils { - private static final String TAG = "AddressUtils"; - private static PhoneNumberUtil mPhoneNumberUtil; - - private AddressUtils() { - // Forbidden being instantiated. - } - - public static String getFrom(Context context, Uri uri) { - String msgId = uri.getLastPathSegment(); - Uri.Builder builder = Mms.CONTENT_URI.buildUpon(); - - builder.appendPath(msgId).appendPath("addr"); - - Cursor cursor = SqliteWrapper.query(context, context.getContentResolver(), - builder.build(), new String[]{Addr.ADDRESS, Addr.CHARSET}, - Addr.TYPE + "=" + PduHeaders.FROM, null, null); - - if (cursor != null) { - try { - if (cursor.moveToFirst()) { - String from = cursor.getString(0); - - if (!TextUtils.isEmpty(from)) { - byte[] bytes = PduPersister.getBytes(from); - int charset = cursor.getInt(1); - return new EncodedStringValue(charset, bytes).getString(); - } - } - } finally { - cursor.close(); - } - } - return context.getString(R.string.hidden_sender_address); - } - - /** - * isPossiblePhoneNumberCanDoFileAccess does a more accurate test if the input is a - * phone number, but it can do file access to load country prefixes and other info, so - * it's not safe to call from the UI thread. - * - * @param query the phone number to test - * @return true if query looks like a valid phone number - */ - public static boolean isPossiblePhoneNumberCanDoFileAccess(String query) { - String currentCountry = QKSMSApp.getApplication().getCurrentCountryIso().toUpperCase(); - if (mPhoneNumberUtil == null) { - mPhoneNumberUtil = PhoneNumberUtil.getInstance(); - } - return mPhoneNumberUtil.isPossibleNumber(query, currentCountry); - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/common/utils/ArrayUtils.java b/QKSMS/src/main/java/com/moez/QKSMS/common/utils/ArrayUtils.java deleted file mode 100644 index 4a8069119..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/common/utils/ArrayUtils.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.moez.QKSMS.common.utils; - -public class ArrayUtils { - - public static int indexOf(T[] arr, T v) { - for (int i = 0; i < arr.length; i++) { - if (v == null && arr[i] == null) { - return i; - } else if (v != null) { - if (v.equals(arr[i])) { - return i; - } - } - } - return -1; - } - -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/common/utils/ColorUtils.java b/QKSMS/src/main/java/com/moez/QKSMS/common/utils/ColorUtils.java deleted file mode 100644 index e8c9e2a7d..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/common/utils/ColorUtils.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.moez.QKSMS.common.utils; - -import android.graphics.Color; - -public class ColorUtils { - private static final String TAG = "ColorUtils"; - - public static int lighten(int color) { - double r = Color.red(color); - double g = Color.green(color); - double b = Color.blue(color); - - r *= 1.1; - g *= 1.1; - b *= 1.1; - - double threshold = 255.999; - double max = Math.max(r, Math.max(g, b)); - - if (max > threshold) { - double total = r + g + b; - if (total >= 3 * threshold) - return Color.WHITE; - - double x = (3 * threshold - total) / (3 * max - total); - double gray = threshold - x * max; - - r = gray + x * r; - g = gray + x * g; - b = gray + x * b; - } - - return Color.argb(255, (int) r, (int) g, (int) b); - } - - public static int darken(int color) { - float[] hsv = new float[3]; - Color.colorToHSV(color, hsv); - hsv[2] *= 0.85f; - color = Color.HSVToColor(hsv); - return color; - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/common/utils/CursorUtils.java b/QKSMS/src/main/java/com/moez/QKSMS/common/utils/CursorUtils.java deleted file mode 100644 index 03fa75c55..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/common/utils/CursorUtils.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.moez.QKSMS.common.utils; - -import android.content.ContentResolver; -import android.content.ContentValues; -import android.content.Context; -import android.database.Cursor; -import android.net.Uri; -import android.telephony.TelephonyManager; -import android.util.Log; - -import com.moez.QKSMS.data.Message; -import com.moez.QKSMS.transaction.SmsHelper; - -public class CursorUtils { - public static final String TAG = "CursorUtils"; - - /** - * Returns true if the cursor is non-null and not closed. - * @param cursor - * @return - */ - public static boolean isValid(Cursor cursor) { - return cursor != null && !cursor.isClosed(); - } - - public static void outputColumns(Cursor cursor) { - if (cursor == null || cursor.getCount() == 0) return; - - if (cursor.getPosition() < 0) { - cursor.moveToFirst(); - } - - for (int i = 0; i < cursor.getColumnCount(); i++) { - Log.d(TAG, "Column " + cursor.getColumnName(i) + ": " + cursor.getString(i)); - } - Log.d(TAG, "------------------------------------------------------------"); - } - - public static void prepareEmulator(Context context) { - TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); - if (Integer.parseInt(telephonyManager.getDeviceId()) > 0) return; - - try { - context.getContentResolver().delete(Uri.parse("content://sms/"), null, null); - } catch (Exception e) { - e.printStackTrace(); - } - - ContentResolver contentResolver = context.getContentResolver(); - - String[][]messages = new String[][] { - {"4165254009", "Why are you texting myself?", "1399856640", "" + Message.RECEIVED}, // address, body, date, type - {"4166485592", "These popups are so handy!", "1400079840", "" + Message.RECEIVED}}; - - for (int i = 0; i < messages.length; i++) { - ContentValues cv = new ContentValues(); - cv.put("address", messages[i][0]); - cv.put("body", messages[i][1]); - cv.put("date", messages[i][2]); - cv.put("date_sent", messages[i][2]); - cv.put("type", messages[i][3]); - contentResolver.insert(SmsHelper.SMS_CONTENT_PROVIDER, cv); - } - - - /*for (int i = 0; i < messages.length; i++) { - ContentValues cv = new ContentValues(); - cv.put("date", messages[i][2]); - contentResolver.update(SmsHelper.CONVERSATIONS_CONTENT_PROVIDER, cv, "snippit=" + messages[i][1], null); - }*/ - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/common/utils/DateFormatter.java b/QKSMS/src/main/java/com/moez/QKSMS/common/utils/DateFormatter.java deleted file mode 100644 index 0d240d7d5..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/common/utils/DateFormatter.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.moez.QKSMS.common.utils; - -import android.content.Context; -import android.text.format.DateFormat; -import android.text.format.DateUtils; -import com.moez.QKSMS.QKSMSApp; -import com.moez.QKSMS.R; - -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Date; - -public abstract class DateFormatter { - - public static String getConversationTimestamp(Context context, long date) { - if (isSameDay(date)) { - return accountFor24HourTime(context, new SimpleDateFormat("h:mm a")).format(date); - } else if (isSameWeek(date)) { - return DateUtils.formatDateTime(context, date, DateUtils.FORMAT_SHOW_WEEKDAY | DateUtils.FORMAT_ABBREV_WEEKDAY); - } else if (isSameYear(date)) { - return DateUtils.formatDateTime(context, date, DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_NO_YEAR | DateUtils.FORMAT_ABBREV_MONTH); - } else { - return DateUtils.formatDateTime(context, date, DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_ABBREV_MONTH); - } - } - - private static boolean isSameDay(long date) { - SimpleDateFormat formatter = new SimpleDateFormat("D, y"); - return formatter.format(date).equals(formatter.format(System.currentTimeMillis())); - } - - private static boolean isSameWeek(long date) { - SimpleDateFormat formatter = new SimpleDateFormat("w, y"); - return formatter.format(date).equals(formatter.format(System.currentTimeMillis())); - } - - private static boolean isSameYear(long date) { - SimpleDateFormat formatter = new SimpleDateFormat("y"); - return formatter.format(date).equals(formatter.format(System.currentTimeMillis())); - } - - private static boolean isYesterday(long date) { - SimpleDateFormat formatter = new SimpleDateFormat("yD"); - return Integer.parseInt(formatter.format(date)) + 1 == Integer.parseInt(formatter.format(System.currentTimeMillis())); - } - - public static SimpleDateFormat accountFor24HourTime(Context context, SimpleDateFormat input) { //pass in 12 hour time. If needed, change to 24 hr. - boolean isUsing24HourTime = DateFormat.is24HourFormat(context); - - if (isUsing24HourTime) { - return new SimpleDateFormat(input.toPattern().replace('h', 'H').replaceAll(" a", "")); - } else return input; - } - - public static String getMessageTimestamp(Context context, long date) { - String time = ", " + accountFor24HourTime(context, new SimpleDateFormat("h:mm a")).format(date); - if (isSameDay(date)) { - return accountFor24HourTime(context, new SimpleDateFormat("h:mm a")).format(date); - } else if (isYesterday(date)) { - return context.getString(R.string.date_yesterday) + time; - } else if (isSameWeek(date)) { - return DateUtils.formatDateTime(context, date, DateUtils.FORMAT_SHOW_WEEKDAY | DateUtils.FORMAT_ABBREV_WEEKDAY) + time; - } else if (isSameYear(date)) { - return DateUtils.formatDateTime(context, date, DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_NO_YEAR | DateUtils.FORMAT_ABBREV_MONTH) + time; - } - - return DateUtils.formatDateTime(context, date, DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_ABBREV_MONTH) + time; - } - - public static String getDate(Context context, long date) { - return DateUtils.formatDateTime(context, date, DateUtils.FORMAT_SHOW_DATE) + accountFor24HourTime(context, new SimpleDateFormat(", h:mm:ss a")).format(date); - } - - public static String getRelativeTimestamp(long date) { - String relativeTimestamp = (String) DateUtils.getRelativeTimeSpanString(date); - if (relativeTimestamp.equals("in 0 minutes") || relativeTimestamp.equals("0 minutes ago")) - return QKSMSApp.getApplication().getString(com.moez.QKSMS.R.string.date_just_now); - return relativeTimestamp; - } - - public static String getSummaryTimestamp(Context context, String time) { - SimpleDateFormat simpleDateFormat = new SimpleDateFormat("H:mm"); - Date date; - - try { - date = simpleDateFormat.parse(time); - simpleDateFormat = accountFor24HourTime(context, new SimpleDateFormat("H:mm")); - time = simpleDateFormat.format(date); - } catch (ParseException e) { - e.printStackTrace(); - } - - return time; - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/common/utils/DrmUtils.java b/QKSMS/src/main/java/com/moez/QKSMS/common/utils/DrmUtils.java deleted file mode 100644 index e3f9399ce..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/common/utils/DrmUtils.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright (C) 2008 Esmertec AG. - * Copyright (C) 2008 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.moez.QKSMS.common.utils; - -import android.drm.DrmManagerClient; -import android.drm.DrmStore; -import android.net.Uri; -import android.util.Log; - -import com.moez.QKSMS.QKSMSApp; - -public class DrmUtils { - private static final String TAG = "DrmUtils"; - - /** The MIME type of special DRM files */ - private static final String EXTENSION_ANDROID_FWDL = ".fl"; - - private DrmUtils() { - } - - public static String getConvertExtension(String mimetype) { - return EXTENSION_ANDROID_FWDL; - } - - public static boolean isDrmType(String mimeType) { - boolean result = false; - DrmManagerClient drmManagerClient = QKSMSApp.getApplication().getDrmManagerClient(); - if (drmManagerClient != null) { - try { - if (drmManagerClient.canHandle("", mimeType)) { - result = true; - } - } catch (IllegalArgumentException ex) { - Log.w(TAG, "canHandle called with wrong parameters"); - } catch (IllegalStateException ex) { - Log.w(TAG, "DrmManagerClient didn't initialize properly"); - } - } - return result; - } - - /** - * Check if content may be forwarded according to DRM - * - * @param uri Uri to content - * @return true if the content may be forwarded - */ - public static boolean haveRightsForAction(Uri uri, int action) { - DrmManagerClient drmManagerClient = QKSMSApp.getApplication().getDrmManagerClient(); - - try { - // first check if the URI is registered as DRM in DRM-framework - if (drmManagerClient.canHandle(uri.toString(), null)) { - int check = drmManagerClient.checkRightsStatus(uri.toString(), action); - return (check == DrmStore.RightsStatus.RIGHTS_VALID); - } - } catch (Exception e) { - // Ignore exception and assume it is OK to forward file. - } finally { - } - return true; - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/common/utils/EmojiUtils.java b/QKSMS/src/main/java/com/moez/QKSMS/common/utils/EmojiUtils.java deleted file mode 100644 index 569ae74f5..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/common/utils/EmojiUtils.java +++ /dev/null @@ -1,1456 +0,0 @@ -package com.moez.QKSMS.common.utils; - -import android.text.TextUtils; -import android.util.SparseIntArray; - -/** - * Helper class for all things Emoji - * - * Modified from https://github.com/rockerhieu/emojicon/blob/master/library/src/main/java/com/rockerhieu/emojicon/EmojiconHandler.java - */ -public class EmojiUtils { - - private static final SparseIntArray sEmojisMap = new SparseIntArray(846); - private static final SparseIntArray sSoftbanksMap = new SparseIntArray(471); - - static { - // People - sEmojisMap.put(0x1f604, 1); - sEmojisMap.put(0x1f603, 1); - sEmojisMap.put(0x1f600, 1); - sEmojisMap.put(0x1f60a, 1); - sEmojisMap.put(0x263a, 1); - sEmojisMap.put(0x1f609, 1); - sEmojisMap.put(0x1f60d, 1); - sEmojisMap.put(0x1f618, 1); - sEmojisMap.put(0x1f61a, 1); - sEmojisMap.put(0x1f617, 1); - sEmojisMap.put(0x1f619, 1); - sEmojisMap.put(0x1f61c, 1); - sEmojisMap.put(0x1f61d, 1); - sEmojisMap.put(0x1f61b, 1); - sEmojisMap.put(0x1f633, 1); - sEmojisMap.put(0x1f601, 1); - sEmojisMap.put(0x1f614, 1); - sEmojisMap.put(0x1f60c, 1); - sEmojisMap.put(0x1f612, 1); - sEmojisMap.put(0x1f61e, 1); - sEmojisMap.put(0x1f623, 1); - sEmojisMap.put(0x1f622, 1); - sEmojisMap.put(0x1f602, 1); - sEmojisMap.put(0x1f62d, 1); - sEmojisMap.put(0x1f62a, 1); - sEmojisMap.put(0x1f625, 1); - sEmojisMap.put(0x1f630, 1); - sEmojisMap.put(0x1f605, 1); - sEmojisMap.put(0x1f613, 1); - sEmojisMap.put(0x1f629, 1); - sEmojisMap.put(0x1f62b, 1); - sEmojisMap.put(0x1f628, 1); - sEmojisMap.put(0x1f631, 1); - sEmojisMap.put(0x1f620, 1); - sEmojisMap.put(0x1f621, 1); - sEmojisMap.put(0x1f624, 1); - sEmojisMap.put(0x1f616, 1); - sEmojisMap.put(0x1f606, 1); - sEmojisMap.put(0x1f60b, 1); - sEmojisMap.put(0x1f637, 1); - sEmojisMap.put(0x1f60e, 1); - sEmojisMap.put(0x1f634, 1); - sEmojisMap.put(0x1f635, 1); - sEmojisMap.put(0x1f632, 1); - sEmojisMap.put(0x1f61f, 1); - sEmojisMap.put(0x1f626, 1); - sEmojisMap.put(0x1f627, 1); - sEmojisMap.put(0x1f608, 1); - sEmojisMap.put(0x1f47f, 1); - sEmojisMap.put(0x1f62e, 1); - sEmojisMap.put(0x1f62c, 1); - sEmojisMap.put(0x1f610, 1); - sEmojisMap.put(0x1f615, 1); - sEmojisMap.put(0x1f62f, 1); - sEmojisMap.put(0x1f636, 1); - sEmojisMap.put(0x1f607, 1); - sEmojisMap.put(0x1f60f, 1); - sEmojisMap.put(0x1f611, 1); - sEmojisMap.put(0x1f472, 1); - sEmojisMap.put(0x1f473, 1); - sEmojisMap.put(0x1f46e, 1); - sEmojisMap.put(0x1f477, 1); - sEmojisMap.put(0x1f482, 1); - sEmojisMap.put(0x1f476, 1); - sEmojisMap.put(0x1f466, 1); - sEmojisMap.put(0x1f467, 1); - sEmojisMap.put(0x1f468, 1); - sEmojisMap.put(0x1f469, 1); - sEmojisMap.put(0x1f474, 1); - sEmojisMap.put(0x1f475, 1); - sEmojisMap.put(0x1f471, 1); - sEmojisMap.put(0x1f47c, 1); - sEmojisMap.put(0x1f478, 1); - sEmojisMap.put(0x1f63a, 1); - sEmojisMap.put(0x1f638, 1); - sEmojisMap.put(0x1f63b, 1); - sEmojisMap.put(0x1f63d, 1); - sEmojisMap.put(0x1f63c, 1); - sEmojisMap.put(0x1f640, 1); - sEmojisMap.put(0x1f63f, 1); - sEmojisMap.put(0x1f639, 1); - sEmojisMap.put(0x1f63e, 1); - sEmojisMap.put(0x1f479, 1); - sEmojisMap.put(0x1f47a, 1); - sEmojisMap.put(0x1f648, 1); - sEmojisMap.put(0x1f649, 1); - sEmojisMap.put(0x1f64a, 1); - sEmojisMap.put(0x1f480, 1); - sEmojisMap.put(0x1f47d, 1); - sEmojisMap.put(0x1f4a9, 1); - sEmojisMap.put(0x1f525, 1); - sEmojisMap.put(0x2728, 1); - sEmojisMap.put(0x1f31f, 1); - sEmojisMap.put(0x1f4ab, 1); - sEmojisMap.put(0x1f4a5, 1); - sEmojisMap.put(0x1f4a2, 1); - sEmojisMap.put(0x1f4a6, 1); - sEmojisMap.put(0x1f4a7, 1); - sEmojisMap.put(0x1f4a4, 1); - sEmojisMap.put(0x1f4a8, 1); - sEmojisMap.put(0x1f442, 1); - sEmojisMap.put(0x1f440, 1); - sEmojisMap.put(0x1f443, 1); - sEmojisMap.put(0x1f445, 1); - sEmojisMap.put(0x1f444, 1); - sEmojisMap.put(0x1f44d, 1); - sEmojisMap.put(0x1f44e, 1); - sEmojisMap.put(0x1f44c, 1); - sEmojisMap.put(0x1f44a, 1); - sEmojisMap.put(0x270a, 1); - sEmojisMap.put(0x270c, 1); - sEmojisMap.put(0x1f44b, 1); - sEmojisMap.put(0x270b, 1); - sEmojisMap.put(0x1f450, 1); - sEmojisMap.put(0x1f446, 1); - sEmojisMap.put(0x1f447, 1); - sEmojisMap.put(0x1f449, 1); - sEmojisMap.put(0x1f448, 1); - sEmojisMap.put(0x1f64c, 1); - sEmojisMap.put(0x1f64f, 1); - sEmojisMap.put(0x261d, 1); - sEmojisMap.put(0x1f44f, 1); - sEmojisMap.put(0x1f4aa, 1); - sEmojisMap.put(0x1f6b6, 1); - sEmojisMap.put(0x1f3c3, 1); - sEmojisMap.put(0x1f483, 1); - sEmojisMap.put(0x1f46b, 1); - sEmojisMap.put(0x1f46a, 1); - sEmojisMap.put(0x1f46c, 1); - sEmojisMap.put(0x1f46d, 1); - sEmojisMap.put(0x1f48f, 1); - sEmojisMap.put(0x1f491, 1); - sEmojisMap.put(0x1f46f, 1); - sEmojisMap.put(0x1f646, 1); - sEmojisMap.put(0x1f645, 1); - sEmojisMap.put(0x1f481, 1); - sEmojisMap.put(0x1f64b, 1); - sEmojisMap.put(0x1f486, 1); - sEmojisMap.put(0x1f487, 1); - sEmojisMap.put(0x1f485, 1); - sEmojisMap.put(0x1f470, 1); - sEmojisMap.put(0x1f64e, 1); - sEmojisMap.put(0x1f64d, 1); - sEmojisMap.put(0x1f647, 1); - sEmojisMap.put(0x1f3a9, 1); - sEmojisMap.put(0x1f451, 1); - sEmojisMap.put(0x1f452, 1); - sEmojisMap.put(0x1f45f, 1); - sEmojisMap.put(0x1f45e, 1); - sEmojisMap.put(0x1f461, 1); - sEmojisMap.put(0x1f460, 1); - sEmojisMap.put(0x1f462, 1); - sEmojisMap.put(0x1f455, 1); - sEmojisMap.put(0x1f454, 1); - sEmojisMap.put(0x1f45a, 1); - sEmojisMap.put(0x1f457, 1); - sEmojisMap.put(0x1f3bd, 1); - sEmojisMap.put(0x1f456, 1); - sEmojisMap.put(0x1f458, 1); - sEmojisMap.put(0x1f459, 1); - sEmojisMap.put(0x1f4bc, 1); - sEmojisMap.put(0x1f45c, 1); - sEmojisMap.put(0x1f45d, 1); - sEmojisMap.put(0x1f45b, 1); - sEmojisMap.put(0x1f453, 1); - sEmojisMap.put(0x1f380, 1); - sEmojisMap.put(0x1f302, 1); - sEmojisMap.put(0x1f484, 1); - sEmojisMap.put(0x1f49b, 1); - sEmojisMap.put(0x1f499, 1); - sEmojisMap.put(0x1f49c, 1); - sEmojisMap.put(0x1f49a, 1); - sEmojisMap.put(0x2764, 1); - sEmojisMap.put(0x1f494, 1); - sEmojisMap.put(0x1f497, 1); - sEmojisMap.put(0x1f493, 1); - sEmojisMap.put(0x1f495, 1); - sEmojisMap.put(0x1f496, 1); - sEmojisMap.put(0x1f49e, 1); - sEmojisMap.put(0x1f498, 1); - sEmojisMap.put(0x1f48c, 1); - sEmojisMap.put(0x1f48b, 1); - sEmojisMap.put(0x1f48d, 1); - sEmojisMap.put(0x1f48e, 1); - sEmojisMap.put(0x1f464, 1); - sEmojisMap.put(0x1f465, 1); - sEmojisMap.put(0x1f4ac, 1); - sEmojisMap.put(0x1f463, 1); - sEmojisMap.put(0x1f4ad, 1); - - // Nature - sEmojisMap.put(0x1f436, 1); - sEmojisMap.put(0x1f43a, 1); - sEmojisMap.put(0x1f431, 1); - sEmojisMap.put(0x1f42d, 1); - sEmojisMap.put(0x1f439, 1); - sEmojisMap.put(0x1f430, 1); - sEmojisMap.put(0x1f438, 1); - sEmojisMap.put(0x1f42f, 1); - sEmojisMap.put(0x1f428, 1); - sEmojisMap.put(0x1f43b, 1); - sEmojisMap.put(0x1f437, 1); - sEmojisMap.put(0x1f43d, 1); - sEmojisMap.put(0x1f42e, 1); - sEmojisMap.put(0x1f417, 1); - sEmojisMap.put(0x1f435, 1); - sEmojisMap.put(0x1f412, 1); - sEmojisMap.put(0x1f434, 1); - sEmojisMap.put(0x1f411, 1); - sEmojisMap.put(0x1f418, 1); - sEmojisMap.put(0x1f43c, 1); - sEmojisMap.put(0x1f427, 1); - sEmojisMap.put(0x1f426, 1); - sEmojisMap.put(0x1f424, 1); - sEmojisMap.put(0x1f425, 1); - sEmojisMap.put(0x1f423, 1); - sEmojisMap.put(0x1f414, 1); - sEmojisMap.put(0x1f40d, 1); - sEmojisMap.put(0x1f422, 1); - sEmojisMap.put(0x1f41b, 1); - sEmojisMap.put(0x1f41d, 1); - sEmojisMap.put(0x1f41c, 1); - sEmojisMap.put(0x1f41e, 1); - sEmojisMap.put(0x1f40c, 1); - sEmojisMap.put(0x1f419, 1); - sEmojisMap.put(0x1f41a, 1); - sEmojisMap.put(0x1f420, 1); - sEmojisMap.put(0x1f41f, 1); - sEmojisMap.put(0x1f42c, 1); - sEmojisMap.put(0x1f433, 1); - sEmojisMap.put(0x1f40b, 1); - sEmojisMap.put(0x1f404, 1); - sEmojisMap.put(0x1f40f, 1); - sEmojisMap.put(0x1f400, 1); - sEmojisMap.put(0x1f403, 1); - sEmojisMap.put(0x1f405, 1); - sEmojisMap.put(0x1f407, 1); - sEmojisMap.put(0x1f409, 1); - sEmojisMap.put(0x1f40e, 1); - sEmojisMap.put(0x1f410, 1); - sEmojisMap.put(0x1f413, 1); - sEmojisMap.put(0x1f415, 1); - sEmojisMap.put(0x1f416, 1); - sEmojisMap.put(0x1f401, 1); - sEmojisMap.put(0x1f402, 1); - sEmojisMap.put(0x1f432, 1); - sEmojisMap.put(0x1f421, 1); - sEmojisMap.put(0x1f40a, 1); - sEmojisMap.put(0x1f42b, 1); - sEmojisMap.put(0x1f42a, 1); - sEmojisMap.put(0x1f406, 1); - sEmojisMap.put(0x1f408, 1); - sEmojisMap.put(0x1f429, 1); - sEmojisMap.put(0x1f43e, 1); - sEmojisMap.put(0x1f490, 1); - sEmojisMap.put(0x1f338, 1); - sEmojisMap.put(0x1f337, 1); - sEmojisMap.put(0x1f340, 1); - sEmojisMap.put(0x1f339, 1); - sEmojisMap.put(0x1f33b, 1); - sEmojisMap.put(0x1f33a, 1); - sEmojisMap.put(0x1f341, 1); - sEmojisMap.put(0x1f343, 1); - sEmojisMap.put(0x1f342, 1); - sEmojisMap.put(0x1f33f, 1); - sEmojisMap.put(0x1f33e, 1); - sEmojisMap.put(0x1f344, 1); - sEmojisMap.put(0x1f335, 1); - sEmojisMap.put(0x1f334, 1); - sEmojisMap.put(0x1f332, 1); - sEmojisMap.put(0x1f333, 1); - sEmojisMap.put(0x1f330, 1); - sEmojisMap.put(0x1f331, 1); - sEmojisMap.put(0x1f33c, 1); - sEmojisMap.put(0x1f310, 1); - sEmojisMap.put(0x1f31e, 1); - sEmojisMap.put(0x1f31d, 1); - sEmojisMap.put(0x1f31a, 1); - sEmojisMap.put(0x1f311, 1); - sEmojisMap.put(0x1f312, 1); - sEmojisMap.put(0x1f313, 1); - sEmojisMap.put(0x1f314, 1); - sEmojisMap.put(0x1f315, 1); - sEmojisMap.put(0x1f316, 1); - sEmojisMap.put(0x1f317, 1); - sEmojisMap.put(0x1f318, 1); - sEmojisMap.put(0x1f31c, 1); - sEmojisMap.put(0x1f31b, 1); - sEmojisMap.put(0x1f319, 1); - sEmojisMap.put(0x1f30d, 1); - sEmojisMap.put(0x1f30e, 1); - sEmojisMap.put(0x1f30f, 1); - sEmojisMap.put(0x1f30b, 1); - sEmojisMap.put(0x1f30c, 1); - sEmojisMap.put(0x1f320, 1); // TODO (rockerhieu) review this emoji - sEmojisMap.put(0x2b50, 1); - sEmojisMap.put(0x2600, 1); - sEmojisMap.put(0x26c5, 1); - sEmojisMap.put(0x2601, 1); - sEmojisMap.put(0x26a1, 1); - sEmojisMap.put(0x2614, 1); - sEmojisMap.put(0x2744, 1); - sEmojisMap.put(0x26c4, 1); - sEmojisMap.put(0x1f300, 1); - sEmojisMap.put(0x1f301, 1); - sEmojisMap.put(0x1f308, 1); - sEmojisMap.put(0x1f30a, 1); - - // Objects - sEmojisMap.put(0x1f38d, 1); - sEmojisMap.put(0x1f49d, 1); - sEmojisMap.put(0x1f38e, 1); - sEmojisMap.put(0x1f392, 1); - sEmojisMap.put(0x1f393, 1); - sEmojisMap.put(0x1f38f, 1); - sEmojisMap.put(0x1f386, 1); - sEmojisMap.put(0x1f387, 1); - sEmojisMap.put(0x1f390, 1); - sEmojisMap.put(0x1f391, 1); - sEmojisMap.put(0x1f383, 1); - sEmojisMap.put(0x1f47b, 1); - sEmojisMap.put(0x1f385, 1); - sEmojisMap.put(0x1f384, 1); - sEmojisMap.put(0x1f381, 1); - sEmojisMap.put(0x1f38b, 1); - sEmojisMap.put(0x1f389, 1); - sEmojisMap.put(0x1f38a, 1); - sEmojisMap.put(0x1f388, 1); - sEmojisMap.put(0x1f38c, 1); - sEmojisMap.put(0x1f52e, 1); - sEmojisMap.put(0x1f3a5, 1); - sEmojisMap.put(0x1f4f7, 1); - sEmojisMap.put(0x1f4f9, 1); - sEmojisMap.put(0x1f4fc, 1); - sEmojisMap.put(0x1f4bf, 1); - sEmojisMap.put(0x1f4c0, 1); - sEmojisMap.put(0x1f4bd, 1); - sEmojisMap.put(0x1f4be, 1); - sEmojisMap.put(0x1f4bb, 1); - sEmojisMap.put(0x1f4f1, 1); - sEmojisMap.put(0x260e, 1); - sEmojisMap.put(0x1f4de, 1); - sEmojisMap.put(0x1f4df, 1); - sEmojisMap.put(0x1f4e0, 1); - sEmojisMap.put(0x1f4e1, 1); - sEmojisMap.put(0x1f4fa, 1); - sEmojisMap.put(0x1f4fb, 1); - sEmojisMap.put(0x1f50a, 1); - sEmojisMap.put(0x1f509, 1); - sEmojisMap.put(0x1f508, 1); // TODO (rockerhieu): review this emoji - sEmojisMap.put(0x1f507, 1); - sEmojisMap.put(0x1f514, 1); - sEmojisMap.put(0x1f515, 1); - sEmojisMap.put(0x1f4e2, 1); - sEmojisMap.put(0x1f4e3, 1); - sEmojisMap.put(0x23f3, 1); - sEmojisMap.put(0x231b, 1); - sEmojisMap.put(0x23f0, 1); - sEmojisMap.put(0x231a, 1); - sEmojisMap.put(0x1f513, 1); - sEmojisMap.put(0x1f512, 1); - sEmojisMap.put(0x1f50f, 1); - sEmojisMap.put(0x1f510, 1); - sEmojisMap.put(0x1f511, 1); - sEmojisMap.put(0x1f50e, 1); - sEmojisMap.put(0x1f4a1, 1); - sEmojisMap.put(0x1f526, 1); - sEmojisMap.put(0x1f506, 1); - sEmojisMap.put(0x1f505, 1); - sEmojisMap.put(0x1f50c, 1); - sEmojisMap.put(0x1f50b, 1); - sEmojisMap.put(0x1f50d, 1); - sEmojisMap.put(0x1f6c1, 1); - sEmojisMap.put(0x1f6c0, 1); - sEmojisMap.put(0x1f6bf, 1); - sEmojisMap.put(0x1f6bd, 1); - sEmojisMap.put(0x1f527, 1); - sEmojisMap.put(0x1f529, 1); - sEmojisMap.put(0x1f528, 1); - sEmojisMap.put(0x1f6aa, 1); - sEmojisMap.put(0x1f6ac, 1); - sEmojisMap.put(0x1f4a3, 1); - sEmojisMap.put(0x1f52b, 1); - sEmojisMap.put(0x1f52a, 1); - sEmojisMap.put(0x1f48a, 1); - sEmojisMap.put(0x1f489, 1); - sEmojisMap.put(0x1f4b0, 1); - sEmojisMap.put(0x1f4b4, 1); - sEmojisMap.put(0x1f4b5, 1); - sEmojisMap.put(0x1f4b7, 1); - sEmojisMap.put(0x1f4b6, 1); - sEmojisMap.put(0x1f4b3, 1); - sEmojisMap.put(0x1f4b8, 1); - sEmojisMap.put(0x1f4f2, 1); - sEmojisMap.put(0x1f4e7, 1); - sEmojisMap.put(0x1f4e5, 1); - sEmojisMap.put(0x1f4e4, 1); - sEmojisMap.put(0x2709, 1); - sEmojisMap.put(0x1f4e9, 1); - sEmojisMap.put(0x1f4e8, 1); - sEmojisMap.put(0x1f4ef, 1); - sEmojisMap.put(0x1f4eb, 1); - sEmojisMap.put(0x1f4ea, 1); - sEmojisMap.put(0x1f4ec, 1); - sEmojisMap.put(0x1f4ed, 1); - sEmojisMap.put(0x1f4ee, 1); - sEmojisMap.put(0x1f4e6, 1); - sEmojisMap.put(0x1f4dd, 1); - sEmojisMap.put(0x1f4c4, 1); - sEmojisMap.put(0x1f4c3, 1); - sEmojisMap.put(0x1f4d1, 1); - sEmojisMap.put(0x1f4ca, 1); - sEmojisMap.put(0x1f4c8, 1); - sEmojisMap.put(0x1f4c9, 1); - sEmojisMap.put(0x1f4dc, 1); - sEmojisMap.put(0x1f4cb, 1); - sEmojisMap.put(0x1f4c5, 1); - sEmojisMap.put(0x1f4c6, 1); - sEmojisMap.put(0x1f4c7, 1); - sEmojisMap.put(0x1f4c1, 1); - sEmojisMap.put(0x1f4c2, 1); - sEmojisMap.put(0x2702, 1); - sEmojisMap.put(0x1f4cc, 1); - sEmojisMap.put(0x1f4ce, 1); - sEmojisMap.put(0x2712, 1); - sEmojisMap.put(0x270f, 1); - sEmojisMap.put(0x1f4cf, 1); - sEmojisMap.put(0x1f4d0, 1); - sEmojisMap.put(0x1f4d5, 1); - sEmojisMap.put(0x1f4d7, 1); - sEmojisMap.put(0x1f4d8, 1); - sEmojisMap.put(0x1f4d9, 1); - sEmojisMap.put(0x1f4d3, 1); - sEmojisMap.put(0x1f4d4, 1); - sEmojisMap.put(0x1f4d2, 1); - sEmojisMap.put(0x1f4da, 1); - sEmojisMap.put(0x1f4d6, 1); - sEmojisMap.put(0x1f516, 1); - sEmojisMap.put(0x1f4db, 1); - sEmojisMap.put(0x1f52c, 1); - sEmojisMap.put(0x1f52d, 1); - sEmojisMap.put(0x1f4f0, 1); - sEmojisMap.put(0x1f3a8, 1); - sEmojisMap.put(0x1f3ac, 1); - sEmojisMap.put(0x1f3a4, 1); - sEmojisMap.put(0x1f3a7, 1); - sEmojisMap.put(0x1f3bc, 1); - sEmojisMap.put(0x1f3b5, 1); - sEmojisMap.put(0x1f3b6, 1); - sEmojisMap.put(0x1f3b9, 1); - sEmojisMap.put(0x1f3bb, 1); - sEmojisMap.put(0x1f3ba, 1); - sEmojisMap.put(0x1f3b7, 1); - sEmojisMap.put(0x1f3b8, 1); - sEmojisMap.put(0x1f47e, 1); - sEmojisMap.put(0x1f3ae, 1); - sEmojisMap.put(0x1f0cf, 1); - sEmojisMap.put(0x1f3b4, 1); - sEmojisMap.put(0x1f004, 1); - sEmojisMap.put(0x1f3b2, 1); - sEmojisMap.put(0x1f3af, 1); - sEmojisMap.put(0x1f3c8, 1); - sEmojisMap.put(0x1f3c0, 1); - sEmojisMap.put(0x26bd, 1); - sEmojisMap.put(0x26be, 1); - sEmojisMap.put(0x1f3be, 1); - sEmojisMap.put(0x1f3b1, 1); - sEmojisMap.put(0x1f3c9, 1); - sEmojisMap.put(0x1f3b3, 1); - sEmojisMap.put(0x26f3, 1); - sEmojisMap.put(0x1f6b5, 1); - sEmojisMap.put(0x1f6b4, 1); - sEmojisMap.put(0x1f3c1, 1); - sEmojisMap.put(0x1f3c7, 1); - sEmojisMap.put(0x1f3c6, 1); - sEmojisMap.put(0x1f3bf, 1); - sEmojisMap.put(0x1f3c2, 1); - sEmojisMap.put(0x1f3ca, 1); - sEmojisMap.put(0x1f3c4, 1); - sEmojisMap.put(0x1f3a3, 1); - sEmojisMap.put(0x2615, 1); - sEmojisMap.put(0x1f375, 1); - sEmojisMap.put(0x1f376, 1); - sEmojisMap.put(0x1f37c, 1); - sEmojisMap.put(0x1f37a, 1); - sEmojisMap.put(0x1f37b, 1); - sEmojisMap.put(0x1f378, 1); - sEmojisMap.put(0x1f379, 1); - sEmojisMap.put(0x1f377, 1); - sEmojisMap.put(0x1f374, 1); - sEmojisMap.put(0x1f355, 1); - sEmojisMap.put(0x1f354, 1); - sEmojisMap.put(0x1f35f, 1); - sEmojisMap.put(0x1f357, 1); - sEmojisMap.put(0x1f356, 1); - sEmojisMap.put(0x1f35d, 1); - sEmojisMap.put(0x1f35b, 1); - sEmojisMap.put(0x1f364, 1); - sEmojisMap.put(0x1f371, 1); - sEmojisMap.put(0x1f363, 1); - sEmojisMap.put(0x1f365, 1); - sEmojisMap.put(0x1f359, 1); - sEmojisMap.put(0x1f358, 1); - sEmojisMap.put(0x1f35a, 1); - sEmojisMap.put(0x1f35c, 1); - sEmojisMap.put(0x1f372, 1); - sEmojisMap.put(0x1f362, 1); - sEmojisMap.put(0x1f361, 1); - sEmojisMap.put(0x1f373, 1); - sEmojisMap.put(0x1f35e, 1); - sEmojisMap.put(0x1f369, 1); - sEmojisMap.put(0x1f36e, 1); - sEmojisMap.put(0x1f366, 1); - sEmojisMap.put(0x1f368, 1); - sEmojisMap.put(0x1f367, 1); - sEmojisMap.put(0x1f382, 1); - sEmojisMap.put(0x1f370, 1); - sEmojisMap.put(0x1f36a, 1); - sEmojisMap.put(0x1f36b, 1); - sEmojisMap.put(0x1f36c, 1); - sEmojisMap.put(0x1f36d, 1); - sEmojisMap.put(0x1f36f, 1); - sEmojisMap.put(0x1f34e, 1); - sEmojisMap.put(0x1f34f, 1); - sEmojisMap.put(0x1f34a, 1); - sEmojisMap.put(0x1f34b, 1); - sEmojisMap.put(0x1f352, 1); - sEmojisMap.put(0x1f347, 1); - sEmojisMap.put(0x1f349, 1); - sEmojisMap.put(0x1f353, 1); - sEmojisMap.put(0x1f351, 1); - sEmojisMap.put(0x1f348, 1); - sEmojisMap.put(0x1f34c, 1); - sEmojisMap.put(0x1f350, 1); - sEmojisMap.put(0x1f34d, 1); - sEmojisMap.put(0x1f360, 1); - sEmojisMap.put(0x1f346, 1); - sEmojisMap.put(0x1f345, 1); - sEmojisMap.put(0x1f33d, 1); - - // Places - sEmojisMap.put(0x1f3e0, 1); - sEmojisMap.put(0x1f3e1, 1); - sEmojisMap.put(0x1f3eb, 1); - sEmojisMap.put(0x1f3e2, 1); - sEmojisMap.put(0x1f3e3, 1); - sEmojisMap.put(0x1f3e5, 1); - sEmojisMap.put(0x1f3e6, 1); - sEmojisMap.put(0x1f3ea, 1); - sEmojisMap.put(0x1f3e9, 1); - sEmojisMap.put(0x1f3e8, 1); - sEmojisMap.put(0x1f492, 1); - sEmojisMap.put(0x26ea, 1); - sEmojisMap.put(0x1f3ec, 1); - sEmojisMap.put(0x1f3e4, 1); - sEmojisMap.put(0x1f307, 1); - sEmojisMap.put(0x1f306, 1); - sEmojisMap.put(0x1f3ef, 1); - sEmojisMap.put(0x1f3f0, 1); - sEmojisMap.put(0x26fa, 1); - sEmojisMap.put(0x1f3ed, 1); - sEmojisMap.put(0x1f5fc, 1); - sEmojisMap.put(0x1f5fe, 1); - sEmojisMap.put(0x1f5fb, 1); - sEmojisMap.put(0x1f304, 1); - sEmojisMap.put(0x1f305, 1); - sEmojisMap.put(0x1f303, 1); - sEmojisMap.put(0x1f5fd, 1); - sEmojisMap.put(0x1f309, 1); - sEmojisMap.put(0x1f3a0, 1); - sEmojisMap.put(0x1f3a1, 1); - sEmojisMap.put(0x26f2, 1); - sEmojisMap.put(0x1f3a2, 1); - sEmojisMap.put(0x1f6a2, 1); - sEmojisMap.put(0x26f5, 1); - sEmojisMap.put(0x1f6a4, 1); - sEmojisMap.put(0x1f6a3, 1); - sEmojisMap.put(0x2693, 1); - sEmojisMap.put(0x1f680, 1); - sEmojisMap.put(0x2708, 1); - sEmojisMap.put(0x1f4ba, 1); - sEmojisMap.put(0x1f681, 1); - sEmojisMap.put(0x1f682, 1); - sEmojisMap.put(0x1f68a, 1); - sEmojisMap.put(0x1f689, 1); - sEmojisMap.put(0x1f69e, 1); - sEmojisMap.put(0x1f686, 1); - sEmojisMap.put(0x1f684, 1); - sEmojisMap.put(0x1f685, 1); - sEmojisMap.put(0x1f688, 1); - sEmojisMap.put(0x1f687, 1); - sEmojisMap.put(0x1f69d, 1); - sEmojisMap.put(0x1f68b, 1); // TODO (rockerhieu) review this emoji - sEmojisMap.put(0x1f683, 1); - sEmojisMap.put(0x1f68e, 1); - sEmojisMap.put(0x1f68c, 1); - sEmojisMap.put(0x1f68d, 1); - sEmojisMap.put(0x1f699, 1); - sEmojisMap.put(0x1f698, 1); - sEmojisMap.put(0x1f697, 1); - sEmojisMap.put(0x1f695, 1); - sEmojisMap.put(0x1f696, 1); - sEmojisMap.put(0x1f69b, 1); - sEmojisMap.put(0x1f69a, 1); - sEmojisMap.put(0x1f6a8, 1); - sEmojisMap.put(0x1f693, 1); - sEmojisMap.put(0x1f694, 1); - sEmojisMap.put(0x1f692, 1); - sEmojisMap.put(0x1f691, 1); - sEmojisMap.put(0x1f690, 1); - sEmojisMap.put(0x1f6b2, 1); - sEmojisMap.put(0x1f6a1, 1); - sEmojisMap.put(0x1f69f, 1); - sEmojisMap.put(0x1f6a0, 1); - sEmojisMap.put(0x1f69c, 1); - sEmojisMap.put(0x1f488, 1); - sEmojisMap.put(0x1f68f, 1); - sEmojisMap.put(0x1f3ab, 1); - sEmojisMap.put(0x1f6a6, 1); - sEmojisMap.put(0x1f6a5, 1); - sEmojisMap.put(0x26a0, 1); - sEmojisMap.put(0x1f6a7, 1); - sEmojisMap.put(0x1f530, 1); - sEmojisMap.put(0x26fd, 1); - sEmojisMap.put(0x1f3ee, 1); - sEmojisMap.put(0x1f3b0, 1); - sEmojisMap.put(0x2668, 1); - sEmojisMap.put(0x1f5ff, 1); - sEmojisMap.put(0x1f3aa, 1); - sEmojisMap.put(0x1f3ad, 1); - sEmojisMap.put(0x1f4cd, 1); - sEmojisMap.put(0x1f6a9, 1); -// Emoji.fromChars("\ud83c\uddef\ud83c\uddf5", 1); -// Emoji.fromChars("\ud83c\uddf0\ud83c\uddf7", 1); -// Emoji.fromChars("\ud83c\udde9\ud83c\uddea", 1); -// Emoji.fromChars("\ud83c\udde8\ud83c\uddf3", 1); -// Emoji.fromChars("\ud83c\uddfa\ud83c\uddf8", 1); -// Emoji.fromChars("\ud83c\uddeb\ud83c\uddf7", 1); -// Emoji.fromChars("\ud83c\uddea\ud83c\uddf8", 1); -// Emoji.fromChars("\ud83c\uddee\ud83c\uddf9", 1); -// Emoji.fromChars("\ud83c\uddf7\ud83c\uddfa", 1); -// Emoji.fromChars("\ud83c\uddec\ud83c\udde7", 1); - - // Symbols -// Emoji.fromChars("\u0031\u20e3"), -// Emoji.fromChars("\u0032\u20e3"), -// Emoji.fromChars("\u0033\u20e3"), -// Emoji.fromChars("\u0034\u20e3"), -// Emoji.fromChars("\u0035\u20e3"), -// Emoji.fromChars("\u0036\u20e3"), -// Emoji.fromChars("\u0037\u20e3"), -// Emoji.fromChars("\u0038\u20e3"), -// Emoji.fromChars("\u0039\u20e3"), -// Emoji.fromChars("\u0030\u20e3"), - sEmojisMap.put(0x1f51f, 1); - sEmojisMap.put(0x1f522, 1); -// Emoji.fromChars("\u0023\u20e3"), - sEmojisMap.put(0x1f523, 1); - sEmojisMap.put(0x2b06, 1); - sEmojisMap.put(0x2b07, 1); - sEmojisMap.put(0x2b05, 1); - sEmojisMap.put(0x27a1, 1); - sEmojisMap.put(0x1f520, 1); - sEmojisMap.put(0x1f521, 1); - sEmojisMap.put(0x1f524, 1); - sEmojisMap.put(0x2197, 1); - sEmojisMap.put(0x2196, 1); - sEmojisMap.put(0x2198, 1); - sEmojisMap.put(0x2199, 1); - sEmojisMap.put(0x2194, 1); - sEmojisMap.put(0x2195, 1); - sEmojisMap.put(0x1f504, 1); - sEmojisMap.put(0x25c0, 1); - sEmojisMap.put(0x25b6, 1); - sEmojisMap.put(0x1f53c, 1); - sEmojisMap.put(0x1f53d, 1); - sEmojisMap.put(0x21a9, 1); - sEmojisMap.put(0x21aa, 1); - sEmojisMap.put(0x2139, 1); - sEmojisMap.put(0x23ea, 1); - sEmojisMap.put(0x23e9, 1); - sEmojisMap.put(0x23eb, 1); - sEmojisMap.put(0x23ec, 1); - sEmojisMap.put(0x2935, 1); - sEmojisMap.put(0x2934, 1); - sEmojisMap.put(0x1f197, 1); - sEmojisMap.put(0x1f500, 1); - sEmojisMap.put(0x1f501, 1); - sEmojisMap.put(0x1f502, 1); - sEmojisMap.put(0x1f195, 1); - sEmojisMap.put(0x1f199, 1); - sEmojisMap.put(0x1f192, 1); - sEmojisMap.put(0x1f193, 1); - sEmojisMap.put(0x1f196, 1); - sEmojisMap.put(0x1f4f6, 1); - sEmojisMap.put(0x1f3a6, 1); - sEmojisMap.put(0x1f201, 1); - sEmojisMap.put(0x1f22f, 1); - sEmojisMap.put(0x1f233, 1); - sEmojisMap.put(0x1f235, 1); - sEmojisMap.put(0x1f234, 1); - sEmojisMap.put(0x1f232, 1); - sEmojisMap.put(0x1f250, 1); - sEmojisMap.put(0x1f239, 1); - sEmojisMap.put(0x1f23a, 1); - sEmojisMap.put(0x1f236, 1); - sEmojisMap.put(0x1f21a, 1); - sEmojisMap.put(0x1f6bb, 1); - sEmojisMap.put(0x1f6b9, 1); - sEmojisMap.put(0x1f6ba, 1); - sEmojisMap.put(0x1f6bc, 1); - sEmojisMap.put(0x1f6be, 1); - sEmojisMap.put(0x1f6b0, 1); - sEmojisMap.put(0x1f6ae, 1); - sEmojisMap.put(0x1f17f, 1); - sEmojisMap.put(0x267f, 1); - sEmojisMap.put(0x1f6ad, 1); - sEmojisMap.put(0x1f237, 1); - sEmojisMap.put(0x1f238, 1); - sEmojisMap.put(0x1f202, 1); - sEmojisMap.put(0x24c2, 1); - sEmojisMap.put(0x1f6c2, 1); - sEmojisMap.put(0x1f6c4, 1); - sEmojisMap.put(0x1f6c5, 1); - sEmojisMap.put(0x1f6c3, 1); - sEmojisMap.put(0x1f251, 1); - sEmojisMap.put(0x3299, 1); - sEmojisMap.put(0x3297, 1); - sEmojisMap.put(0x1f191, 1); - sEmojisMap.put(0x1f198, 1); - sEmojisMap.put(0x1f194, 1); - sEmojisMap.put(0x1f6ab, 1); - sEmojisMap.put(0x1f51e, 1); - sEmojisMap.put(0x1f4f5, 1); - sEmojisMap.put(0x1f6af, 1); - sEmojisMap.put(0x1f6b1, 1); - sEmojisMap.put(0x1f6b3, 1); - sEmojisMap.put(0x1f6b7, 1); - sEmojisMap.put(0x1f6b8, 1); - sEmojisMap.put(0x26d4, 1); - sEmojisMap.put(0x2733, 1); - sEmojisMap.put(0x2747, 1); - sEmojisMap.put(0x274e, 1); - sEmojisMap.put(0x2705, 1); - sEmojisMap.put(0x2734, 1); - sEmojisMap.put(0x1f49f, 1); - sEmojisMap.put(0x1f19a, 1); - sEmojisMap.put(0x1f4f3, 1); - sEmojisMap.put(0x1f4f4, 1); - sEmojisMap.put(0x1f170, 1); - sEmojisMap.put(0x1f171, 1); - sEmojisMap.put(0x1f18e, 1); - sEmojisMap.put(0x1f17e, 1); - sEmojisMap.put(0x1f4a0, 1); - sEmojisMap.put(0x27bf, 1); - sEmojisMap.put(0x267b, 1); - sEmojisMap.put(0x2648, 1); - sEmojisMap.put(0x2649, 1); - sEmojisMap.put(0x264a, 1); - sEmojisMap.put(0x264b, 1); - sEmojisMap.put(0x264c, 1); - sEmojisMap.put(0x264d, 1); - sEmojisMap.put(0x264e, 1); - sEmojisMap.put(0x264f, 1); - sEmojisMap.put(0x2650, 1); - sEmojisMap.put(0x2651, 1); - sEmojisMap.put(0x2652, 1); - sEmojisMap.put(0x2653, 1); - sEmojisMap.put(0x26ce, 1); - sEmojisMap.put(0x1f52f, 1); - sEmojisMap.put(0x1f3e7, 1); - sEmojisMap.put(0x1f4b9, 1); - sEmojisMap.put(0x1f4b2, 1); - sEmojisMap.put(0x1f4b1, 1); - sEmojisMap.put(0x00a9, 1); - sEmojisMap.put(0x00ae, 1); - sEmojisMap.put(0x2122, 1); - sEmojisMap.put(0x274c, 1); - sEmojisMap.put(0x203c, 1); - sEmojisMap.put(0x2049, 1); - sEmojisMap.put(0x2757, 1); - sEmojisMap.put(0x2753, 1); - sEmojisMap.put(0x2755, 1); - sEmojisMap.put(0x2754, 1); - sEmojisMap.put(0x2b55, 1); - sEmojisMap.put(0x1f51d, 1); - sEmojisMap.put(0x1f51a, 1); - sEmojisMap.put(0x1f519, 1); - sEmojisMap.put(0x1f51b, 1); - sEmojisMap.put(0x1f51c, 1); - sEmojisMap.put(0x1f503, 1); - sEmojisMap.put(0x1f55b, 1); - sEmojisMap.put(0x1f567, 1); - sEmojisMap.put(0x1f550, 1); - sEmojisMap.put(0x1f55c, 1); - sEmojisMap.put(0x1f551, 1); - sEmojisMap.put(0x1f55d, 1); - sEmojisMap.put(0x1f552, 1); - sEmojisMap.put(0x1f55e, 1); - sEmojisMap.put(0x1f553, 1); - sEmojisMap.put(0x1f55f, 1); - sEmojisMap.put(0x1f554, 1); - sEmojisMap.put(0x1f560, 1); - sEmojisMap.put(0x1f555, 1); - sEmojisMap.put(0x1f556, 1); - sEmojisMap.put(0x1f557, 1); - sEmojisMap.put(0x1f558, 1); - sEmojisMap.put(0x1f559, 1); - sEmojisMap.put(0x1f55a, 1); - sEmojisMap.put(0x1f561, 1); - sEmojisMap.put(0x1f562, 1); - sEmojisMap.put(0x1f563, 1); - sEmojisMap.put(0x1f564, 1); - sEmojisMap.put(0x1f565, 1); - sEmojisMap.put(0x1f566, 1); - sEmojisMap.put(0x2716, 1); - sEmojisMap.put(0x2795, 1); - sEmojisMap.put(0x2796, 1); - sEmojisMap.put(0x2797, 1); - sEmojisMap.put(0x2660, 1); - sEmojisMap.put(0x2665, 1); - sEmojisMap.put(0x2663, 1); - sEmojisMap.put(0x2666, 1); - sEmojisMap.put(0x1f4ae, 1); - sEmojisMap.put(0x1f4af, 1); - sEmojisMap.put(0x2714, 1); - sEmojisMap.put(0x2611, 1); - sEmojisMap.put(0x1f518, 1); - sEmojisMap.put(0x1f517, 1); - sEmojisMap.put(0x27b0, 1); - sEmojisMap.put(0x3030, 1); - sEmojisMap.put(0x303d, 1); - sEmojisMap.put(0x1f531, 1); - sEmojisMap.put(0x25fc, 1); - sEmojisMap.put(0x25fb, 1); - sEmojisMap.put(0x25fe, 1); - sEmojisMap.put(0x25fd, 1); - sEmojisMap.put(0x25aa, 1); - sEmojisMap.put(0x25ab, 1); - sEmojisMap.put(0x1f53a, 1); - sEmojisMap.put(0x1f532, 1); - sEmojisMap.put(0x1f533, 1); - sEmojisMap.put(0x26ab, 1); - sEmojisMap.put(0x26aa, 1); - sEmojisMap.put(0x1f534, 1); - sEmojisMap.put(0x1f535, 1); - sEmojisMap.put(0x1f53b, 1); - sEmojisMap.put(0x2b1c, 1); - sEmojisMap.put(0x2b1b, 1); - sEmojisMap.put(0x1f536, 1); - sEmojisMap.put(0x1f537, 1); - sEmojisMap.put(0x1f538, 1); - sEmojisMap.put(0x1f539, 1); - - - sSoftbanksMap.put(0xe001, 1); - sSoftbanksMap.put(0xe002, 1); - sSoftbanksMap.put(0xe003, 1); - sSoftbanksMap.put(0xe004, 1); - sSoftbanksMap.put(0xe005, 1); - sSoftbanksMap.put(0xe006, 1); - sSoftbanksMap.put(0xe007, 1); - sSoftbanksMap.put(0xe008, 1); - sSoftbanksMap.put(0xe009, 1); - sSoftbanksMap.put(0xe00a, 1); - sSoftbanksMap.put(0xe00b, 1); - sSoftbanksMap.put(0xe00c, 1); - sSoftbanksMap.put(0xe00d, 1); - sSoftbanksMap.put(0xe00e, 1); - sSoftbanksMap.put(0xe00f, 1); - sSoftbanksMap.put(0xe010, 1); - sSoftbanksMap.put(0xe011, 1); - sSoftbanksMap.put(0xe012, 1); - sSoftbanksMap.put(0xe013, 1); - sSoftbanksMap.put(0xe014, 1); - sSoftbanksMap.put(0xe015, 1); - sSoftbanksMap.put(0xe016, 1); - sSoftbanksMap.put(0xe017, 1); - sSoftbanksMap.put(0xe018, 1); - sSoftbanksMap.put(0xe019, 1); - sSoftbanksMap.put(0xe01a, 1); - sSoftbanksMap.put(0xe01b, 1); - sSoftbanksMap.put(0xe01c, 1); - sSoftbanksMap.put(0xe01d, 1); - sSoftbanksMap.put(0xe01e, 1); - sSoftbanksMap.put(0xe01f, 1); - sSoftbanksMap.put(0xe020, 1); - sSoftbanksMap.put(0xe021, 1); - sSoftbanksMap.put(0xe022, 1); - sSoftbanksMap.put(0xe023, 1); - sSoftbanksMap.put(0xe024, 1); - sSoftbanksMap.put(0xe025, 1); - sSoftbanksMap.put(0xe026, 1); - sSoftbanksMap.put(0xe027, 1); - sSoftbanksMap.put(0xe028, 1); - sSoftbanksMap.put(0xe029, 1); - sSoftbanksMap.put(0xe02a, 1); - sSoftbanksMap.put(0xe02b, 1); - sSoftbanksMap.put(0xe02c, 1); - sSoftbanksMap.put(0xe02d, 1); - sSoftbanksMap.put(0xe02e, 1); - sSoftbanksMap.put(0xe02f, 1); - sSoftbanksMap.put(0xe030, 1); - sSoftbanksMap.put(0xe031, 1); - sSoftbanksMap.put(0xe032, 1); - sSoftbanksMap.put(0xe033, 1); - sSoftbanksMap.put(0xe034, 1); - sSoftbanksMap.put(0xe035, 1); - sSoftbanksMap.put(0xe036, 1); - sSoftbanksMap.put(0xe037, 1); - sSoftbanksMap.put(0xe038, 1); - sSoftbanksMap.put(0xe039, 1); - sSoftbanksMap.put(0xe03a, 1); - sSoftbanksMap.put(0xe03b, 1); - sSoftbanksMap.put(0xe03c, 1); - sSoftbanksMap.put(0xe03d, 1); - sSoftbanksMap.put(0xe03e, 1); - sSoftbanksMap.put(0xe03f, 1); - sSoftbanksMap.put(0xe040, 1); - sSoftbanksMap.put(0xe041, 1); - sSoftbanksMap.put(0xe042, 1); - sSoftbanksMap.put(0xe043, 1); - sSoftbanksMap.put(0xe044, 1); - sSoftbanksMap.put(0xe045, 1); - sSoftbanksMap.put(0xe046, 1); - sSoftbanksMap.put(0xe047, 1); - sSoftbanksMap.put(0xe048, 1); - sSoftbanksMap.put(0xe049, 1); - sSoftbanksMap.put(0xe04a, 1); - sSoftbanksMap.put(0xe04b, 1); - sSoftbanksMap.put(0xe04c, 1); - sSoftbanksMap.put(0xe04d, 1); - sSoftbanksMap.put(0xe04e, 1); - sSoftbanksMap.put(0xe04f, 1); - sSoftbanksMap.put(0xe050, 1); - sSoftbanksMap.put(0xe051, 1); - sSoftbanksMap.put(0xe052, 1); - sSoftbanksMap.put(0xe053, 1); - sSoftbanksMap.put(0xe054, 1); - sSoftbanksMap.put(0xe055, 1); - sSoftbanksMap.put(0xe056, 1); - sSoftbanksMap.put(0xe057, 1); - sSoftbanksMap.put(0xe058, 1); - sSoftbanksMap.put(0xe059, 1); - sSoftbanksMap.put(0xe05a, 1); - sSoftbanksMap.put(0xe101, 1); - sSoftbanksMap.put(0xe102, 1); - sSoftbanksMap.put(0xe103, 1); - sSoftbanksMap.put(0xe104, 1); - sSoftbanksMap.put(0xe105, 1); - sSoftbanksMap.put(0xe106, 1); - sSoftbanksMap.put(0xe107, 1); - sSoftbanksMap.put(0xe108, 1); - sSoftbanksMap.put(0xe109, 1); - sSoftbanksMap.put(0xe10a, 1); - sSoftbanksMap.put(0xe10b, 1); - sSoftbanksMap.put(0xe10c, 1); - sSoftbanksMap.put(0xe10d, 1); - sSoftbanksMap.put(0xe10e, 1); - sSoftbanksMap.put(0xe10f, 1); - sSoftbanksMap.put(0xe110, 1); - sSoftbanksMap.put(0xe111, 1); - sSoftbanksMap.put(0xe112, 1); - sSoftbanksMap.put(0xe113, 1); - sSoftbanksMap.put(0xe114, 1); - sSoftbanksMap.put(0xe115, 1); - sSoftbanksMap.put(0xe116, 1); - sSoftbanksMap.put(0xe117, 1); - sSoftbanksMap.put(0xe118, 1); - sSoftbanksMap.put(0xe119, 1); - sSoftbanksMap.put(0xe11a, 1); - sSoftbanksMap.put(0xe11b, 1); - sSoftbanksMap.put(0xe11c, 1); - sSoftbanksMap.put(0xe11d, 1); - sSoftbanksMap.put(0xe11e, 1); - sSoftbanksMap.put(0xe11f, 1); - sSoftbanksMap.put(0xe120, 1); - sSoftbanksMap.put(0xe121, 1); - sSoftbanksMap.put(0xe122, 1); - sSoftbanksMap.put(0xe123, 1); - sSoftbanksMap.put(0xe124, 1); - sSoftbanksMap.put(0xe125, 1); - sSoftbanksMap.put(0xe126, 1); - sSoftbanksMap.put(0xe127, 1); - sSoftbanksMap.put(0xe128, 1); - sSoftbanksMap.put(0xe129, 1); - sSoftbanksMap.put(0xe12a, 1); - sSoftbanksMap.put(0xe12b, 1); - sSoftbanksMap.put(0xe12c, 1); - sSoftbanksMap.put(0xe12d, 1); - sSoftbanksMap.put(0xe12e, 1); - sSoftbanksMap.put(0xe12f, 1); - sSoftbanksMap.put(0xe130, 1); - sSoftbanksMap.put(0xe131, 1); - sSoftbanksMap.put(0xe132, 1); - sSoftbanksMap.put(0xe133, 1); - sSoftbanksMap.put(0xe134, 1); - sSoftbanksMap.put(0xe135, 1); - sSoftbanksMap.put(0xe136, 1); - sSoftbanksMap.put(0xe137, 1); - sSoftbanksMap.put(0xe138, 1); - sSoftbanksMap.put(0xe139, 1); - sSoftbanksMap.put(0xe13a, 1); - sSoftbanksMap.put(0xe13b, 1); - sSoftbanksMap.put(0xe13c, 1); - sSoftbanksMap.put(0xe13d, 1); - sSoftbanksMap.put(0xe13e, 1); - sSoftbanksMap.put(0xe13f, 1); - sSoftbanksMap.put(0xe140, 1); - sSoftbanksMap.put(0xe141, 1); - sSoftbanksMap.put(0xe142, 1); - sSoftbanksMap.put(0xe143, 1); - sSoftbanksMap.put(0xe144, 1); - sSoftbanksMap.put(0xe145, 1); - sSoftbanksMap.put(0xe146, 1); - sSoftbanksMap.put(0xe147, 1); - sSoftbanksMap.put(0xe148, 1); - sSoftbanksMap.put(0xe149, 1); - sSoftbanksMap.put(0xe14a, 1); - sSoftbanksMap.put(0xe14b, 1); - sSoftbanksMap.put(0xe14c, 1); - sSoftbanksMap.put(0xe14d, 1); - sSoftbanksMap.put(0xe14e, 1); - sSoftbanksMap.put(0xe14f, 1); - sSoftbanksMap.put(0xe150, 1); - sSoftbanksMap.put(0xe151, 1); - sSoftbanksMap.put(0xe152, 1); - sSoftbanksMap.put(0xe153, 1); - sSoftbanksMap.put(0xe154, 1); - sSoftbanksMap.put(0xe155, 1); - sSoftbanksMap.put(0xe156, 1); - sSoftbanksMap.put(0xe157, 1); - sSoftbanksMap.put(0xe158, 1); - sSoftbanksMap.put(0xe159, 1); - sSoftbanksMap.put(0xe15a, 1); - sSoftbanksMap.put(0xe201, 1); - sSoftbanksMap.put(0xe202, 1); - sSoftbanksMap.put(0xe203, 1); - sSoftbanksMap.put(0xe204, 1); - sSoftbanksMap.put(0xe205, 1); - sSoftbanksMap.put(0xe206, 1); - sSoftbanksMap.put(0xe207, 1); - sSoftbanksMap.put(0xe208, 1); - sSoftbanksMap.put(0xe209, 1); - sSoftbanksMap.put(0xe20a, 1); - sSoftbanksMap.put(0xe20b, 1); - sSoftbanksMap.put(0xe20c, 1); - sSoftbanksMap.put(0xe20d, 1); - sSoftbanksMap.put(0xe20e, 1); - sSoftbanksMap.put(0xe20f, 1); - sSoftbanksMap.put(0xe210, 1); - sSoftbanksMap.put(0xe211, 1); - sSoftbanksMap.put(0xe212, 1); - sSoftbanksMap.put(0xe213, 1); - sSoftbanksMap.put(0xe214, 1); - sSoftbanksMap.put(0xe215, 1); - sSoftbanksMap.put(0xe216, 1); - sSoftbanksMap.put(0xe217, 1); - sSoftbanksMap.put(0xe218, 1); - sSoftbanksMap.put(0xe219, 1); - sSoftbanksMap.put(0xe21a, 1); - sSoftbanksMap.put(0xe21b, 1); - sSoftbanksMap.put(0xe21c, 1); - sSoftbanksMap.put(0xe21d, 1); - sSoftbanksMap.put(0xe21e, 1); - sSoftbanksMap.put(0xe21f, 1); - sSoftbanksMap.put(0xe220, 1); - sSoftbanksMap.put(0xe221, 1); - sSoftbanksMap.put(0xe222, 1); - sSoftbanksMap.put(0xe223, 1); - sSoftbanksMap.put(0xe224, 1); - sSoftbanksMap.put(0xe225, 1); - sSoftbanksMap.put(0xe226, 1); - sSoftbanksMap.put(0xe227, 1); - sSoftbanksMap.put(0xe228, 1); - sSoftbanksMap.put(0xe229, 1); - sSoftbanksMap.put(0xe22a, 1); - sSoftbanksMap.put(0xe22b, 1); - sSoftbanksMap.put(0xe22c, 1); - sSoftbanksMap.put(0xe22d, 1); - sSoftbanksMap.put(0xe22e, 1); - sSoftbanksMap.put(0xe22f, 1); - sSoftbanksMap.put(0xe230, 1); - sSoftbanksMap.put(0xe231, 1); - sSoftbanksMap.put(0xe232, 1); - sSoftbanksMap.put(0xe233, 1); - sSoftbanksMap.put(0xe234, 1); - sSoftbanksMap.put(0xe235, 1); - sSoftbanksMap.put(0xe236, 1); - sSoftbanksMap.put(0xe237, 1); - sSoftbanksMap.put(0xe238, 1); - sSoftbanksMap.put(0xe239, 1); - sSoftbanksMap.put(0xe23a, 1); - sSoftbanksMap.put(0xe23b, 1); - sSoftbanksMap.put(0xe23c, 1); - sSoftbanksMap.put(0xe23d, 1); - sSoftbanksMap.put(0xe23e, 1); - sSoftbanksMap.put(0xe23f, 1); - sSoftbanksMap.put(0xe240, 1); - sSoftbanksMap.put(0xe241, 1); - sSoftbanksMap.put(0xe242, 1); - sSoftbanksMap.put(0xe243, 1); - sSoftbanksMap.put(0xe244, 1); - sSoftbanksMap.put(0xe245, 1); - sSoftbanksMap.put(0xe246, 1); - sSoftbanksMap.put(0xe247, 1); - sSoftbanksMap.put(0xe248, 1); - sSoftbanksMap.put(0xe249, 1); - sSoftbanksMap.put(0xe24a, 1); - sSoftbanksMap.put(0xe24b, 1); - sSoftbanksMap.put(0xe24c, 1); - sSoftbanksMap.put(0xe24d, 1); - sSoftbanksMap.put(0xe24e, 1); - sSoftbanksMap.put(0xe24f, 1); - sSoftbanksMap.put(0xe250, 1); - sSoftbanksMap.put(0xe251, 1); - sSoftbanksMap.put(0xe252, 1); - sSoftbanksMap.put(0xe253, 1); - sSoftbanksMap.put(0xe301, 1); - sSoftbanksMap.put(0xe302, 1); - sSoftbanksMap.put(0xe303, 1); - sSoftbanksMap.put(0xe304, 1); - sSoftbanksMap.put(0xe305, 1); - sSoftbanksMap.put(0xe306, 1); - sSoftbanksMap.put(0xe307, 1); - sSoftbanksMap.put(0xe308, 1); - sSoftbanksMap.put(0xe309, 1); - sSoftbanksMap.put(0xe30a, 1); - sSoftbanksMap.put(0xe30b, 1); - sSoftbanksMap.put(0xe30c, 1); - sSoftbanksMap.put(0xe30d, 1); - sSoftbanksMap.put(0xe30e, 1); - sSoftbanksMap.put(0xe30f, 1); - sSoftbanksMap.put(0xe310, 1); - sSoftbanksMap.put(0xe311, 1); - sSoftbanksMap.put(0xe312, 1); - sSoftbanksMap.put(0xe313, 1); - sSoftbanksMap.put(0xe314, 1); - sSoftbanksMap.put(0xe315, 1); - sSoftbanksMap.put(0xe316, 1); - sSoftbanksMap.put(0xe317, 1); - sSoftbanksMap.put(0xe318, 1); - sSoftbanksMap.put(0xe319, 1); - sSoftbanksMap.put(0xe31a, 1); - sSoftbanksMap.put(0xe31b, 1); - sSoftbanksMap.put(0xe31c, 1); - sSoftbanksMap.put(0xe31d, 1); - sSoftbanksMap.put(0xe31e, 1); - sSoftbanksMap.put(0xe31f, 1); - sSoftbanksMap.put(0xe320, 1); - sSoftbanksMap.put(0xe321, 1); - sSoftbanksMap.put(0xe322, 1); - sSoftbanksMap.put(0xe323, 1); - sSoftbanksMap.put(0xe324, 1); - sSoftbanksMap.put(0xe325, 1); - sSoftbanksMap.put(0xe326, 1); - sSoftbanksMap.put(0xe327, 1); - sSoftbanksMap.put(0xe328, 1); - sSoftbanksMap.put(0xe329, 1); - sSoftbanksMap.put(0xe32a, 1); - sSoftbanksMap.put(0xe32b, 1); - sSoftbanksMap.put(0xe32c, 1); - sSoftbanksMap.put(0xe32d, 1); - sSoftbanksMap.put(0xe32e, 1); - sSoftbanksMap.put(0xe32f, 1); - sSoftbanksMap.put(0xe330, 1); - sSoftbanksMap.put(0xe331, 1); - sSoftbanksMap.put(0xe332, 1); - sSoftbanksMap.put(0xe333, 1); - sSoftbanksMap.put(0xe334, 1); - sSoftbanksMap.put(0xe335, 1); - sSoftbanksMap.put(0xe336, 1); - sSoftbanksMap.put(0xe337, 1); - sSoftbanksMap.put(0xe338, 1); - sSoftbanksMap.put(0xe339, 1); - sSoftbanksMap.put(0xe33a, 1); - sSoftbanksMap.put(0xe33b, 1); - sSoftbanksMap.put(0xe33c, 1); - sSoftbanksMap.put(0xe33d, 1); - sSoftbanksMap.put(0xe33e, 1); - sSoftbanksMap.put(0xe33f, 1); - sSoftbanksMap.put(0xe340, 1); - sSoftbanksMap.put(0xe341, 1); - sSoftbanksMap.put(0xe342, 1); - sSoftbanksMap.put(0xe343, 1); - sSoftbanksMap.put(0xe344, 1); - sSoftbanksMap.put(0xe345, 1); - sSoftbanksMap.put(0xe346, 1); - sSoftbanksMap.put(0xe347, 1); - sSoftbanksMap.put(0xe348, 1); - sSoftbanksMap.put(0xe349, 1); - sSoftbanksMap.put(0xe34a, 1); - sSoftbanksMap.put(0xe34b, 1); - sSoftbanksMap.put(0xe34c, 1); - sSoftbanksMap.put(0xe34d, 1); - sSoftbanksMap.put(0xe401, 1); - sSoftbanksMap.put(0xe402, 1); - sSoftbanksMap.put(0xe403, 1); - sSoftbanksMap.put(0xe404, 1); - sSoftbanksMap.put(0xe405, 1); - sSoftbanksMap.put(0xe406, 1); - sSoftbanksMap.put(0xe407, 1); - sSoftbanksMap.put(0xe408, 1); - sSoftbanksMap.put(0xe409, 1); - sSoftbanksMap.put(0xe40a, 1); - sSoftbanksMap.put(0xe40b, 1); - sSoftbanksMap.put(0xe40c, 1); - sSoftbanksMap.put(0xe40d, 1); - sSoftbanksMap.put(0xe40e, 1); - sSoftbanksMap.put(0xe40f, 1); - sSoftbanksMap.put(0xe410, 1); - sSoftbanksMap.put(0xe411, 1); - sSoftbanksMap.put(0xe412, 1); - sSoftbanksMap.put(0xe413, 1); - sSoftbanksMap.put(0xe414, 1); - sSoftbanksMap.put(0xe415, 1); - sSoftbanksMap.put(0xe416, 1); - sSoftbanksMap.put(0xe417, 1); - sSoftbanksMap.put(0xe418, 1); - sSoftbanksMap.put(0xe419, 1); - sSoftbanksMap.put(0xe41a, 1); - sSoftbanksMap.put(0xe41b, 1); - sSoftbanksMap.put(0xe41c, 1); - sSoftbanksMap.put(0xe41d, 1); - sSoftbanksMap.put(0xe41e, 1); - sSoftbanksMap.put(0xe41f, 1); - sSoftbanksMap.put(0xe420, 1); - sSoftbanksMap.put(0xe421, 1); - sSoftbanksMap.put(0xe422, 1); - sSoftbanksMap.put(0xe423, 1); - sSoftbanksMap.put(0xe424, 1); - sSoftbanksMap.put(0xe425, 1); - sSoftbanksMap.put(0xe426, 1); - sSoftbanksMap.put(0xe427, 1); - sSoftbanksMap.put(0xe428, 1); - sSoftbanksMap.put(0xe429, 1); - sSoftbanksMap.put(0xe42a, 1); - sSoftbanksMap.put(0xe42b, 1); - sSoftbanksMap.put(0xe42c, 1); - sSoftbanksMap.put(0xe42d, 1); - sSoftbanksMap.put(0xe42e, 1); - sSoftbanksMap.put(0xe42f, 1); - sSoftbanksMap.put(0xe430, 1); - sSoftbanksMap.put(0xe431, 1); - sSoftbanksMap.put(0xe432, 1); - sSoftbanksMap.put(0xe433, 1); - sSoftbanksMap.put(0xe434, 1); - sSoftbanksMap.put(0xe435, 1); - sSoftbanksMap.put(0xe436, 1); - sSoftbanksMap.put(0xe437, 1); - sSoftbanksMap.put(0xe438, 1); - sSoftbanksMap.put(0xe439, 1); - sSoftbanksMap.put(0xe43a, 1); - sSoftbanksMap.put(0xe43b, 1); - sSoftbanksMap.put(0xe43c, 1); - sSoftbanksMap.put(0xe43d, 1); - sSoftbanksMap.put(0xe43e, 1); - sSoftbanksMap.put(0xe43f, 1); - sSoftbanksMap.put(0xe440, 1); - sSoftbanksMap.put(0xe441, 1); - sSoftbanksMap.put(0xe442, 1); - sSoftbanksMap.put(0xe443, 1); - sSoftbanksMap.put(0xe444, 1); - sSoftbanksMap.put(0xe445, 1); - sSoftbanksMap.put(0xe446, 1); - sSoftbanksMap.put(0xe447, 1); - sSoftbanksMap.put(0xe448, 1); - sSoftbanksMap.put(0xe449, 1); - sSoftbanksMap.put(0xe44a, 1); - sSoftbanksMap.put(0xe44b, 1); - sSoftbanksMap.put(0xe44b, 1); - sSoftbanksMap.put(0xe44c, 1); - sSoftbanksMap.put(0xe501, 1); - sSoftbanksMap.put(0xe502, 1); - sSoftbanksMap.put(0xe503, 1); - sSoftbanksMap.put(0xe504, 1); - sSoftbanksMap.put(0xe505, 1); - sSoftbanksMap.put(0xe506, 1); - sSoftbanksMap.put(0xe507, 1); - sSoftbanksMap.put(0xe508, 1); - sSoftbanksMap.put(0xe509, 1); - sSoftbanksMap.put(0xe50b, 1); - sSoftbanksMap.put(0xe50c, 1); - sSoftbanksMap.put(0xe50d, 1); - sSoftbanksMap.put(0xe50e, 1); - sSoftbanksMap.put(0xe50f, 1); - sSoftbanksMap.put(0xe510, 1); - sSoftbanksMap.put(0xe511, 1); - sSoftbanksMap.put(0xe512, 1); - sSoftbanksMap.put(0xe513, 1); - sSoftbanksMap.put(0xe514, 1); - sSoftbanksMap.put(0xe515, 1); - sSoftbanksMap.put(0xe516, 1); - sSoftbanksMap.put(0xe517, 1); - sSoftbanksMap.put(0xe518, 1); - sSoftbanksMap.put(0xe519, 1); - sSoftbanksMap.put(0xe51a, 1); - sSoftbanksMap.put(0xe51b, 1); - sSoftbanksMap.put(0xe51c, 1); - sSoftbanksMap.put(0xe51d, 1); - sSoftbanksMap.put(0xe51e, 1); - sSoftbanksMap.put(0xe51f, 1); - sSoftbanksMap.put(0xe520, 1); - sSoftbanksMap.put(0xe521, 1); - sSoftbanksMap.put(0xe522, 1); - sSoftbanksMap.put(0xe523, 1); - sSoftbanksMap.put(0xe524, 1); - sSoftbanksMap.put(0xe525, 1); - sSoftbanksMap.put(0xe526, 1); - sSoftbanksMap.put(0xe527, 1); - sSoftbanksMap.put(0xe528, 1); - sSoftbanksMap.put(0xe529, 1); - sSoftbanksMap.put(0xe52a, 1); - sSoftbanksMap.put(0xe52b, 1); - sSoftbanksMap.put(0xe52c, 1); - sSoftbanksMap.put(0xe52d, 1); - sSoftbanksMap.put(0xe52e, 1); - sSoftbanksMap.put(0xe52f, 1); - sSoftbanksMap.put(0xe530, 1); - sSoftbanksMap.put(0xe531, 1); - sSoftbanksMap.put(0xe532, 1); - sSoftbanksMap.put(0xe533, 1); - sSoftbanksMap.put(0xe534, 1); - sSoftbanksMap.put(0xe535, 1); - sSoftbanksMap.put(0xe536, 1); - sSoftbanksMap.put(0xe537, 1); - } - - private static int getEmojiResource(int codePoint) { - return sEmojisMap.get(codePoint); - } - - private static int getSoftbankEmojiResource(char c) { - return sSoftbanksMap.get(c); - } - - private static boolean isSoftBankEmoji(char c) { - return ((c >> 12) == 0xe); - } - - public static boolean isOnlyEmoji(CharSequence text) { - if (TextUtils.isEmpty(text)) { - return false; - } - - int skip; - int length = text.length(); - for (int i = 0; i < text.length(); i += skip) { - - int icon = 0; - char c = text.charAt(i); - skip = 0; - - if (isSoftBankEmoji(c)) { - icon = getSoftbankEmojiResource(c); - skip = icon == 0 ? 0 : 1; - } - - if (icon == 0) { - int unicode = Character.codePointAt(text, i); - skip = Character.charCount(unicode); - - if (unicode > 0xff) { - icon = getEmojiResource(unicode); - } - - if (icon == 0 && i + skip < length) { - int followUnicode = Character.codePointAt(text, i + skip); - if (followUnicode == 0x20e3) { - int followSkip = Character.charCount(followUnicode); - switch (unicode) { - case 0x0031: - case 0x0032: - case 0x0033: - case 0x0034: - case 0x0035: - case 0x0036: - case 0x0037: - case 0x0038: - case 0x0039: - case 0x0030: - case 0x0023: - icon = 1; - break; - default: - followSkip = 0; - break; - } - skip += followSkip; - } else { - int followSkip = Character.charCount(followUnicode); - switch (unicode) { - case 0x1f1ef: - icon = (followUnicode == 0x1f1f5) ? 1 : 0; - break; - case 0x1f1fa: - icon = (followUnicode == 0x1f1f8) ? 1 : 0; - break; - case 0x1f1eb: - icon = (followUnicode == 0x1f1f7) ? 1 : 0; - break; - case 0x1f1e9: - icon = (followUnicode == 0x1f1ea) ? 1 : 0; - break; - case 0x1f1ee: - icon = (followUnicode == 0x1f1f9) ? 1 : 0; - break; - case 0x1f1ec: - icon = (followUnicode == 0x1f1e7) ? 1 : 0; - break; - case 0x1f1ea: - icon = (followUnicode == 0x1f1f8) ? 1 : 0; - break; - case 0x1f1f7: - icon = (followUnicode == 0x1f1fa) ? 1 : 0; - break; - case 0x1f1e8: - icon = (followUnicode == 0x1f1f3) ? 1 : 0; - break; - case 0x1f1f0: - icon = (followUnicode == 0x1f1f7) ? 1 : 0; - break; - default: - followSkip = 0; - break; - } - skip += followSkip; - } - } - } - - if (icon == 0 && c != ' ') { - return false; - } - } - - return true; - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/common/utils/ImageUtils.java b/QKSMS/src/main/java/com/moez/QKSMS/common/utils/ImageUtils.java deleted file mode 100644 index fe5e1d2a7..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/common/utils/ImageUtils.java +++ /dev/null @@ -1,127 +0,0 @@ -package com.moez.QKSMS.common.utils; - -import android.content.Context; -import android.database.Cursor; -import android.graphics.Bitmap; -import android.graphics.Canvas; -import android.graphics.Color; -import android.graphics.Paint; -import android.graphics.PorterDuff; -import android.graphics.PorterDuffXfermode; -import android.graphics.Rect; -import android.graphics.drawable.BitmapDrawable; -import android.graphics.drawable.Drawable; -import android.net.Uri; -import android.provider.MediaStore; -import android.support.v4.graphics.drawable.RoundedBitmapDrawable; -import android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory; - -import java.io.ByteArrayOutputStream; - -public class ImageUtils { - public static Bitmap drawableToBitmap (Drawable drawable) { - if (drawable instanceof BitmapDrawable) { - return ((BitmapDrawable)drawable).getBitmap(); - } - - Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888); - Canvas canvas = new Canvas(bitmap); - drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight()); - drawable.draw(canvas); - - return bitmap; - } - - public static Bitmap getCircleBitmap(Bitmap bitmap, int radius) { - - Bitmap sbmp; - - if (bitmap.getWidth() != radius || bitmap.getHeight() != radius) { - float smallest = Math.min(bitmap.getWidth(), bitmap.getHeight()); - float factor = smallest / radius; - sbmp = Bitmap.createScaledBitmap(bitmap, (int) (bitmap.getWidth() / factor), (int) (bitmap.getHeight() / factor), false); - } else { - sbmp = bitmap; - } - - Bitmap output = Bitmap.createBitmap(radius, radius, Bitmap.Config.ARGB_8888); - Canvas canvas = new Canvas(output); - - final int color = 0xffa19774; - final Paint paint = new Paint(); - final Rect rect = new Rect(0, 0, radius, radius); - - paint.setAntiAlias(true); - paint.setFilterBitmap(true); - paint.setDither(true); - canvas.drawARGB(0, 0, 0, 0); - paint.setColor(Color.parseColor("#BAB399")); - canvas.drawCircle(radius / 2, radius / 2, radius / 2, paint); - paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); - canvas.drawBitmap(sbmp, rect, rect, paint); - - return output; - } - - public static RoundedBitmapDrawable getRoundedDrawable(Context context, Drawable drawable, int radiusDp) { - return getRoundedDrawable(context, ((BitmapDrawable) drawable).getBitmap(), radiusDp); - } - - public static RoundedBitmapDrawable getRoundedDrawable(Context context, Bitmap bitmap, int radiusDp) { - float radius = (float) Units.dpToPx(context, radiusDp); - - RoundedBitmapDrawable drawable = RoundedBitmapDrawableFactory.create(context.getResources(), bitmap); - drawable.setCornerRadius(radius); - drawable.setAntiAlias(true); - - return drawable; - } - - /** - * Shrinks a bitmap so that, when it is encoded to a jpg with the given compression level, its - * size is less than the given number of bytes. - * - * @param src The bitmap to shrink - * @param jpgCompression The JPEG compression level to use when judging the size of the file - * @param maxSize The maximum size that the compressed JPEG should be - * @return The shrinked bitmap - */ - public static Bitmap shrink(Bitmap src, int jpgCompression, long maxSize) { - - // Factor to scale the size down by each time - final float factor = 0.5f; - - ByteArrayOutputStream stream = new ByteArrayOutputStream(); - src.compress(Bitmap.CompressFormat.JPEG, jpgCompression, stream); - - while (maxSize != -1 && stream.size() > maxSize) { - // Calculate new height / width - int height = (int) (src.getHeight() * factor); - int width = (int) (src.getWidth() * factor); - - // Scale the image and compress to jpg again - stream.reset(); - src = Bitmap.createScaledBitmap(src, width, height, false); - src.compress(Bitmap.CompressFormat.JPEG, 90, stream); - } - - return src; - } - - public static int getOrientation(Context context, Uri photoUri) { - final int result; - Cursor cursor = context.getContentResolver().query( - photoUri, new String[]{MediaStore.Images.ImageColumns.ORIENTATION}, null, null, null - ); - if (cursor == null) { - return 0; - } - if (cursor.moveToFirst()) { - result = cursor.getInt(0); - } else { - result = 0; - } - cursor.close(); - return result; - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/common/utils/KeyboardUtils.java b/QKSMS/src/main/java/com/moez/QKSMS/common/utils/KeyboardUtils.java deleted file mode 100644 index 30c6b8818..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/common/utils/KeyboardUtils.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.moez.QKSMS.common.utils; - -import android.app.Activity; -import android.content.Context; -import android.util.Log; -import android.view.View; -import android.view.inputmethod.InputMethodManager; - -public class KeyboardUtils { - public static final String TAG = "KeyboardUtils"; - - /** - * Hides the keyboard. Note that both the context and the view must be non-null. - * @param context - * @param view used to get the window token - */ - public static void hide(Context context, View view) { - if (context != null && view != null) { - InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); - imm.hideSoftInputFromWindow(view.getWindowToken(), 0); - } else { - Log.w(TAG, "hide called with null parameter: " + context + " " + view); - } - } - - /** - * Hides the keyboard. Note that both the context and the view must be non-null. - * @param context - * @param view used to get the window token - */ - public static void hide(Activity context) { - hide(context, context.getCurrentFocus()); - } - - /** - * Shows the keyboard. - * @param context - */ - public static void show(Context context) { - if (context != null) { - InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); - imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0); - } else { - Log.w(TAG, "show called with null context: " + context); - } - } - - /** - * Shows the keyboard and attempts to set the focus on the given view. - * @param context - * @param view - */ - public static void showAndFocus(Context context, View view) { - show(context); - if (view != null) { - view.requestFocus(); - } - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/common/utils/LinkifyUtils.java b/QKSMS/src/main/java/com/moez/QKSMS/common/utils/LinkifyUtils.java deleted file mode 100644 index e64199894..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/common/utils/LinkifyUtils.java +++ /dev/null @@ -1,111 +0,0 @@ -package com.moez.QKSMS.common.utils; - -import android.content.ActivityNotFoundException; -import android.content.Context; -import android.content.Intent; -import android.net.Uri; -import android.provider.Browser; -import android.text.Spannable; -import android.text.SpannableString; -import android.text.style.CharacterStyle; -import android.text.style.ClickableSpan; -import android.text.style.URLSpan; -import android.text.util.Linkify; -import android.text.util.Linkify.TransformFilter; -import android.util.Log; -import android.view.View; -import android.widget.TextView; - -import java.util.regex.Pattern; - -/** - * Shamelessly stolen from - * ChatSecure's implementation - */ -public class LinkifyUtils { - - private static Pattern bitcoin = Pattern.compile("bitcoin:[1-9a-km-zA-HJ-NP-Z]{27,34}(\\?[a-zA-Z0-9$\\-_.+!*'(),%:;@&=]*)?"); - private static Pattern geo = Pattern.compile("geo:[-0-9.]+,[-0-9.]+[^ \t\n\"\':]*"); - private static Pattern market = Pattern.compile("market://[^ \t\n\"\':,<>]+"); - private static Pattern openpgp4fpr = Pattern.compile("openpgp4fpr:[A-Za-z0-9]{8,40}"); - private static Pattern xmpp = Pattern.compile("xmpp:[^ \t\n\"\':,<>]+"); - private static Pattern twitterHandle = Pattern.compile("@([A-Za-z0-9_-]+)"); - private static Pattern hashtag = Pattern.compile("#([A-Za-z0-9_-]+)"); - - static TransformFilter returnMatchFilter = (match, url) -> match.group(1); - - /* Right now, if there is no app to handle */ - public static void addLinks(TextView text) { - Linkify.addLinks(text, Linkify.ALL); - Linkify.addLinks(text, geo, null); - Linkify.addLinks(text, market, null); - Linkify.addLinks(text, openpgp4fpr, null); - Linkify.addLinks(text, bitcoin, null); - Linkify.addLinks(text, xmpp, null); - Linkify.addLinks(text, twitterHandle, "https://twitter.com/", null, returnMatchFilter); - Linkify.addLinks(text, hashtag, "https://twitter.com/hashtag/", null, returnMatchFilter); - text.setText(replaceAll(text.getText(), URLSpan.class, new URLSpanConverter())); - } - - /** - * Do not create this static utility class. - */ - private LinkifyUtils() { - } - - // thanks to @commonsware https://stackoverflow.com/a/11417498 - public static Spannable replaceAll( - CharSequence original, Class sourceType, SpanConverter converter) { - SpannableString result = new SpannableString(original); - A[] spans = result.getSpans(0, result.length(), sourceType); - - for (A span : spans) { - int start = result.getSpanStart(span); - int end = result.getSpanEnd(span); - int flags = result.getSpanFlags(span); - - result.removeSpan(span); - result.setSpan(converter.convert(span), start, end, flags); - } - - return (result); - } - - private interface SpanConverter { - B convert(A span); - } - - /** - * This trickery is needed in order to have clickable links that open things - * in a new {@code Task} rather than in ChatSecure's {@code Task.} Thanks to @commonsware - * https://stackoverflow.com/a/11417498 - */ - private static class NewTaskUrlSpan extends ClickableSpan { - private String urlString; - - NewTaskUrlSpan(String urlString) { - this.urlString = urlString; - } - - @Override - public void onClick(View widget) { - try { - Uri uri = Uri.parse(urlString); - Context context = widget.getContext(); - Intent intent = new Intent(Intent.ACTION_VIEW, uri); - intent.putExtra(Browser.EXTRA_APPLICATION_ID, context.getPackageName()); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - context.startActivity(intent); - } catch (ActivityNotFoundException ignored) { - Log.e("LinkifyUtils", "", ignored); // We should (or shouldn't) explain that no app can handle this intent ? - } - } - } - - private static class URLSpanConverter implements LinkifyUtils.SpanConverter { - @Override - public NewTaskUrlSpan convert(URLSpan span) { - return (new NewTaskUrlSpan(span.getURL())); - } - } -} \ No newline at end of file diff --git a/QKSMS/src/main/java/com/moez/QKSMS/common/utils/MessageUtils.java b/QKSMS/src/main/java/com/moez/QKSMS/common/utils/MessageUtils.java deleted file mode 100644 index 3bf09fbc8..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/common/utils/MessageUtils.java +++ /dev/null @@ -1,1446 +0,0 @@ -/* - * Copyright (C) 2008 Esmertec AG. - * Copyright (C) 2008 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.moez.QKSMS.common.utils; - -import android.app.Activity; -import android.app.AlertDialog; -import android.content.ClipData; -import android.content.ClipboardManager; -import android.content.ContentUris; -import android.content.ContentValues; -import android.content.Context; -import android.content.DialogInterface; -import android.content.DialogInterface.OnCancelListener; -import android.content.DialogInterface.OnClickListener; -import android.content.Intent; -import android.content.res.Resources; -import android.database.Cursor; -import android.database.sqlite.SqliteWrapper; -import android.drm.DrmStore; -import android.media.CamcorderProfile; -import android.media.RingtoneManager; -import android.net.Uri; -import android.os.Environment; -import android.os.Handler; -import android.provider.ContactsContract; -import android.provider.MediaStore; -import android.provider.Telephony.Mms; -import android.provider.Telephony.Sms; -import android.text.TextUtils; -import android.text.format.DateUtils; -import android.text.format.Time; -import android.text.style.URLSpan; -import android.util.Log; -import android.webkit.MimeTypeMap; -import android.widget.Toast; -import com.android.mms.transaction.MmsMessageSender; -import com.google.android.mms.ContentType; -import com.google.android.mms.MmsException; -import com.google.android.mms.pdu_alt.CharacterSets; -import com.google.android.mms.pdu_alt.EncodedStringValue; -import com.google.android.mms.pdu_alt.MultimediaMessagePdu; -import com.google.android.mms.pdu_alt.NotificationInd; -import com.google.android.mms.pdu_alt.PduBody; -import com.google.android.mms.pdu_alt.PduHeaders; -import com.google.android.mms.pdu_alt.PduPart; -import com.google.android.mms.pdu_alt.PduPersister; -import com.google.android.mms.pdu_alt.RetrieveConf; -import com.google.android.mms.pdu_alt.SendReq; -import com.moez.QKSMS.LogTag; -import com.moez.QKSMS.MmsConfig; -import com.moez.QKSMS.QKSMSApp; -import com.moez.QKSMS.R; -import com.moez.QKSMS.TempFileProvider; -import com.moez.QKSMS.common.google.ThumbnailManager; -import com.moez.QKSMS.common.google.UriImage; -import com.moez.QKSMS.data.Contact; -import com.moez.QKSMS.model.MediaModel; -import com.moez.QKSMS.model.SlideModel; -import com.moez.QKSMS.model.SlideshowModel; -import com.moez.QKSMS.transaction.SmsHelper; -import com.moez.QKSMS.ui.dialog.AsyncDialog; -import com.moez.QKSMS.ui.messagelist.MessageColumns; -import com.moez.QKSMS.ui.messagelist.MessageItem; -import com.moez.QKSMS.ui.mms.SlideshowActivity; -import com.moez.QKSMS.ui.popup.QKComposeActivity; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -/** - * An utility class for managing messages. - */ -public abstract class MessageUtils { - - /** - * Copies media from an Mms to the DrmProvider - * - * @param context - * @param msgId - */ - public static boolean saveRingtone(Context context, long msgId) { - boolean result = true; - PduBody body = null; - try { - body = SlideshowModel.getPduBody(context, ContentUris.withAppendedId(Mms.CONTENT_URI, msgId)); - } catch (MmsException e) { - Log.e(TAG, "copyToDrmProvider can't load pdu body: " + msgId); - } - if (body == null) { - return false; - } - - int partNum = body.getPartsNum(); - for (int i = 0; i < partNum; i++) { - PduPart part = body.getPart(i); - String type = new String(part.getContentType()); - - if (DrmUtils.isDrmType(type)) { - // All parts (but there's probably only a single one) have to be successful - // for a valid result. - result &= copyPart(context, part, Long.toHexString(msgId)); - } - } - return result; - } - - public static boolean copyPart(Context context, PduPart part, String fallback) { - Uri uri = part.getDataUri(); - String type = new String(part.getContentType()); - boolean isDrm = DrmUtils.isDrmType(type); - if (isDrm) { - type = QKSMSApp.getApplication().getDrmManagerClient().getOriginalMimeType(part.getDataUri()); - } - if (!ContentType.isImageType(type) && !ContentType.isVideoType(type) && - !ContentType.isAudioType(type)) { - return true; // we only save pictures, videos, and sounds. Skip the text parts, - // the app (smil) parts, and other type that we can't handle. - // Return true to pretend that we successfully saved the part so - // the whole save process will be counted a success. - } - InputStream input = null; - FileOutputStream fout = null; - try { - input = context.getContentResolver().openInputStream(uri); - if (input instanceof FileInputStream) { - FileInputStream fin = (FileInputStream) input; - - byte[] location = part.getName(); - if (location == null) { - location = part.getFilename(); - } - if (location == null) { - location = part.getContentLocation(); - } - - String fileName; - if (location == null) { - // Use fallback name. - fileName = fallback; - } else { - // For locally captured videos, fileName can end up being something like this: - // /mnt/sdcard/Android/data/com.android.mms/cache/.temp1.3gp - fileName = new String(location); - } - File originalFile = new File(fileName); - fileName = originalFile.getName(); // Strip the full path of where the "part" is - // stored down to just the leaf filename. - - // Depending on the location, there may be an - // extension already on the name or not. If we've got audio, put the attachment - // in the Ringtones directory. - String dir = Environment.getExternalStorageDirectory() + "/" - + (ContentType.isAudioType(type) ? Environment.DIRECTORY_RINGTONES : - Environment.DIRECTORY_DOWNLOADS) + "/"; - String extension; - int index; - if ((index = fileName.lastIndexOf('.')) == -1) { - extension = MimeTypeMap.getSingleton().getExtensionFromMimeType(type); - } else { - extension = fileName.substring(index + 1, fileName.length()); - fileName = fileName.substring(0, index); - } - if (isDrm) { - extension += DrmUtils.getConvertExtension(type); - } - // Remove leading periods. The gallery ignores files starting with a period. - fileName = fileName.replaceAll("^.", ""); - - File file = getUniqueDestination(dir + fileName, extension); - - // make sure the path is valid and directories created for this file. - File parentFile = file.getParentFile(); - if (!parentFile.exists() && !parentFile.mkdirs()) { - Log.e(TAG, "[MMS] copyPart: mkdirs for " + parentFile.getPath() + " failed!"); - return false; - } - - fout = new FileOutputStream(file); - - byte[] buffer = new byte[8000]; - int size = 0; - while ((size = fin.read(buffer)) != -1) { - fout.write(buffer, 0, size); - } - - // Notify other applications listening to scanner events - // that a media file has been added to the sd card - context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(file))); - } - } catch (IOException e) { - // Ignore - Log.e(TAG, "IOException caught while opening or reading stream", e); - return false; - } finally { - if (null != input) { - try { - input.close(); - } catch (IOException e) { - // Ignore - Log.e(TAG, "IOException caught while closing stream", e); - return false; - } - } - if (null != fout) { - try { - fout.close(); - } catch (IOException e) { - // Ignore - Log.e(TAG, "IOException caught while closing stream", e); - return false; - } - } - } - return true; - } - - private static File getUniqueDestination(String base, String extension) { - File file = new File(base + "." + extension); - - for (int i = 2; file.exists(); i++) { - file = new File(base + "_" + i + "." + extension); - } - return file; - } - - public static int getDrmMimeSavedStringRsrc(Context context, long msgId, boolean success) { - if (isDrmRingtoneWithRights(context, msgId)) { - return success ? R.string.saved_ringtone : R.string.saved_ringtone_fail; - } - return 0; - } - - /** - * Returns true if any part is drm'd audio with ringtone rights. - * - * @param context - * @param msgId - * @return true if one of the parts is drm'd audio with rights to save as a ringtone. - */ - public static boolean isDrmRingtoneWithRights(Context context, long msgId) { - PduBody body = null; - try { - body = SlideshowModel.getPduBody(context, ContentUris.withAppendedId(Mms.CONTENT_URI, msgId)); - } catch (MmsException e) { - Log.e(TAG, "isDrmRingtoneWithRights can't load pdu body: " + msgId); - } - if (body == null) { - return false; - } - - int partNum = body.getPartsNum(); - for (int i = 0; i < partNum; i++) { - PduPart part = body.getPart(i); - String type = new String(part.getContentType()); - - if (DrmUtils.isDrmType(type)) { - String mimeType = QKSMSApp.getApplication().getDrmManagerClient() - .getOriginalMimeType(part.getDataUri()); - if (ContentType.isAudioType(mimeType) && DrmUtils.haveRightsForAction(part.getDataUri(), - DrmStore.Action.RINGTONE)) { - return true; - } - } - } - return false; - } - - /** - * Copies media from an Mms to the "download" directory on the SD card. If any of the parts - * are audio types, drm'd or not, they're copied to the "Ringtones" directory. - * - * @param context - * @param msgId - */ - public static boolean copyMedia(Context context, long msgId) { - boolean result = true; - PduBody body = null; - try { - body = SlideshowModel.getPduBody(context, ContentUris.withAppendedId(Mms.CONTENT_URI, msgId)); - } catch (MmsException e) { - Log.e(TAG, "copyMedia can't load pdu body: " + msgId); - } - if (body == null) { - return false; - } - - int partNum = body.getPartsNum(); - for (int i = 0; i < partNum; i++) { - PduPart part = body.getPart(i); - - // all parts have to be successful for a valid result. - result &= copyPart(context, part, Long.toHexString(msgId)); - } - return result; - } - - /** - * Returns true if all drm'd parts are forwardable. - * - * @param context - * @param msgId - * @return true if all drm'd parts are forwardable. - */ - public static boolean isForwardable(Context context, long msgId) { - PduBody body = null; - try { - body = SlideshowModel.getPduBody(context, ContentUris.withAppendedId(Mms.CONTENT_URI, msgId)); - } catch (MmsException e) { - Log.e(TAG, "getDrmMimeType can't load pdu body: " + msgId); - } - if (body == null) { - return false; - } - - int partNum = body.getPartsNum(); - for (int i = 0; i < partNum; i++) { - PduPart part = body.getPart(i); - String type = new String(part.getContentType()); - - if (DrmUtils.isDrmType(type) && !DrmUtils.haveRightsForAction(part.getDataUri(), - DrmStore.Action.TRANSFER)) { - return false; - } - } - return true; - } - - public static void addToContacts(Context context, MessageItem msgItem) { - Intent intent = new Intent(Intent.ACTION_INSERT); - intent.setType(ContactsContract.Contacts.CONTENT_TYPE); - intent.putExtra(ContactsContract.Intents.Insert.PHONE, msgItem.mAddress); - context.startActivity(intent); - } - - public static void copyToClipboard(Context context, String str) { - ClipboardManager clipboard = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE); - clipboard.setPrimaryClip(ClipData.newPlainText(null, str)); - } - - public static void forwardMessage(Context context, MessageItem msgItem) { - Intent forwardIntent = new Intent(context, QKComposeActivity.class); - forwardIntent.putExtra("sms_body", msgItem.mBody); - context.startActivity(forwardIntent); - } - - public static void lockMessage(Context context, MessageItem msgItem, boolean locked) { - Uri uri; - if ("sms".equals(msgItem.mType)) { - uri = Sms.CONTENT_URI; - } else { - uri = Mms.CONTENT_URI; - } - final Uri lockUri = ContentUris.withAppendedId(uri, msgItem.mMsgId); - - final ContentValues values = new ContentValues(1); - values.put("locked", locked ? 1 : 0); - - new Thread(() -> { - context.getContentResolver().update(lockUri, - values, null, null); - }, "MainActivity.lockMessage").start(); - } - - /** - * Looks to see if there are any valid parts of the attachment that can be copied to a SD card. - * - * @param context - * @param msgId - */ - public static boolean haveSomethingToCopyToSDCard(Context context, long msgId) { - PduBody body = null; - try { - body = SlideshowModel.getPduBody(context, ContentUris.withAppendedId(Mms.CONTENT_URI, msgId)); - } catch (MmsException e) { - Log.e(TAG, "haveSomethingToCopyToSDCard can't load pdu body: " + msgId); - } - if (body == null) { - return false; - } - - boolean result = false; - int partNum = body.getPartsNum(); - for (int i = 0; i < partNum; i++) { - PduPart part = body.getPart(i); - String type = new String(part.getContentType()); - - if (Log.isLoggable(LogTag.APP, Log.VERBOSE)) { - Log.v(TAG, "[CMA] haveSomethingToCopyToSDCard: part[" + i + "] contentType=" + type); - } - - if (ContentType.isImageType(type) || ContentType.isVideoType(type) || - ContentType.isAudioType(type) || DrmUtils.isDrmType(type)) { - result = true; - break; - } - } - return result; - } - - public static int getDrmMimeMenuStringRsrc(Context context, long msgId) { - if (isDrmRingtoneWithRights(context, msgId)) { - return R.string.save_ringtone; - } - return 0; - } - - public static Uri getContactUriForEmail(Context context, String emailAddress) { - Cursor cursor = SqliteWrapper.query(context, context.getContentResolver(), - Uri.withAppendedPath(ContactsContract.CommonDataKinds.Email.CONTENT_LOOKUP_URI, Uri.encode(emailAddress)), - new String[]{ContactsContract.CommonDataKinds.Email.CONTACT_ID, ContactsContract.Contacts.DISPLAY_NAME}, null, null, null); - - if (cursor != null) { - try { - while (cursor.moveToNext()) { - String name = cursor.getString(1); - if (!TextUtils.isEmpty(name)) { - return ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, cursor.getLong(0)); - } - } - } finally { - cursor.close(); - } - } - return null; - } - - public static Uri getContactUriForPhoneNumber(String phoneNumber) { - Contact contact = Contact.get(phoneNumber, false); - if (contact.existsInDatabase()) { - return contact.getUri(); - } - return null; - } - - interface ResizeImageResultCallback { - void onResizeResult(PduPart part, boolean append); - } - - private static final String TAG = LogTag.TAG; - private static String sLocalNumber; - private static String[] sNoSubjectStrings; - - // Cache of both groups of space-separated ids to their full - // comma-separated display names, as well as individual ids to - // display names. - // TODO: is it possible for canonical address ID keys to be - // re-used? SQLite does reuse IDs on NULL id_ insert, but does - // anything ever delete from the mmssms.db canonical_addresses - // table? Nothing that I could find. - private static final Map sRecipientAddress = - new ConcurrentHashMap<>(20 /* initial capacity */); - - // When we pass a video record duration to the video recorder, use one of these values. - private static final int[] sVideoDuration = - new int[]{0, 5, 10, 15, 20, 30, 40, 50, 60, 90, 120}; - - /** - * MMS address parsing data structures - */ - // allowable phone number separators - private static final char[] NUMERIC_CHARS_SUGAR = { - '-', '.', ',', '(', ')', ' ', '/', '\\', '*', '#', '+' - }; - - private static HashMap numericSugarMap = new HashMap(NUMERIC_CHARS_SUGAR.length); - - static { - for (int i = 0; i < NUMERIC_CHARS_SUGAR.length; i++) { - numericSugarMap.put(NUMERIC_CHARS_SUGAR[i], NUMERIC_CHARS_SUGAR[i]); - } - } - - - private MessageUtils() { - // Forbidden being instantiated. - } - - /** - * cleanseMmsSubject will take a subject that's says, "", and return - * a null string. Otherwise it will return the original subject string. - * - * @param context a regular context so the function can grab string resources - * @param subject the raw subject - * @param blacklist any extra strings to cleanse - * @return - */ - public static String cleanseMmsSubject(Context context, String subject, String... blacklist) { - if (TextUtils.isEmpty(subject)) { - return subject; - } - if (sNoSubjectStrings == null) { - sNoSubjectStrings = - context.getResources().getStringArray(R.array.empty_subject_strings); - - } - for (String string : sNoSubjectStrings) { - if (subject.replaceAll("\\s+", "") - .equalsIgnoreCase(string.replaceAll("\\s+", ""))) { - return null; - } - } - - for (String string : blacklist) { - if (string != null) { - if (subject.replaceAll("\\s+", "") - .equalsIgnoreCase(string.replaceAll("\\s+", ""))) { - return null; - } - } - } - - return subject; - } - - public static String getMessageDetails(Context context, Cursor cursor, int size) { - if (cursor == null) { - return null; - } - - if ("mms".equals(cursor.getString(MessageColumns.COLUMN_MSG_TYPE))) { - int type = cursor.getInt(MessageColumns.COLUMN_MMS_MESSAGE_TYPE); - switch (type) { - case PduHeaders.MESSAGE_TYPE_NOTIFICATION_IND: - return getNotificationIndDetails(context, cursor); - case PduHeaders.MESSAGE_TYPE_RETRIEVE_CONF: - case PduHeaders.MESSAGE_TYPE_SEND_REQ: - return getMultimediaMessageDetails(context, cursor, size); - default: - Log.w(TAG, "No details could be retrieved."); - return ""; - } - } else { - return getTextMessageDetails(context, cursor); - } - } - - private static String getNotificationIndDetails(Context context, Cursor cursor) { - StringBuilder details = new StringBuilder(); - Resources res = context.getResources(); - - long id = cursor.getLong(MessageColumns.COLUMN_ID); - Uri uri = ContentUris.withAppendedId(Mms.CONTENT_URI, id); - NotificationInd nInd; - - try { - nInd = (NotificationInd) PduPersister.getPduPersister( - context).load(uri); - } catch (MmsException e) { - Log.e(TAG, "Failed to load the message: " + uri, e); - return context.getResources().getString(R.string.cannot_get_details); - } - - // Message Type: Mms Notification. - details.append(res.getString(R.string.message_type_label)); - details.append(res.getString(R.string.multimedia_notification)); - - // From: *** - String from = extractEncStr(context, nInd.getFrom()); - details.append("\n\n"); - details.append(res.getString(R.string.from_label)); - details.append(!TextUtils.isEmpty(from) ? from : - res.getString(R.string.hidden_sender_address)); - - // Date: *** - details.append("\n\n"); - details.append(res.getString( - R.string.expire_on, - MessageUtils.formatTimeStampString( - context, nInd.getExpiry() * 1000L, true))); - - // Subject: *** - details.append("\n\n"); - details.append(res.getString(R.string.subject_label)); - - EncodedStringValue subject = nInd.getSubject(); - if (subject != null) { - details.append(subject.getString()); - } - - // Message class: Personal/Advertisement/Infomational/Auto - details.append("\n\n"); - details.append(res.getString(R.string.message_class_label)); - details.append(new String(nInd.getMessageClass())); - - // Message size: *** KB - details.append("\n\n"); - details.append(res.getString(R.string.message_size_label)); - details.append(String.valueOf((nInd.getMessageSize() + 1023) / 1024)); - details.append(context.getString(R.string.kilobyte)); - - return details.toString(); - } - - private static String getMultimediaMessageDetails( - Context context, Cursor cursor, int size) { - int type = cursor.getInt(MessageColumns.COLUMN_MMS_MESSAGE_TYPE); - if (type == PduHeaders.MESSAGE_TYPE_NOTIFICATION_IND) { - return getNotificationIndDetails(context, cursor); - } - - StringBuilder details = new StringBuilder(); - Resources res = context.getResources(); - - long id = cursor.getLong(MessageColumns.COLUMN_ID); - Uri uri = ContentUris.withAppendedId(Mms.CONTENT_URI, id); - MultimediaMessagePdu msg; - - try { - msg = (MultimediaMessagePdu) PduPersister.getPduPersister( - context).load(uri); - } catch (MmsException e) { - Log.e(TAG, "Failed to load the message: " + uri, e); - return context.getResources().getString(R.string.cannot_get_details); - } - - // Message Type: Text message. - details.append(res.getString(R.string.message_type_label)); - details.append(res.getString(R.string.multimedia_message)); - - if (msg instanceof RetrieveConf) { - // From: *** - String from = extractEncStr(context, ((RetrieveConf) msg).getFrom()); - details.append("\n\n"); - details.append(res.getString(R.string.from_label)); - details.append(!TextUtils.isEmpty(from) ? from : - res.getString(R.string.hidden_sender_address)); - } - - // To: *** - details.append("\n\n"); - details.append(res.getString(R.string.to_address_label)); - EncodedStringValue[] to = msg.getTo(); - if (to != null) { - details.append(EncodedStringValue.concat(to)); - } else { - Log.w(TAG, "recipient list is empty!"); - } - - - // Bcc: *** - if (msg instanceof SendReq) { - EncodedStringValue[] values = ((SendReq) msg).getBcc(); - if ((values != null) && (values.length > 0)) { - details.append("\n\n"); - details.append(res.getString(R.string.bcc_label)); - details.append(EncodedStringValue.concat(values)); - } - } - - // Date: *** - details.append("\n\n"); - int msgBox = cursor.getInt(MessageColumns.COLUMN_MMS_MESSAGE_BOX); - if (msgBox == Mms.MESSAGE_BOX_DRAFTS) { - details.append(res.getString(R.string.saved_label)); - } else if (msgBox == Mms.MESSAGE_BOX_INBOX) { - details.append(res.getString(R.string.received_label)); - } else { - details.append(res.getString(R.string.sent_label)); - } - - details.append(MessageUtils.formatTimeStampString( - context, msg.getDate() * 1000L, true)); - - // Subject: *** - details.append("\n\n"); - details.append(res.getString(R.string.subject_label)); - - EncodedStringValue subject = msg.getSubject(); - if (subject != null) { - String subStr = subject.getString(); - // Message size should include size of subject. - size += subStr.length(); - details.append(subStr); - } - - // Priority: High/Normal/Low - details.append("\n\n"); - details.append(res.getString(R.string.priority_label)); - details.append(getPriorityDescription(context, msg.getPriority())); - - // Message size: *** KB - details.append("\n\n"); - details.append(res.getString(R.string.message_size_label)); - details.append((size - 1) / 1000 + 1); - details.append(" KB"); - - return details.toString(); - } - - private static String getTextMessageDetails(Context context, Cursor cursor) { - Log.d(TAG, "getTextMessageDetails"); - - StringBuilder details = new StringBuilder(); - Resources res = context.getResources(); - - // Message Type: Text message. - details.append(res.getString(R.string.message_type_label)); - details.append(res.getString(R.string.text_message)); - - // Address: *** - details.append("\n\n"); - int smsType = cursor.getInt(MessageColumns.COLUMN_SMS_TYPE); - if (SmsHelper.isOutgoingFolder(smsType)) { - details.append(res.getString(R.string.to_address_label)); - } else { - details.append(res.getString(R.string.from_label)); - } - details.append(cursor.getString(MessageColumns.COLUMN_SMS_ADDRESS)); - - // Sent: *** - if (smsType == Sms.MESSAGE_TYPE_INBOX) { - long date_sent = cursor.getLong(MessageColumns.COLUMN_SMS_DATE_SENT); - if (date_sent > 0) { - details.append("\n\n"); - details.append(res.getString(R.string.sent_label)); - details.append(MessageUtils.formatTimeStampString(context, date_sent, true)); - } - } - - // Received: *** - details.append("\n\n"); - if (smsType == Sms.MESSAGE_TYPE_DRAFT) { - details.append(res.getString(R.string.saved_label)); - } else if (smsType == Sms.MESSAGE_TYPE_INBOX) { - details.append(res.getString(R.string.received_label)); - } else { - details.append(res.getString(R.string.sent_label)); - } - - long date = cursor.getLong(MessageColumns.COLUMN_SMS_DATE); - details.append(MessageUtils.formatTimeStampString(context, date, true)); - - // Delivered: *** - if (smsType == Sms.MESSAGE_TYPE_SENT) { - // For sent messages with delivery reports, we stick the delivery time in the - // date_sent column (see MessageStatusReceiver). - long dateDelivered = cursor.getLong(MessageColumns.COLUMN_SMS_DATE_SENT); - if (dateDelivered > 0) { - details.append("\n\n"); - details.append(res.getString(R.string.delivered_label)); - details.append(MessageUtils.formatTimeStampString(context, dateDelivered, true)); - } - } - - // Error code: *** - int errorCode = cursor.getInt(MessageColumns.COLUMN_SMS_ERROR_CODE); - if (errorCode != 0) { - details.append("\n\n") - .append(res.getString(R.string.error_code_label)) - .append(errorCode); - } - - return details.toString(); - } - - static private String getPriorityDescription(Context context, int PriorityValue) { - Resources res = context.getResources(); - switch (PriorityValue) { - case PduHeaders.PRIORITY_HIGH: - return res.getString(R.string.priority_high); - case PduHeaders.PRIORITY_LOW: - return res.getString(R.string.priority_low); - case PduHeaders.PRIORITY_NORMAL: - default: - return res.getString(R.string.priority_normal); - } - } - - public static int getAttachmentType(SlideshowModel model, MultimediaMessagePdu mmp) { - if (model == null || mmp == null) { - return MessageItem.ATTACHMENT_TYPE_NOT_LOADED; - } - - int numberOfSlides = model.size(); - if (numberOfSlides > 1) { - return SmsHelper.SLIDESHOW; - } else if (numberOfSlides == 1) { - // Only one slide in the slide-show. - SlideModel slide = model.get(0); - if (slide.hasVideo()) { - return SmsHelper.VIDEO; - } - - if (slide.hasAudio() && slide.hasImage()) { - return SmsHelper.SLIDESHOW; - } - - if (slide.hasAudio()) { - return SmsHelper.AUDIO; - } - - if (slide.hasImage()) { - return SmsHelper.IMAGE; - } - - if (slide.hasText()) { - return SmsHelper.TEXT; - } - - // Handle the multimedia message only has subject - String subject = mmp.getSubject() != null ? mmp.getSubject().getString() : null; - if (!TextUtils.isEmpty(subject)) { - return SmsHelper.TEXT; - } - } - - return MessageItem.ATTACHMENT_TYPE_NOT_LOADED; - } - - public static void removeThumbnailsFromCache(SlideshowModel slideshow) { - if (slideshow != null) { - ThumbnailManager thumbnailManager = QKSMSApp.getApplication().getThumbnailManager(); - boolean removedSomething = false; - Iterator iterator = slideshow.iterator(); - while (iterator.hasNext()) { - SlideModel slideModel = iterator.next(); - if (slideModel.hasImage()) { - thumbnailManager.removeThumbnail(slideModel.getImage().getUri()); - removedSomething = true; - } else if (slideModel.hasVideo()) { - thumbnailManager.removeThumbnail(slideModel.getVideo().getUri()); - removedSomething = true; - } - } - if (removedSomething) { - // HACK: the keys to the thumbnail cache are the part uris, such as mms/part/3 - // Because the part table doesn't have auto-increment ids, the part ids are reused - // when a message or thread is deleted. For now, we're clearing the whole thumbnail - // cache so we don't retrieve stale images when part ids are reused. This will be - // fixed in the next release in the mms provider. - QKSMSApp.getApplication().getThumbnailManager().clearBackingStore(); - } - } - } - - public static String formatTimeStampString(Context context, long when) { - return formatTimeStampString(context, when, false); - } - - public static String formatTimeStampString(Context context, long when, boolean fullFormat) { - Time then = new Time(); - then.set(when); - Time now = new Time(); - now.setToNow(); - - // Basic settings for formatDateTime() we want for all cases. - int format_flags = DateUtils.FORMAT_NO_NOON_MIDNIGHT | - DateUtils.FORMAT_ABBREV_ALL | - DateUtils.FORMAT_CAP_AMPM; - - // If the message is from a different year, show the date and year. - if (then.year != now.year) { - format_flags |= DateUtils.FORMAT_SHOW_YEAR | DateUtils.FORMAT_SHOW_DATE; - } else if (then.yearDay != now.yearDay) { - // If it is from a different day than today, show only the date. - format_flags |= DateUtils.FORMAT_SHOW_DATE; - } else { - // Otherwise, if the message is from today, show the time. - format_flags |= DateUtils.FORMAT_SHOW_TIME; - } - - // If the caller has asked for full details, make sure to show the date - // and time no matter what we've determined above (but still make showing - // the year only happen if it is a different year from today). - if (fullFormat) { - format_flags |= (DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_SHOW_TIME); - } - - return DateUtils.formatDateTime(context, when, format_flags); - } - - public static void selectAudio(Activity activity, int requestCode) { - Intent intent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER); - intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_DEFAULT, false); - intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_SILENT, false); - intent.putExtra(RingtoneManager.EXTRA_RINGTONE_INCLUDE_DRM, false); - intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TITLE, - activity.getString(R.string.select_audio)); - activity.startActivityForResult(intent, requestCode); - } - - public static void recordSound(Activity activity, int requestCode, long sizeLimit) { - Intent intent = new Intent(Intent.ACTION_GET_CONTENT); - intent.setType(ContentType.AUDIO_AMR); - intent.setClassName("com.android.soundrecorder", - "com.android.soundrecorder.SoundRecorder"); - intent.putExtra(MediaStore.Audio.Media.EXTRA_MAX_BYTES, sizeLimit); - activity.startActivityForResult(intent, requestCode); - } - - public static void recordVideo(Activity activity, int requestCode, long sizeLimit) { - // The video recorder can sometimes return a file that's larger than the max we - // say we can handle. Try to handle that overshoot by specifying an 85% limit. - sizeLimit *= .85F; - - int durationLimit = getVideoCaptureDurationLimit(sizeLimit); - - if (Log.isLoggable(LogTag.APP, Log.VERBOSE)) { - log("recordVideo: durationLimit: " + durationLimit + - " sizeLimit: " + sizeLimit); - } - - Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE); - intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 0); - intent.putExtra("android.intent.extra.sizeLimit", sizeLimit); - intent.putExtra("android.intent.extra.durationLimit", durationLimit); - intent.putExtra(MediaStore.EXTRA_OUTPUT, TempFileProvider.SCRAP_CONTENT_URI); - activity.startActivityForResult(intent, requestCode); - } - - public static void capturePicture(Activity activity, int requestCode) { - Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); - intent.putExtra(MediaStore.EXTRA_OUTPUT, TempFileProvider.SCRAP_CONTENT_URI); - activity.startActivityForResult(intent, requestCode); - } - - // Public for until tests - public static int getVideoCaptureDurationLimit(long bytesAvailable) { - CamcorderProfile camcorder = CamcorderProfile.get(CamcorderProfile.QUALITY_LOW); - if (camcorder == null) { - return 0; - } - bytesAvailable *= 8; // convert to bits - long seconds = bytesAvailable / (camcorder.audioBitRate + camcorder.videoBitRate); - - // Find the best match for one of the fixed durations - for (int i = sVideoDuration.length - 1; i >= 0; i--) { - if (seconds >= sVideoDuration[i]) { - return sVideoDuration[i]; - } - } - return 0; - } - - public static void selectVideo(Context context, int requestCode) { - selectMediaByType(context, requestCode, ContentType.VIDEO_UNSPECIFIED, true); - } - - public static void selectImage(Context context, int requestCode) { - selectMediaByType(context, requestCode, ContentType.IMAGE_UNSPECIFIED, false); - } - - private static void selectMediaByType( - Context context, int requestCode, String contentType, boolean localFilesOnly) { - if (context instanceof Activity) { - - Intent innerIntent = new Intent(Intent.ACTION_GET_CONTENT); - - innerIntent.setType(contentType); - if (localFilesOnly) { - innerIntent.putExtra(Intent.EXTRA_LOCAL_ONLY, true); - } - - Intent wrapperIntent = Intent.createChooser(innerIntent, null); - - ((Activity) context).startActivityForResult(wrapperIntent, requestCode); - } - } - - public static void viewSimpleSlideshow(Context context, SlideshowModel slideshow) { - if (!slideshow.isSimple()) { - throw new IllegalArgumentException( - "viewSimpleSlideshow() called on a non-simple slideshow"); - } - SlideModel slide = slideshow.get(0); - MediaModel mm = null; - if (slide.hasImage()) { - mm = slide.getImage(); - } else if (slide.hasVideo()) { - mm = slide.getVideo(); - } - - if (mm == null) { - return; - } - - Intent intent = new Intent(Intent.ACTION_VIEW); - intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); - intent.putExtra("SingleItemOnly", true); // So we don't see "surrounding" images in Gallery - - String contentType; - contentType = mm.getContentType(); - intent.setDataAndType(mm.getUri(), contentType); - context.startActivity(intent); - } - - public static void showErrorDialog(Activity activity, - String title, String message) { - if (activity.isFinishing()) { - return; - } - AlertDialog.Builder builder = new AlertDialog.Builder(activity); - - builder.setIcon(R.drawable.ic_error); - builder.setTitle(title); - builder.setMessage(message); - builder.setPositiveButton(android.R.string.ok, new OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - if (which == DialogInterface.BUTTON_POSITIVE) { - dialog.dismiss(); - } - } - }); - builder.show(); - } - - /** - * The quality parameter which is used to compress JPEG images. - */ - public static final int IMAGE_COMPRESSION_QUALITY = 95; - /** - * The minimum quality parameter which is used to compress JPEG images. - */ - public static final int MINIMUM_IMAGE_COMPRESSION_QUALITY = 50; - - /** - * Message overhead that reduces the maximum image byte size. - * 5000 is a realistic overhead number that allows for user to also include - * a small MIDI file or a couple pages of text along with the picture. - */ - public static final int MESSAGE_OVERHEAD = 5000; - - public static void resizeImageAsync(final Context context, - final Uri imageUri, final Handler handler, - final ResizeImageResultCallback cb, - final boolean append) { - - // Show a progress toast if the resize hasn't finished - // within one second. - // Stash the runnable for showing it away so we can cancel - // it later if the resize completes ahead of the deadline. - final Runnable showProgress = new Runnable() { - @Override - public void run() { - Toast.makeText(context, R.string.compressing, Toast.LENGTH_SHORT).show(); - } - }; - // Schedule it for one second from now. - handler.postDelayed(showProgress, 1000); - - new Thread(new Runnable() { - @Override - public void run() { - final PduPart part; - try { - UriImage image = new UriImage(context, imageUri); - int widthLimit = MmsConfig.getMaxImageWidth(); - int heightLimit = MmsConfig.getMaxImageHeight(); - // In mms_config.xml, the max width has always been declared larger than the max - // height. Swap the width and height limits if necessary so we scale the picture - // as little as possible. - if (image.getHeight() > image.getWidth()) { - int temp = widthLimit; - widthLimit = heightLimit; - heightLimit = temp; - } - - part = image.getResizedImageAsPart( - widthLimit, - heightLimit, - MmsConfig.getMaxMessageSize() - MESSAGE_OVERHEAD); - } finally { - // Cancel pending show of the progress toast if necessary. - handler.removeCallbacks(showProgress); - } - - handler.post(new Runnable() { - @Override - public void run() { - cb.onResizeResult(part, append); - } - }); - } - }, "MessageUtils.resizeImageAsync").start(); - } - - public static void showDiscardDraftConfirmDialog(Context context, - OnClickListener listener) { - new AlertDialog.Builder(context) - .setMessage(R.string.discard_message_reason) - .setPositiveButton(R.string.yes, listener) - .setNegativeButton(R.string.cancel, null) - .show(); - } - - public static String getLocalNumber() { - if (null == sLocalNumber) { - sLocalNumber = QKSMSApp.getApplication().getTelephonyManager().getLine1Number(); - } - return sLocalNumber; - } - - public static boolean isLocalNumber(String number) { - if (number == null) { - return false; - } - - // we don't use Mms.isEmailAddress() because it is too strict for comparing addresses like - // "foo+caf_=6505551212=tmomail.net@gmail.com", which is the 'from' address from a forwarded email - // message from Gmail. We don't want to treat "foo+caf_=6505551212=tmomail.net@gmail.com" and - // "6505551212" to be the same. - return number.indexOf('@') < 0 && PhoneNumberUtils.compare(number, getLocalNumber()); - - } - - public static void handleReadReport(final Context context, - final Collection threadIds, - final int status, - final Runnable callback) { - StringBuilder selectionBuilder = new StringBuilder(Mms.MESSAGE_TYPE + " = " - + PduHeaders.MESSAGE_TYPE_RETRIEVE_CONF - + " AND " + Mms.READ + " = 0" - + " AND " + Mms.READ_REPORT + " = " + PduHeaders.VALUE_YES); - - String[] selectionArgs = null; - if (threadIds != null) { - String threadIdSelection = null; - StringBuilder buf = new StringBuilder(); - selectionArgs = new String[threadIds.size()]; - int i = 0; - - for (long threadId : threadIds) { - if (i > 0) { - buf.append(" OR "); - } - buf.append(Mms.THREAD_ID).append("=?"); - selectionArgs[i++] = Long.toString(threadId); - } - threadIdSelection = buf.toString(); - - selectionBuilder.append(" AND (" + threadIdSelection + ")"); - } - - final Cursor c = SqliteWrapper.query(context, context.getContentResolver(), - Mms.Inbox.CONTENT_URI, new String[]{Mms._ID, Mms.MESSAGE_ID}, - selectionBuilder.toString(), selectionArgs, null); - - if (c == null) { - return; - } - - final Map map = new HashMap<>(); - try { - if (c.getCount() == 0) { - if (callback != null) { - callback.run(); - } - return; - } - - while (c.moveToNext()) { - Uri uri = ContentUris.withAppendedId(Mms.CONTENT_URI, c.getLong(0)); - map.put(c.getString(1), AddressUtils.getFrom(context, uri)); - } - } finally { - c.close(); - } - - OnClickListener positiveListener = new OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - for (final Map.Entry entry : map.entrySet()) { - MmsMessageSender.sendReadRec(context, entry.getValue(), - entry.getKey(), status); - } - - if (callback != null) { - callback.run(); - } - dialog.dismiss(); - } - }; - - OnClickListener negativeListener = new OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - if (callback != null) { - callback.run(); - } - dialog.dismiss(); - } - }; - - OnCancelListener cancelListener = new OnCancelListener() { - @Override - public void onCancel(DialogInterface dialog) { - if (callback != null) { - callback.run(); - } - dialog.dismiss(); - } - }; - - confirmReadReportDialog(context, positiveListener, - negativeListener, - cancelListener); - } - - private static void confirmReadReportDialog(Context context, - OnClickListener positiveListener, OnClickListener negativeListener, - OnCancelListener cancelListener) { - AlertDialog.Builder builder = new AlertDialog.Builder(context); - builder.setCancelable(true); - builder.setTitle(R.string.confirm); - builder.setMessage(R.string.message_send_read_report); - builder.setPositiveButton(R.string.yes, positiveListener); - builder.setNegativeButton(R.string.cancel, negativeListener); - builder.setOnCancelListener(cancelListener); - builder.show(); - } - - public static String extractEncStrFromCursor(Cursor cursor, - int columnRawBytes, int columnCharset) { - String rawBytes = cursor.getString(columnRawBytes); - int charset = cursor.getInt(columnCharset); - - if (TextUtils.isEmpty(rawBytes)) { - return ""; - } else if (charset == CharacterSets.ANY_CHARSET) { - return rawBytes; - } else { - return new EncodedStringValue(charset, PduPersister.getBytes(rawBytes)).getString(); - } - } - - private static String extractEncStr(Context context, EncodedStringValue value) { - if (value != null) { - return value.getString(); - } else { - return ""; - } - } - - public static ArrayList extractUris(URLSpan[] spans) { - int size = spans.length; - ArrayList accumulator = new ArrayList<>(); - - for (int i = 0; i < size; i++) { - accumulator.add(spans[i].getURL()); - } - return accumulator; - } - - /** - * Play/view the message attachments. - * TOOD: We need to save the draft before launching another activity to view the attachments. - * This is hacky though since we will do saveDraft twice and slow down the UI. - * We should pass the slideshow in intent extra to the view activity instead of - * asking it to read attachments from database. - * - * @param activity - * @param msgUri the MMS message URI in database - * @param slideshow the slideshow to save - * @param persister the PDU persister for updating the database - * @param sendReq the SendReq for updating the database - */ - public static void viewMmsMessageAttachment(Activity activity, Uri msgUri, - SlideshowModel slideshow, AsyncDialog asyncDialog) { - viewMmsMessageAttachment(activity, msgUri, slideshow, 0, asyncDialog); - } - - public static void viewMmsMessageAttachment(final Activity activity, final Uri msgUri, - final SlideshowModel slideshow, final int requestCode, AsyncDialog asyncDialog) { - boolean isSimple = (slideshow != null) && slideshow.isSimple(); - if (isSimple) { - // In attachment-editor mode, we only ever have one slide. - MessageUtils.viewSimpleSlideshow(activity, slideshow); - } else { - // The user wants to view the slideshow. We have to persist the slideshow parts - // in a background task. If the task takes longer than a half second, a progress dialog - // is displayed. Once the PDU persisting is done, another runnable on the UI thread get - // executed to start the SlideshowActivity. - asyncDialog.runAsync(new Runnable() { - @Override - public void run() { - // If a slideshow was provided, save it to disk first. - if (slideshow != null) { - PduPersister persister = PduPersister.getPduPersister(activity); - try { - PduBody pb = slideshow.toPduBody(); - persister.updateParts(msgUri, pb, null); - slideshow.sync(pb); - } catch (MmsException e) { - Log.e(TAG, "Unable to save message for preview"); - return; - } - } - } - }, new Runnable() { - @Override - public void run() { - // Once the above background thread is complete, this runnable is run - // on the UI thread to launch the slideshow activity. - launchSlideshowActivity(activity, msgUri, requestCode); - } - }, R.string.building_slideshow_title); - } - } - - public static void launchSlideshowActivity(Context context, Uri msgUri, int requestCode) { - // Launch the slideshow activity to play/view. - Intent intent = new Intent(context, SlideshowActivity.class); - intent.setData(msgUri); - intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); - if (requestCode > 0 && context instanceof Activity) { - ((Activity) context).startActivityForResult(intent, requestCode); - } else { - context.startActivity(intent); - } - - } - - /** - * Debugging - */ - public static void writeHprofDataToFile() { - String filename = Environment.getExternalStorageDirectory() + "/mms_oom_hprof_data"; - try { - android.os.Debug.dumpHprofData(filename); - Log.i(TAG, "##### written hprof data to " + filename); - } catch (IOException ex) { - Log.e(TAG, "writeHprofDataToFile: caught " + ex); - } - } - - // An alias (or commonly called "nickname") is: - // Nickname must begin with a letter. - // Only letters a-z, numbers 0-9, or . are allowed in Nickname field. - public static boolean isAlias(String string) { - if (!MmsConfig.isAliasEnabled()) { - return false; - } - - int len = string == null ? 0 : string.length(); - - if (len < MmsConfig.getAliasMinChars() || len > MmsConfig.getAliasMaxChars()) { - return false; - } - - if (!Character.isLetter(string.charAt(0))) { // Nickname begins with a letter - return false; - } - for (int i = 1; i < len; i++) { - char c = string.charAt(i); - if (!(Character.isLetterOrDigit(c) || c == '.')) { - return false; - } - } - - return true; - } - - /** - * Given a phone number, return the string without syntactic sugar, meaning parens, - * spaces, slashes, dots, dashes, etc. If the input string contains non-numeric - * non-punctuation characters, return null. - */ - private static String parsePhoneNumberForMms(String address) { - StringBuilder builder = new StringBuilder(); - int len = address.length(); - - for (int i = 0; i < len; i++) { - char c = address.charAt(i); - - // accept the first '+' in the address - if (c == '+' && builder.length() == 0) { - builder.append(c); - continue; - } - - if (Character.isDigit(c)) { - builder.append(c); - continue; - } - - if (numericSugarMap.get(c) == null) { - return null; - } - } - return builder.toString(); - } - - /** - * Returns true if the address passed in is a valid MMS address. - */ - public static boolean isValidMmsAddress(String address) { - String retVal = parseMmsAddress(address); - return (retVal != null); - } - - /** - * parse the input address to be a valid MMS address. - * - if the address is an email address, leave it as is. - * - if the address can be parsed into a valid MMS phone number, return the parsed number. - * - if the address is a compliant alias address, leave it as is. - */ - public static String parseMmsAddress(String address) { - // if it's a valid Email address, use that. - if (SmsHelper.isEmailAddress(address)) { - return address; - } - - // if we are able to parse the address to a MMS compliant phone number, take that. - String retVal = parsePhoneNumberForMms(address); - if (retVal != null && retVal.length() != 0) { - return retVal; - } - - // if it's an alias compliant address, use that. - if (isAlias(address)) { - return address; - } - - // it's not a valid MMS address, return null - return null; - } - - private static void log(String msg) { - Log.d(TAG, "[MsgUtils] " + msg); - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/common/utils/PackageUtils.java b/QKSMS/src/main/java/com/moez/QKSMS/common/utils/PackageUtils.java deleted file mode 100644 index be77740e1..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/common/utils/PackageUtils.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.moez.QKSMS.common.utils; - -import android.content.Context; -import android.content.pm.PackageManager; - -public class PackageUtils { - - public static boolean isAppInstalled(Context context, String packageName) { - try { - context.getPackageManager().getPackageInfo(packageName, PackageManager.GET_ACTIVITIES); - return true; - } catch (PackageManager.NameNotFoundException e) { - return false; - } - } -} diff --git a/QKSMS/src/main/java/com/moez/QKSMS/common/utils/PhoneNumberUtils.java b/QKSMS/src/main/java/com/moez/QKSMS/common/utils/PhoneNumberUtils.java deleted file mode 100644 index b47dbf815..000000000 --- a/QKSMS/src/main/java/com/moez/QKSMS/common/utils/PhoneNumberUtils.java +++ /dev/null @@ -1,468 +0,0 @@ -package com.moez.QKSMS.common.utils; - -import android.annotation.SuppressLint; -import android.text.TextUtils; - -import com.google.i18n.phonenumbers.NumberParseException; -import com.google.i18n.phonenumbers.PhoneNumberUtil; -import com.google.i18n.phonenumbers.Phonenumber; - -public class PhoneNumberUtils extends android.telephony.PhoneNumberUtils { - - // Three and four digit phone numbers for either special services, - // or 3-6 digit addresses from the network (eg carrier-originated SMS messages) should - // not match. - // - // This constant used to be 5, but SMS short codes has increased in length and - // can be easily 6 digits now days. Most countries have SMS short code length between - // 3 to 6 digits. The exceptions are - // - // Australia: Short codes are six or eight digits in length, starting with the prefix "19" - // followed by an additional four or six digits and two. - // Czech Republic: Codes are seven digits in length for MO and five (not billed) or - // eight (billed) for MT direction - // - // see http://en.wikipedia.org/wiki/Short_code#Regional_differences for reference - // - // However, in order to loose match 650-555-1212 and 555-1212, we need to set the min match - // to 7. - static final int MIN_MATCH = 7; - - /** - * Format the phone number only if the given number hasn't been formatted. - *

9AxHZ~IbT3h=$85=u+hltSGXC~N5kVn{GK7RUy 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 }9naMW3e6&}Zp3`W)R(pQk(M3v{RU3Vo5jL|>-6 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 H=d=F@iuu`M diff --git a/QKSMS/src/main/assets/fonts/Roboto-Regular.ttf b/QKSMS/src/main/assets/fonts/Roboto-Regular.ttf deleted file mode 100644 index 0e58508a64bf413a58c24bf60a0e8a90d663f304..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 126072 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 G5dQ-=cGtK7 diff --git a/QKSMS/src/main/assets/fonts/Roboto-Thin.ttf b/QKSMS/src/main/assets/fonts/Roboto-Thin.ttf deleted file mode 100644 index 8779333b1a25df32c4397c4ab587fead14c2cde0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 127584 zcmeFacYIVu_dh;!@7>)bKtg&*@0;E>yPLX6Hf_^;CB66FI}k$e2uPDAARtE2fQUW_ z2#AP^h={1bgNnd|$fJmm-Tj@pn+?%NKhNj;dj0>&4>H9eDP@g@V+gH`Mb&0a~EQ0fM2+cfQ*H~KY@pcomjqit$ zMp=DvR}+(r1L3|5%3C)S*O%)!rgS3gJq+zz(A3!4c1EIm7-7+Lgd7+|`U=UYXW!?A zIzhi8O%1q!(CLS|9wh(x;6HyJ7t24_WHeggR1;C;D*VASygCKcq3Jj-{`~_@RZXgU zEM>e&8K9%c2rWV!_D#?4({N5RHRvhaL7a^o0aR(F%IQy0h59wB2W}urnT)Jw!a*=!P`i|4g69Pd1C-)6mD4~3g0DVpkBz?v<$7GG|@WdXB5U1qi)V` zsD=3!wc>QNkSauLsYYZ@XCq5y5XIm@ln2*>@e#C!)u25{X5o#S4Id#^xBNAsDBsvMp>#k`G*m~%+X$v|&Gop!ts6b!kDt^XV< zfHuELbCEwjqI^Q9pxJbSQc2B1FEIWn58Ako(Lu$K_b?hLi<*z5OeyMy^80&p|_+x6vxjZFt@X_0cO) z9nS>$Fy^R)<=-jb=}TxA_bkeX{8eTFih;VaAnoJSBLmW2CJ60k9FPY79qDrRL3y~x zOF>P%VU!2FIY0t%0(esaVv4zd+Hn zH_C;6tfuCoV+hGXrsN>E22sF=@Zob9%mj3AZ_N@ui;;wWfEF>QkOYqRGhy&d zKGaD=-@ReZWuT>;OthA}5p7_Wq18;P@+>zV@i{*tDIm^DjqOMT=@d5~dBA&5fuO#} zS%vbrpCWzceP|1rn`@CRhekHgwkXbObQGRD#fwG9c^T+9H%0jsw+X!mt2z?~;?@hWC=0G+I;P*LX3w7G_Fj8_cy2ABGdtg57(TGO(c?{Gy3%y9+MosJ-nghK16xq?=B3Jet z<`2&ry~W*$Hc!_50Ig(9psnwt%`m>-Kw1W4JQvbFgcO?~T_Nx1VBpIjj1i1C-3)Ck zg8XO5&!W=|AMNKBp#sh{2YQuQ^Iek;{eGy z-ytpLFw$o0Fhcvun2~;S4uBjjhc=N^qFhbKDHnrWg>deo5bibLTRifHx#q@%09MIS z74HZN<<=rTZxg!2U5~af_t8d1AB}K!A}fv&3WIkoW(+{vI0M>Fp+pU1bOJEFkuw9W z;Toe>?oD{_TWA@#2Jm|=s$m|ZH-HcR%nGy<=31D>YiKD&DT|r8sC)vi;{mg4nCU12 zpF$f!U-aV-(R!F8QqmLXbEbw6bOT@#k$vhT6i07F19&A`!Pp{m#tFu>9r!$i_R)7C z{R_^I0{&e=`|t(yA$=CbF?n!(CE(5-xc3dD4SD zq>#w9M8MiQnuiVpUY`WMu7UpS!5h#R;8-K|oAMOni*l)7lw0T}AX}z@F>9cIF!wp2 zi-@iw`hv~3!2D%U3#EkqfKFufnjf0WSqy3IL|y>pKS$eu-}9Ignt&%m$$$YIVB8-~nX z$g3yv9mJ+0cFljy)pKZSK8hU4n3M7N-{w59*@)dl#)sA6WSqcuBlgpub7IF3yM^rw z$Q{Uu2Ac>*5X||z1USTE5W%5|1Q=uh>0Nw5`7cOcPvQ^3ps9&q&(uV)XX<+h#!XFX zyqoea@=g}}2>z)Pi-XEhc=v8dA46L-A&pJJ#q9(e)roB%!ALbus@q6#Qk@81PECX_ zYW$qqhlyhrPf33!@RVRGNgB3L4;hC?$ec?dC#nbRpen#ISLGNd7|U@{C+x3T8vZC((-CYTutSOMsKzz*I|+Y?ol0y= za?J8&3LdIuN{w%gOiw{xi;y^_Uu4z$RqnlH_3Hg5B9e#)0(vKXPKL5&IQv zV%Bbjc>(3b!1o?vN5j~<{kfh0zn}jNo~!u)`MUoJ_kox1gML~J`6nCNP%lSgCU& zcSHu%b7RuhCNgstY$B3MU>#hF7>*O7>94`QR?nLWUC7EItZSx@HJK;scf#{+V58a) zI~hIy!{8T!KQtXZ(NH1{q@h$GO{A%mBQ2x_bQ+olbUK<2bOxHC97ozn8>kM_0Xh@S z1geX4mCukK(gUiG^nn^61E7XLpMrnJ5U4RS0&0ScfzCoE%HNSGng!GhnF2LOW54;kR?!SWChd)Su1}-w#Wvk9kK;#kL-XtAbaIwCeYa^3uqq72AYp@ zly^`8$^}}8W&5S5!C=~LbX7fQJwOis0GynZAA@0+fXCWcGRT2g*s3( z&`#6>vHbAc{G^ORqs#b_Al5;Py^QZxc|8PMx!Ia&a81zHGn zC0Yb@6G(Q4(FXd_w!bQ4+& zbTfJZ=oSQaIogWW1APf?0J;sm2y{EpFVGIO5$H~|3Ft1g8R*Msi}DKEjkW^agI)r< z7i|Oj3fivx9PL9pfbK^-fgV7+fWC@eR$fL2(Qcrxp*=uH(O#ghqgRxlp+jgN(8Fjy z&^OQlpl<@bgvQXTK#!n2;uQqeDQCqr*VoL2oEOLGPkBf&K%H z0X>0^0DTV~Rep?4qPKvaLdSrfMsEXsA01a-L}$=DK+mFgfu2ME0Qv#YkI;E^0_cb6 zJ)jrRNuVF0Q_2hIB03Eeo(B2}Is^1mbXNHxx`fUF{S18o^fEdR^mFu~@;thNE&%-k zeFXF>x(M`3^s({-bPat1^egl!(Cg?D(651>L*Jm!fPRZE1HFMh2YM4-QJzJ&&=)}e ziLL^@jlKl>9lEAGgT6;!0sR482YLs64fIF!jq-hT7kvx#9=ZYaKDr6?U+9+dGUFGD*=oR z1#Fc9rbYmkMgfM(06Sv=Gvfg(69FTW0UJ{R6Vm|;GXVp$0sC?R^YQ@e3IOAZ0NcQ` zL`|b+P&$+mWky+1wv-KJM>$aTlq2OtxlqoOE9FLcQ0|l`|#L19+0j1 zfH{MJt@U^zT8o!}bk?C>+>B_7OKDQ3fGw+WDK5h`xE5F7O0)p4pn|CVxE=T4R@{cy z(B-%Rb>b>qhg&EOY9_^_bSZ60pE95fDLu*reDjDhrYtB+${f&a6QD^WAk9`lm@dGS zZGb%tHx)+l4z!gE2u|WKGXO=m0cyMoa(o74?R%K73ao>5u>ovwGYpXc;Gvkxp^j5$sSl{HsejX$rfE%Dhqj{^(@W{q^mclbevAHqzDQr9 zuP_dbClkpeF(phR)6I-97nv`Zo6N5q%$dp2x5Snqmh&xtw*0r{?^X%c)2t1xEv;>> z9j(2r1=a!9LDmu0ZPtUTC7y}(up@TD-q;_9;dERC z940;8hF^o8KE>m}S<{K0o`IfTg`R?8Hqp~z=;?BL4ZV|oojyjNr$2?BBF2&NVxpL2 zrj%)7dYFaG$IMmc7W0@xada(_rNnZ`a+~EN%U__U$Xegp*xK6K0eb3V?LXPmozT<$ zf9UD#iJt0C>1i4C6hluj^mH70iW#tnK%XMO2t-f;M?ngM6by+(^ZX$}v;ccUf>@c7 zQv9m8gFApjW1ww&6(x!=v|s+Ye7F34`KWxCe5ZV?{6+Z)l$@`G$RGHhxo})Q{&f5| z@JWwBItXbeq%Gi+J`4$>X5;YI?`pntxqa=s8Mhn0n|9mkW)?y>6K^KmjJqlQr`OGZ ze>&atzDeD9g3ygikUDNu->AHi_wC9XDK{Lxo%_w+Z#%wi|F+@V+HVWL4gc2dTj#Id z*I%LaG0g85@QV}pMjCSi68Ode)e+2Ggdu*3U8W=v9A`r+gZu0s@hksNe>jxf#WL~) z?o*Y-5P!n(28w~?2nlMXPC)tu(rs0l=M+4lfAL2_w1%Yr-5<3>RSu*K0XpzN+BFGw zp&^O_>@p^@4s+5B?47xkIVm9!+>bEfNA!CYOtzBBYN1$*KY*b(mo zKAi=xuLoES=jle;7hR-<=wn($i)laFALRK{bcqh6o9H0)86Au+(-JxaeNKmhUGN1& z#=__T^d&8&!|4b*l8&OIX&G1sU(qpiEXI%(k%CS`N;;j+pfl+#c3DNy*>nq?gK5lQ4r4~Q(rs8D8(>3hM7Pr& zbQj%;?Xd%6&Db!efHr)<8)xjom@^jG6}vHpj1k>U_b@z01G{4n#*(qZp4f}gWV8U6 ze6RrfVj&jMy>uTljhRmO(*ukXL*m68L zQcfnPhVuqDmRrR=z`esW;Cb*Ocnf*kcn5f&@E-6K8s-{48ciBoHSTDdYqn`F)I6kl zUh@|%11&c#saB>|nO29^Vyz8YyTK(IF>UU≫L}7foL|{oU!;W^iZN&+wYjHDmXT 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