[
  {
    "path": ".gitignore",
    "content": "*.iml\n.gradle\n/local.properties\n/.idea/workspace.xml\n/.idea\n/.idea/libraries\n.DS_Store\n/build\n/captures\n/gradle\ngradlew\ngradlew.bat\n"
  },
  {
    "path": "README.md",
    "content": "# 项目介绍\n### 项目地址:\n   [SmsObserverForAndroid](https://github.com/Robin-jiangyufeng/SmsObserverForAndroid) \n   \n### 介绍\n   * 这是一个用于拦截android实时短信的库,可以进行短信过滤,得到自己想要的内容,可以用于需要自动填写短信验证码的app项目\n   \n### 功能\n   * 用于监听当前接收到的短信信息\n   * 过滤接收到的短信，得到自己想要的内容\n   \n### 使用场景\n   * 可以用于自动填写短信验证码的app项目\n   * 自己想...\n   \n# 使用方法\n### 所需权限\n```java\n    <uses-permission android:name=\"android.permission.RECEIVE_SMS\" />\n    <uses-permission android:name=\"android.permission.READ_SMS\" />\n```\n### 初始化\n```java\n    /***\n     * 构造器\n     * @param context\n     * @param callback 短信接收器\n     * @param smsFilter 短信过滤器\n     */\n     SmsObserver smsObserver=new SmsObserver(this, new SmsResponseCallback() {\n                 @Override\n                 public void onCallbackSmsContent(String smsContent) {\n                     //这里接收短信\n                 }\n             }, new VerificationCodeSmsFilter(\"180\"));\n```\n### 注册短信变化监听器\n   * 在注册监听器以后,短信观察者就已经启动短信变化监听,接下只要接收短信,对短信做处理就可以了\n   \n```java\n    /***\n     * 注册短信变化观察者\n     *\n     * @see [类、类#方法、类#成员]\n     */\n   smsObserver.registerSMSObserver();\n```\n### 注销短信变化监听器\n  * 在不需要再使用短信接收功能的时候,请注销短信监听器,不然后续还是可以接收得到短信\n  \n```java\n    /***\n     * 注销短信变化观察者\n     *\n     * @see [类、类#方法、类#成员]\n     */\n   smsObserver.unregisterSMSObserver();\n```\n\n### 短信过滤器\n  * 要接收到自己想要的短信内容只要实现自己的SmsFilter短信过滤器即可\n\n```java\n/**\n * 短信验证码过滤器\n *\n * @author 江钰锋 00501\n * @version [版本号, 16/6/2]\n * @see [相关类/方法]\n * @since [产品/模块版本]\n */\npublic class VerificationCodeSmsFilter implements SmsFilter {\n    /**\n     * 需要过滤的发短信的人\n     */\n    private String filterAddress;\n\n    public VerificationCodeSmsFilter(String filterAddress) {\n        this.filterAddress = filterAddress;\n    }\n\n    @Override\n    public String filter(String address, String smsContent) {\n        if (address.startsWith(filterAddress)) {\n            Pattern pattern = Pattern.compile(\"(\\\\d{4,8})\");//匹配4-8位的数字\n            Matcher matcher = pattern.matcher(smsContent);\n            if (matcher.find()) {\n                return matcher.group(0);\n            }\n        }\n        return null;\n    }\n}\n```\n\n# 关于作者Robin\n* 屌丝程序员\n* GitHub: [Robin-jiangyufeng](https://github.com/Robin-jiangyufeng)\n* QQ:429257411\n* 交流QQ群 236395044"
  },
  {
    "path": "Sample/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "Sample/build.gradle",
    "content": "apply plugin: 'com.android.application'\n\nandroid {\n    compileSdkVersion 27\n    buildToolsVersion \"28.0.3\"\n\n    defaultConfig {\n        applicationId \"com.robin.lazy.sample\"\n        minSdkVersion 14\n        targetSdkVersion 27\n        versionCode 1\n        versionName \"1.0\"\n    }\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'\n        }\n    }\n}\n\ndependencies {\n    implementation fileTree(dir: 'libs', include: ['*.jar'])\n    implementation 'com.karumi:dexter:5.0.0'\n    testImplementation 'junit:junit:4.12'\n    implementation 'com.android.support:appcompat-v7:27.1.1'\n    implementation project(':SmsObserverLibrary')\n}\n"
  },
  {
    "path": "Sample/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# By default, the flags in this file are appended to flags specified\n# in /Volumes/Work/androidIDE/sdk/tools/proguard/proguard-android.txt\n# You can edit the include path and order by changing the proguardFiles\n# directive in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# Add any project specific keep options here:\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n"
  },
  {
    "path": "Sample/src/androidTest/java/com/robin/lazy/sample/ApplicationTest.java",
    "content": "package com.robin.lazy.sample;\n\nimport android.app.Application;\nimport android.test.ApplicationTestCase;\n\n/**\n * <a href=\"http://d.android.com/tools/testing/testing_android.html\">Testing Fundamentals</a>\n */\npublic class ApplicationTest extends ApplicationTestCase<Application> {\n    public ApplicationTest() {\n        super(Application.class);\n    }\n}"
  },
  {
    "path": "Sample/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.robin.lazy.sample\">\n\n    <uses-permission android:name=\"android.permission.RECEIVE_SMS\" />\n    <uses-permission android:name=\"android.permission.READ_SMS\" />\n\n    <application\n        android:name=\".App\"\n        android:allowBackup=\"true\"\n        android:icon=\"@mipmap/ic_launcher\"\n        android:label=\"@string/app_name\"\n        android:supportsRtl=\"true\"\n        android:theme=\"@style/AppTheme\">\n        <activity android:name=\"com.robin.lazy.sample.MainActivity\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\" />\n\n                <category android:name=\"android.intent.category.LAUNCHER\" />\n            </intent-filter>\n        </activity>\n    </application>\n\n</manifest>\n"
  },
  {
    "path": "Sample/src/main/java/com/robin/lazy/sample/App.java",
    "content": "/**\n * 文 件 名:  App.java\n * 版    权:  Technologies Co., Ltd. Copyright YYYY-YYYY,  All rights reserved\n * 描    述:  <描述>\n * 修 改 人:  江钰锋 00501\n * 修改时间:  16/6/8\n * 跟踪单号:  <跟踪单号>\n * 修改单号:  <修改单号>\n * 修改内容:  <修改内容>\n */\n\npackage com.robin.lazy.sample;\n\nimport android.app.Application;\n\n/**\n * <一句话功能简述>\n *\n * @author 江钰锋 00501\n * @version [版本号, 16/6/8]\n * @see [相关类/方法]\n * @since [产品/模块版本]\n */\npublic class App extends Application{\n    @Override\n    public void onCreate() {\n        super.onCreate();\n    }\n}\n"
  },
  {
    "path": "Sample/src/main/java/com/robin/lazy/sample/MainActivity.java",
    "content": "package com.robin.lazy.sample;\n\nimport android.Manifest;\nimport android.os.Bundle;\nimport android.support.v7.app.AppCompatActivity;\nimport android.widget.TextView;\n\nimport com.karumi.dexter.Dexter;\nimport com.karumi.dexter.PermissionToken;\nimport com.karumi.dexter.listener.PermissionDeniedResponse;\nimport com.karumi.dexter.listener.PermissionGrantedResponse;\nimport com.karumi.dexter.listener.PermissionRequest;\nimport com.karumi.dexter.listener.single.PermissionListener;\nimport com.robin.lazy.sms.SmsObserver;\nimport com.robin.lazy.sms.SmsResponseCallback;\nimport com.robin.lazy.sms.VerificationCodeSmsFilter;\n\npublic class MainActivity extends AppCompatActivity implements SmsResponseCallback{\n\n    private TextView textView;\n    private SmsObserver smsObserver;\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_main);\n        smsObserver=new SmsObserver(this,this,new VerificationCodeSmsFilter(\"180\"));\n        smsObserver.registerSMSObserver();\n        textView=(TextView)findViewById(R.id.textView);\n        Dexter.withActivity(this)\n                .withPermission(Manifest.permission.READ_SMS)\n                .withListener(new PermissionListener() {\n                    @Override public void onPermissionGranted(PermissionGrantedResponse response) {/* ... */}\n                    @Override public void onPermissionDenied(PermissionDeniedResponse response) {/* ... */}\n                    @Override public void onPermissionRationaleShouldBeShown(PermissionRequest permission, PermissionToken token) {/* ... */}\n                }).check();\n    }\n\n    @Override\n    public void onCallbackSmsContent(String code) {\n        textView.setText(\"短信验证码:\"+code);\n    }\n\n    @Override\n    protected void onDestroy() {\n        super.onDestroy();\n        smsObserver.unregisterSMSObserver();\n    }\n}\n"
  },
  {
    "path": "Sample/src/main/res/layout/activity_main.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:paddingBottom=\"@dimen/activity_vertical_margin\"\n    android:paddingLeft=\"@dimen/activity_horizontal_margin\"\n    android:paddingRight=\"@dimen/activity_horizontal_margin\"\n    android:paddingTop=\"@dimen/activity_vertical_margin\"\n    tools:context=\"com.robin.lazy.sample.MainActivity\">\n\n    <TextView\n        android:id=\"@+id/textView\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"Hello World!\" />\n</RelativeLayout>\n"
  },
  {
    "path": "Sample/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"colorPrimary\">#3F51B5</color>\n    <color name=\"colorPrimaryDark\">#303F9F</color>\n    <color name=\"colorAccent\">#FF4081</color>\n</resources>\n"
  },
  {
    "path": "Sample/src/main/res/values/dimens.xml",
    "content": "<resources>\n    <!-- Default screen margins, per the Android Design guidelines. -->\n    <dimen name=\"activity_horizontal_margin\">16dp</dimen>\n    <dimen name=\"activity_vertical_margin\">16dp</dimen>\n</resources>\n"
  },
  {
    "path": "Sample/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\">SmsObserverForAndroid</string>\n</resources>\n"
  },
  {
    "path": "Sample/src/main/res/values/styles.xml",
    "content": "<resources>\n\n    <!-- Base application theme. -->\n    <style name=\"AppTheme\" parent=\"Theme.AppCompat.Light.DarkActionBar\">\n        <!-- Customize your theme here. -->\n        <item name=\"colorPrimary\">@color/colorPrimary</item>\n        <item name=\"colorPrimaryDark\">@color/colorPrimaryDark</item>\n        <item name=\"colorAccent\">@color/colorAccent</item>\n    </style>\n\n</resources>\n"
  },
  {
    "path": "Sample/src/main/res/values-w820dp/dimens.xml",
    "content": "<resources>\n    <!-- Example customization of dimensions originally defined in res/values/dimens.xml\n         (such as screen margins) for screens with more than 820dp of available width. This\n         would include 7\" and 10\" devices in landscape (~960dp and ~1280dp respectively). -->\n    <dimen name=\"activity_horizontal_margin\">64dp</dimen>\n</resources>\n"
  },
  {
    "path": "Sample/src/test/java/com/robin/lazy/sms/ExampleUnitTest.java",
    "content": "package com.robin.lazy.sample;\n\nimport org.junit.Test;\n\nimport static org.junit.Assert.*;\n\n/**\n * To work on unit tests, switch the Test Artifact in the Build Variants view.\n */\npublic class ExampleUnitTest {\n    @Test\n    public void addition_isCorrect() throws Exception {\n        assertEquals(4, 2 + 2);\n    }\n}"
  },
  {
    "path": "SmsObserverLibrary/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "SmsObserverLibrary/build.gradle",
    "content": "apply plugin: 'com.android.library'\n\nandroid {\n    compileSdkVersion 27\n    buildToolsVersion \"28.0.3\"\n\n    defaultConfig {\n        minSdkVersion 14\n        targetSdkVersion 27\n        versionCode 1\n        versionName \"1.0\"\n    }\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'\n        }\n    }\n}\n\ndependencies {\n    implementation fileTree(dir: 'libs', include: ['*.jar'])\n    testImplementation 'junit:junit:4.12'\n}\n"
  },
  {
    "path": "SmsObserverLibrary/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# By default, the flags in this file are appended to flags specified\n# in /Volumes/Work/androidIDE/sdk/tools/proguard/proguard-android.txt\n# You can edit the include path and order by changing the proguardFiles\n# directive in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# Add any project specific keep options here:\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n"
  },
  {
    "path": "SmsObserverLibrary/src/androidTest/java/com/robin/lazy/sample/ApplicationTest.java",
    "content": "package com.robin.lazy.sample;\n\nimport android.app.Application;\nimport android.test.ApplicationTestCase;\n\n/**\n * <a href=\"http://d.android.com/tools/testing/testing_android.html\">Testing Fundamentals</a>\n */\npublic class ApplicationTest extends ApplicationTestCase<Application> {\n    public ApplicationTest() {\n        super(Application.class);\n    }\n}"
  },
  {
    "path": "SmsObserverLibrary/src/main/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.robin.lazy.sms\">\n\n    <application\n        android:allowBackup=\"true\"\n        android:label=\"@string/app_name\"\n        android:supportsRtl=\"true\">\n\n    </application>\n\n</manifest>\n"
  },
  {
    "path": "SmsObserverLibrary/src/main/java/com/robin/lazy/sms/DefaultSmsFilter.java",
    "content": "/*\n * 文 件 名:  DefaultSmsFilter.java\n * 版    权:  Technologies Co., Ltd. Copyright YYYY-YYYY,  All rights reserved\n * 描    述:  <描述>\n * 修 改 人:  江钰锋 00501\n * 修改时间:  16/6/2\n * 跟踪单号:  <跟踪单号>\n * 修改单号:  <修改单号>\n * 修改内容:  <修改内容>\n */\n\npackage com.robin.lazy.sms;\n\n/**\n * 默认的短信过滤器\n *\n * @author 江钰锋 00501\n * @version [版本号, 16/6/2]\n * @see [相关类/方法]\n * @since [产品/模块版本]\n */\npublic class DefaultSmsFilter implements SmsFilter{\n\n    @Override\n    public String filter(String address, String smsContent) {\n        return smsContent;\n    }\n}\n"
  },
  {
    "path": "SmsObserverLibrary/src/main/java/com/robin/lazy/sms/SmsFilter.java",
    "content": "/*\n * 文 件 名:  SmsFilter.java\n * 版    权:  Technologies Co., Ltd. Copyright YYYY-YYYY,  All rights reserved\n * 描    述:  <描述>\n * 修 改 人:  江钰锋 00501\n * 修改时间:  16/6/2\n * 跟踪单号:  <跟踪单号>\n * 修改单号:  <修改单号>\n * 修改内容:  <修改内容>\n */\n\npackage com.robin.lazy.sms;\n\n/**\n * 短信过滤器\n *\n * @author 江钰锋 00501\n * @version [版本号, 16/6/2]\n * @see [相关类/方法]\n * @since [产品/模块版本]\n */\npublic interface SmsFilter {\n\n    /***\n     * 过滤方法\n     * @param address 发信人\n     * @param smsContent 短信内容\n     * @return 过滤处理后的短信信息\n     */\n    String filter(String address,String smsContent);\n}\n"
  },
  {
    "path": "SmsObserverLibrary/src/main/java/com/robin/lazy/sms/SmsHandler.java",
    "content": "package com.robin.lazy.sms;\n\nimport android.os.Handler;\nimport android.os.Message;\n\n/**\n * 短信处理\n *\n * @author 江钰锋 0152\n * @version [版本号, 2015年9月17日]\n * @see [相关类/方法]\n * @since [产品/模块版本]\n */\npublic class SmsHandler extends Handler {\n\n    private SmsResponseCallback mCallback;\n\n    /***\n     * 短信过滤器\n     */\n    private SmsFilter smsFilter;\n\n    public SmsHandler(SmsResponseCallback callback) {\n        this.mCallback = callback;\n    }\n\n    public SmsHandler(SmsResponseCallback callback, SmsFilter smsFilter) {\n        this(callback);\n        this.smsFilter = smsFilter;\n    }\n\n    /***\n     * 设置短信过滤器\n     * @param smsFilter 短信过滤器\n     */\n    public void setSmsFilter(SmsFilter smsFilter) {\n        this.smsFilter = smsFilter;\n    }\n\n    @Override\n    public void handleMessage(Message msg) {\n        super.handleMessage(msg);\n        if (msg.what == SmsObserver.MSG_RECEIVED_CODE) {\n            String[] smsInfos = (String[]) msg.obj;\n            if (smsInfos != null && smsInfos.length == 2 && mCallback != null) {\n                if (smsFilter == null) {\n                    smsFilter = new DefaultSmsFilter();\n                }\n                mCallback.onCallbackSmsContent(smsFilter.filter(smsInfos[0], smsInfos[1]));\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "SmsObserverLibrary/src/main/java/com/robin/lazy/sms/SmsObserver.java",
    "content": "package com.robin.lazy.sms;\n\nimport android.app.Activity;\nimport android.content.Context;\nimport android.database.ContentObserver;\nimport android.database.Cursor;\nimport android.net.Uri;\nimport android.util.Log;\n\n/***\n * 短信接收观察者\n *\n * @author 江钰锋 0152\n * @version [版本号, 2015年9月17日]\n * @see [相关类/方法]\n * @since [产品/模块版本]\n */\npublic class SmsObserver extends ContentObserver {\n\n    private Context mContext;\n    public static final int MSG_RECEIVED_CODE = 1001;\n    private SmsHandler mHandler;\n\n    /***\n     * 构造器\n     * @param context\n     * @param callback 短信接收器\n     * @param smsFilter 短信过滤器\n     */\n    public SmsObserver(Activity context, SmsResponseCallback callback,SmsFilter smsFilter) {\n        this(new SmsHandler(callback,smsFilter));\n        this.mContext = context;\n    }\n\n    public SmsObserver(Activity context, SmsResponseCallback callback) {\n        this(new SmsHandler(callback));\n        this.mContext = context;\n    }\n\n    public SmsObserver(SmsHandler handler) {\n        super(handler);\n        this.mHandler = handler;\n    }\n\n    /***\n     * 设置短信过滤器\n     * @param smsFilter\n     */\n    public void setSmsFilter(SmsFilter smsFilter) {\n        mHandler.setSmsFilter(smsFilter);\n    }\n\n    /***\n     * 注册短信变化观察者\n     *\n     * @see [类、类#方法、类#成员]\n     */\n    public void registerSMSObserver() {\n        Uri uri = Uri.parse(\"content://sms\");\n        if (mContext != null) {\n            mContext.getContentResolver().registerContentObserver(uri,\n                    true, this);\n        }\n    }\n\n    /***\n     * 注销短信变化观察者\n     *\n     * @see [类、类#方法、类#成员]\n     */\n    public void unregisterSMSObserver() {\n        if (mContext != null) {\n            mContext.getContentResolver().unregisterContentObserver(this);\n        }\n        if (mHandler != null) {\n            mHandler = null;\n        }\n    }\n\n    @Override\n    public void onChange(boolean selfChange, Uri uri) {\n        super.onChange(selfChange, uri);\n        if (uri.toString().equals(\"content://sms/raw\")) {\n            return;\n        }\n        Uri inboxUri = Uri.parse(\"content://sms/inbox\");//收件箱\n        try {\n            Cursor c = mContext.getContentResolver().query(inboxUri, null, null,\n                    null, \"date desc\");\n            if (c != null) {\n                if (c.moveToFirst()) {\n                    String address = c.getString(c.getColumnIndex(\"address\"));\n                    String body = c.getString(c.getColumnIndex(\"body\"));\n                    if (mHandler != null) {\n                        mHandler.obtainMessage(MSG_RECEIVED_CODE, new String[]{address, body})\n                                .sendToTarget();\n                    }\n                    Log.i(getClass().getName(), \"发件人为：\" + address + \" \" + \"短信内容为：\" + body);\n                }\n                c.close();\n            }\n        } catch (SecurityException e) {\n            Log.e(getClass().getName(), \"获取短信权限失败\", e);\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n    }\n\n}\n"
  },
  {
    "path": "SmsObserverLibrary/src/main/java/com/robin/lazy/sms/SmsResponseCallback.java",
    "content": "package com.robin.lazy.sms;\n\n/**\n * 短信接收器回调接口\n * \n * @author  江钰锋 0152\n * @version  [版本号, 2015年9月17日]\n * @see  [相关类/方法]\n * @since  [产品/模块版本]\n */\npublic interface SmsResponseCallback {\n\t\n\t/**\n\t * 返回短信内容\n\t * \n\t * @param smsContent\n\t * @see [类、类#方法、类#成员]\n\t */\n\tvoid onCallbackSmsContent(String smsContent);\n}\n"
  },
  {
    "path": "SmsObserverLibrary/src/main/java/com/robin/lazy/sms/VerificationCodeSmsFilter.java",
    "content": "/*\n * 文 件 名:  CerificationCode.java\n * 版    权:  Technologies Co., Ltd. Copyright YYYY-YYYY,  All rights reserved\n * 描    述:  <描述>\n * 修 改 人:  江钰锋 00501\n * 修改时间:  16/6/2\n * 跟踪单号:  <跟踪单号>\n * 修改单号:  <修改单号>\n * 修改内容:  <修改内容>\n */\n\npackage com.robin.lazy.sms;\n\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\n\n/**\n * 短信验证码过滤器\n *\n * @author 江钰锋 00501\n * @version [版本号, 16/6/2]\n * @see [相关类/方法]\n * @since [产品/模块版本]\n */\npublic class VerificationCodeSmsFilter implements SmsFilter {\n    /**\n     * 需要过滤的发短信的人\n     */\n    private String filterAddress;\n\n    public VerificationCodeSmsFilter(String filterAddress) {\n        this.filterAddress = filterAddress;\n    }\n\n    @Override\n    public String filter(String address, String smsContent) {\n        if (address.startsWith(filterAddress)) {\n            Pattern pattern = Pattern.compile(\"(\\\\d{4,8})\");//匹配4-8位的数字\n            Matcher matcher = pattern.matcher(smsContent);\n            if (matcher.find()) {\n                return matcher.group(0);\n            }\n        }\n        return null;\n    }\n}\n"
  },
  {
    "path": "SmsObserverLibrary/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\">SmsObserverLibrary</string>\n</resources>\n"
  },
  {
    "path": "SmsObserverLibrary/src/test/java/com/robin/lazy/sms/ExampleUnitTest.java",
    "content": "package com.robin.lazy.sample;\n\nimport org.junit.Test;\n\nimport static org.junit.Assert.*;\n\n/**\n * To work on unit tests, switch the Test Artifact in the Build Variants view.\n */\npublic class ExampleUnitTest {\n    @Test\n    public void addition_isCorrect() throws Exception {\n        assertEquals(4, 2 + 2);\n    }\n}"
  },
  {
    "path": "build.gradle",
    "content": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\n\nbuildscript {\n    repositories {\n        mavenCentral()\n        maven {\n            url 'http://maven.aliyun.com/nexus/content/groups/public/'\n        }\n        jcenter()\n        google()\n    }\n    dependencies {\n        classpath 'com.android.tools.build:gradle:3.4.1'\n\n        // NOTE: Do not place your application dependencies here; they belong\n        // in the individual module build.gradle files\n    }\n}\n\nallprojects {\n    repositories {\n        maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }\n        maven { url \"https://jitpack.io\" }\n        jcenter()\n        google()\n    }\n}\n\ntask clean(type: Delete) {\n    delete rootProject.buildDir\n}\n"
  },
  {
    "path": "gradle.properties",
    "content": "# Project-wide Gradle settings.\n\n# IDE (e.g. Android Studio) users:\n# Gradle settings configured through the IDE *will override*\n# any settings specified in this file.\n\n# For more details on how to configure your build environment visit\n# http://www.gradle.org/docs/current/userguide/build_environment.html\n\n# Specifies the JVM arguments used for the daemon process.\n# The setting is particularly useful for tweaking memory settings.\n# Default value: -Xmx10248m -XX:MaxPermSize=256m\n# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8\n\n# When configured, Gradle will run in incubating parallel mode.\n# This option should only be used with decoupled projects. More details, visit\n# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects\n# org.gradle.parallel=true"
  },
  {
    "path": "settings.gradle",
    "content": "include ':Sample', ':SmsObserverLibrary'\n"
  }
]