├── .gitignore ├── ADDITIONAL_TERMS ├── CHANGELOG.md ├── COPYING ├── ConnectorMatrix.md ├── FAQ.md ├── PRIVACY.md ├── README.md ├── WebSMS ├── .gitignore ├── build.gradle └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── de │ │ └── ub0r │ │ └── android │ │ └── websms │ │ ├── AboutActivity.java │ │ ├── CaptchaActivity.java │ │ ├── ConnectorLabel.java │ │ ├── DefaultSMSLengthCalculator.java │ │ ├── FillWidthImageView.java │ │ ├── HeaderPreferenceFragment.java │ │ ├── HelpHtmlActivity.java │ │ ├── HelpIntroActivity.java │ │ ├── MobilePhoneAdapter.java │ │ ├── MyTimePickerDialog.java │ │ ├── Preferences11Activity.java │ │ ├── PreferencesActivity.java │ │ ├── PreferencesAppearanceActivity.java │ │ ├── PreferencesBehaviorActivity.java │ │ ├── WebSMS.java │ │ ├── WebSMSReceiver.java │ │ ├── connector │ │ └── sms │ │ │ └── ConnectorSMS.java │ │ └── rules │ │ ├── CheckableLinearLayout.java │ │ ├── ConfirmDialogFragment.java │ │ ├── EditRuleActivity.java │ │ ├── EditRuleFragment.java │ │ ├── IndexedRule.java │ │ ├── PreferencesRulesActivity.java │ │ ├── PseudoConnectorRules.java │ │ ├── Rule.java │ │ ├── RulesEditorActivity.java │ │ └── RulesEditorFragment.java │ ├── res │ ├── drawable-hdpi-v11 │ │ ├── ic_menu_emoticons.png │ │ ├── ic_menu_invite.png │ │ ├── ic_menu_star.png │ │ ├── stat_notify_resending.png │ │ └── stat_notify_sms_failed.png │ ├── drawable-hdpi │ │ ├── app_icon.png │ │ ├── ic_menu_emoticons.png │ │ ├── ic_menu_invite.png │ │ ├── ic_menu_refresh.png │ │ ├── ic_menu_send.png │ │ ├── ic_menu_star.png │ │ ├── stat_notify_resending.png │ │ └── stat_notify_sms_failed.png │ ├── drawable-ldpi │ │ ├── app_icon.png │ │ ├── ic_menu_emoticons.png │ │ ├── ic_menu_invite.png │ │ ├── ic_menu_refresh.png │ │ ├── ic_menu_send.png │ │ ├── ic_menu_star.png │ │ ├── stat_notify_resending.png │ │ └── stat_notify_sms_failed.png │ ├── drawable-mdpi-v11 │ │ ├── ic_menu_emoticons.png │ │ ├── ic_menu_invite.png │ │ ├── ic_menu_star.png │ │ ├── stat_notify_resending.png │ │ └── stat_notify_sms_failed.png │ ├── drawable-mdpi │ │ ├── app_icon.png │ │ ├── ic_menu_emoticons.png │ │ ├── ic_menu_invite.png │ │ ├── ic_menu_refresh.png │ │ ├── ic_menu_send.png │ │ ├── ic_menu_star.png │ │ ├── stat_notify_resending.png │ │ └── stat_notify_sms_failed.png │ ├── drawable-xhdpi │ │ ├── app_icon.png │ │ ├── ic_menu_emoticons.png │ │ ├── ic_menu_invite.png │ │ ├── ic_menu_refresh.png │ │ ├── ic_menu_send.png │ │ ├── stat_notify_resending.png │ │ └── stat_notify_sms_failed.png │ ├── drawable │ │ ├── bg_selectable_row.xml │ │ ├── emo_im_angel.png │ │ ├── emo_im_cool.png │ │ ├── emo_im_crying.png │ │ ├── emo_im_foot_in_mouth.png │ │ ├── emo_im_happy.png │ │ ├── emo_im_kissing.png │ │ ├── emo_im_laughing.png │ │ ├── emo_im_lips_are_sealed.png │ │ ├── emo_im_money_mouth.png │ │ ├── emo_im_sad.png │ │ ├── emo_im_surprised.png │ │ ├── emo_im_tongue_sticking_out.png │ │ ├── emo_im_undecided.png │ │ ├── emo_im_winking.png │ │ ├── emo_im_wtf.png │ │ ├── emo_im_yelling.png │ │ └── ic_menu_star.png │ ├── layout-de │ │ └── help_intro.xml │ ├── layout │ │ ├── about.xml │ │ ├── captcha.xml │ │ ├── edit_rule.xml │ │ ├── emo.xml │ │ ├── help_html.xml │ │ ├── help_intro.xml │ │ ├── main.xml │ │ ├── recipient_dropdown_item.xml │ │ ├── rules_editor.xml │ │ └── rules_editor_row.xml │ ├── menu-w720dp │ │ └── menu.xml │ ├── menu │ │ ├── edit_rule_menu.xml │ │ ├── menu.xml │ │ ├── rules_editor_context_menu.xml │ │ └── rules_editor_menu.xml │ ├── values-cs │ │ ├── help.xml │ │ ├── market.xml │ │ └── strings.xml │ ├── values-de │ │ ├── help.xml │ │ ├── market.xml │ │ └── strings.xml │ ├── values-el-rGR │ │ ├── help.xml │ │ ├── market.xml │ │ └── strings.xml │ ├── values-es │ │ ├── help.xml │ │ ├── market.xml │ │ └── strings.xml │ ├── values-fr │ │ ├── help.xml │ │ ├── market.xml │ │ └── strings.xml │ ├── values-hr │ │ ├── help.xml │ │ ├── market.xml │ │ └── strings.xml │ ├── values-hu │ │ ├── help.xml │ │ ├── market.xml │ │ └── strings.xml │ ├── values-it │ │ ├── help.xml │ │ ├── market.xml │ │ └── strings.xml │ ├── values-pt │ │ ├── help.xml │ │ ├── market.xml │ │ └── strings.xml │ ├── values-ro │ │ ├── help.xml │ │ ├── market.xml │ │ └── strings.xml │ ├── values-ru │ │ ├── help.xml │ │ ├── market.xml │ │ └── strings.xml │ ├── values-sk │ │ ├── help.xml │ │ ├── market.xml │ │ └── strings.xml │ ├── values-sw600dp │ │ └── dimen.xml │ ├── values-sw720dp-land │ │ └── dimen.xml │ ├── values-tr │ │ ├── help.xml │ │ ├── market.xml │ │ └── strings.xml │ ├── values-uk │ │ ├── help.xml │ │ ├── market.xml │ │ └── strings.xml │ ├── values-v11 │ │ └── styles.xml │ ├── values-v19 │ │ └── strings.xml │ ├── values │ │ ├── base.xml │ │ ├── dimen.xml │ │ ├── help.xml │ │ ├── market.xml │ │ ├── strings.xml │ │ └── styles.xml │ ├── xml-de │ │ └── prefs_connectors.xml │ ├── xml-v11 │ │ ├── prefs_about.xml │ │ ├── prefs_common.xml │ │ └── prefs_debug.xml │ └── xml │ │ ├── preference_headers.xml │ │ ├── preference_headers_debug.xml │ │ ├── prefs_about.xml │ │ ├── prefs_appearance.xml │ │ ├── prefs_appearance_behavior.xml │ │ ├── prefs_behavior.xml │ │ ├── prefs_common.xml │ │ ├── prefs_connectors.xml │ │ ├── prefs_debug.xml │ │ └── prefs_rules.xml │ └── translation.stats ├── build.gradle ├── hi-res ├── promo.png ├── promo.xcf ├── promo_large.png ├── promo_large.xcf ├── websms-icon-512x512.png ├── websms-icon-512x512_white.png └── websms-icon.svgz ├── settings.gradle └── uml ├── sequence.dia └── sequence.png /.gitignore: -------------------------------------------------------------------------------- 1 | bin 2 | gen 3 | .ant-targets-build.xml 4 | local.properties 5 | build.properties 6 | doc 7 | *.zip 8 | *.swp 9 | .gradle 10 | /local.properties 11 | /.idea/workspace.xml 12 | .DS_Store 13 | build 14 | *.iml 15 | gradle 16 | gradlew 17 | .idea 18 | wiki 19 | gradle.properties 20 | release.ks 21 | crowdin.yaml 22 | -------------------------------------------------------------------------------- /ADDITIONAL_TERMS: -------------------------------------------------------------------------------- 1 | Additional Terms according to GPL, Section 7 2 | ============================================ 3 | 4 | If you modify this Program, or any covered work, by linking or combining it 5 | with AdMob library (or a modified version of that library), containing parts 6 | covered by the terms of AdMob's license, the licensors of this Program grant 7 | you additional permission to convey the resulting work. 8 | 9 | -------------------------------------------------------------------------------- /FAQ.md: -------------------------------------------------------------------------------- 1 | # Frequently Ask Questions 2 | 3 | ## How do I set up WebSMS? 4 | 5 | 1. Install WebSMS: 6 | * Install WebSMS from market (there is a barcode on the main page). 7 | * Or go to download section and install it from there. 8 | 2. Start WebSMS and open it's preferences via menu. 9 | 3. Set sender and international prefix. 10 | 4. Install Connectors: 11 | * Click the "more connectors" preferences. It will launch the market search. 12 | * Or install Connectors from this website. 13 | 5. Restart WebSMS now! 14 | 6. Go to preferences again. 15 | 7. Above the "more connectors" preference you will find the preferences for all Connectors installed. Click them. 16 | 8. For each Connector, you may set: 17 | * En-/disable the Connector. 18 | * Set username and password. (for some, the username is set to your sender you set above automatically) 19 | * Set a alternative sender, which may differ from the one set in main preferences. (This may set your username for some Connectors as well) 20 | 9. Finally you should set the connector you want to use via menu or button (if not hidden). The chosen Connector is displayed in the text field in big grey letters. 21 | 22 | ## What Connector should I use? 23 | 24 | If you own a account for one of the Connectors, use it. You may use your free sms there. 25 | 26 | If you don't own an account, the answer differs on your location. At the moment most Connectors are working only for german or austrian people. 27 | Fishtext is specialized on international SMS and should work for most people. 28 | 29 | For backup purpose there is a SMS Connector shipped with the main app. 30 | It will send real SMS via your carrier which are billed as normal. 31 | 32 | You should read the [ConnectorMatrix](https://github.com/felixb/websms/blob/master/ConnectorMatrix.md) for more details. 33 | 34 | ## What is the password for sending a SMS? 35 | 36 | It is the password you set on the Connectors website while registration. 37 | 38 | ## What is the website of a Connector? 39 | 40 | Please use google. I am pretty sure, google knows the connectors website. 41 | 42 | ## What is the "prefix"? 43 | 44 | You should enter your international country code here (E.g. +1 for US, +49 for Germany). 45 | See the full list [wikipedia](http://en.wikipedia.org/wiki/Country_calling_code). 46 | 47 | ## I'm living abroad, what prefix should I use? 48 | 49 | Please set the prefix of YOUR telephone number used for sender id and login. 50 | The prefix is just needed to strip it from the international formatted number to login to some webservice using the national formatted number. 51 | 52 | ## How can I send messages directly from the messaging app? 53 | 54 | It is not possible with the stock messaging app. 55 | However, try [SMSdroid](https://play.google.com/store/apps/details?id=de.ub0r.android.smsdroid), which is build for this. 56 | 57 | ## How can I be sure and check, that the SMS is not sent via GSM and is not billed by my provider? 58 | 59 | Just turn of the "SMS" Connector. Any other connector will use a webservice to send the messages. 60 | 61 | ## What have I to put in the field "Default recipient"? 62 | 63 | If you do not want to start WebSMS with a fixed recipient, you should leave it blank. 64 | 65 | ## I've send the sms to the recipient, but the recipient don't receive my sms..why.? 66 | 67 | You should not use a connector sending messages without YOUR sender id. 68 | Some connectors do support sending with and without sender id. 69 | Without sender id might be cheaper. But a direct reply is not possible. 70 | 71 | ## I have issues with/feature requests for any of the apps! 72 | 73 | Please use the [issues](https://github.com/felixb/websms/issues) to report issues or feature requests. -------------------------------------------------------------------------------- /PRIVACY.md: -------------------------------------------------------------------------------- 1 | # WebSMS Privacy Policy 2 | 3 | This Privacy Policy was last modified on 12.09.2015. 4 | 5 | ub0r.de / Felix Bechstein ("us", "we", or "our") operates the WebSMS App (the "App"). 6 | This page informs you of our policies regarding the collection, 7 | use and disclosure of Personal Information we receive from users of the App. 8 | 9 | We use your Personal Information only for providing and improving the App. 10 | By using the App, you agree to the collection and use of information in accordance with this policy. 11 | 12 | ## Information Collection And Use 13 | 14 | While using our App, we may ask you to provide us with certain personally identifiable 15 | information that can be used to contact or identify you. 16 | Personally identifiable information may include, but is not limited to your name ("Personal Information"). 17 | 18 | ## Cookies 19 | 20 | Cookies are files with small amount of data, which may include an anonymous unique identifier. 21 | Cookies are sent to your browser from a web site or Ads included in the App and stored on your device's hard drive. 22 | Like many Apps, we use "cookies" to collect information. You can instruct your device to refuse 23 | all cookies or to indicate when a cookie is being sent. However, if you do not accept cookies, you 24 | may not be able to use some portions of our App. 25 | 26 | ## Security 27 | The security of your Personal Information is important to us, but remember that no method of 28 | transmission over the Internet, or method of electronic storage, is 100% secure. While we strive to 29 | use commercially acceptable means to protect your Personal Information, we cannot guarantee 30 | its absolute security. 31 | 32 | ## Changes To This Privacy Policy 33 | ub0r.de / Felix Bechstein may update this Privacy Policy from time to time. We will notify 34 | you of any changes by posting the new Privacy Policy on our web site. You are advised to review this 35 | Privacy Policy periodically for any changes. 36 | 37 | ## Contact Us 38 | 39 | If you have any questions about this Privacy Policy, please contact us. 40 | Create your own Privacy Policy 41 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Discontinued 2 | 3 | This app is discontinued and removed from all distribution channels. 4 | 5 | # WebSMS 6 | 7 | WebSMS is a simple app allowing you to send text messages to anybody via different kinds of web services. 8 | The recipient does not need any app. The text messages is sent to the recipient as default text message / SMS. 9 | The integration with these web services is done by so called WebSMS Connectors. 10 | 11 | ## FAQ 12 | 13 | Check out the [FAQ](https://github.com/felixb/websms/blob/master/FAQ.md). 14 | 15 | ## Translation 16 | 17 | Help to translate the app on [crowdin](https://crowdin.com/project/websms/invite). 18 | 19 | ## Building a connector 20 | 21 | Documentation about creating a connector is hosted within the [websms-api](https://github.com/felixb/websms-api) project. 22 | -------------------------------------------------------------------------------- /WebSMS/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /WebSMS/build.gradle: -------------------------------------------------------------------------------- 1 | buildscript { 2 | repositories { 3 | mavenCentral() 4 | } 5 | dependencies { 6 | classpath 'com.android.tools.build:gradle:1.5.0' 7 | } 8 | } 9 | apply plugin: 'com.android.application' 10 | 11 | repositories { 12 | maven { 13 | url 'https://raw.githubusercontent.com/felixb/mvn-repo/master/' 14 | } 15 | mavenCentral() 16 | } 17 | 18 | android { 19 | compileSdkVersion 23 20 | buildToolsVersion '23.0.2' 21 | 22 | defaultConfig { 23 | minSdkVersion 9 24 | targetSdkVersion 23 25 | versionName '4.9.5' 26 | versionCode 9495000 27 | buildConfigField 'boolean', 'DEBUG_LOG', 'true' 28 | } 29 | 30 | signingConfigs { 31 | if (project.hasProperty("releaseKeystorePassword")) { 32 | release { 33 | storeFile file("release.ks") 34 | storePassword releaseKeystorePassword 35 | keyAlias "jarsign" 36 | keyPassword releaseKeyPassword 37 | } 38 | } 39 | 40 | buildTypes { 41 | debug { 42 | versionNameSuffix " debug" 43 | } 44 | 45 | if (project.hasProperty("releaseKeystorePassword")) { 46 | release { 47 | signingConfig signingConfigs.release 48 | buildConfigField 'boolean', 'DEBUG_LOG', 'false' 49 | } 50 | } 51 | } 52 | } 53 | 54 | lintOptions { 55 | abortOnError false 56 | } 57 | } 58 | 59 | dependencies { 60 | compile 'com.android.support:support-v4:23.1.1' 61 | compile 'com.android.support:appcompat-v7:23.1.1' 62 | compile 'com.google.android.gms:play-services-ads:8.4.0' 63 | compile 'de.ub0r.android.lib:lib:1.1.1' 64 | compile 'de.ub0r.android.logg0r:logg0r:2.0.0' 65 | compile 'de.ub0r.android.websms.connector.common:WebSMSAPI:1.1' 66 | compile 'de.ub0r.android.eucookieconsent:library:0.2.0@aar' 67 | } 68 | -------------------------------------------------------------------------------- /WebSMS/src/main/java/de/ub0r/android/websms/AboutActivity.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2009-2012 Felix Bechstein 3 | * 4 | * This file is part of WebSMS. 5 | * 6 | * This program is free software; you can redistribute it and/or modify it under 7 | * the terms of the GNU General Public License as published by the Free Software 8 | * Foundation; either version 3 of the License, or (at your option) any later 9 | * version. 10 | * 11 | * This program is distributed in the hope that it will be useful, but WITHOUT 12 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 13 | * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more 14 | * details. 15 | * 16 | * You should have received a copy of the GNU General Public License along with 17 | * this program; If not, see . 18 | */ 19 | package de.ub0r.android.websms; 20 | 21 | import android.content.Intent; 22 | import android.os.Bundle; 23 | import android.support.v7.app.AppCompatActivity; 24 | import android.view.MenuItem; 25 | import android.widget.TextView; 26 | 27 | import de.ub0r.android.websms.connector.common.ConnectorSpec; 28 | 29 | /** 30 | * Display About Activity. 31 | * 32 | * @author flx 33 | */ 34 | public final class AboutActivity extends AppCompatActivity { 35 | 36 | @Override 37 | public void onCreate(final Bundle savedInstanceState) { 38 | super.onCreate(savedInstanceState); 39 | this.setContentView(R.layout.about); 40 | this.setTitle(this.getString(R.string.about_) + " " 41 | + this.getString(R.string.app_name)); 42 | getSupportActionBar().setSubtitle("v" + BuildConfig.VERSION_NAME); 43 | this.getSupportActionBar().setHomeButtonEnabled(true); 44 | StringBuffer authors = new StringBuffer(); 45 | final ConnectorSpec[] css = WebSMS.getConnectors( 46 | ConnectorSpec.CAPABILITIES_NONE, ConnectorSpec.STATUS_INACTIVE, 47 | true /*isIncludePseudoConnectors*/); 48 | String a; 49 | for (ConnectorSpec cs : css) { 50 | a = cs.getAuthor(); 51 | if (a != null && a.length() > 0) { 52 | authors.append(cs.getName()); 53 | authors.append(":\t"); 54 | authors.append(a); 55 | authors.append("\n"); 56 | } 57 | } 58 | a = null; 59 | ((TextView) this.findViewById(R.id.author_connectors)).setText(authors 60 | .toString().trim()); 61 | } 62 | 63 | @Override 64 | public boolean onOptionsItemSelected(final MenuItem item) { 65 | switch (item.getItemId()) { 66 | case android.R.id.home: 67 | // app icon in Action Bar clicked; go home 68 | Intent intent = new Intent(this, WebSMS.class); 69 | intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 70 | this.startActivity(intent); 71 | return true; 72 | default: 73 | return super.onOptionsItemSelected(item); 74 | } 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /WebSMS/src/main/java/de/ub0r/android/websms/CaptchaActivity.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2009-2012 Felix Bechstein 3 | * 4 | * This file is part of WebSMS. 5 | * 6 | * This program is free software; you can redistribute it and/or modify it under 7 | * the terms of the GNU General Public License as published by the Free Software 8 | * Foundation; either version 3 of the License, or (at your option) any later 9 | * version. 10 | * 11 | * This program is distributed in the hope that it will be useful, but WITHOUT 12 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 13 | * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more 14 | * details. 15 | * 16 | * You should have received a copy of the GNU General Public License along with 17 | * this program; If not, see . 18 | */ 19 | package de.ub0r.android.websms; 20 | 21 | import android.content.Intent; 22 | import android.graphics.Bitmap; 23 | import android.os.Bundle; 24 | import android.os.Parcelable; 25 | import android.support.v7.app.AppCompatActivity; 26 | import android.view.MenuItem; 27 | import android.view.View; 28 | import android.view.View.OnClickListener; 29 | import android.widget.EditText; 30 | import android.widget.ImageView; 31 | import android.widget.TextView; 32 | 33 | import de.ub0r.android.websms.connector.common.Connector; 34 | import de.ub0r.android.websms.connector.common.ConnectorSpec; 35 | import de.ub0r.android.websms.connector.common.Log; 36 | 37 | /** 38 | * @author flx 39 | */ 40 | public final class CaptchaActivity extends AppCompatActivity implements 41 | OnClickListener { 42 | /** Tag for output. */ 43 | private static final String TAG = "cpt"; 44 | 45 | /** Connector which sent the request. */ 46 | private ConnectorSpec connector = null; 47 | 48 | @Override 49 | public void onCreate(final Bundle savedInstanceState) { 50 | this.setTheme(PreferencesActivity.getTheme(this)); 51 | super.onCreate(savedInstanceState); 52 | Log.d(TAG, "onCreate();"); 53 | final Bundle extras = this.getIntent().getExtras(); 54 | if (extras == null) { 55 | this.finish(); 56 | return; 57 | } 58 | this.connector = new ConnectorSpec(this.getIntent()); 59 | this.setContentView(R.layout.captcha); 60 | this.setTitle(this.connector.getName() + " - " 61 | + this.getString(R.string.captcha_)); 62 | this.getSupportActionBar().setHomeButtonEnabled(true); 63 | 64 | final Parcelable p = extras.getParcelable(Connector.EXTRA_CAPTCHA_DRAWABLE); 65 | if (p != null && p instanceof Bitmap) { 66 | final ImageView ivCaptcha = (ImageView) this.findViewById(R.id.captcha); 67 | final ImageView ivCaptchaFull = (ImageView) this.findViewById(R.id.captcha_full); 68 | ivCaptcha.setImageBitmap((Bitmap) p); 69 | 70 | ivCaptcha.setOnClickListener(new OnClickListener() { 71 | public void onClick(View v) { 72 | ivCaptcha.setVisibility(View.GONE); 73 | ivCaptchaFull.setVisibility(View.VISIBLE); 74 | 75 | if (ivCaptchaFull.getDrawable() == null) { 76 | ivCaptchaFull.setImageBitmap((Bitmap) p); 77 | } 78 | } 79 | }); 80 | ivCaptchaFull.setOnClickListener(new OnClickListener() { 81 | public void onClick(View v) { 82 | ivCaptcha.setVisibility(View.VISIBLE); 83 | ivCaptchaFull.setVisibility(View.GONE); 84 | } 85 | }); 86 | 87 | } else { 88 | this.finish(); 89 | return; 90 | } 91 | 92 | final String t = extras.getString(Connector.EXTRA_CAPTCHA_MESSAGE); 93 | if (t != null) { 94 | ((TextView) this.findViewById(R.id.text)).setText(t); 95 | } 96 | this.findViewById(R.id.ok).setOnClickListener(this); 97 | this.findViewById(R.id.cancel).setOnClickListener(this); 98 | } 99 | 100 | public void onClick(final View v) { 101 | switch (v.getId()) { 102 | case R.id.cancel: 103 | ((EditText) this.findViewById(R.id.solved)).setText(""); 104 | default: 105 | break; 106 | } 107 | this.finish(); 108 | } 109 | 110 | @Override 111 | protected void onDestroy() { 112 | super.onDestroy(); 113 | final Intent intent = new Intent(this.connector.getPackage() 114 | + Connector.ACTION_CAPTCHA_SOLVED); 115 | final String s = ((EditText) this.findViewById(R.id.solved)).getText() 116 | .toString(); 117 | if (s.length() > 0) { 118 | Log.d(TAG, "solved: " + s); 119 | intent.putExtra(Connector.EXTRA_CAPTCHA_SOLVED, s); 120 | } 121 | intent.setFlags(intent.getFlags() 122 | | Intent.FLAG_INCLUDE_STOPPED_PACKAGES); 123 | Log.d(TAG, "send broadcast: " + intent.getAction()); 124 | this.sendBroadcast(intent); 125 | } 126 | 127 | @Override 128 | public boolean onOptionsItemSelected(final MenuItem item) { 129 | switch (item.getItemId()) { 130 | case android.R.id.home: 131 | // app icon in Action Bar clicked; go home 132 | Intent intent = new Intent(this, WebSMS.class); 133 | intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 134 | this.startActivity(intent); 135 | return true; 136 | default: 137 | return super.onOptionsItemSelected(item); 138 | } 139 | } 140 | } 141 | -------------------------------------------------------------------------------- /WebSMS/src/main/java/de/ub0r/android/websms/ConnectorLabel.java: -------------------------------------------------------------------------------- 1 | package de.ub0r.android.websms; 2 | 3 | import de.ub0r.android.websms.connector.common.ConnectorSpec; 4 | 5 | /** 6 | * Helper class for building connector selectors. 7 | * (Implements CharSequence so that it can be passed to AlertDialog.Builder.setItems().) 8 | */ 9 | public class ConnectorLabel 10 | implements CharSequence { 11 | 12 | private final String name; 13 | private final ConnectorSpec connector; 14 | private final ConnectorSpec.SubConnectorSpec subConnector; 15 | 16 | 17 | public ConnectorLabel(ConnectorSpec connector, ConnectorSpec.SubConnectorSpec subConnector, 18 | boolean isSingleSubConnector) { 19 | this.connector = connector; 20 | this.subConnector = subConnector; 21 | 22 | if (isSingleSubConnector) { 23 | this.name = connector.getName(); 24 | } else { 25 | this.name = connector.getName() + " - " + subConnector.getName(); 26 | } 27 | } 28 | 29 | 30 | public String getName() { 31 | return name; 32 | } 33 | 34 | public ConnectorSpec getConnector() { 35 | return connector; 36 | } 37 | 38 | public ConnectorSpec.SubConnectorSpec getSubConnector() { 39 | return subConnector; 40 | } 41 | 42 | 43 | @Override 44 | public int length() { 45 | return name.length(); 46 | } 47 | 48 | @Override 49 | public char charAt(int index) { 50 | return name.charAt(index); 51 | } 52 | 53 | @Override 54 | public CharSequence subSequence(int start, int end) { 55 | return name.subSequence(start, end); 56 | } 57 | 58 | @Override 59 | public String toString() { 60 | return name; 61 | } 62 | 63 | 64 | @Override 65 | public boolean equals(Object o) { 66 | if (this == o) { 67 | return true; 68 | } else if (!(o instanceof ConnectorLabel)) { 69 | return false; 70 | } 71 | ConnectorLabel that = (ConnectorLabel) o; 72 | return this.connector.getPackage().equals(that.connector.getPackage()) 73 | && this.subConnector.getID().equals(that.subConnector.getID()); 74 | } 75 | 76 | @Override 77 | public int hashCode() { 78 | int result = this.connector.getPackage().hashCode(); 79 | result = 31 * result + this.subConnector.getID().hashCode(); 80 | return result; 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /WebSMS/src/main/java/de/ub0r/android/websms/DefaultSMSLengthCalculator.java: -------------------------------------------------------------------------------- 1 | package de.ub0r.android.websms; 2 | 3 | import android.os.Parcel; 4 | import android.os.Parcelable; 5 | import android.telephony.SmsMessage; 6 | 7 | import de.ub0r.android.websms.connector.common.Log; 8 | import de.ub0r.android.websms.connector.common.SMSLengthCalculator; 9 | 10 | /** 11 | * A SMSLengthCalculator that just delegates to SmsMessage.calculateLength(). 12 | * 13 | * @author Fintan Fairmichael / Felix Bechstein 14 | */ 15 | public class DefaultSMSLengthCalculator implements SMSLengthCalculator { 16 | /** Serial Version UID. */ 17 | private static final long serialVersionUID = -1021281060248896432L; 18 | 19 | private static final String TAG = "DefaultSMSLengthCalculator"; 20 | 21 | @Override 22 | public void writeToParcel(final Parcel dest, final int flags) { 23 | } 24 | 25 | @Override 26 | public int describeContents() { 27 | return 0; 28 | } 29 | 30 | @Override 31 | public int[] calculateLength(final String messageBody, 32 | final boolean use7bitOnly) { 33 | try { 34 | return SmsMessage.calculateLength(messageBody, use7bitOnly); 35 | } catch (RuntimeException e) { 36 | Log.e(TAG, "unable to calculate message length"); 37 | int l = messageBody.length(); 38 | return new int[]{l % 160, l, 160 - l/160, 0}; 39 | } 40 | } 41 | 42 | /** Parcel stuff. */ 43 | public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { 44 | public DefaultSMSLengthCalculator createFromParcel(final Parcel in) { 45 | return new DefaultSMSLengthCalculator(); 46 | } 47 | 48 | public DefaultSMSLengthCalculator[] newArray(final int size) { 49 | return new DefaultSMSLengthCalculator[size]; 50 | } 51 | }; 52 | } 53 | -------------------------------------------------------------------------------- /WebSMS/src/main/java/de/ub0r/android/websms/FillWidthImageView.java: -------------------------------------------------------------------------------- 1 | package de.ub0r.android.websms; 2 | 3 | import android.content.Context; 4 | import android.graphics.drawable.Drawable; 5 | import android.util.AttributeSet; 6 | import android.widget.ImageView; 7 | 8 | /** 9 | * ImageView that tries to take the whole width of the screen. 10 | */ 11 | public class FillWidthImageView extends ImageView { 12 | 13 | public FillWidthImageView(Context context) { 14 | super(context); 15 | } 16 | 17 | public FillWidthImageView(Context context, AttributeSet attrs) { 18 | super(context, attrs); 19 | } 20 | 21 | public FillWidthImageView(Context context, AttributeSet attrs, int defStyle) { 22 | super(context, attrs, defStyle); 23 | } 24 | 25 | @Override 26 | protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 27 | Drawable image = getDrawable(); 28 | if (image != null) { 29 | int width = MeasureSpec.getSize(widthMeasureSpec); 30 | int height = width * image.getIntrinsicHeight() / image.getIntrinsicWidth(); 31 | setMeasuredDimension(width, height); 32 | } 33 | else { 34 | super.onMeasure(widthMeasureSpec, heightMeasureSpec); 35 | } 36 | } 37 | } -------------------------------------------------------------------------------- /WebSMS/src/main/java/de/ub0r/android/websms/HeaderPreferenceFragment.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2010-2011 Felix Bechstein 3 | * 4 | * This file is part of WebSMS. 5 | * 6 | * This program is free software; you can redistribute it and/or modify it under 7 | * the terms of the GNU General Public License as published by the Free Software 8 | * Foundation; either version 3 of the License, or (at your option) any later 9 | * version. 10 | * 11 | * This program is distributed in the hope that it will be useful, but WITHOUT 12 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 13 | * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more 14 | * details. 15 | * 16 | * You should have received a copy of the GNU General Public License along with 17 | * this program; If not, see . 18 | */ 19 | package de.ub0r.android.websms; 20 | 21 | import android.annotation.TargetApi; 22 | import android.app.Activity; 23 | import android.content.Context; 24 | import android.os.Build; 25 | import android.os.Bundle; 26 | import android.preference.PreferenceFragment; 27 | import de.ub0r.android.lib.IPreferenceContainer; 28 | 29 | /** 30 | * {@link PreferenceFragment} for API>=11. 31 | * 32 | * @author flx 33 | */ 34 | @TargetApi(Build.VERSION_CODES.HONEYCOMB) 35 | public final class HeaderPreferenceFragment extends PreferenceFragment 36 | implements IPreferenceContainer { 37 | @Override 38 | public void onCreate(final Bundle savedInstanceState) { 39 | super.onCreate(savedInstanceState); 40 | 41 | final Activity a = this.getActivity(); 42 | int res = a.getResources().getIdentifier( 43 | this.getArguments().getString("resource"), "xml", 44 | a.getPackageName()); 45 | this.addPreferencesFromResource(res); 46 | 47 | PreferencesActivity.registerPreferenceChecker(this); 48 | PreferencesActivity.addConnectorPreferences(this); 49 | PreferencesActivity.registerOnPreferenceChangeListener(this); 50 | } 51 | 52 | @Override 53 | public Context getContext() { 54 | return this.getActivity(); 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /WebSMS/src/main/java/de/ub0r/android/websms/HelpHtmlActivity.java: -------------------------------------------------------------------------------- 1 | package de.ub0r.android.websms; 2 | 3 | import android.content.Context; 4 | import android.content.Intent; 5 | import android.os.Bundle; 6 | import android.support.v7.app.AppCompatActivity; 7 | import android.webkit.WebView; 8 | 9 | /** 10 | * Activity for displaying html help pages. 11 | */ 12 | public class HelpHtmlActivity extends AppCompatActivity { 13 | 14 | private static final String INTENT_TITLE = "title"; 15 | private static final String INTENT_CONTENT = "content"; 16 | 17 | public static Intent createStartIntent(Context appCtx, String title, String content) { 18 | Intent intent = new Intent(appCtx, HelpHtmlActivity.class); 19 | intent.putExtra(INTENT_TITLE, title); 20 | intent.putExtra(INTENT_CONTENT, content); 21 | return intent; 22 | } 23 | 24 | @Override 25 | public void onCreate(final Bundle savedInstanceState) { 26 | super.onCreate(savedInstanceState); 27 | this.setContentView(R.layout.help_html); 28 | this.setTitle(getIntent().getStringExtra(INTENT_TITLE)); 29 | 30 | WebView webView = (WebView) findViewById(R.id.help_content); 31 | webView.loadData(getIntent().getStringExtra(INTENT_CONTENT), 32 | "text/html; charset=utf-8", "utf-8"); 33 | } 34 | 35 | } 36 | -------------------------------------------------------------------------------- /WebSMS/src/main/java/de/ub0r/android/websms/HelpIntroActivity.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2009-2012 Felix Bechstein 3 | * 4 | * This file is part of WebSMS. 5 | * 6 | * This program is free software; you can redistribute it and/or modify it under 7 | * the terms of the GNU General Public License as published by the Free Software 8 | * Foundation; either version 3 of the License, or (at your option) any later 9 | * version. 10 | * 11 | * This program is distributed in the hope that it will be useful, but WITHOUT 12 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 13 | * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more 14 | * details. 15 | * 16 | * You should have received a copy of the GNU General Public License along with 17 | * this program; If not, see . 18 | */ 19 | package de.ub0r.android.websms; 20 | 21 | import android.app.AlertDialog.Builder; 22 | import android.content.DialogInterface; 23 | import android.content.Intent; 24 | import android.content.SharedPreferences; 25 | import android.net.Uri; 26 | import android.os.Bundle; 27 | import android.preference.PreferenceManager; 28 | import android.support.v7.app.AppCompatActivity; 29 | import android.text.TextUtils; 30 | import android.view.MenuItem; 31 | import android.view.View; 32 | import android.view.View.OnClickListener; 33 | 34 | /** 35 | * Activity showing intro. 36 | * 37 | * @author flx 38 | */ 39 | public final class HelpIntroActivity extends AppCompatActivity implements 40 | OnClickListener { 41 | @Override 42 | public void onCreate(final Bundle savedInstanceState) { 43 | super.onCreate(savedInstanceState); 44 | this.setContentView(R.layout.help_intro); 45 | this.setTitle(R.string.help_title); 46 | 47 | this.findViewById(R.id.ok).setOnClickListener(this); 48 | View v = this.findViewById(R.id.connectors); 49 | if (v != null) { 50 | v.setOnClickListener(this); 51 | } 52 | v = this.findViewById(R.id.connectors_de); 53 | if (v != null) { 54 | v.setOnClickListener(this); 55 | } 56 | 57 | final SharedPreferences p = PreferenceManager 58 | .getDefaultSharedPreferences(this); 59 | if (TextUtils.isEmpty(p.getString(WebSMS.PREFS_SENDER, null)) 60 | || TextUtils.isEmpty(p.getString(WebSMS.PREFS_DEFPREFIX, null))) { 61 | this.findViewById(R.id.help_prefs).setVisibility(View.VISIBLE); 62 | } 63 | } 64 | 65 | @Override 66 | public boolean onOptionsItemSelected(final MenuItem item) { 67 | switch (item.getItemId()) { 68 | case android.R.id.home: 69 | this.finish(); 70 | return true; 71 | default: 72 | return super.onOptionsItemSelected(item); 73 | } 74 | } 75 | 76 | @Override 77 | public void onClick(final View v) { 78 | switch (v.getId()) { 79 | case R.id.ok: 80 | this.finish(); 81 | return; 82 | case R.id.connectors: 83 | startActivity(new Intent(Intent.ACTION_VIEW, 84 | Uri.parse("https://play.google.com/store/search?q=websms+connector"))); 85 | return; 86 | case R.id.connectors_de: 87 | Builder b = new Builder(this); 88 | b.setItems(R.array.get_connectors_items, 89 | new DialogInterface.OnClickListener() { 90 | @Override 91 | public void onClick(final DialogInterface dialog, 92 | final int which) { 93 | switch (which) { 94 | case 0: 95 | startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse( 96 | "https://play.google.com/store/apps/details?id=de.ub0r.android.websms.connector.smsflatratenet"))); 97 | break; 98 | case 1: 99 | startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse( 100 | "https://play.google.com/store/search?q=websms+connector"))); 101 | break; 102 | default: 103 | throw new IllegalStateException( 104 | "invalid option selected: " + which); 105 | } 106 | } 107 | }); 108 | b.show(); 109 | return; 110 | default: 111 | return; 112 | } 113 | } 114 | } 115 | -------------------------------------------------------------------------------- /WebSMS/src/main/java/de/ub0r/android/websms/MobilePhoneAdapter.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2010-2012 Felix Bechstein 3 | * 4 | * This file is part of WebSMS. 5 | * 6 | * This program is free software; you can redistribute it and/or modify it under 7 | * the terms of the GNU General Public License as published by the Free Software 8 | * Foundation; either version 3 of the License, or (at your option) any later 9 | * version. 10 | * 11 | * This program is distributed in the hope that it will be useful, but WITHOUT 12 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 13 | * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more 14 | * details. 15 | * 16 | * You should have received a copy of the GNU General Public License along with 17 | * this program; If not, see . 18 | */ 19 | package de.ub0r.android.websms; 20 | 21 | import android.content.ContentResolver; 22 | import android.content.Context; 23 | import android.database.Cursor; 24 | import android.net.Uri; 25 | import android.provider.ContactsContract.CommonDataKinds.Phone; 26 | import android.text.TextUtils; 27 | import android.view.View; 28 | import android.widget.ResourceCursorAdapter; 29 | import android.widget.TextView; 30 | import de.ub0r.android.websms.connector.common.Utils; 31 | 32 | /** 33 | * CursorAdapter getting Name, Phone from DB. This class requires android API5+ 34 | * to work. 35 | * 36 | * @author flx 37 | */ 38 | public class MobilePhoneAdapter extends ResourceCursorAdapter { 39 | /** Preferences: show mobile numbers only. */ 40 | private static boolean prefsMobilesOnly; 41 | 42 | /** Global ContentResolver. */ 43 | private ContentResolver mContentResolver; 44 | 45 | /** Projection for content. */ 46 | private static final String[] PROJECTION = new String[] { Phone._ID, // 0 47 | Phone.DISPLAY_NAME, // 1 48 | Phone.NUMBER, // 2 49 | Phone.TYPE // 3 50 | }; 51 | 52 | /** Index of id/lookup key. */ 53 | public static final int INDEX_ID = 0; 54 | /** Index of name. */ 55 | public static final int INDEX_NAME = 1; 56 | /** Index of number. */ 57 | public static final int INDEX_NUMBER = 2; 58 | /** Index of type. */ 59 | public static final int INDEX_TYPE = 3; 60 | 61 | /** List of number types. */ 62 | private final String[] types; 63 | 64 | /** 65 | * Constructor. 66 | * 67 | * @param context 68 | * context 69 | */ 70 | public MobilePhoneAdapter(final Context context) { 71 | super(context, R.layout.recipient_dropdown_item, null, true); 72 | this.mContentResolver = context.getContentResolver(); 73 | this.types = context.getResources().getStringArray( 74 | android.R.array.phoneTypes); 75 | } 76 | 77 | /** View holder. */ 78 | private static class ViewHolder { 79 | /** {@link TextView}s. */ 80 | TextView tv1, tv2, tv3; 81 | } 82 | 83 | /** 84 | * {@inheritDoc} 85 | */ 86 | @Override 87 | public final void bindView(final View view, final Context context, 88 | final Cursor cursor) { 89 | ViewHolder holder = (ViewHolder) view.getTag(); 90 | if (holder == null) { 91 | holder = new ViewHolder(); 92 | holder.tv1 = (TextView) view.findViewById(R.id.text1); 93 | holder.tv2 = (TextView) view.findViewById(R.id.text2); 94 | holder.tv3 = (TextView) view.findViewById(R.id.text3); 95 | view.setTag(holder); 96 | } 97 | holder.tv1.setText(cursor.getString(INDEX_NAME)); 98 | holder.tv2.setText(cursor.getString(INDEX_NUMBER)); 99 | final int i = cursor.getInt(INDEX_TYPE) - 1; 100 | if (i >= 0 && i < this.types.length) { 101 | holder.tv3.setText(this.types[i]); 102 | } else { 103 | holder.tv3.setText(""); 104 | } 105 | } 106 | 107 | /** 108 | * {@inheritDoc} 109 | */ 110 | @Override 111 | public final String convertToString(final Cursor cursor) { 112 | final String name = cursor.getString(INDEX_NAME); 113 | final String number = cursor.getString(INDEX_NUMBER); 114 | if (TextUtils.isEmpty(name)) { 115 | return Utils.cleanRecipient(number); 116 | } 117 | return name + " <" + Utils.cleanRecipient(number) + '>'; 118 | } 119 | 120 | /** 121 | * {@inheritDoc} 122 | */ 123 | @Override 124 | public final Cursor runQueryOnBackgroundThread(final CharSequence constraint) { 125 | String s = constraint == null ? null : constraint.toString(); 126 | String where = prefsMobilesOnly ? Phone.TYPE + " = " 127 | + Phone.TYPE_MOBILE + " OR " 128 | + Phone.TYPE + " = " + Phone.TYPE_WORK_MOBILE : null; 129 | Uri u = Uri.withAppendedPath(Phone.CONTENT_FILTER_URI, Uri.encode(s)); 130 | Cursor cursor = this.mContentResolver.query(u, PROJECTION, where, null, 131 | Phone.DISPLAY_NAME); 132 | return cursor; 133 | } 134 | 135 | /** 136 | * @param b 137 | * set to true, if only mobile numbers should be displayed. 138 | */ 139 | static void setMobileNumbersOnly(final boolean b) { 140 | prefsMobilesOnly = b; 141 | } 142 | } 143 | -------------------------------------------------------------------------------- /WebSMS/src/main/java/de/ub0r/android/websms/MyTimePickerDialog.java: -------------------------------------------------------------------------------- 1 | package de.ub0r.android.websms; 2 | 3 | import android.app.TimePickerDialog; 4 | import android.content.Context; 5 | import android.widget.TimePicker; 6 | 7 | /** 8 | * TimePickerDialog checking time set by user. o2 allows only 00/15/30/45 9 | * minutes. 10 | * 11 | * @author flx 12 | */ 13 | public class MyTimePickerDialog extends TimePickerDialog { 14 | /** Last set minutes. */ 15 | private int lastMinutes; 16 | /** Allow only quaters. */ 17 | private static boolean onlyQuaters; 18 | 19 | /** 20 | * Default Constructor. 21 | * 22 | * @param context 23 | * Context 24 | * @param callBack 25 | * call back method 26 | * @param hourOfDay 27 | * hour of day 28 | * @param minute 29 | * minute 30 | * @param is24HourView 31 | * 24h / day or am/pm? 32 | */ 33 | public MyTimePickerDialog(final Context context, 34 | final TimePickerDialog.OnTimeSetListener callBack, 35 | final int hourOfDay, final int minute, final boolean is24HourView) { 36 | super(context, callBack, hourOfDay, minute, is24HourView); 37 | this.lastMinutes = minute; 38 | } 39 | 40 | /** 41 | * Set true if only full quaters are allowed. 42 | * 43 | * @param allowOnlyQuaters 44 | * allow only 00/15/30/45 as minutes 45 | */ 46 | public static final void setOnlyQuaters(final boolean allowOnlyQuaters) { 47 | onlyQuaters = allowOnlyQuaters; 48 | } 49 | 50 | /** 51 | * {@inheritDoc} 52 | */ 53 | @Override 54 | public final void onTimeChanged(final TimePicker view, final int hourOfDay, 55 | final int minute) { 56 | if (MyTimePickerDialog.onlyQuaters && minute % 15 != 0) { 57 | // check input, only 00/15/30/45 allowed 58 | int newMinute = minute; 59 | if (this.lastMinutes == 0 && minute == 59) { 60 | newMinute = 45; 61 | } else if (this.lastMinutes % 15 != 0) { 62 | newMinute = ((minute / 15)) * 15; 63 | } else if (minute >= this.lastMinutes) { 64 | newMinute = ((minute / 15) + 1) * 15; 65 | } else { 66 | newMinute = ((minute / 15)) * 15; 67 | } 68 | newMinute = newMinute % 60; 69 | view.setCurrentMinute(newMinute); 70 | this.lastMinutes = newMinute; 71 | } else { 72 | this.lastMinutes = minute; 73 | } 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /WebSMS/src/main/java/de/ub0r/android/websms/Preferences11Activity.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2010-2011 Felix Bechstein 3 | * 4 | * This file is part of WebSMS. 5 | * 6 | * This program is free software; you can redistribute it and/or modify it under 7 | * the terms of the GNU General Public License as published by the Free Software 8 | * Foundation; either version 3 of the License, or (at your option) any later 9 | * version. 10 | * 11 | * This program is distributed in the hope that it will be useful, but WITHOUT 12 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 13 | * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more 14 | * details. 15 | * 16 | * You should have received a copy of the GNU General Public License along with 17 | * this program; If not, see . 18 | */ 19 | package de.ub0r.android.websms; 20 | 21 | import android.annotation.TargetApi; 22 | import android.app.Activity; 23 | import android.content.Context; 24 | import android.os.Build; 25 | import android.os.Bundle; 26 | import android.preference.PreferenceActivity; 27 | 28 | import java.util.List; 29 | 30 | import de.ub0r.android.lib.IPreferenceContainer; 31 | import de.ub0r.android.lib.Utils; 32 | 33 | /** 34 | * {@link PreferenceActivity} for API>=11. 35 | * 36 | * @author flx 37 | */ 38 | @TargetApi(Build.VERSION_CODES.HONEYCOMB) 39 | public final class Preferences11Activity extends PreferenceActivity implements 40 | IPreferenceContainer { 41 | 42 | @Override 43 | public void onCreate(final Bundle savedInstanceState) { 44 | super.onCreate(savedInstanceState); 45 | this.setTitle(R.string.settings); 46 | Utils.setLocale(this); 47 | } 48 | 49 | @Override 50 | public void onResume() { 51 | super.onResume(); 52 | WebSMS.doPreferences = true; 53 | } 54 | 55 | @Override 56 | public void onBuildHeaders(final List
target) { 57 | this.loadHeadersFromResource(R.xml.preference_headers, target); 58 | if (BuildConfig.DEBUG_LOG) { 59 | this.loadHeadersFromResource(R.xml.preference_headers_debug, target); 60 | } 61 | } 62 | 63 | @Override 64 | public Activity getActivity() { 65 | return this; 66 | } 67 | 68 | @Override 69 | public Context getContext() { 70 | return this; 71 | } 72 | 73 | @Override 74 | protected boolean isValidFragment(final String fragmentName) { 75 | return HeaderPreferenceFragment.class.getName().equals(fragmentName); 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /WebSMS/src/main/java/de/ub0r/android/websms/PreferencesAppearanceActivity.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2010-2012 Felix Bechstein 3 | * 4 | * This file is part of WebSMS. 5 | * 6 | * This program is free software; you can redistribute it and/or modify it under 7 | * the terms of the GNU General Public License as published by the Free Software 8 | * Foundation; either version 3 of the License, or (at your option) any later 9 | * version. 10 | * 11 | * This program is distributed in the hope that it will be useful, but WITHOUT 12 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 13 | * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more 14 | * details. 15 | * 16 | * You should have received a copy of the GNU General Public License along with 17 | * this program; If not, see . 18 | */ 19 | package de.ub0r.android.websms; 20 | 21 | import android.content.Intent; 22 | import android.os.Bundle; 23 | import android.preference.PreferenceActivity; 24 | import android.view.MenuItem; 25 | 26 | /** 27 | * Preferences. 28 | * 29 | * @author flx 30 | */ 31 | public class PreferencesAppearanceActivity extends PreferenceActivity { 32 | @Override 33 | public final void onCreate(final Bundle savedInstanceState) { 34 | super.onCreate(savedInstanceState); 35 | this.addPreferencesFromResource(R.xml.prefs_appearance); 36 | this.setTitle(this.getString(R.string.settings) + " > " 37 | + this.getString(R.string.appearance_)); 38 | } 39 | 40 | @Override 41 | public final boolean onOptionsItemSelected(final MenuItem item) { 42 | switch (item.getItemId()) { 43 | case android.R.id.home: 44 | // app icon in Action Bar clicked; go home 45 | Intent intent = new Intent(this, WebSMS.class); 46 | intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 47 | this.startActivity(intent); 48 | return true; 49 | default: 50 | return super.onOptionsItemSelected(item); 51 | } 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /WebSMS/src/main/java/de/ub0r/android/websms/PreferencesBehaviorActivity.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2010-2012 Felix Bechstein 3 | * 4 | * This file is part of WebSMS. 5 | * 6 | * This program is free software; you can redistribute it and/or modify it under 7 | * the terms of the GNU General Public License as published by the Free Software 8 | * Foundation; either version 3 of the License, or (at your option) any later 9 | * version. 10 | * 11 | * This program is distributed in the hope that it will be useful, but WITHOUT 12 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 13 | * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more 14 | * details. 15 | * 16 | * You should have received a copy of the GNU General Public License along with 17 | * this program; If not, see . 18 | */ 19 | package de.ub0r.android.websms; 20 | 21 | import android.content.Intent; 22 | import android.os.Build; 23 | import android.os.Bundle; 24 | import android.preference.PreferenceActivity; 25 | import android.preference.PreferenceGroup; 26 | import android.view.MenuItem; 27 | 28 | /** 29 | * Preferences. 30 | * 31 | * @author flx 32 | */ 33 | public class PreferencesBehaviorActivity extends PreferenceActivity { 34 | @Override 35 | public final void onCreate(final Bundle savedInstanceState) { 36 | super.onCreate(savedInstanceState); 37 | this.addPreferencesFromResource(R.xml.prefs_behavior); 38 | this.setTitle(this.getString(R.string.settings) + " > " 39 | + this.getString(R.string.behavior_)); 40 | 41 | if (Build.VERSION.SDK_INT < Build.VERSION_CODES.GINGERBREAD) { 42 | // removing diacritics is not supported in API8- 43 | PreferenceGroup pg = (PreferenceGroup) this 44 | .findPreference("container"); 45 | pg.removePreference(this.findPreference("remove_diacritics")); 46 | } 47 | if (Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN_MR2) { 48 | // writing to content://sms is not supported in API19+ 49 | PreferenceGroup pg = (PreferenceGroup) this 50 | .findPreference("container"); 51 | pg.removePreference(this.findPreference("drop_sent")); 52 | } 53 | } 54 | 55 | @Override 56 | public final boolean onOptionsItemSelected(final MenuItem item) { 57 | switch (item.getItemId()) { 58 | case android.R.id.home: 59 | // app icon in Action Bar clicked; go home 60 | Intent intent = new Intent(this, WebSMS.class); 61 | intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 62 | this.startActivity(intent); 63 | return true; 64 | default: 65 | return super.onOptionsItemSelected(item); 66 | } 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /WebSMS/src/main/java/de/ub0r/android/websms/rules/CheckableLinearLayout.java: -------------------------------------------------------------------------------- 1 | package de.ub0r.android.websms.rules; 2 | 3 | import android.annotation.SuppressLint; 4 | import android.content.Context; 5 | import android.util.AttributeSet; 6 | import android.widget.Checkable; 7 | import android.widget.LinearLayout; 8 | 9 | /** 10 | * LinearLayout that implements a Checkable interface. 11 | */ 12 | public class CheckableLinearLayout 13 | extends LinearLayout 14 | implements Checkable { 15 | 16 | private boolean mChecked = false; 17 | 18 | private static final int[] mCheckedStateSet = { 19 | android.R.attr.state_checked, 20 | }; 21 | 22 | 23 | public CheckableLinearLayout(Context context) 24 | { 25 | super(context); 26 | } 27 | 28 | public CheckableLinearLayout(Context context, AttributeSet attrs) 29 | { 30 | super(context, attrs); 31 | } 32 | 33 | @SuppressLint("NewApi") 34 | public CheckableLinearLayout(Context context, AttributeSet attrs, int defStyle) { 35 | super(context, attrs, defStyle); 36 | } 37 | 38 | 39 | @Override 40 | public boolean isChecked() { 41 | return mChecked; 42 | } 43 | 44 | @Override 45 | public void setChecked(boolean checked) { 46 | mChecked = checked; 47 | refreshDrawableState(); 48 | } 49 | 50 | @Override 51 | protected int[] onCreateDrawableState(int extraSpace) { 52 | final int[] drawableState = super.onCreateDrawableState(extraSpace + 1); 53 | if (isChecked()) { 54 | mergeDrawableStates(drawableState, mCheckedStateSet); 55 | } 56 | return drawableState; 57 | } 58 | 59 | @Override 60 | public void toggle() { 61 | setChecked(!mChecked); 62 | } 63 | 64 | } -------------------------------------------------------------------------------- /WebSMS/src/main/java/de/ub0r/android/websms/rules/ConfirmDialogFragment.java: -------------------------------------------------------------------------------- 1 | package de.ub0r.android.websms.rules; 2 | 3 | import android.app.AlertDialog; 4 | import android.app.Dialog; 5 | import android.content.DialogInterface; 6 | import android.os.Bundle; 7 | import android.support.v4.app.Fragment; 8 | import android.support.v7.app.AppCompatDialogFragment; 9 | 10 | 11 | /** 12 | * Dialog Fragment with a message and Confirm / Decline buttons. 13 | * Target Fragment must implement the DialogListener interface. 14 | */ 15 | public class ConfirmDialogFragment 16 | extends AppCompatDialogFragment { 17 | 18 | public static final String FRAG_TAG = "ConfirmDialogFragment"; 19 | 20 | public static final int ACTION_NONE = 0; 21 | public static final int ACTION_OK = 1; 22 | public static final int ACTION_CANCEL = 2; 23 | 24 | private static final String ARG_DIALOG_ID = "dialogId"; 25 | private static final String ARG_CONTENT = "content"; 26 | private static final String ARG_CONFIRM_RESID = "confirmResId"; 27 | private static final String ARG_DECLINE_RESID = "declineResId"; 28 | private static final String ARG_ACTION_ON_DISMISS = "actionOnDismiss"; 29 | 30 | 31 | public interface DialogListener { 32 | void onConfirmOk(int dialogId); 33 | void onConfirmCancelled(int dialogId); 34 | } 35 | 36 | 37 | public static ConfirmDialogFragment newInstance(int dialogId, 38 | String content, int confirmResId, int declineResId, 39 | int actionOnDismiss, 40 | Fragment targetFragment /*must implement the DialogListener interface*/ ) { 41 | 42 | ConfirmDialogFragment confDialogFragment = new ConfirmDialogFragment(); 43 | 44 | Bundle args = new Bundle(); 45 | args.putInt(ARG_DIALOG_ID, dialogId); 46 | args.putString(ARG_CONTENT, content); 47 | args.putInt(ARG_CONFIRM_RESID, confirmResId); 48 | args.putInt(ARG_DECLINE_RESID, declineResId); 49 | args.putInt(ARG_ACTION_ON_DISMISS, actionOnDismiss); 50 | confDialogFragment.setArguments(args); 51 | 52 | confDialogFragment.setTargetFragment(targetFragment, 0); 53 | 54 | return confDialogFragment; 55 | } 56 | 57 | 58 | private DialogListener getListener() { 59 | return (DialogListener) getTargetFragment(); 60 | } 61 | 62 | @Override 63 | public Dialog onCreateDialog(Bundle savedInstanceState) { 64 | AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()) 65 | .setTitle(null) 66 | .setIcon(null) 67 | .setMessage(getArguments().getString(ARG_CONTENT)) 68 | .setPositiveButton(getArguments().getInt(ARG_CONFIRM_RESID), new DialogInterface.OnClickListener() { 69 | public void onClick(DialogInterface dialog, int id) { 70 | getListener().onConfirmOk(getArguments().getInt(ARG_DIALOG_ID)); 71 | } 72 | }) 73 | .setNegativeButton(getArguments().getInt(ARG_DECLINE_RESID), new DialogInterface.OnClickListener() { 74 | public void onClick(DialogInterface dialog, int id) { 75 | getListener().onConfirmCancelled(getArguments().getInt(ARG_DIALOG_ID)); 76 | } 77 | }); 78 | return builder.create(); 79 | } 80 | 81 | @Override 82 | public void onCancel(DialogInterface dialog) { 83 | int actionOnDismiss = getArguments().getInt(ARG_ACTION_ON_DISMISS); 84 | int dialogId = getArguments().getInt(ARG_DIALOG_ID); 85 | 86 | if (actionOnDismiss == ACTION_OK) { 87 | getListener().onConfirmOk(dialogId); 88 | } else if (actionOnDismiss == ACTION_CANCEL) { 89 | getListener().onConfirmCancelled(dialogId); 90 | } else if (actionOnDismiss == ACTION_NONE) { 91 | // nothing to do 92 | } 93 | super.onCancel(dialog); 94 | } 95 | 96 | } 97 | -------------------------------------------------------------------------------- /WebSMS/src/main/java/de/ub0r/android/websms/rules/EditRuleActivity.java: -------------------------------------------------------------------------------- 1 | package de.ub0r.android.websms.rules; 2 | 3 | import android.app.Activity; 4 | import android.content.Context; 5 | import android.content.Intent; 6 | import android.os.Bundle; 7 | import android.support.v4.app.Fragment; 8 | import android.support.v7.app.AppCompatActivity; 9 | import android.view.inputmethod.InputMethodManager; 10 | 11 | 12 | import java.util.List; 13 | 14 | import de.ub0r.android.websms.R; 15 | 16 | /** 17 | * Activity for editing new or existing rules. 18 | */ 19 | public class EditRuleActivity extends AppCompatActivity { 20 | 21 | private static final String INTENT_RULE_IDX = "rule_idx"; 22 | private static final String INTENT_RULE = "rule"; 23 | 24 | 25 | public static Intent createStartIntent(Context appCtx, int ruleIdx, Rule rule) { 26 | Intent intent = new Intent(appCtx, EditRuleActivity.class); 27 | intent.putExtra(INTENT_RULE_IDX, ruleIdx); 28 | intent.putExtra(INTENT_RULE, rule); 29 | return intent; 30 | } 31 | 32 | 33 | @Override 34 | protected void onCreate(Bundle savedInstanceState) { 35 | super.onCreate(savedInstanceState); 36 | 37 | int ruleIdx = getIntent().getIntExtra(INTENT_RULE_IDX, -1); 38 | getSupportActionBar().setTitle(ruleIdx == -1 ? R.string.new_rule_title : R.string.edit_rule_title); 39 | 40 | if (savedInstanceState == null) { 41 | Rule rule = (Rule) getIntent().getSerializableExtra(INTENT_RULE); 42 | 43 | EditRuleFragment frag = EditRuleFragment.newInstance(ruleIdx, rule); 44 | 45 | getSupportFragmentManager() 46 | .beginTransaction() 47 | .add(android.R.id.content, frag) 48 | .commit(); 49 | } 50 | } 51 | 52 | @Override 53 | public void onBackPressed() { 54 | boolean canLeave = true; 55 | List fragments = getSupportFragmentManager().getFragments(); 56 | for (Fragment fragment : fragments) { 57 | if (fragment instanceof EditRuleFragment) { 58 | canLeave &= ((EditRuleFragment)fragment).onDone(); 59 | } 60 | } 61 | if (canLeave) { 62 | super.onBackPressed(); 63 | } 64 | } 65 | 66 | @Override 67 | public void finish() { 68 | hideSoftKeyboard(); 69 | super.finish(); 70 | } 71 | 72 | private void hideSoftKeyboard() { 73 | InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 74 | if (imm != null && getCurrentFocus() != null) { 75 | imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0); 76 | } 77 | } 78 | 79 | @SuppressWarnings("unchecked") 80 | public static IndexedRule getResult(Intent result) { 81 | int ruleIdx = result.getIntExtra(INTENT_RULE_IDX, -1); 82 | Rule rule = (Rule) result.getSerializableExtra(INTENT_RULE); 83 | return new IndexedRule(ruleIdx, rule); 84 | } 85 | 86 | public void setResult(int ruleIdx, Rule rule) { 87 | Intent data = new Intent(); 88 | data.putExtra(INTENT_RULE_IDX, ruleIdx); 89 | data.putExtra(INTENT_RULE, rule); 90 | setResult(Activity.RESULT_OK, data); 91 | } 92 | 93 | } 94 | -------------------------------------------------------------------------------- /WebSMS/src/main/java/de/ub0r/android/websms/rules/IndexedRule.java: -------------------------------------------------------------------------------- 1 | package de.ub0r.android.websms.rules; 2 | 3 | public class IndexedRule { 4 | private final int idx; 5 | private final Rule rule; 6 | 7 | public IndexedRule(int idx, Rule rule) { 8 | this.idx = idx; 9 | this.rule = rule; 10 | } 11 | 12 | public int getIdx() { 13 | return this.idx; 14 | } 15 | 16 | public Rule getRule() { 17 | return this.rule; 18 | } 19 | 20 | } 21 | -------------------------------------------------------------------------------- /WebSMS/src/main/java/de/ub0r/android/websms/rules/PreferencesRulesActivity.java: -------------------------------------------------------------------------------- 1 | package de.ub0r.android.websms.rules; 2 | 3 | import android.content.Intent; 4 | import android.os.Bundle; 5 | import android.preference.PreferenceActivity; 6 | 7 | import de.ub0r.android.websms.R; 8 | import de.ub0r.android.websms.WebSMS; 9 | 10 | /** 11 | * Preferences for the pseudo-connector Rules. 12 | */ 13 | public class PreferencesRulesActivity extends PreferenceActivity { 14 | 15 | @Override 16 | @SuppressWarnings("deprecation") 17 | public final void onCreate(final Bundle savedInstanceState) { 18 | super.onCreate(savedInstanceState); 19 | this.addPreferencesFromResource(R.xml.prefs_rules); 20 | this.setTitle(R.string.settings); 21 | } 22 | 23 | @Override 24 | public final boolean onOptionsItemSelected(final android.view.MenuItem item) { 25 | switch (item.getItemId()) { 26 | case android.R.id.home: 27 | // app icon in Action Bar clicked; go home 28 | Intent intent = new Intent(this, WebSMS.class); 29 | intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 30 | this.startActivity(intent); 31 | return true; 32 | default: 33 | return super.onOptionsItemSelected(item); 34 | } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /WebSMS/src/main/java/de/ub0r/android/websms/rules/Rule.java: -------------------------------------------------------------------------------- 1 | package de.ub0r.android.websms.rules; 2 | 3 | import java.io.Serializable; 4 | import java.nio.charset.Charset; 5 | import java.util.regex.Pattern; 6 | 7 | public class Rule 8 | implements Serializable, Cloneable { 9 | 10 | private static final long serialVersionUID = 1451431417810332955L; 11 | 12 | private String prefix; 13 | private Pattern pattern; 14 | private String charsetName; 15 | private String connectorId; 16 | private String subConnectorId; 17 | 18 | 19 | public String getPrefix() { 20 | return this.prefix; 21 | } 22 | 23 | public void setPrefix(String prefix) { 24 | this.prefix = prefix; 25 | } 26 | 27 | public Pattern getPattern() { 28 | return this.pattern; 29 | } 30 | 31 | public void setPattern(Pattern pattern) { 32 | this.pattern = pattern; 33 | } 34 | 35 | public String getCharsetName() { 36 | return this.charsetName; 37 | } 38 | 39 | public void setCharsetName(String charsetName) { 40 | this.charsetName = charsetName; 41 | } 42 | 43 | public String getConnectorId() { 44 | return this.connectorId; 45 | } 46 | 47 | public void setConnectorId(String connectorId) { 48 | this.connectorId = connectorId; 49 | } 50 | 51 | public String getSubConnectorId() { 52 | return this.subConnectorId; 53 | } 54 | 55 | public void setSubConnectorId(String subConnectorId) { 56 | this.subConnectorId = subConnectorId; 57 | } 58 | 59 | 60 | @Override 61 | public Rule clone() { 62 | try { 63 | return (Rule) super.clone(); 64 | } catch (CloneNotSupportedException ex) { 65 | throw new IllegalStateException(); 66 | } 67 | } 68 | 69 | } 70 | -------------------------------------------------------------------------------- /WebSMS/src/main/java/de/ub0r/android/websms/rules/RulesEditorActivity.java: -------------------------------------------------------------------------------- 1 | package de.ub0r.android.websms.rules; 2 | 3 | import android.os.Bundle; 4 | import android.support.v4.app.Fragment; 5 | import android.support.v7.app.AppCompatActivity; 6 | 7 | 8 | import java.util.List; 9 | 10 | import de.ub0r.android.websms.R; 11 | 12 | /** 13 | * Rules Editor activity. 14 | */ 15 | public class RulesEditorActivity extends AppCompatActivity { 16 | 17 | @Override 18 | protected void onCreate(Bundle savedInstanceState) { 19 | super.onCreate(savedInstanceState); 20 | getSupportActionBar().setTitle(R.string.rules_editor_title); 21 | 22 | if (savedInstanceState == null) { 23 | getSupportFragmentManager() 24 | .beginTransaction() 25 | .add(android.R.id.content, new RulesEditorFragment()) 26 | .commit(); 27 | } 28 | } 29 | 30 | @Override 31 | public void onBackPressed() { 32 | List fragments = getSupportFragmentManager().getFragments(); 33 | for (Fragment fragment : fragments) { 34 | if (fragment instanceof RulesEditorFragment) { 35 | ((RulesEditorFragment)fragment).onDone(); 36 | } 37 | } 38 | super.onBackPressed(); 39 | } 40 | 41 | } 42 | -------------------------------------------------------------------------------- /WebSMS/src/main/res/drawable-hdpi-v11/ic_menu_emoticons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixb/websms/8e9e62b8977289373b5bd53cbea7834752e8c6b0/WebSMS/src/main/res/drawable-hdpi-v11/ic_menu_emoticons.png -------------------------------------------------------------------------------- /WebSMS/src/main/res/drawable-hdpi-v11/ic_menu_invite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixb/websms/8e9e62b8977289373b5bd53cbea7834752e8c6b0/WebSMS/src/main/res/drawable-hdpi-v11/ic_menu_invite.png -------------------------------------------------------------------------------- /WebSMS/src/main/res/drawable-hdpi-v11/ic_menu_star.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixb/websms/8e9e62b8977289373b5bd53cbea7834752e8c6b0/WebSMS/src/main/res/drawable-hdpi-v11/ic_menu_star.png -------------------------------------------------------------------------------- /WebSMS/src/main/res/drawable-hdpi-v11/stat_notify_resending.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixb/websms/8e9e62b8977289373b5bd53cbea7834752e8c6b0/WebSMS/src/main/res/drawable-hdpi-v11/stat_notify_resending.png -------------------------------------------------------------------------------- /WebSMS/src/main/res/drawable-hdpi-v11/stat_notify_sms_failed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixb/websms/8e9e62b8977289373b5bd53cbea7834752e8c6b0/WebSMS/src/main/res/drawable-hdpi-v11/stat_notify_sms_failed.png -------------------------------------------------------------------------------- /WebSMS/src/main/res/drawable-hdpi/app_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixb/websms/8e9e62b8977289373b5bd53cbea7834752e8c6b0/WebSMS/src/main/res/drawable-hdpi/app_icon.png -------------------------------------------------------------------------------- /WebSMS/src/main/res/drawable-hdpi/ic_menu_emoticons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixb/websms/8e9e62b8977289373b5bd53cbea7834752e8c6b0/WebSMS/src/main/res/drawable-hdpi/ic_menu_emoticons.png -------------------------------------------------------------------------------- /WebSMS/src/main/res/drawable-hdpi/ic_menu_invite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixb/websms/8e9e62b8977289373b5bd53cbea7834752e8c6b0/WebSMS/src/main/res/drawable-hdpi/ic_menu_invite.png -------------------------------------------------------------------------------- /WebSMS/src/main/res/drawable-hdpi/ic_menu_refresh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixb/websms/8e9e62b8977289373b5bd53cbea7834752e8c6b0/WebSMS/src/main/res/drawable-hdpi/ic_menu_refresh.png -------------------------------------------------------------------------------- /WebSMS/src/main/res/drawable-hdpi/ic_menu_send.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixb/websms/8e9e62b8977289373b5bd53cbea7834752e8c6b0/WebSMS/src/main/res/drawable-hdpi/ic_menu_send.png -------------------------------------------------------------------------------- /WebSMS/src/main/res/drawable-hdpi/ic_menu_star.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixb/websms/8e9e62b8977289373b5bd53cbea7834752e8c6b0/WebSMS/src/main/res/drawable-hdpi/ic_menu_star.png -------------------------------------------------------------------------------- /WebSMS/src/main/res/drawable-hdpi/stat_notify_resending.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixb/websms/8e9e62b8977289373b5bd53cbea7834752e8c6b0/WebSMS/src/main/res/drawable-hdpi/stat_notify_resending.png -------------------------------------------------------------------------------- /WebSMS/src/main/res/drawable-hdpi/stat_notify_sms_failed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixb/websms/8e9e62b8977289373b5bd53cbea7834752e8c6b0/WebSMS/src/main/res/drawable-hdpi/stat_notify_sms_failed.png -------------------------------------------------------------------------------- /WebSMS/src/main/res/drawable-ldpi/app_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixb/websms/8e9e62b8977289373b5bd53cbea7834752e8c6b0/WebSMS/src/main/res/drawable-ldpi/app_icon.png -------------------------------------------------------------------------------- /WebSMS/src/main/res/drawable-ldpi/ic_menu_emoticons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixb/websms/8e9e62b8977289373b5bd53cbea7834752e8c6b0/WebSMS/src/main/res/drawable-ldpi/ic_menu_emoticons.png -------------------------------------------------------------------------------- /WebSMS/src/main/res/drawable-ldpi/ic_menu_invite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixb/websms/8e9e62b8977289373b5bd53cbea7834752e8c6b0/WebSMS/src/main/res/drawable-ldpi/ic_menu_invite.png -------------------------------------------------------------------------------- /WebSMS/src/main/res/drawable-ldpi/ic_menu_refresh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixb/websms/8e9e62b8977289373b5bd53cbea7834752e8c6b0/WebSMS/src/main/res/drawable-ldpi/ic_menu_refresh.png -------------------------------------------------------------------------------- /WebSMS/src/main/res/drawable-ldpi/ic_menu_send.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixb/websms/8e9e62b8977289373b5bd53cbea7834752e8c6b0/WebSMS/src/main/res/drawable-ldpi/ic_menu_send.png -------------------------------------------------------------------------------- /WebSMS/src/main/res/drawable-ldpi/ic_menu_star.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixb/websms/8e9e62b8977289373b5bd53cbea7834752e8c6b0/WebSMS/src/main/res/drawable-ldpi/ic_menu_star.png -------------------------------------------------------------------------------- /WebSMS/src/main/res/drawable-ldpi/stat_notify_resending.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixb/websms/8e9e62b8977289373b5bd53cbea7834752e8c6b0/WebSMS/src/main/res/drawable-ldpi/stat_notify_resending.png -------------------------------------------------------------------------------- /WebSMS/src/main/res/drawable-ldpi/stat_notify_sms_failed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixb/websms/8e9e62b8977289373b5bd53cbea7834752e8c6b0/WebSMS/src/main/res/drawable-ldpi/stat_notify_sms_failed.png -------------------------------------------------------------------------------- /WebSMS/src/main/res/drawable-mdpi-v11/ic_menu_emoticons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixb/websms/8e9e62b8977289373b5bd53cbea7834752e8c6b0/WebSMS/src/main/res/drawable-mdpi-v11/ic_menu_emoticons.png -------------------------------------------------------------------------------- /WebSMS/src/main/res/drawable-mdpi-v11/ic_menu_invite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixb/websms/8e9e62b8977289373b5bd53cbea7834752e8c6b0/WebSMS/src/main/res/drawable-mdpi-v11/ic_menu_invite.png -------------------------------------------------------------------------------- /WebSMS/src/main/res/drawable-mdpi-v11/ic_menu_star.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixb/websms/8e9e62b8977289373b5bd53cbea7834752e8c6b0/WebSMS/src/main/res/drawable-mdpi-v11/ic_menu_star.png -------------------------------------------------------------------------------- /WebSMS/src/main/res/drawable-mdpi-v11/stat_notify_resending.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixb/websms/8e9e62b8977289373b5bd53cbea7834752e8c6b0/WebSMS/src/main/res/drawable-mdpi-v11/stat_notify_resending.png -------------------------------------------------------------------------------- /WebSMS/src/main/res/drawable-mdpi-v11/stat_notify_sms_failed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixb/websms/8e9e62b8977289373b5bd53cbea7834752e8c6b0/WebSMS/src/main/res/drawable-mdpi-v11/stat_notify_sms_failed.png -------------------------------------------------------------------------------- /WebSMS/src/main/res/drawable-mdpi/app_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixb/websms/8e9e62b8977289373b5bd53cbea7834752e8c6b0/WebSMS/src/main/res/drawable-mdpi/app_icon.png -------------------------------------------------------------------------------- /WebSMS/src/main/res/drawable-mdpi/ic_menu_emoticons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixb/websms/8e9e62b8977289373b5bd53cbea7834752e8c6b0/WebSMS/src/main/res/drawable-mdpi/ic_menu_emoticons.png -------------------------------------------------------------------------------- /WebSMS/src/main/res/drawable-mdpi/ic_menu_invite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixb/websms/8e9e62b8977289373b5bd53cbea7834752e8c6b0/WebSMS/src/main/res/drawable-mdpi/ic_menu_invite.png -------------------------------------------------------------------------------- /WebSMS/src/main/res/drawable-mdpi/ic_menu_refresh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixb/websms/8e9e62b8977289373b5bd53cbea7834752e8c6b0/WebSMS/src/main/res/drawable-mdpi/ic_menu_refresh.png -------------------------------------------------------------------------------- /WebSMS/src/main/res/drawable-mdpi/ic_menu_send.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixb/websms/8e9e62b8977289373b5bd53cbea7834752e8c6b0/WebSMS/src/main/res/drawable-mdpi/ic_menu_send.png -------------------------------------------------------------------------------- /WebSMS/src/main/res/drawable-mdpi/ic_menu_star.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixb/websms/8e9e62b8977289373b5bd53cbea7834752e8c6b0/WebSMS/src/main/res/drawable-mdpi/ic_menu_star.png -------------------------------------------------------------------------------- /WebSMS/src/main/res/drawable-mdpi/stat_notify_resending.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixb/websms/8e9e62b8977289373b5bd53cbea7834752e8c6b0/WebSMS/src/main/res/drawable-mdpi/stat_notify_resending.png -------------------------------------------------------------------------------- /WebSMS/src/main/res/drawable-mdpi/stat_notify_sms_failed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixb/websms/8e9e62b8977289373b5bd53cbea7834752e8c6b0/WebSMS/src/main/res/drawable-mdpi/stat_notify_sms_failed.png -------------------------------------------------------------------------------- /WebSMS/src/main/res/drawable-xhdpi/app_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixb/websms/8e9e62b8977289373b5bd53cbea7834752e8c6b0/WebSMS/src/main/res/drawable-xhdpi/app_icon.png -------------------------------------------------------------------------------- /WebSMS/src/main/res/drawable-xhdpi/ic_menu_emoticons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixb/websms/8e9e62b8977289373b5bd53cbea7834752e8c6b0/WebSMS/src/main/res/drawable-xhdpi/ic_menu_emoticons.png -------------------------------------------------------------------------------- /WebSMS/src/main/res/drawable-xhdpi/ic_menu_invite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixb/websms/8e9e62b8977289373b5bd53cbea7834752e8c6b0/WebSMS/src/main/res/drawable-xhdpi/ic_menu_invite.png -------------------------------------------------------------------------------- /WebSMS/src/main/res/drawable-xhdpi/ic_menu_refresh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixb/websms/8e9e62b8977289373b5bd53cbea7834752e8c6b0/WebSMS/src/main/res/drawable-xhdpi/ic_menu_refresh.png -------------------------------------------------------------------------------- /WebSMS/src/main/res/drawable-xhdpi/ic_menu_send.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixb/websms/8e9e62b8977289373b5bd53cbea7834752e8c6b0/WebSMS/src/main/res/drawable-xhdpi/ic_menu_send.png -------------------------------------------------------------------------------- /WebSMS/src/main/res/drawable-xhdpi/stat_notify_resending.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixb/websms/8e9e62b8977289373b5bd53cbea7834752e8c6b0/WebSMS/src/main/res/drawable-xhdpi/stat_notify_resending.png -------------------------------------------------------------------------------- /WebSMS/src/main/res/drawable-xhdpi/stat_notify_sms_failed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixb/websms/8e9e62b8977289373b5bd53cbea7834752e8c6b0/WebSMS/src/main/res/drawable-xhdpi/stat_notify_sms_failed.png -------------------------------------------------------------------------------- /WebSMS/src/main/res/drawable/bg_selectable_row.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /WebSMS/src/main/res/drawable/emo_im_angel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixb/websms/8e9e62b8977289373b5bd53cbea7834752e8c6b0/WebSMS/src/main/res/drawable/emo_im_angel.png -------------------------------------------------------------------------------- /WebSMS/src/main/res/drawable/emo_im_cool.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixb/websms/8e9e62b8977289373b5bd53cbea7834752e8c6b0/WebSMS/src/main/res/drawable/emo_im_cool.png -------------------------------------------------------------------------------- /WebSMS/src/main/res/drawable/emo_im_crying.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixb/websms/8e9e62b8977289373b5bd53cbea7834752e8c6b0/WebSMS/src/main/res/drawable/emo_im_crying.png -------------------------------------------------------------------------------- /WebSMS/src/main/res/drawable/emo_im_foot_in_mouth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixb/websms/8e9e62b8977289373b5bd53cbea7834752e8c6b0/WebSMS/src/main/res/drawable/emo_im_foot_in_mouth.png -------------------------------------------------------------------------------- /WebSMS/src/main/res/drawable/emo_im_happy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixb/websms/8e9e62b8977289373b5bd53cbea7834752e8c6b0/WebSMS/src/main/res/drawable/emo_im_happy.png -------------------------------------------------------------------------------- /WebSMS/src/main/res/drawable/emo_im_kissing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixb/websms/8e9e62b8977289373b5bd53cbea7834752e8c6b0/WebSMS/src/main/res/drawable/emo_im_kissing.png -------------------------------------------------------------------------------- /WebSMS/src/main/res/drawable/emo_im_laughing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixb/websms/8e9e62b8977289373b5bd53cbea7834752e8c6b0/WebSMS/src/main/res/drawable/emo_im_laughing.png -------------------------------------------------------------------------------- /WebSMS/src/main/res/drawable/emo_im_lips_are_sealed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixb/websms/8e9e62b8977289373b5bd53cbea7834752e8c6b0/WebSMS/src/main/res/drawable/emo_im_lips_are_sealed.png -------------------------------------------------------------------------------- /WebSMS/src/main/res/drawable/emo_im_money_mouth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixb/websms/8e9e62b8977289373b5bd53cbea7834752e8c6b0/WebSMS/src/main/res/drawable/emo_im_money_mouth.png -------------------------------------------------------------------------------- /WebSMS/src/main/res/drawable/emo_im_sad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixb/websms/8e9e62b8977289373b5bd53cbea7834752e8c6b0/WebSMS/src/main/res/drawable/emo_im_sad.png -------------------------------------------------------------------------------- /WebSMS/src/main/res/drawable/emo_im_surprised.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixb/websms/8e9e62b8977289373b5bd53cbea7834752e8c6b0/WebSMS/src/main/res/drawable/emo_im_surprised.png -------------------------------------------------------------------------------- /WebSMS/src/main/res/drawable/emo_im_tongue_sticking_out.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixb/websms/8e9e62b8977289373b5bd53cbea7834752e8c6b0/WebSMS/src/main/res/drawable/emo_im_tongue_sticking_out.png -------------------------------------------------------------------------------- /WebSMS/src/main/res/drawable/emo_im_undecided.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixb/websms/8e9e62b8977289373b5bd53cbea7834752e8c6b0/WebSMS/src/main/res/drawable/emo_im_undecided.png -------------------------------------------------------------------------------- /WebSMS/src/main/res/drawable/emo_im_winking.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixb/websms/8e9e62b8977289373b5bd53cbea7834752e8c6b0/WebSMS/src/main/res/drawable/emo_im_winking.png -------------------------------------------------------------------------------- /WebSMS/src/main/res/drawable/emo_im_wtf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixb/websms/8e9e62b8977289373b5bd53cbea7834752e8c6b0/WebSMS/src/main/res/drawable/emo_im_wtf.png -------------------------------------------------------------------------------- /WebSMS/src/main/res/drawable/emo_im_yelling.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixb/websms/8e9e62b8977289373b5bd53cbea7834752e8c6b0/WebSMS/src/main/res/drawable/emo_im_yelling.png -------------------------------------------------------------------------------- /WebSMS/src/main/res/drawable/ic_menu_star.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixb/websms/8e9e62b8977289373b5bd53cbea7834752e8c6b0/WebSMS/src/main/res/drawable/ic_menu_star.png -------------------------------------------------------------------------------- /WebSMS/src/main/res/layout-de/help_intro.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 17 | 24 | 25 | 32 | 33 |