├── .gitignore ├── .idea ├── codeStyles │ ├── Project.xml │ └── codeStyleConfig.xml ├── gradle.xml ├── misc.xml ├── runConfigurations.xml └── vcs.xml ├── README.md ├── allcity.html ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro ├── release │ ├── app-release.apk │ └── output.json └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── vincent │ │ └── baseproject │ │ └── ExampleInstrumentedTest.kt │ ├── main │ ├── AndroidManifest.xml │ ├── assets │ │ ├── cities.db │ │ └── city.json │ ├── java │ │ └── com │ │ │ └── vincent │ │ │ └── baseproject │ │ │ ├── common │ │ │ ├── BaseUiFragment.kt │ │ │ ├── Contsant.kt │ │ │ ├── MyApplication.kt │ │ │ └── UIActivity.kt │ │ │ ├── data │ │ │ ├── BaseResult.kt │ │ │ ├── Login.kt │ │ │ ├── LoginNetWork.kt │ │ │ ├── LoginRepository.kt │ │ │ ├── Resource.kt │ │ │ └── ServiceCreator.kt │ │ │ ├── ui │ │ │ ├── DialogActivity.kt │ │ │ ├── RadiusActivity.kt │ │ │ ├── ScannerActivity.kt │ │ │ ├── SettingActivity.kt │ │ │ ├── WebActivity.kt │ │ │ ├── city_picker │ │ │ │ ├── CityPickerActivity.kt │ │ │ │ └── FileDBManager.kt │ │ │ ├── home │ │ │ │ ├── MainActivity.kt │ │ │ │ └── fragment │ │ │ │ │ ├── HomeFragmentA.kt │ │ │ │ │ ├── HomeFragmentB.kt │ │ │ │ │ ├── HomeFragmentC.kt │ │ │ │ │ └── HomeFragmentD.kt │ │ │ ├── login │ │ │ │ ├── LoginActivity.kt │ │ │ │ ├── LoginModelFactory.kt │ │ │ │ ├── LoginViewModel.kt │ │ │ │ └── RegisterActivity.kt │ │ │ └── space │ │ │ │ ├── SpaceActivity.kt │ │ │ │ ├── SpaceFragment.kt │ │ │ │ └── SpaceInFragmentActivity.kt │ │ │ └── widget │ │ │ ├── NumberProgressBar.kt │ │ │ ├── SettingBar.kt │ │ │ ├── SquareFrameLayout.kt │ │ │ ├── SquareImageView.kt │ │ │ ├── SquareLinearLayout.kt │ │ │ ├── SquareRelativeLayout.kt │ │ │ └── XCollapsingToolbarLayout.kt │ └── res │ │ ├── drawable-v24 │ │ └── ic_launcher_foreground.xml │ │ ├── drawable │ │ ├── bg_web_progress_bar.xml │ │ ├── btn_retry.xml │ │ ├── home_search_bar_bg.xml │ │ ├── ic_cb_normal.png │ │ ├── ic_cb_selected.png │ │ ├── ic_github.xml │ │ ├── ic_launcher_background.xml │ │ ├── ic_selector_selectable_home_found.xml │ │ ├── ic_selector_selectable_home_index.xml │ │ ├── ic_selector_selectable_home_me.xml │ │ ├── ic_selector_selectable_home_message.xml │ │ ├── scan_btn_bg.xml │ │ ├── scan_flash_select.xml │ │ ├── scan_flash_selected.xml │ │ ├── selector_button.xml │ │ ├── selector_button_rect.xml │ │ ├── selector_selectable_white.xml │ │ ├── selector_thumb.xml │ │ ├── selector_track.xml │ │ ├── shape_bg_radius.xml │ │ ├── txt_home_bottom_nav_selector.xml │ │ └── xupdate_bg_app_info.xml │ │ ├── layout │ │ ├── activity_city_picker.xml │ │ ├── activity_dialog.xml │ │ ├── activity_login.xml │ │ ├── activity_main.xml │ │ ├── activity_radius.xml │ │ ├── activity_register.xml │ │ ├── activity_scanner.xml │ │ ├── activity_setting.xml │ │ ├── activity_space.xml │ │ ├── activity_space_in_fragment.xml │ │ ├── activity_web.xml │ │ ├── app_toolbar.xml │ │ ├── banner_item.xml │ │ ├── dialog_custom.xml │ │ ├── fragment_space.xml │ │ ├── home_fragment_a.xml │ │ ├── home_fragment_b.xml │ │ ├── home_fragment_c.xml │ │ ├── home_fragment_d.xml │ │ ├── layout_empty.xml │ │ ├── layout_loading.xml │ │ ├── network_error2_layout.xml │ │ ├── network_error_layout.xml │ │ ├── view_setting_bar.xml │ │ └── xupdate_dialog_app.xml │ │ ├── menu │ │ └── menu_home_bottom_nav.xml │ │ ├── mipmap-anydpi-v26 │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_round.png │ │ ├── tab_ico_found.png │ │ ├── tab_ico_found_off.png │ │ ├── tab_ico_home.png │ │ ├── tab_ico_home_off.png │ │ ├── tab_ico_me.png │ │ ├── tab_ico_me_off.png │ │ ├── tab_ico_message.png │ │ ├── tab_ico_message_off.png │ │ ├── xupdate_bg_app_top.png │ │ └── zfb_grid_scan_line.png │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_round.png │ │ ├── tab_ico_found.png │ │ ├── tab_ico_found_off.png │ │ ├── tab_ico_home.png │ │ ├── tab_ico_home_off.png │ │ ├── tab_ico_me.png │ │ ├── tab_ico_me_off.png │ │ ├── tab_ico_message.png │ │ ├── tab_ico_message_off.png │ │ └── xupdate_icon_app_close.png │ │ ├── mipmap-xxhdpi │ │ ├── bg_launcher.jpg │ │ ├── ic_launcher.png │ │ ├── ic_launcher_round.png │ │ ├── img_custom_dialog_bkg.png │ │ ├── img_custom_dialog_button.png │ │ ├── tab_ico_found.png │ │ ├── tab_ico_found_off.png │ │ ├── tab_ico_home.png │ │ ├── tab_ico_home_off.png │ │ ├── tab_ico_me.png │ │ ├── tab_ico_me_off.png │ │ ├── tab_ico_message.png │ │ └── tab_ico_message_off.png │ │ ├── mipmap-xxxhdpi │ │ ├── arrow_right_icon.png │ │ ├── back.png │ │ ├── error.png │ │ ├── ic_empty.png │ │ ├── ic_launcher.png │ │ ├── ic_launcher_round.png │ │ ├── ic_network_error.png │ │ ├── icon_black.png │ │ ├── scan_change.png │ │ ├── scan_flash.png │ │ └── scan_normal.png │ │ ├── navigation │ │ └── nav_garden.xml │ │ ├── raw │ │ └── weixin_beep.ogg │ │ └── values │ │ ├── attrs.xml │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── com │ └── vincent │ └── baseproject │ └── ExampleUnitTest.kt ├── base.jks ├── baselibrary ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── vincent │ │ └── baselibrary │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── vincent │ │ │ └── baselibrary │ │ │ ├── base │ │ │ ├── BaseActivity.kt │ │ │ ├── BaseActivityHandler.kt │ │ │ └── BaseLazyFragment.kt │ │ │ ├── entity │ │ │ └── NetworkChangeEvent.kt │ │ │ ├── helper │ │ │ ├── CacheDataManager.kt │ │ │ ├── EditTextInputHelper.kt │ │ │ ├── SettingUtil.kt │ │ │ └── SpaceLayout.kt │ │ │ ├── util │ │ │ ├── DrawableUtil.kt │ │ │ ├── MarginDecoration.kt │ │ │ ├── NetUtils.kt │ │ │ ├── ResourceUtil.kt │ │ │ └── SquareDelegate.kt │ │ │ └── widget │ │ │ ├── ClearEditText.kt │ │ │ ├── CountdownView.kt │ │ │ ├── NoScrollViewPager.kt │ │ │ ├── RoundImageView.kt │ │ │ ├── SwitchButton.kt │ │ │ └── radius │ │ │ ├── RadiusButton.kt │ │ │ ├── RadiusCheckBox.kt │ │ │ ├── RadiusEditText.kt │ │ │ ├── RadiusFrameLayout.kt │ │ │ ├── RadiusLinearLayout.kt │ │ │ ├── RadiusRadioButton.kt │ │ │ ├── RadiusRelativeLayout.kt │ │ │ ├── RadiusSwitch.kt │ │ │ ├── RadiusTextView.kt │ │ │ └── delegate │ │ │ ├── RadiusCompoundDelegate.kt │ │ │ ├── RadiusEditTextDelegate.kt │ │ │ ├── RadiusSwitchDelegate.kt │ │ │ ├── RadiusTextDelegate.kt │ │ │ └── RadiusViewDelegate.kt │ └── res │ │ ├── anim │ │ ├── dialog_bottom_in.xml │ │ ├── dialog_bottom_out.xml │ │ ├── dialog_ios_in.xml │ │ ├── dialog_ios_out.xml │ │ ├── dialog_left_in.xml │ │ ├── dialog_left_out.xml │ │ ├── dialog_right_in.xml │ │ ├── dialog_right_out.xml │ │ ├── dialog_scale_in.xml │ │ ├── dialog_scale_out.xml │ │ ├── dialog_top_in.xml │ │ └── dialog_top_out.xml │ │ ├── layout │ │ └── toast_custom_layout.xml │ │ ├── mipmap-hdpi │ │ └── icon_input_del.png │ │ ├── mipmap-xhdpi │ │ └── icon_input_del.png │ │ ├── mipmap-xxhdpi │ │ └── icon_input_del.png │ │ └── values │ │ ├── attr.xml │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── com │ └── vincent │ └── baselibrary │ └── ExampleUnitTest.java ├── build.gradle ├── cityPickerUpdateNote.md ├── citypicker ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── zaaach │ │ └── citypicker │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── assets │ │ └── china_cities_v2.db │ ├── java │ │ └── com │ │ │ └── zaaach │ │ │ └── citypicker │ │ │ ├── CityPicker.java │ │ │ ├── CityPickerDialogFragment.java │ │ │ ├── adapter │ │ │ ├── CityListAdapter.java │ │ │ ├── GridListAdapter.java │ │ │ ├── InnerListener.java │ │ │ ├── OnPickListener.java │ │ │ └── decoration │ │ │ │ ├── DividerItemDecoration.java │ │ │ │ ├── GridItemDecoration.java │ │ │ │ └── SectionItemDecoration.java │ │ │ ├── db │ │ │ ├── CustomDBManager.java │ │ │ ├── DBConfig.java │ │ │ ├── DBManager.java │ │ │ └── DefaultDBManager.java │ │ │ ├── model │ │ │ ├── City.java │ │ │ ├── HotCity.java │ │ │ ├── LocateState.java │ │ │ └── LocatedCity.java │ │ │ ├── util │ │ │ └── ScreenUtil.java │ │ │ └── view │ │ │ └── SideIndexBar.java │ └── res │ │ ├── anim │ │ ├── cp_push_bottom_in.xml │ │ └── cp_push_bottom_out.xml │ │ ├── drawable │ │ ├── cp_grid_item_bg.xml │ │ └── cp_overlay_bg.xml │ │ ├── layout │ │ ├── cp_dialog_city_picker.xml │ │ ├── cp_empty_view.xml │ │ ├── cp_grid_item_layout.xml │ │ ├── cp_list_item_default_layout.xml │ │ ├── cp_list_item_hot_layout.xml │ │ ├── cp_list_item_location_layout.xml │ │ └── cp_search_view.xml │ │ ├── mipmap-xxhdpi │ │ ├── cp_icon_clear_all.png │ │ └── cp_icon_empty.png │ │ ├── values-w820dp │ │ └── dimens.xml │ │ └── values │ │ ├── attrs.xml │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── com │ └── zaaach │ └── citypicker │ └── ExampleUnitTest.java ├── config.gradle ├── doc └── NetworkExceptionChecking.md ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── screenCapture ├── checkVersion.jpg ├── cityPicker.jpg ├── fileDownload.jpg ├── installTip.jpg ├── netError.gif ├── radiusView1.png ├── radiusView2.png ├── radiusView3.png ├── scan.jpg ├── scanResult.jpg ├── selectDate.png ├── setting.jpg ├── spaceLayout.gif ├── tab1.jpg ├── tab2.jpg ├── tab3.jpg └── tab4.jpg └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/caches 5 | /.idea/libraries 6 | /.idea/modules.xml 7 | /.idea/workspace.xml 8 | /.idea/navEditor.xml 9 | /.idea/assetWizardSettings.xml 10 | .DS_Store 11 | /build 12 | /captures 13 | .externalNativeBuild 14 | .idea/ 15 | -------------------------------------------------------------------------------- /.idea/codeStyles/Project.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 9 | 10 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/codeStyles/codeStyleConfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 21 | 22 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /.idea/runConfigurations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/release/app-release.apk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Vicent9920/BaseProject/cbc262ed79dc301e73d29f63c478e28f2ffec6f8/app/release/app-release.apk -------------------------------------------------------------------------------- /app/release/output.json: -------------------------------------------------------------------------------- 1 | [{"outputType":{"type":"APK"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":1,"versionName":"1.0","enabled":true,"outputFile":"app-release.apk","fullName":"release","baseName":"release"},"path":"app-release.apk","properties":{}}] -------------------------------------------------------------------------------- /app/src/androidTest/java/com/vincent/baseproject/ExampleInstrumentedTest.kt: -------------------------------------------------------------------------------- 1 | package com.vincent.baseproject 2 | 3 | import android.content.Context 4 | import android.graphics.Color 5 | import android.util.AttributeSet 6 | import android.util.Log 7 | import android.view.View 8 | import androidx.test.InstrumentationRegistry 9 | import androidx.test.runner.AndroidJUnit4 10 | 11 | import org.junit.Test 12 | import org.junit.runner.RunWith 13 | 14 | import org.junit.Assert.* 15 | 16 | /** 17 | * Instrumented test, which will execute on an Android device. 18 | * 19 | * See [testing documentation](http://d.android.com/tools/testing). 20 | */ 21 | @RunWith(AndroidJUnit4::class) 22 | class ExampleInstrumentedTest { 23 | @Test 24 | fun useAppContext() { 25 | 26 | } 27 | 28 | fun calculateColor(color: Int, alpha: Int): Int { 29 | if (alpha == 0) { 30 | return color 31 | } 32 | val a = 1 - alpha / 255f 33 | var red = color shr 16 and 0xff 34 | var green = color shr 8 and 0xff 35 | var blue = color and 0xff 36 | println(red) 37 | println(green) 38 | println(blue) 39 | return Color.argb(alpha,red,green,blue) 40 | } 41 | } 42 | 43 | 44 | -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 25 | 26 | 27 | 28 | 29 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 45 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | -------------------------------------------------------------------------------- /app/src/main/assets/cities.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Vicent9920/BaseProject/cbc262ed79dc301e73d29f63c478e28f2ffec6f8/app/src/main/assets/cities.db -------------------------------------------------------------------------------- /app/src/main/java/com/vincent/baseproject/common/BaseUiFragment.kt: -------------------------------------------------------------------------------- 1 | package com.vincent.baseproject.common 2 | 3 | import android.view.Gravity 4 | import android.view.LayoutInflater 5 | import com.haoge.easyandroid.easy.EasyToast 6 | import com.vincent.baselibrary.base.BaseLazyFragment 7 | 8 | /** 9 | *

文件描述:

10 | *

@author 烤鱼

11 | *

@date 2019/7/21 0021

12 | *

@update 2019/7/21 0021

13 | *

版本号:1

14 | * 15 | */ 16 | abstract class BaseUiFragment :BaseLazyFragment(){ 17 | open val toastCustom by lazy { 18 | // 创建自定义的Toast. 19 | val layout = LayoutInflater.from(context).inflate(com.vincent.baselibrary.R.layout.toast_custom_layout, null) 20 | EasyToast.newBuilder(layout, com.vincent.baselibrary.R.id.toast_tv) 21 | .setGravity(Gravity.CENTER, 0, 0) 22 | .build() 23 | } 24 | fun toast(resString: Int) { 25 | toastCustom.show(resString) 26 | } 27 | 28 | fun toast(s: String) { 29 | toastCustom.show(s) 30 | } 31 | } -------------------------------------------------------------------------------- /app/src/main/java/com/vincent/baseproject/common/Contsant.kt: -------------------------------------------------------------------------------- 1 | package com.vincent.baseproject.common 2 | 3 | /** 4 | * 创建日期:2019/3/8 0008on 下午 3:36 5 | * 描述:常量类 6 | * @author:Vincent 7 | * QQ:3332168769 8 | * 备注: 9 | */ 10 | object Contsant { 11 | const val SWIPE_ENABLED = "swipeEnabled" 12 | } -------------------------------------------------------------------------------- /app/src/main/java/com/vincent/baseproject/data/BaseResult.kt: -------------------------------------------------------------------------------- 1 | package com.vincent.baseproject.data 2 | 3 | /** 4 | * 创建日期:2019/3/9 0009on 下午 3:02 5 | * 描述:返回实体 6 | * @author:Vincent 7 | * QQ:3332168769 8 | * 备注: 9 | */ 10 | data class BaseResult(val t:T,val errorCode:Int,val errorMsg:String?) -------------------------------------------------------------------------------- /app/src/main/java/com/vincent/baseproject/data/Login.kt: -------------------------------------------------------------------------------- 1 | package com.vincent.baseproject.data 2 | 3 | import okhttp3.RequestBody 4 | import retrofit2.Call 5 | import retrofit2.http.Body 6 | import retrofit2.http.POST 7 | 8 | /** 9 | * 创建日期:2019/3/9 0009on 下午 2:55 10 | * 描述:登录模块api 11 | * @author:Vincent 12 | * QQ:3332168769 13 | * 备注: 14 | */ 15 | interface Login { 16 | @POST("user/login") 17 | fun login(@Body body: RequestBody): Call> 18 | 19 | @POST("user/register") 20 | fun register(@Body body: RequestBody): Call> 21 | } -------------------------------------------------------------------------------- /app/src/main/java/com/vincent/baseproject/data/LoginNetWork.kt: -------------------------------------------------------------------------------- 1 | package com.vincent.baseproject.data 2 | 3 | import okhttp3.MultipartBody 4 | import retrofit2.Callback 5 | 6 | /** 7 | * 创建日期:2019/3/9 0009on 下午 3:11 8 | * 描述: 9 | * @author:Vincent 10 | * QQ:3332168769 11 | * 备注: 12 | */ 13 | object LoginNetWork { 14 | private val services = ServiceCreator.create(Login::class.java) 15 | 16 | /** 17 | * 登录 18 | */ 19 | fun login(username:String, password:String,callback: Callback>){ 20 | val builder = MultipartBody.Builder().setType(MultipartBody.FORM) 21 | builder.addFormDataPart("username", username) 22 | builder.addFormDataPart("password",password) 23 | services.login(builder.build()).enqueue(callback) 24 | } 25 | 26 | /** 27 | * 注册 28 | */ 29 | fun register(username:String, password:String,repassword:String,callback: Callback>){ 30 | val builder = MultipartBody.Builder().setType(MultipartBody.FORM) 31 | builder.addFormDataPart("username", username) 32 | builder.addFormDataPart("password",password) 33 | builder.addFormDataPart("password",password) 34 | services.register(builder.build()).enqueue(callback) 35 | } 36 | } -------------------------------------------------------------------------------- /app/src/main/java/com/vincent/baseproject/data/LoginRepository.kt: -------------------------------------------------------------------------------- 1 | package com.vincent.baseproject.data 2 | 3 | import androidx.lifecycle.MutableLiveData 4 | import retrofit2.Call 5 | import retrofit2.Callback 6 | import retrofit2.Response 7 | 8 | /** 9 | * 创建日期:2019/3/9 0009on 下午 3:32 10 | * 描述: 11 | * @author:Vincent 12 | * QQ:3332168769 13 | * 备注: 14 | */ 15 | class LoginRepository private constructor() { 16 | val login = MutableLiveData>() 17 | val register = MutableLiveData>() 18 | fun login(username: String, password: String) { 19 | 20 | login.value = Resource.loading(null) 21 | LoginNetWork.login(username, password, object : Callback> { 22 | override fun onFailure(call: Call>, t: Throwable) { 23 | login.postValue(Resource.error("登录失败", null)) 24 | } 25 | 26 | override fun onResponse(call: Call>, response: Response>) { 27 | val body = response.body() 28 | if (body?.errorCode == 0) { 29 | login.postValue(Resource.success("登录成功")) 30 | } else { 31 | login.postValue(Resource.error("登录失败", body?.errorMsg)) 32 | } 33 | } 34 | }) 35 | 36 | } 37 | 38 | fun register(username: String, password: String, rePassword: String) { 39 | 40 | register.value = Resource.loading(null) 41 | LoginNetWork.register(username, password, rePassword, object : Callback> { 42 | override fun onFailure(call: Call>, t: Throwable) { 43 | register.postValue(Resource.error("登录失败", null)) 44 | } 45 | 46 | override fun onResponse(call: Call>, response: Response>) { 47 | val body = response.body() 48 | if (body?.errorCode == 0) { 49 | register.postValue(Resource.success("登录成功")) 50 | } else { 51 | register.postValue(Resource.error("登录失败", body?.errorMsg)) 52 | } 53 | } 54 | }) 55 | } 56 | 57 | companion object { 58 | private var instance: LoginRepository? = null 59 | fun getInstance(): LoginRepository { 60 | if (instance == null) { 61 | synchronized(LoginRepository::class.java) { 62 | if (instance == null) { 63 | instance = LoginRepository() 64 | } 65 | } 66 | } 67 | return instance!! 68 | } 69 | } 70 | } -------------------------------------------------------------------------------- /app/src/main/java/com/vincent/baseproject/data/Resource.kt: -------------------------------------------------------------------------------- 1 | package com.vincent.baseproject.data 2 | 3 | /** 4 | * 创建日期:2019/3/9 0009on 下午 3:37 5 | * 描述:liveData回调对象 6 | * @author:Vincent 7 | * QQ:3332168769 8 | * 备注: 9 | */ 10 | data class Resource(val status: Int, val data: T?, val message: String?) { 11 | companion object { 12 | const val SUCCESS = 0 13 | const val ERROR = 1 14 | const val LOADING = 2 15 | 16 | fun success(data: T?) = Resource(SUCCESS, data, null) 17 | 18 | fun error(msg: String, data: T?) = Resource(ERROR, data, msg) 19 | 20 | fun loading(data: T?) = Resource(LOADING, data, null) 21 | } 22 | } -------------------------------------------------------------------------------- /app/src/main/java/com/vincent/baseproject/data/ServiceCreator.kt: -------------------------------------------------------------------------------- 1 | package com.vincent.baseproject.data 2 | 3 | import okhttp3.OkHttpClient 4 | import retrofit2.Retrofit 5 | import retrofit2.converter.gson.GsonConverterFactory 6 | 7 | /** 8 | * 创建日期:2019/3/9 0009on 下午 3:14 9 | * 描述:Retrofit 基类 10 | * @author:Vincent 11 | * QQ:3332168769 12 | * 备注: 13 | */ 14 | object ServiceCreator { 15 | private const val BASE_URL = "http://www.wanandroid.com/" 16 | 17 | private val httpClient = OkHttpClient.Builder() 18 | 19 | private val builder = Retrofit.Builder() 20 | .baseUrl(BASE_URL) 21 | .client(httpClient.build()) 22 | .addConverterFactory(GsonConverterFactory.create()) 23 | 24 | private val retrofit = builder.build() 25 | 26 | fun create(serviceClass: Class): T = retrofit.create(serviceClass) 27 | } -------------------------------------------------------------------------------- /app/src/main/java/com/vincent/baseproject/ui/city_picker/FileDBManager.kt: -------------------------------------------------------------------------------- 1 | package com.vincent.baseproject.ui.city_picker 2 | 3 | import android.content.Context 4 | import android.database.sqlite.SQLiteDatabase 5 | import com.zaaach.citypicker.db.DBConfig 6 | import com.zaaach.citypicker.db.DBManager 7 | import com.zaaach.citypicker.model.City 8 | import java.io.File 9 | import java.util.* 10 | 11 | /** 12 | * 创建日期:2019/4/2 0002on 上午 10:14 13 | * 描述:通过db文件获取自定义数据 14 | * @author:Vincent 15 | * QQ:3332168769 16 | * 备注: 17 | */ 18 | 19 | //由于是构造函数初始化调用copyDBFile方法,因此所有字段需要提前进行赋值,所以此处设置成静态, 20 | private const val tbName = "cities.db" 21 | private const val tableName = "targetcity" 22 | class FileDBManager( ctx: Context) : DBManager(ctx) { 23 | 24 | /** 25 | * assets文件夹下数据库文件名称 26 | */ 27 | 28 | override fun copyDBFile() { 29 | val dir = File(DB_PATH) 30 | if (!dir.exists()) { 31 | dir.mkdirs() 32 | } 33 | 34 | createDbFile(tbName) 35 | } 36 | 37 | override fun getAllCities(): MutableList { 38 | val db = SQLiteDatabase.openOrCreateDatabase(DB_PATH + tbName, null) 39 | val cursor = db.rawQuery("select * from $tableName", null) 40 | val result = mutableListOf() 41 | var city: City 42 | while (cursor.moveToNext()) { 43 | val name = cursor.getString(cursor.getColumnIndex(DBConfig.COLUMN_C_NAME)) 44 | val province = cursor.getString(cursor.getColumnIndex(DBConfig.COLUMN_C_PROVINCE)) 45 | val pinyin = cursor.getString(cursor.getColumnIndex(DBConfig.COLUMN_C_PINYIN)) 46 | val code = cursor.getString(cursor.getColumnIndex(DBConfig.COLUMN_C_CODE)) 47 | city = City(name, province, pinyin, code) 48 | result.add(city) 49 | } 50 | cursor.close() 51 | db.close() 52 | Collections.sort(result, CityComparator()) 53 | return result 54 | } 55 | 56 | override fun searchCity(keyword: String?): MutableList { 57 | val sql = ("select * from " + tableName + " where " 58 | + DBConfig.COLUMN_C_NAME + " like ? " + "or " 59 | + DBConfig.COLUMN_C_PINYIN + " like ? ") 60 | val db = SQLiteDatabase.openOrCreateDatabase(DB_PATH + tbName, null) 61 | val cursor = db.rawQuery(sql, arrayOf("%$keyword%", "$keyword%")) 62 | 63 | val result = mutableListOf() 64 | while (cursor.moveToNext()) { 65 | val name = cursor.getString(cursor.getColumnIndex(DBConfig.COLUMN_C_NAME)) 66 | val province = cursor.getString(cursor.getColumnIndex(DBConfig.COLUMN_C_PROVINCE)) 67 | val pinyin = cursor.getString(cursor.getColumnIndex(DBConfig.COLUMN_C_PINYIN)) 68 | val code = cursor.getString(cursor.getColumnIndex(DBConfig.COLUMN_C_CODE)) 69 | val city = City(name, province, pinyin, code) 70 | result.add(city) 71 | } 72 | cursor.close() 73 | db.close() 74 | val comparator = CityComparator() 75 | Collections.sort(result, comparator) 76 | return result 77 | } 78 | } -------------------------------------------------------------------------------- /app/src/main/java/com/vincent/baseproject/ui/home/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package com.vincent.baseproject.ui.home 2 | 3 | 4 | import androidx.navigation.Navigation 5 | import androidx.navigation.fragment.NavHostFragment 6 | import androidx.navigation.ui.NavigationUI 7 | import com.google.android.material.bottomnavigation.BottomNavigationView 8 | import com.vincent.baselibrary.helper.SpaceLayout 9 | import com.vincent.baseproject.R 10 | import com.vincent.baseproject.common.UIActivity 11 | 12 | class MainActivity : UIActivity() { 13 | override fun getLayoutId() = R.layout.activity_main 14 | 15 | override fun initView() { 16 | val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_fragment) as NavHostFragment 17 | val navController = navHostFragment.navController 18 | val navigation = findViewById(R.id.navigation) 19 | NavigationUI.setupWithNavController(navigation, navController) 20 | navigation.itemIconTintList = null 21 | 22 | // 如果首页不加载网络数据 建议在此处初始化,有利于提高app启动速度 23 | SpaceLayout.init(this) 24 | SpaceLayout.setEmptyLayout(R.layout.layout_empty) 25 | SpaceLayout.setLoadingLayout(R.layout.layout_loading) 26 | SpaceLayout.setNetworkErrorLayout(R.layout.network_error2_layout) 27 | 28 | } 29 | 30 | 31 | override fun onSupportNavigateUp(): Boolean { 32 | return Navigation.findNavController(this, R.id.nav_fragment).navigateUp() 33 | } 34 | 35 | override fun isSupportSwipeBack(): Boolean { 36 | return false 37 | } 38 | 39 | 40 | } 41 | -------------------------------------------------------------------------------- /app/src/main/java/com/vincent/baseproject/ui/home/fragment/HomeFragmentB.kt: -------------------------------------------------------------------------------- 1 | package com.vincent.baseproject.ui.home.fragment 2 | 3 | 4 | import android.view.Gravity 5 | import android.view.LayoutInflater 6 | import androidx.fragment.app.Fragment 7 | import com.haoge.easyandroid.easy.EasyToast 8 | import com.vincent.baselibrary.base.BaseLazyFragment 9 | import com.vincent.baseproject.R 10 | import com.vincent.baseproject.common.BaseUiFragment 11 | import kotlinx.android.synthetic.main.app_toolbar.* 12 | import kotlinx.android.synthetic.main.home_fragment_b.* 13 | 14 | 15 | /** 16 | * A simple [Fragment] subclass. 17 | * 18 | */ 19 | class HomeFragmentB : BaseUiFragment() { 20 | 21 | override fun getLayoutId(): Int { 22 | return R.layout.home_fragment_b 23 | } 24 | 25 | override fun initView() { 26 | tv_title.text = "发现" 27 | initToolBar(app_toolbar) 28 | } 29 | 30 | override fun initEvent() { 31 | super.initEvent() 32 | homeB_cv_countdown.setOnClickListener { 33 | toast(R.string.countdown_code_send_succeed) 34 | 35 | } 36 | } 37 | 38 | } 39 | -------------------------------------------------------------------------------- /app/src/main/java/com/vincent/baseproject/ui/login/LoginModelFactory.kt: -------------------------------------------------------------------------------- 1 | package com.vincent.baseproject.ui.login 2 | 3 | import androidx.lifecycle.ViewModel 4 | import androidx.lifecycle.ViewModelProvider 5 | import com.vincent.baseproject.data.LoginRepository 6 | 7 | /** 8 | * 创建日期:2019/3/9 0009on 下午 3:48 9 | * 描述: 10 | * @author:Vincent 11 | * QQ:3332168769 12 | * 备注: 13 | */ 14 | class LoginModelFactory(private val repository:LoginRepository): ViewModelProvider.NewInstanceFactory() { 15 | override fun create(modelClass: Class): T { 16 | return super.create(modelClass) 17 | } 18 | } -------------------------------------------------------------------------------- /app/src/main/java/com/vincent/baseproject/ui/login/LoginViewModel.kt: -------------------------------------------------------------------------------- 1 | package com.vincent.baseproject.ui.login 2 | 3 | import androidx.lifecycle.Transformations 4 | import androidx.lifecycle.ViewModel 5 | import com.vincent.baseproject.data.LoginRepository 6 | 7 | /** 8 | * 创建日期:2019/3/9 0009on 下午 3:54 9 | * 描述: 10 | * @author:Vincent 11 | * QQ:3332168769 12 | * 备注: 13 | */ 14 | class LoginViewModel(private val repository: LoginRepository) : ViewModel() { 15 | val loginState = Transformations.map(repository.login) { it }!! 16 | val registerState = Transformations.map(repository.register) { it }!! 17 | fun logun(username: String, password: String) = repository.login(username, password) 18 | fun register(username: String, password: String, rePassword: String) = 19 | repository.register(username, password, rePassword) 20 | } -------------------------------------------------------------------------------- /app/src/main/java/com/vincent/baseproject/ui/space/SpaceActivity.kt: -------------------------------------------------------------------------------- 1 | package com.vincent.baseproject.ui.space 2 | 3 | import android.view.View 4 | import com.vincent.baselibrary.helper.SpaceLayout 5 | import com.vincent.baseproject.R 6 | import com.vincent.baseproject.common.UIActivity 7 | import kotlinx.android.synthetic.main.activity_space.* 8 | import kotlinx.android.synthetic.main.app_toolbar.* 9 | 10 | class SpaceActivity : UIActivity() { 11 | override fun getLayoutId() = R.layout.activity_space 12 | 13 | override fun initView() { 14 | tv_title.text = "布局测试" 15 | tv_rightMenu.text = "重置" 16 | tv_rightMenu.visibility = View.VISIBLE 17 | initToolBar(app_toolbar) 18 | } 19 | 20 | /** 21 | * 返回之前都先关掉弹窗 22 | */ 23 | override fun onBackPressed() { 24 | SpaceLayout.onDestroy(windowManager) 25 | super.onBackPressed() 26 | } 27 | 28 | override fun initEvent() { 29 | super.initEvent() 30 | // 重置公共布局 31 | tv_rightMenu.setOnClickListener { 32 | SpaceLayout.onDestroy(windowManager) 33 | } 34 | // 展示空布局 35 | ll_btn_empty.setOnClickListener { 36 | SpaceLayout.showEmptyLayout(ll_content, windowManager) 37 | } 38 | // 展示加载中布局 39 | ll_btn_loading.setOnClickListener { 40 | SpaceLayout.showLoadingLayout(ll_content, windowManager) 41 | } 42 | 43 | // 展示网络异常页面,支持点击事件回调 44 | ll_btn_error.setOnClickListener { 45 | // 防止回调事件错乱 因此回调事件的作用只有一次 即重置的时候对事件进行了回收 46 | SpaceLayout.setOnRetryClickedListener(R.id.retry,object :SpaceLayout.OnRetryClickedListener{ 47 | override fun onRetryClick() { 48 | SpaceLayout.onDestroy(windowManager) 49 | } 50 | 51 | }) 52 | SpaceLayout.showNetworkErrorLayout(ll_content, windowManager) 53 | } 54 | ll_btn_fragment.setOnClickListener { 55 | easyStart(SpaceInFragmentActivity::class.java) 56 | } 57 | 58 | } 59 | 60 | } 61 | -------------------------------------------------------------------------------- /app/src/main/java/com/vincent/baseproject/ui/space/SpaceFragment.kt: -------------------------------------------------------------------------------- 1 | package com.vincent.baseproject.ui.space 2 | 3 | 4 | import android.os.Bundle 5 | import android.os.Handler 6 | import android.view.LayoutInflater 7 | import android.view.View 8 | import android.view.ViewGroup 9 | import com.vincent.baselibrary.base.BaseLazyFragment 10 | import com.vincent.baselibrary.helper.SpaceLayout 11 | import com.vincent.baseproject.R 12 | import kotlinx.android.synthetic.main.fragment_space.* 13 | 14 | 15 | /** 16 | * @author Vincent 17 | * 测试Fragment 18 | */ 19 | class SpaceFragment : BaseLazyFragment() { 20 | override fun getLayoutId(): Int { 21 | return R.layout.fragment_space 22 | } 23 | 24 | override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { 25 | if (mRootView == null && getLayoutId() > 0) { 26 | mRootView = layoutInflater.inflate(getLayoutId(), container, false) 27 | } 28 | container?.removeView(mRootView) 29 | return SpaceLayout.LoadLayout(mRootView!!) 30 | } 31 | 32 | override fun initView() { 33 | 34 | } 35 | 36 | override fun initEvent() { 37 | super.initEvent() 38 | fragment_btn_empty.setOnClickListener { 39 | Handler().post { 40 | SpaceLayout.showEmptyLayout(this) 41 | } 42 | 43 | } 44 | fragment_btn_loading.setOnClickListener { 45 | Handler().post { 46 | SpaceLayout.showLoadingLayout(this) 47 | } 48 | 49 | } 50 | 51 | fragment_btn_error.setOnClickListener { 52 | Handler().post { 53 | SpaceLayout.setOnFragmentRetryClickedListener( 54 | this@SpaceFragment, 55 | R.id.retry, 56 | object : SpaceLayout.OnRetryClickedListener { 57 | override fun onRetryClick() { 58 | SpaceLayout.onDestroy(this@SpaceFragment) 59 | } 60 | 61 | }) 62 | SpaceLayout.showNetworkErrorLayout(this) 63 | } 64 | 65 | } 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /app/src/main/java/com/vincent/baseproject/ui/space/SpaceInFragmentActivity.kt: -------------------------------------------------------------------------------- 1 | package com.vincent.baseproject.ui.space 2 | 3 | import android.view.View 4 | import com.vincent.baselibrary.helper.SpaceLayout 5 | import com.vincent.baseproject.R 6 | import com.vincent.baseproject.common.UIActivity 7 | import kotlinx.android.synthetic.main.app_toolbar.* 8 | 9 | class SpaceInFragmentActivity : UIActivity() { 10 | 11 | private lateinit var space:SpaceFragment 12 | override fun getLayoutId() = R.layout.activity_space_in_fragment 13 | 14 | override fun initView() { 15 | tv_title.text = "Fragment 布局测试" 16 | tv_rightMenu.text = "重置" 17 | tv_rightMenu.visibility = View.VISIBLE 18 | initToolBar(app_toolbar) 19 | space = SpaceFragment() 20 | supportFragmentManager.beginTransaction().replace(R.id.container, space).commit() 21 | } 22 | 23 | 24 | override fun initEvent() { 25 | super.initEvent() 26 | tv_rightMenu.setOnClickListener { 27 | SpaceLayout.onDestroy(space) 28 | } 29 | 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /app/src/main/java/com/vincent/baseproject/widget/SquareFrameLayout.kt: -------------------------------------------------------------------------------- 1 | package com.vincent.baseproject.widget 2 | 3 | import android.content.Context 4 | import android.util.AttributeSet 5 | import android.widget.FrameLayout 6 | import com.vincent.baselibrary.util.SquareDelegate 7 | 8 | /** 9 | * author : Android 轮子哥 10 | * github : https://github.com/getActivity/AndroidProject 11 | * time : 2018/10/18 12 | * desc : 正方形的FrameLayout 13 | */ 14 | class SquareFrameLayout : FrameLayout { 15 | 16 | constructor(context: Context) : super(context) 17 | 18 | constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr) 19 | 20 | constructor(context: Context, attrs: AttributeSet) : super(context, attrs) 21 | 22 | override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { 23 | super.onMeasure( 24 | SquareDelegate.measureWidth(widthMeasureSpec, heightMeasureSpec), 25 | SquareDelegate.measureHeight(widthMeasureSpec, heightMeasureSpec) 26 | ) 27 | } 28 | } -------------------------------------------------------------------------------- /app/src/main/java/com/vincent/baseproject/widget/SquareImageView.kt: -------------------------------------------------------------------------------- 1 | package com.vincent.baseproject.widget 2 | 3 | import android.content.Context 4 | import android.util.AttributeSet 5 | import androidx.appcompat.widget.AppCompatImageView 6 | import com.vincent.baselibrary.util.SquareDelegate 7 | 8 | /** 9 | * author : Android 轮子哥 10 | * github : https://github.com/getActivity/AndroidProject 11 | * time : 2018/10/18 12 | * desc : 正方形的ImageView 13 | */ 14 | class SquareImageView : AppCompatImageView { 15 | 16 | constructor(context: Context) : super(context) {} 17 | 18 | constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {} 19 | 20 | constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {} 21 | 22 | override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { 23 | super.onMeasure( 24 | SquareDelegate.measureWidth(widthMeasureSpec, heightMeasureSpec), 25 | SquareDelegate.measureHeight(widthMeasureSpec, heightMeasureSpec) 26 | ) 27 | } 28 | } -------------------------------------------------------------------------------- /app/src/main/java/com/vincent/baseproject/widget/SquareLinearLayout.kt: -------------------------------------------------------------------------------- 1 | package com.vincent.baseproject.widget 2 | 3 | import android.content.Context 4 | import android.util.AttributeSet 5 | import android.widget.LinearLayout 6 | import com.vincent.baselibrary.util.SquareDelegate 7 | 8 | /** 9 | * author : Android 轮子哥 10 | * github : https://github.com/getActivity/AndroidProject 11 | * time : 2018/10/18 12 | * desc : 正方形的LinearLayout 13 | */ 14 | class SquareLinearLayout : LinearLayout { 15 | 16 | constructor(context: Context) : super(context) {} 17 | 18 | constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {} 19 | 20 | constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {} 21 | 22 | override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { 23 | super.onMeasure( 24 | SquareDelegate.measureWidth(widthMeasureSpec, heightMeasureSpec), 25 | SquareDelegate.measureHeight(widthMeasureSpec, heightMeasureSpec) 26 | ) 27 | } 28 | } -------------------------------------------------------------------------------- /app/src/main/java/com/vincent/baseproject/widget/SquareRelativeLayout.kt: -------------------------------------------------------------------------------- 1 | package com.vincent.baseproject.widget 2 | 3 | import android.content.Context 4 | import android.util.AttributeSet 5 | import android.widget.RelativeLayout 6 | import com.vincent.baselibrary.util.SquareDelegate 7 | 8 | /** 9 | * author : Android 轮子哥 10 | * github : https://github.com/getActivity/AndroidProject 11 | * time : 2018/10/18 12 | * desc : 正方形的RelativeLayout 13 | */ 14 | class SquareRelativeLayout : RelativeLayout { 15 | 16 | constructor(context: Context) : super(context) {} 17 | 18 | constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {} 19 | 20 | constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {} 21 | 22 | override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { 23 | super.onMeasure( 24 | SquareDelegate.measureWidth(widthMeasureSpec, heightMeasureSpec), 25 | SquareDelegate.measureHeight(widthMeasureSpec, heightMeasureSpec) 26 | ) 27 | } 28 | } -------------------------------------------------------------------------------- /app/src/main/java/com/vincent/baseproject/widget/XCollapsingToolbarLayout.kt: -------------------------------------------------------------------------------- 1 | package com.vincent.baseproject.widget 2 | 3 | import android.content.Context 4 | import android.util.AttributeSet 5 | import com.google.android.material.appbar.CollapsingToolbarLayout 6 | 7 | /** 8 | * author : Android 轮子哥 9 | * github : https://github.com/getActivity/AndroidProject 10 | * time : 2018/10/18 11 | * desc : 支持监听渐变的CollapsingToolbarLayout 12 | */ 13 | class XCollapsingToolbarLayout : CollapsingToolbarLayout { 14 | 15 | var mListener: OnScrimsListener? = null // 渐变监听 16 | var isCurrentScrimsShown: Boolean = false // 当前渐变状态 17 | 18 | constructor(context: Context) : super(context) 19 | constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) 20 | constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) 21 | 22 | override fun setScrimsShown(shown: Boolean, animate: Boolean) { 23 | super.setScrimsShown(shown, animate) 24 | if(isCurrentScrimsShown != shown){ 25 | isCurrentScrimsShown = shown 26 | mListener?.onScrimsStateChange(shown) 27 | } 28 | } 29 | 30 | /** 31 | * CollapsingToolbarLayout渐变监听器 32 | */ 33 | interface OnScrimsListener { 34 | 35 | /** 36 | * 渐变状态变化 37 | * 38 | * @param shown 渐变开关 39 | */ 40 | fun onScrimsStateChange(shown: Boolean) 41 | } 42 | 43 | 44 | } 45 | 46 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 7 | 12 | 13 | 19 | 22 | 25 | 26 | 27 | 28 | 34 | 35 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_web_progress_bar.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/btn_retry.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/home_search_bar_bg.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_cb_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Vicent9920/BaseProject/cbc262ed79dc301e73d29f63c478e28f2ffec6f8/app/src/main/res/drawable/ic_cb_normal.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_cb_selected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Vicent9920/BaseProject/cbc262ed79dc301e73d29f63c478e28f2ffec6f8/app/src/main/res/drawable/ic_cb_selected.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_github.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_selector_selectable_home_found.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_selector_selectable_home_index.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_selector_selectable_home_me.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_selector_selectable_home_message.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/scan_btn_bg.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | 11 | 12 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/scan_flash_select.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/scan_flash_selected.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | 11 | 12 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/selector_button.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/selector_button_rect.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/selector_selectable_white.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/selector_thumb.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 14 | 15 | 16 | 17 | 18 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 32 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/selector_track.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 9 | 10 | 11 | 14 | 15 | 16 | 17 | 19 | 22 | 23 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/shape_bg_radius.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/txt_home_bottom_nav_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/xupdate_bg_app_info.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_city_picker.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 13 | 14 | 20 | 21 |