├── .gitignore ├── README.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── com │ │ └── loopeer │ │ └── projectdevelopmodule │ │ ├── DividerItemDecoration.java │ │ ├── MainActivity.java │ │ ├── SampleApp.java │ │ ├── flowlayout │ │ ├── FlowLayoutActivity.java │ │ └── SampleFlowAdapter.java │ │ ├── sample │ │ ├── AddressPickerActivity.java │ │ ├── AppUpdateActivity.java │ │ ├── BaseDevelopUtilsActivity.java │ │ ├── BottomDialogDateTimeViewActivity.java │ │ ├── BottomImagePickerViewActivity.java │ │ ├── CompatInsetImageHeaderActivity.java │ │ ├── CompatInsetToolbarActivity.java │ │ ├── CompatSingleInsetImageHeaderActivity.java │ │ ├── CompatSingleInsetToolbarActivity.java │ │ ├── FormItemViewActivity.java │ │ ├── FormValidator2Activity.kt │ │ ├── FormValidatorActivity.java │ │ ├── GuideTestActivity.java │ │ ├── ImageSwitcherTestActivity.java │ │ ├── ImageTextButtonActivity.java │ │ ├── SpringRVActivity.java │ │ ├── SpringSVActivity.java │ │ └── SpringViewGroupActivity.java │ │ └── validator │ │ ├── NamePhoneValidator.java │ │ ├── NamePhoneValidator2.kt │ │ └── PersonInfoValidator.java │ └── res │ ├── color │ ├── selector_color.xml │ ├── selector_text_color.xml │ └── text_color_phone_captcha.xml │ ├── drawable-xxhdpi │ ├── ic_authorize.png │ └── ic_example.png │ ├── drawable │ ├── bg_yellow_button.xml │ ├── btn_common.xml │ ├── divider_inset.xml │ ├── indicator_shape_selected_guide.xml │ └── indicator_shape_unselected_guide.xml │ ├── layout │ ├── acitivty_bottom_dialog_date_time.xml │ ├── activity_address_picker.xml │ ├── activity_base_develop_utils.xml │ ├── activity_bottom_image_picker_view.xml │ ├── activity_compat_inset_image_header.xml │ ├── activity_compat_inset_toolbar.xml │ ├── activity_flow_layout.xml │ ├── activity_form_item_view.xml │ ├── activity_form_validator.xml │ ├── activity_form_validator2.xml │ ├── activity_guide.xml │ ├── activity_image_text_button.xml │ ├── activity_main.xml │ ├── activity_single_compat_inset_image_header.xml │ ├── activity_single_compat_inset_toolbar.xml │ ├── activity_spring_rv.xml │ ├── activity_spring_sv.xml │ ├── activity_springviewgroup.xml │ ├── item_route.xml │ ├── list_item_spring_recyclerview.xml │ ├── view_inset_toolbar.xml │ └── view_single_inset_toolbar.xml │ ├── menu │ ├── menu_address_picker.xml │ ├── menu_bottom_time_actions.xml │ └── menu_validator_submit.xml │ ├── mipmap-hdpi │ └── ic_launcher.png │ ├── mipmap-mdpi │ └── ic_launcher.png │ ├── mipmap-xhdpi │ └── ic_launcher.png │ ├── mipmap-xxhdpi │ ├── ic_guide_1.png │ ├── ic_guide_2.png │ ├── ic_image_default.png │ ├── ic_launcher.png │ ├── image_girl.jpg │ └── img_test.jpg │ ├── mipmap-xxxhdpi │ └── ic_launcher.png │ ├── values-v19 │ └── styles.xml │ ├── values-v21 │ └── styles.xml │ ├── values-w820dp │ └── dimens.xml │ ├── values-zh │ └── strings.xml │ └── values │ ├── colors.xml │ ├── dimens.xml │ ├── ids.xml │ ├── strings.xml │ ├── styles.xml │ └── themes.xml ├── build.gradle ├── gradle.properties ├── gradle ├── android-maven-install.gradle ├── android-tasks.gradle ├── bintray.gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── library ├── addresspicker │ ├── build.gradle │ ├── gradle.properties │ ├── proguard-rules.pro │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ ├── assets │ │ └── city.json │ │ ├── java │ │ └── com │ │ │ └── loopeer │ │ │ └── addresspicker │ │ │ ├── Address.java │ │ │ ├── AddressPickerDelegate.java │ │ │ ├── AddressPickerDialog.java │ │ │ ├── AddressPickerView.java │ │ │ ├── AddressUtils.java │ │ │ ├── AlertDialogDelegate.java │ │ │ ├── BottomDialogDelegate.java │ │ │ ├── OnAddressPickListener.java │ │ │ └── StringPicker.java │ │ └── res │ │ ├── drawable │ │ └── shape_dash_line.xml │ │ ├── layout │ │ ├── dialog_bottom_address_picker.xml │ │ ├── view_address_picker.xml │ │ └── view_divider_dash.xml │ │ └── values │ │ ├── colors.xml │ │ ├── defaults.xml │ │ └── strings.xml ├── appupdate │ ├── build.gradle │ ├── gradle.properties │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ └── com.loopeer.appupdate │ │ │ ├── ApkDownloadService.java │ │ │ └── AppUpdate.java │ │ └── res │ │ ├── values-zh │ │ └── strings.xml │ │ ├── values │ │ └── strings.xml │ │ └── xml │ │ └── file_paths.xml ├── bottomdialog │ ├── build.gradle │ ├── gradle.properties │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ └── com.loopeer.bottomdialog │ │ │ ├── BottomDateTimeDialog.java │ │ │ ├── BottomDialog.java │ │ │ ├── DateTimeView.java │ │ │ └── NumberPickerUtils.java │ │ └── res │ │ ├── anim │ │ ├── slide_in_bottom.xml │ │ └── slide_out_bottom.xml │ │ ├── drawable │ │ └── shape_dash_line.xml │ │ ├── layout │ │ ├── dialog_date_time.xml │ │ ├── view_date_time_picker.xml │ │ └── view_divider_dash.xml │ │ ├── values-en │ │ └── strings.xml │ │ └── values │ │ ├── attrs.xml │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── strings.xml │ │ └── styles.xml ├── bottomimagepicker │ ├── .gitignore │ ├── build.gradle │ ├── gradle.properties │ ├── proguard-rules.pro │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ └── com │ │ │ └── loopeer │ │ │ └── bottomimagepicker │ │ │ ├── BottomImagePickerView.java │ │ │ ├── GridLayoutItemDecoration.java │ │ │ ├── Image.java │ │ │ ├── ImageAdapter.java │ │ │ ├── ImageFolder.java │ │ │ ├── LoaderManagerImpl.java │ │ │ ├── MathUtils.java │ │ │ ├── PickerBottomBehavior.java │ │ │ ├── PickerFragment.java │ │ │ ├── PickerFragmentStatePagerAdapter.java │ │ │ ├── ScaleImageView.java │ │ │ └── SlideCustomViewPager.java │ │ └── res │ │ ├── drawable-xxhdpi │ │ ├── ic_image_default.png │ │ ├── ic_pull_down.png │ │ └── ic_pull_up.png │ │ ├── layout │ │ ├── fragment_picker.xml │ │ ├── list_item_image.xml │ │ └── view_bottom_image_picker.xml │ │ └── values │ │ └── strings.xml ├── compatinset │ ├── build.gradle │ ├── gradle.properties │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ └── com │ │ │ └── loopeer │ │ │ └── compatinset │ │ │ ├── InsetCoordinatorLayout.java │ │ │ ├── InsetFragmentTabHost.java │ │ │ ├── InsetFramelayout.java │ │ │ ├── InsetHelper.java │ │ │ ├── InsetHolderView.java │ │ │ ├── InsetLinearLayout.java │ │ │ ├── InsetRelativeLayout.java │ │ │ ├── InsetScrollView.java │ │ │ ├── InsetViewAnimator.java │ │ │ ├── MainActivity1.java │ │ │ ├── SingleInsetHolderView.java │ │ │ ├── SoftInputHelper.java │ │ │ ├── ViewUtils.java │ │ │ └── statusbar │ │ │ ├── IStatusBarFontHelper.java │ │ │ ├── StatusBarFontHelper.java │ │ │ └── impl │ │ │ ├── AndroidMHelper.java │ │ │ ├── FlymeHelper.java │ │ │ └── MIUIHelper.java │ │ └── res │ │ ├── values-v19 │ │ └── booleans.xml │ │ ├── values-v21 │ │ └── booleans.xml │ │ └── values │ │ ├── attrs.xml │ │ ├── booleans.xml │ │ ├── strings.xml │ │ └── styles.xml ├── databindpack │ ├── build.gradle │ ├── gradle.properties │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ └── com.loopeer.databindpack │ │ │ ├── package.info │ │ │ └── validator │ │ │ ├── IFormValidator.java │ │ │ ├── IValidator.java │ │ │ ├── ObservableModel.java │ │ │ └── ObservableValidator.java │ │ └── res │ │ └── values │ │ └── strings.xml ├── developutils │ ├── build.gradle │ ├── gradle.properties │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ └── com.loopeer.developutils │ │ │ ├── BankNoSpaceWatcher.java │ │ │ ├── CacheUtils.java │ │ │ ├── CaptchaHelper.java │ │ │ ├── ClickSpanHelper.java │ │ │ ├── ColorClickableSpan.java │ │ │ ├── DoubleClickHelper.java │ │ │ ├── EditTextLengthWatcher.java │ │ │ ├── PermissionUtils.java │ │ │ └── RegexUtils.java │ │ └── res │ │ └── values │ │ └── strings.xml ├── flowlayout │ ├── .gitignore │ ├── build.gradle │ ├── gradle.properties │ ├── proguard-rules.pro │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ └── com │ │ │ └── loopeer │ │ │ └── flowlayout │ │ │ ├── FlowAdapter.java │ │ │ ├── FlowLayout.java │ │ │ └── SimpleTextFlowAdapter.java │ │ └── res │ │ └── values │ │ ├── attr.xml │ │ └── strings.xml ├── formitemview │ ├── .gitignore │ ├── build.gradle │ ├── gradle.properties │ ├── proguard-rules.pro │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ └── com │ │ │ └── loopeer │ │ │ └── formitemview │ │ │ ├── AbstractFormItemView.java │ │ │ ├── ForegroundLinearLayout.java │ │ │ ├── FormEditItem.java │ │ │ ├── FormItemView.java │ │ │ ├── FormTextItem.java │ │ │ └── databinding │ │ │ ├── FormEditItemBindingAdapter.java │ │ │ ├── FormItemAdapter.java │ │ │ └── FormTextItemBindingAdapter.java │ │ └── res │ │ ├── drawable-xxhdpi │ │ └── ic_arrow_right_grey.png │ │ ├── layout │ │ ├── form_edit_item.xml │ │ └── form_text_item.xml │ │ └── values │ │ ├── attrs.xml │ │ ├── colors.xml │ │ ├── defaults.xml │ │ ├── dimens.xml │ │ ├── strings.xml │ │ └── styles.xml ├── guideactivity │ ├── .gitignore │ ├── build.gradle │ ├── gradle.properties │ ├── proguard-rules.pro │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ └── com │ │ │ └── loopeer │ │ │ └── guideactivity │ │ │ ├── AbsGuideActivity.java │ │ │ └── PageIndicator.java │ │ └── res │ │ └── values │ │ ├── dimens.xml │ │ └── strings.xml ├── imageswitcher │ ├── .gitignore │ ├── build.gradle │ ├── gradle.properties │ ├── proguard-rules.pro │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ └── com │ │ │ └── loopeer │ │ │ └── imageswitcher │ │ │ ├── ImageDisplayHelper.java │ │ │ ├── ImageSwitcherActivity.java │ │ │ ├── ImagesSwitcherAdapter.java │ │ │ ├── MutipleTouchViewPager.java │ │ │ ├── NavigatorImage.java │ │ │ ├── OnTabOneClickListener.java │ │ │ ├── ScaleImageFragment.java │ │ │ └── photodraweeview │ │ │ ├── Attacher.java │ │ │ ├── DefaultOnDoubleTapListener.java │ │ │ ├── IAttacher.java │ │ │ ├── OnPhotoTapListener.java │ │ │ ├── OnScaleChangeListener.java │ │ │ ├── OnScaleDragGestureListener.java │ │ │ ├── OnViewTapListener.java │ │ │ ├── PhotoDraweeView.java │ │ │ └── ScaleDragDetector.java │ │ └── res │ │ ├── drawable-xxhdpi │ │ └── ic_image_default.png │ │ ├── layout │ │ ├── activity_image_switcher.xml │ │ └── fragment_scale_image.xml │ │ └── values │ │ ├── strings.xml │ │ └── themes.xml ├── imagetextbutton │ ├── .gitignore │ ├── build.gradle │ ├── gradle.properties │ ├── proguard-rules.pro │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ └── com │ │ │ └── loopeer │ │ │ └── imagetextbutton │ │ │ └── ImageTextButton.java │ │ └── res │ │ ├── layout │ │ └── image_text_button.xml │ │ └── values │ │ ├── attrs.xml │ │ ├── colors.xml │ │ └── strings.xml ├── springviewgroup │ ├── .gitignore │ ├── build.gradle │ ├── gradle.properties │ ├── proguard-rules.pro │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ └── com │ │ │ └── loopeer │ │ │ └── springviewgroup │ │ │ ├── SpringRecyclerView.java │ │ │ └── SpringScrollView.java │ │ └── res │ │ └── values │ │ └── strings.xml └── validator2 │ ├── .gitignore │ ├── build.gradle │ ├── gradle.properties │ ├── proguard-rules.pro │ └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── com │ │ └── loopeer │ │ └── validator2 │ │ ├── EditTextDelegate.kt │ │ ├── IFormValidator.kt │ │ ├── IValidator.kt │ │ ├── ObservableModel.kt │ │ ├── ObservableValidator.kt │ │ ├── SimpleDelegate.kt │ │ └── TextViewDelegate.kt │ └── res │ └── values │ └── strings.xml ├── release-bintray.gradle ├── release.gradle ├── screenshot ├── address_picker │ └── address_picker_dialog.gif ├── bottom_dialog │ └── bottom_dialog_date_time.gif ├── develop_util │ ├── util_bank_no_space_watcher.gif │ ├── util_captcha_helper.gif │ └── util_click_span_helper.png ├── image_switcher │ └── image_switcher.gif ├── inset_image │ ├── inset_image_16.png │ ├── inset_image_19.png │ ├── inset_image_23.png │ ├── inset_tool_16.png │ ├── inset_tool_19.png │ ├── inset_tool_23.png │ ├── single_inset_image_23.png │ └── single_inset_tool_23.png └── spring_viewgroup │ ├── less_item_anim.gif │ └── more_item_anim.gif └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | # Specific files to exclude 2 | dist 3 | com_crashlytics_export_strings.xml 4 | keys.xml 5 | #*.keystore 6 | #*.jks 7 | keystore/ 8 | 9 | ### Android 10 | ########### 11 | # built application files 12 | *.apk 13 | *.ap_ 14 | 15 | # files for the dex VM 16 | *.dex 17 | 18 | # Java class files 19 | *.class 20 | 21 | # generated files 22 | bin/ 23 | gen/ 24 | 25 | # Local configuration file (sdk path, etc) 26 | local.properties 27 | #gradle.properties 28 | keystore.properties 29 | 30 | ### Mac 31 | .DS_store 32 | 33 | ### Linux 34 | ######### 35 | !.gitignore 36 | *~ 37 | 38 | ### Windows 39 | ############ 40 | # Windows image file caches 41 | Thumbs.db 42 | ehthumbs.db 43 | 44 | # Folder config file 45 | Desktop.ini 46 | 47 | # Recycle Bin used on file shares 48 | $RECYCLE.BIN/ 49 | 50 | ### IntelliJ 51 | *.iml 52 | *.ipr 53 | *.iws 54 | .idea/ 55 | 56 | ### Gradle 57 | .gradle/ 58 | build/ 59 | out/ 60 | 61 | #Maven 62 | target 63 | release.properties 64 | pom.xml.* 65 | 66 | ### AppEngine 67 | google_generated/ 68 | datanucleus.log 69 | captures/ 70 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | apply plugin: 'kotlin-android' 3 | apply plugin: 'kotlin-android-extensions' 4 | apply plugin: 'kotlin-kapt' 5 | 6 | android { 7 | compileSdkVersion configs.compileSdkVersion 8 | buildToolsVersion configs.buildToolsVersion 9 | 10 | defaultConfig { 11 | applicationId "com.loopeer.projectdevelopmodule" 12 | minSdkVersion configs.minSdkVersion 13 | targetSdkVersion configs.targetSdkVersion 14 | versionCode configs.versionCode 15 | versionName configs.versionName 16 | } 17 | buildTypes { 18 | release { 19 | minifyEnabled false 20 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 21 | } 22 | } 23 | 24 | dataBinding { 25 | enabled = true 26 | } 27 | 28 | lintOptions { 29 | abortOnError false 30 | } 31 | 32 | compileOptions { 33 | sourceCompatibility JavaVersion.VERSION_1_8 34 | targetCompatibility JavaVersion.VERSION_1_8 35 | } 36 | } 37 | 38 | dependencies { 39 | implementation fileTree(dir: 'libs', include: ['*.jar']) 40 | implementation deps.appcompatV7 41 | implementation project(':library:compatinset') 42 | implementation project(':library:bottomdialog') 43 | implementation project(':library:addresspicker') 44 | implementation project(':library:guideactivity') 45 | implementation project(':library:appupdate') 46 | implementation project(':library:flowlayout') 47 | implementation project(':library:developutils') 48 | implementation project(':library:imageswitcher') 49 | implementation project(':library:databindpack') 50 | implementation project(':library:springviewgroup') 51 | implementation project(':library:formitemview') 52 | implementation project(':library:bottomimagepicker') 53 | implementation project(':library:imagetextbutton') 54 | implementation project(':library:validator2') 55 | 56 | implementation deps.kotlinStdlib 57 | kapt 'com.android.databinding:compiler:3.0.0' 58 | } 59 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in /Users/todou/Library/Android/sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /app/src/main/java/com/loopeer/projectdevelopmodule/SampleApp.java: -------------------------------------------------------------------------------- 1 | package com.loopeer.projectdevelopmodule; 2 | 3 | import android.app.Application; 4 | 5 | import com.facebook.drawee.backends.pipeline.Fresco; 6 | import com.facebook.imagepipeline.core.ImagePipelineConfig; 7 | 8 | public class SampleApp extends Application { 9 | 10 | @Override 11 | public void onCreate() { 12 | super.onCreate(); 13 | 14 | ImagePipelineConfig config = ImagePipelineConfig.newBuilder(getApplicationContext()) 15 | .setDownsampleEnabled(true) 16 | .build(); 17 | Fresco.initialize(this, config); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /app/src/main/java/com/loopeer/projectdevelopmodule/flowlayout/FlowLayoutActivity.java: -------------------------------------------------------------------------------- 1 | package com.loopeer.projectdevelopmodule.flowlayout; 2 | 3 | import android.os.Bundle; 4 | import android.support.v7.app.AppCompatActivity; 5 | 6 | import com.loopeer.flowlayout.FlowLayout; 7 | import com.loopeer.projectdevelopmodule.R; 8 | 9 | public class FlowLayoutActivity extends AppCompatActivity { 10 | 11 | private static final String[] FLOW_CONTENTS1 = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11"}; 12 | private static final String[] FLOW_DESCS1 = {"+1", 13 | "+2", "+5", "+3"}; 14 | 15 | private static final String[] FLOW_CONTENTS2 = {"1", "2", "3", "4", "5", "6", "7"}; 16 | private static final String[] FLOW_DESCS2 = {"+3", 17 | "+4", "+4", "+5"}; 18 | 19 | FlowLayout mFlowLayout1; 20 | FlowLayout mFlowLayout2; 21 | 22 | @Override 23 | protected void onCreate(Bundle savedInstanceState) { 24 | super.onCreate(savedInstanceState); 25 | setContentView(R.layout.activity_flow_layout); 26 | mFlowLayout1 = (FlowLayout) findViewById(R.id.layout_flow1); 27 | mFlowLayout1.setAdapter(new SampleFlowAdapter(mFlowLayout1, this, R.style.FlowDescStyle, FLOW_CONTENTS1, FLOW_DESCS1)); 28 | mFlowLayout2 = (FlowLayout) findViewById(R.id.layout_flow2); 29 | mFlowLayout2.setAdapter(new SampleFlowAdapter(mFlowLayout2, this, R.style.FlowDescStyle, FLOW_CONTENTS2, FLOW_DESCS2)); 30 | } 31 | 32 | } 33 | -------------------------------------------------------------------------------- /app/src/main/java/com/loopeer/projectdevelopmodule/flowlayout/SampleFlowAdapter.java: -------------------------------------------------------------------------------- 1 | package com.loopeer.projectdevelopmodule.flowlayout; 2 | 3 | import android.content.Context; 4 | 5 | import com.loopeer.flowlayout.FlowLayout; 6 | import com.loopeer.flowlayout.SimpleTextFlowAdapter; 7 | 8 | public class SampleFlowAdapter extends SimpleTextFlowAdapter { 9 | 10 | private String[] mContents; 11 | private String[] mDescs; 12 | 13 | public SampleFlowAdapter(FlowLayout flowLayout, Context context, int styleRes, 14 | String[] contents, String[] descs) { 15 | super(flowLayout, context, styleRes); 16 | mContents = contents; 17 | mDescs = descs; 18 | } 19 | 20 | @Override 21 | public String getDesc(int position) { 22 | if (position < mDescs.length) 23 | return mDescs[position]; 24 | return null; 25 | } 26 | 27 | @Override 28 | public String[] getContents() { 29 | return mContents; 30 | } 31 | 32 | @Override 33 | public int getItemCount() { 34 | return mContents.length; 35 | } 36 | 37 | @Override 38 | public int getSelectedCount() { 39 | return mDescs.length; 40 | } 41 | 42 | } 43 | -------------------------------------------------------------------------------- /app/src/main/java/com/loopeer/projectdevelopmodule/sample/AppUpdateActivity.java: -------------------------------------------------------------------------------- 1 | package com.loopeer.projectdevelopmodule.sample; 2 | 3 | import android.os.Bundle; 4 | import android.support.annotation.Nullable; 5 | import android.support.v7.app.AppCompatActivity; 6 | 7 | import com.loopeer.appupdate.AppUpdate; 8 | import com.loopeer.projectdevelopmodule.BuildConfig; 9 | import com.loopeer.projectdevelopmodule.R; 10 | 11 | public class AppUpdateActivity extends AppCompatActivity { 12 | 13 | private static final String APP_URL = "https://pro-app-qn.fir.im/dfdb155d9337fe25a9a0a183e6ec1599802bf5b4.apk?attname=loopeerRelease-6.4.0_96-release.apk_6.4.0.apk&e=1510548228&token=LOvmia8oXF4xnLh0IdH05XMYpH6ENHNpARlmPc-T:t7oySraABVRkklHVwx2-wH7jx8I="; 14 | 15 | @Override 16 | protected void onCreate(@Nullable Bundle savedInstanceState) { 17 | super.onCreate(savedInstanceState); 18 | 19 | AppUpdate.apply(this, "this is message", "this is description", 20 | APP_URL, BuildConfig.APPLICATION_ID, R.mipmap.ic_launcher, 21 | "com.loopeer.projectdevelopmodule.apkDownload.fileProvider"); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /app/src/main/java/com/loopeer/projectdevelopmodule/sample/CompatInsetImageHeaderActivity.java: -------------------------------------------------------------------------------- 1 | package com.loopeer.projectdevelopmodule.sample; 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.widget.TextView; 8 | 9 | import com.loopeer.projectdevelopmodule.R; 10 | 11 | public class CompatInsetImageHeaderActivity extends AppCompatActivity { 12 | 13 | public static void startActivity(Context context) { 14 | context.startActivity(new Intent(context, CompatInsetImageHeaderActivity.class)); 15 | } 16 | @Override 17 | protected void onCreate(Bundle savedInstanceState) { 18 | super.onCreate(savedInstanceState); 19 | setContentView(R.layout.activity_compat_inset_image_header); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /app/src/main/java/com/loopeer/projectdevelopmodule/sample/CompatInsetToolbarActivity.java: -------------------------------------------------------------------------------- 1 | package com.loopeer.projectdevelopmodule.sample; 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.support.v7.widget.Toolbar; 8 | import android.widget.TextView; 9 | 10 | import com.loopeer.projectdevelopmodule.R; 11 | 12 | public class CompatInsetToolbarActivity extends AppCompatActivity { 13 | 14 | public static void startActivity(Context context) { 15 | context.startActivity(new Intent(context, CompatInsetToolbarActivity.class)); 16 | } 17 | 18 | @Override 19 | protected void onCreate(Bundle savedInstanceState) { 20 | super.onCreate(savedInstanceState); 21 | setContentView(R.layout.activity_compat_inset_toolbar); 22 | 23 | Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 24 | setSupportActionBar(toolbar); 25 | getSupportActionBar().setDisplayHomeAsUpEnabled(true); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /app/src/main/java/com/loopeer/projectdevelopmodule/sample/CompatSingleInsetImageHeaderActivity.java: -------------------------------------------------------------------------------- 1 | package com.loopeer.projectdevelopmodule.sample; 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.widget.TextView; 8 | 9 | import com.loopeer.projectdevelopmodule.R; 10 | 11 | public class CompatSingleInsetImageHeaderActivity extends AppCompatActivity { 12 | 13 | public static void startActivity(Context context) { 14 | context.startActivity(new Intent(context, CompatSingleInsetImageHeaderActivity.class)); 15 | } 16 | @Override 17 | protected void onCreate(Bundle savedInstanceState) { 18 | super.onCreate(savedInstanceState); 19 | setContentView(R.layout.activity_single_compat_inset_image_header); 20 | 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/src/main/java/com/loopeer/projectdevelopmodule/sample/CompatSingleInsetToolbarActivity.java: -------------------------------------------------------------------------------- 1 | package com.loopeer.projectdevelopmodule.sample; 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.support.v7.widget.Toolbar; 8 | import android.widget.TextView; 9 | 10 | import com.loopeer.projectdevelopmodule.R; 11 | 12 | public class CompatSingleInsetToolbarActivity extends AppCompatActivity { 13 | 14 | public static void startActivity(Context context) { 15 | context.startActivity(new Intent(context, CompatSingleInsetToolbarActivity.class)); 16 | } 17 | 18 | @Override 19 | protected void onCreate(Bundle savedInstanceState) { 20 | super.onCreate(savedInstanceState); 21 | setContentView(R.layout.activity_single_compat_inset_toolbar); 22 | 23 | Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 24 | setSupportActionBar(toolbar); 25 | getSupportActionBar().setDisplayHomeAsUpEnabled(true); 26 | 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /app/src/main/java/com/loopeer/projectdevelopmodule/sample/FormValidator2Activity.kt: -------------------------------------------------------------------------------- 1 | package com.loopeer.projectdevelopmodule.sample 2 | 3 | import android.os.Bundle 4 | import android.support.v7.app.AppCompatActivity 5 | import android.view.Menu 6 | import android.view.MenuItem 7 | import android.view.View 8 | import android.widget.Toast 9 | import com.loopeer.projectdevelopmodule.R 10 | import com.loopeer.projectdevelopmodule.validator.NamePhoneValidator2 11 | 12 | class FormValidator2Activity : AppCompatActivity() { 13 | 14 | private lateinit var validator : NamePhoneValidator2 15 | 16 | override fun onCreate(savedInstanceState: Bundle?) { 17 | super.onCreate(savedInstanceState) 18 | setContentView(R.layout.activity_form_validator2) 19 | validator = NamePhoneValidator2(this) 20 | validator.addEnableListener { invalidateOptionsMenu() } 21 | validator.notifyEnable() 22 | } 23 | 24 | fun onBtnClick(view: View) { 25 | Toast.makeText(this, validator.name + " : " + validator.phone, Toast.LENGTH_SHORT).show() 26 | } 27 | 28 | override fun onCreateOptionsMenu(menu: Menu): Boolean { 29 | menuInflater.inflate(R.menu.menu_validator_submit, menu) 30 | return super.onCreateOptionsMenu(menu) 31 | } 32 | 33 | override fun onPrepareOptionsMenu(menu: Menu): Boolean { 34 | menu.findItem(R.id.menu_validator_submit).isEnabled = validator.isEnable 35 | return super.onPrepareOptionsMenu(menu) 36 | } 37 | 38 | override fun onOptionsItemSelected(item: MenuItem): Boolean { 39 | 40 | return super.onOptionsItemSelected(item) 41 | } 42 | 43 | override fun onBackPressed() { 44 | 45 | super.onBackPressed() 46 | } 47 | 48 | 49 | } 50 | -------------------------------------------------------------------------------- /app/src/main/java/com/loopeer/projectdevelopmodule/sample/FormValidatorActivity.java: -------------------------------------------------------------------------------- 1 | package com.loopeer.projectdevelopmodule.sample; 2 | 3 | import android.databinding.DataBindingUtil; 4 | import android.os.Bundle; 5 | import android.support.v7.app.AppCompatActivity; 6 | import android.view.Menu; 7 | import android.view.MenuItem; 8 | import android.view.View; 9 | import android.widget.Toast; 10 | 11 | import com.loopeer.projectdevelopmodule.R; 12 | import com.loopeer.projectdevelopmodule.databinding.ActivityFormValidatorBinding; 13 | import com.loopeer.projectdevelopmodule.validator.NamePhoneValidator; 14 | 15 | public class FormValidatorActivity extends AppCompatActivity { 16 | 17 | private NamePhoneValidator mValidator; 18 | private ActivityFormValidatorBinding mBinding; 19 | 20 | @Override 21 | protected void onCreate(Bundle savedInstanceState) { 22 | super.onCreate(savedInstanceState); 23 | mBinding = DataBindingUtil.setContentView(this, R.layout.activity_form_validator); 24 | mValidator = new NamePhoneValidator(); 25 | mBinding.setValidator(mValidator); 26 | 27 | mValidator.setEnableListener(enable -> invalidateOptionsMenu()); 28 | } 29 | 30 | public void onBtnClick(View view) { 31 | Toast.makeText(this, mValidator.getName() + " : " + mValidator.getPhone(), Toast.LENGTH_SHORT).show(); 32 | } 33 | 34 | @Override 35 | public boolean onCreateOptionsMenu(Menu menu) { 36 | getMenuInflater().inflate(R.menu.menu_validator_submit, menu); 37 | return super.onCreateOptionsMenu(menu); 38 | } 39 | 40 | @Override 41 | public boolean onPrepareOptionsMenu(Menu menu) { 42 | menu.findItem(R.id.menu_validator_submit).setEnabled(mValidator.enable); 43 | return super.onPrepareOptionsMenu(menu); 44 | } 45 | 46 | @Override 47 | public boolean onOptionsItemSelected(MenuItem item) { 48 | 49 | return super.onOptionsItemSelected(item); 50 | } 51 | 52 | @Override 53 | public void onBackPressed() { 54 | 55 | super.onBackPressed(); 56 | } 57 | 58 | 59 | } 60 | -------------------------------------------------------------------------------- /app/src/main/java/com/loopeer/projectdevelopmodule/sample/GuideTestActivity.java: -------------------------------------------------------------------------------- 1 | package com.loopeer.projectdevelopmodule.sample; 2 | 3 | 4 | import android.os.Bundle; 5 | import android.support.v4.view.ViewPager; 6 | import android.view.View; 7 | import android.widget.Button; 8 | import android.widget.FrameLayout; 9 | 10 | import com.loopeer.guideactivity.AbsGuideActivity; 11 | import com.loopeer.projectdevelopmodule.R; 12 | 13 | public class GuideTestActivity extends AbsGuideActivity{ 14 | 15 | private Button mBtnEnter; 16 | 17 | @Override 18 | protected void onCreate(Bundle savedInstanceState) { 19 | setContentView(R.layout.activity_guide); 20 | mViewPager = (ViewPager) findViewById(R.id.viewpager); 21 | mContainer = (FrameLayout) findViewById(R.id.container); 22 | mBtnEnter=(Button)findViewById(R.id.btn_enter); 23 | setPics(new int[]{R.mipmap.ic_guide_1, R.mipmap.ic_guide_2}); 24 | 25 | super.onCreate(savedInstanceState); 26 | 27 | setIndicatorDrawable(true, R.drawable.indicator_shape_selected_guide, 28 | R.drawable.indicator_shape_unselected_guide); 29 | } 30 | 31 | @Override 32 | public void onPageSelected(int position) { 33 | super.onPageSelected(position); 34 | if (position == sPics.length - 1) { 35 | mBtnEnter.setVisibility(View.VISIBLE); 36 | } else { 37 | mBtnEnter.setVisibility(View.INVISIBLE); 38 | } 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /app/src/main/java/com/loopeer/projectdevelopmodule/sample/ImageSwitcherTestActivity.java: -------------------------------------------------------------------------------- 1 | package com.loopeer.projectdevelopmodule.sample; 2 | 3 | import android.os.Bundle; 4 | import android.support.v7.app.AppCompatActivity; 5 | 6 | import com.loopeer.imageswitcher.NavigatorImage; 7 | import com.loopeer.projectdevelopmodule.R; 8 | 9 | import java.util.Arrays; 10 | 11 | public class ImageSwitcherTestActivity extends AppCompatActivity { 12 | 13 | private static final String[] sImages = new String[]{ 14 | "http://ww2.sinaimg.cn/large/610dc034gw1f9zjk8iaz2j20u011hgsc.jpg", 15 | "http://ww2.sinaimg.cn/large/610dc034jw1f9vyl2fqi0j20u011habc.jpg", 16 | "http://ww2.sinaimg.cn/large/610dc034jw1f9us52puzsj20u00u0jtd.jpg", 17 | "http://ww3.sinaimg.cn/large/610dc034jw1f9tmhxq87lj20u011htae.jpg", 18 | "http://ww3.sinaimg.cn/large/610dc034gw1f9shm1cajkj20u00jy408.jpg", 19 | "http://ww3.sinaimg.cn/large/610dc034jw1f9rc3qcfm1j20u011hmyk.jpg", 20 | "http://ww3.sinaimg.cn/large/610dc034jw1f9nuk0nvrdj20u011haci.jpg"}; 21 | 22 | @Override 23 | public void onCreate(Bundle savedInstanceState) { 24 | super.onCreate(savedInstanceState); 25 | 26 | NavigatorImage.startImageSwitchActivity(this, Arrays.asList(sImages), 3, R.mipmap.ic_image_default); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /app/src/main/java/com/loopeer/projectdevelopmodule/sample/ImageTextButtonActivity.java: -------------------------------------------------------------------------------- 1 | package com.loopeer.projectdevelopmodule.sample; 2 | 3 | import android.os.Bundle; 4 | import android.support.annotation.Nullable; 5 | import android.support.v7.app.AppCompatActivity; 6 | 7 | import com.loopeer.imagetextbutton.ImageTextButton; 8 | import com.loopeer.projectdevelopmodule.R; 9 | 10 | /** 11 | * Created by loopeer on 2017/8/3. 12 | */ 13 | 14 | public class ImageTextButtonActivity extends AppCompatActivity { 15 | @Override 16 | protected void onCreate(@Nullable Bundle savedInstanceState) { 17 | super.onCreate(savedInstanceState); 18 | setContentView(R.layout.activity_image_text_button); 19 | ImageTextButton imageTextButton; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /app/src/main/java/com/loopeer/projectdevelopmodule/sample/SpringSVActivity.java: -------------------------------------------------------------------------------- 1 | package com.loopeer.projectdevelopmodule.sample; 2 | 3 | 4 | import android.os.Bundle; 5 | import android.support.annotation.Nullable; 6 | import android.support.v7.app.AppCompatActivity; 7 | import android.view.View; 8 | import android.widget.Toast; 9 | 10 | import com.loopeer.projectdevelopmodule.R; 11 | 12 | public class SpringSVActivity extends AppCompatActivity { 13 | 14 | @Override 15 | protected void onCreate(@Nullable Bundle savedInstanceState) { 16 | super.onCreate(savedInstanceState); 17 | 18 | setContentView(R.layout.activity_spring_sv); 19 | 20 | findViewById(R.id.item_one).setOnClickListener(new View.OnClickListener() { 21 | @Override 22 | public void onClick(View v) { 23 | Toast.makeText(v.getContext(), "one", Toast.LENGTH_SHORT).show(); 24 | } 25 | }); 26 | 27 | findViewById(R.id.item_two).setOnClickListener(new View.OnClickListener() { 28 | @Override 29 | public void onClick(View v) { 30 | Toast.makeText(v.getContext(), "two", Toast.LENGTH_SHORT).show(); 31 | } 32 | }); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /app/src/main/java/com/loopeer/projectdevelopmodule/sample/SpringViewGroupActivity.java: -------------------------------------------------------------------------------- 1 | package com.loopeer.projectdevelopmodule.sample; 2 | 3 | 4 | import android.content.Intent; 5 | import android.os.Bundle; 6 | import android.support.annotation.Nullable; 7 | import android.support.v7.app.AppCompatActivity; 8 | import android.view.View; 9 | 10 | import com.loopeer.projectdevelopmodule.R; 11 | 12 | public class SpringViewGroupActivity extends AppCompatActivity { 13 | @Override 14 | protected void onCreate(@Nullable Bundle savedInstanceState) { 15 | super.onCreate(savedInstanceState); 16 | 17 | setContentView(R.layout.activity_springviewgroup); 18 | } 19 | 20 | public void SRVClick(View view) { 21 | startActivity(new Intent(this, SpringRVActivity.class)); 22 | } 23 | 24 | public void SSVClick(View view) { 25 | startActivity(new Intent(this, SpringSVActivity.class)); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /app/src/main/java/com/loopeer/projectdevelopmodule/validator/NamePhoneValidator.java: -------------------------------------------------------------------------------- 1 | package com.loopeer.projectdevelopmodule.validator; 2 | 3 | 4 | import android.databinding.Bindable; 5 | import android.text.TextUtils; 6 | 7 | import com.loopeer.databindpack.validator.ObservableValidator; 8 | 9 | public class NamePhoneValidator extends ObservableValidator{ 10 | 11 | public String name; 12 | public String phone; 13 | 14 | @Bindable 15 | public String getName() { 16 | return name; 17 | } 18 | 19 | public void setName(String name) { 20 | this.name = name; 21 | notifyEnable(); 22 | } 23 | 24 | @Bindable 25 | public String getPhone() { 26 | return phone; 27 | } 28 | 29 | public void setPhone(String phone) { 30 | this.phone = phone; 31 | notifyEnable(); 32 | } 33 | 34 | @Override 35 | public boolean checkEnable() { 36 | return !TextUtils.isEmpty(name) 37 | && !TextUtils.isEmpty(phone); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /app/src/main/java/com/loopeer/projectdevelopmodule/validator/NamePhoneValidator2.kt: -------------------------------------------------------------------------------- 1 | package com.loopeer.projectdevelopmodule.validator 2 | 3 | import android.text.TextUtils 4 | import android.view.View 5 | import com.loopeer.projectdevelopmodule.sample.FormValidator2Activity 6 | import com.loopeer.validator2.EditTextDelegate 7 | 8 | import com.loopeer.validator2.ObservableValidator 9 | import kotlinx.android.synthetic.main.activity_form_validator2.* 10 | 11 | class NamePhoneValidator2(val activity: FormValidator2Activity) : ObservableValidator() { 12 | 13 | var name: String by EditTextDelegate(activity.edit_name, this) 14 | var phone: String by EditTextDelegate(activity.edit_phone, this) 15 | 16 | override fun checkEnable(): Boolean { 17 | return !TextUtils.isEmpty(name) && !TextUtils.isEmpty(phone) 18 | } 19 | 20 | override fun getEnableView(): Array? { 21 | return arrayOf(activity.btn_submit) 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /app/src/main/res/color/selector_color.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/color/selector_text_color.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/color/text_color_phone_captcha.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_authorize.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopeer/ProjectDevelopModule/7f494f7fd25589a28329eb775a758c6732057b85/app/src/main/res/drawable-xxhdpi/ic_authorize.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loopeer/ProjectDevelopModule/7f494f7fd25589a28329eb775a758c6732057b85/app/src/main/res/drawable-xxhdpi/ic_example.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_yellow_button.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/btn_common.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/divider_inset.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/indicator_shape_selected_guide.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/indicator_shape_unselected_guide.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/layout/acitivty_bottom_dialog_date_time.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 11 | 23 | 24 | 29 | 30 | 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_bottom_image_picker_view.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 11 | 12 |