├── .gitignore ├── LICENSE ├── README.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro ├── release │ └── bottomsheet-v1.2.3.apk └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── org │ │ └── michaelbel │ │ └── sample │ │ ├── activity │ │ └── MainActivity.java │ │ └── fragment │ │ └── MainFragment.java │ └── res │ ├── drawable-v21 │ └── selectable_custom.xml │ ├── drawable │ ├── ic_about.xml │ ├── ic_copy.xml │ ├── ic_copy_48.xml │ ├── ic_edit.xml │ ├── ic_facebook.xml │ ├── ic_github.xml │ ├── ic_gmail.xml │ ├── ic_google_plus.xml │ ├── ic_hangouts.xml │ ├── ic_mail.xml │ ├── ic_message.xml │ ├── ic_print.xml │ ├── ic_share.xml │ ├── ic_theme.xml │ ├── ic_twitter.xml │ ├── ic_upload.xml │ └── selectable_custom.xml │ ├── layout │ ├── about_view.xml │ ├── activity_main.xml │ └── fragment_main.xml │ ├── menu │ ├── menu_items.xml │ └── menu_items_icons.xml │ ├── mipmap-hdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── mipmap-mdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── mipmap-xhdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── mipmap-xxhdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── mipmap-xxxhdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ └── values │ ├── colors.xml │ ├── strings.xml │ └── styles.xml ├── bottomsheet ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── org │ │ └── michaelbel │ │ └── bottomsheet │ │ ├── BottomSheet.java │ │ ├── BottomSheetCallback.java │ │ ├── BottomSheetCell.java │ │ ├── BottomSheetGrid.java │ │ ├── BottomSheetItem.java │ │ ├── Utils.java │ │ ├── annotation │ │ ├── Beta.java │ │ └── New.java │ │ └── menu │ │ ├── BottomSheetMenu.java │ │ └── BottomSheetMenuItem.java │ └── res │ ├── anim │ └── no_animation.xml │ ├── drawable-hdpi │ └── sheet_shadow.9.png │ ├── drawable-mdpi │ └── sheet_shadow.9.png │ ├── drawable-v21 │ ├── selectable_dark.xml │ └── selectable_light.xml │ ├── drawable-xhdpi │ └── sheet_shadow.9.png │ ├── drawable-xxhdpi │ └── sheet_shadow.9.png │ ├── drawable-xxxhdpi │ └── sheet_shadow.9.png │ ├── drawable │ ├── selectable_dark.xml │ ├── selectable_light.xml │ └── transparent.xml │ ├── values-sw600dp │ └── values.xml │ ├── values-sw720dp │ └── values.xml │ ├── values-v21 │ └── styles.xml │ └── values │ ├── styles.xml │ └── values.xml ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── screenshots ├── bs_dark_1.png ├── bs_dark_2.png ├── bs_dark_3.png ├── bs_dark_4.png ├── bs_dark_landscape.png ├── bs_light_1.png ├── bs_light_2.png ├── bs_light_3.png ├── bs_light_4.png ├── bs_light_landscape.png ├── demo-gif.gif ├── direct-apk-download.png ├── web1024x500.png ├── web512x512.png ├── wiki_bs_dividers_1.jpg ├── wiki_bs_dividers_2.jpg ├── wiki_bs_fullwidth_1.jpg └── wiki_bs_fullwidth_2.jpg └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/workspace.xml 5 | /.idea/libraries 6 | .DS_Store 7 | /build 8 | /captures 9 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "{}" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright {yyyy} {name of copyright owner} 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [apk-url]: https://github.com/michaelbel/BottomSheet/raw/master/app/release/bottomsheet-v1.2.3.apk 2 | [wiki-url]: https://github.com/michaelbel/BottomSheet/wiki/usage 3 | [paypal-url]: https://paypal.me/michaelbel 4 | [github-url]: https://github.com/michaelbel/bottomsheet 5 | [licence-url]: http://www.apache.org/licenses/LICENSE-2.0 6 | [bintray-url]: https://bintray.com/michael-bel/maven/bottomsheet/_latestVersion 7 | [arsenal-url]: https://android-arsenal.com/details/1/6623 8 | [mdguides-url]: https://material.io/guidelines/components/bottom-sheets.html# 9 | [googleplay-url]: https://play.google.com/store/apps/details?id=org.michaelbel.bottomsheetdialog 10 | [methodscount-url]: http://www.methodscount.com/?lib=org.michaelbel%3Abottomsheet%3A1.1.2 11 | [bsdf-url]: https://developer.android.com/reference/android/support/design/widget/BottomSheetDialogFragment 12 | 13 | [ide-badge]: https://img.shields.io/badge/Android_Studio-3.1.4-009688.svg 14 | [minsdk-badge]: https://img.shields.io/badge/minSdkVersion-21-009688.svg 15 | [paypal-badge]: https://img.shields.io/badge/Donate-Paypal-009688.svg 16 | [license-badge]: https://img.shields.io/badge/License-Apache_v2.0-009688.svg 17 | [arsenal-badge]: https://img.shields.io/badge/Android%20Arsenal-BottomSheet-009688.svg?style=flat 18 | [bintray-badge]: https://api.bintray.com/packages/michael-bel/maven/bottomsheet/images/download.svg 19 | [platform-badge]: https://img.shields.io/badge/Platform-Android-009688.svg 20 | [googleplay-badge]: https://img.shields.io/badge/Google_Play-Demo-009688.svg 21 | [methodscount-badge]: https://img.shields.io/badge/Methods_and_Size-355_%20%7C%20_55KB-009688.svg 22 | 23 | 24 | 25 | # BottomSheet 26 | [![Bintray][bintray-badge]][bintray-url] 27 | [![Platform][platform-badge]][github-url] 28 | [![MinSdk][minsdk-badge]][github-url] 29 | [![IDE][ide-badge]][github-url] 30 | [![License][license-badge]][licence-url] 31 | [![AndroidArsenal][arsenal-badge]][arsenal-url] 32 | [![GooglePlay][googleplay-badge]][googleplay-url] 33 | [![Methodscount][methodscount-badge]][methodscount-url] 34 | [![Paypal][paypal-badge]][paypal-url] 35 | 36 | BottomSheet dialogs library for Android with [material design concept][mdguides-url]. 37 | Bottom sheets slide up from the bottom of the screen to reveal more content. 38 | 39 | 40 | 41 |
42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 |
51 | 52 |
53 | 54 | 55 |
56 | 57 | ## Demo 58 | [](https://play.google.com/store/apps/details?id=org.michaelbel.bottomsheetdialog) 59 | [](https://github.com/michaelbel/BottomSheet/raw/master/app/release/bottomsheet-v1.2.3.apk) 60 | 61 | ## Download 62 | ```gradle 63 | dependencies { 64 | implementation 'org.michaelbel:bottomsheet:1.2.3' 65 | } 66 | ``` 67 | 68 | ## Usage 69 | ```java 70 | BottomSheet.Builder builder = new BottomSheet.Builder(context); 71 | builder 72 | .setTitle(CharSequence title) 73 | .setItems(CharSequence[] items, Drawable[] icons, DialogInterface.OnClickListener listener) 74 | .setMenu(@MenuRes int menuResId, DialogInterface.OnClickListener listener) 75 | .setView(@LayoutRes int layoutResId) 76 | .setContentType(@BottomSheet.Type int type) 77 | .setDarkTheme(boolean darkTheme) 78 | .setFullWidth(boolean fullWidth) 79 | .setCellHeight(int cellHeightDp) 80 | .setDividers(boolean dividers) 81 | .setWindowDimming(@Range(from = 0, to = 255) int windowDimming) 82 | .setTitleMultiline(boolean multiline) 83 | .setFabBehavior(FloatingActionButton button) 84 | .setFabBehavior(FloatingActionButton button, @BottomSheet.FabBehavior int fabBehavior) 85 | .setBackgroundColor(@ColorInt int color) 86 | .setBackgroundColorRes(@ColorRes int color) 87 | .setTitleTextColor(@ColorInt int color) 88 | .setTitleTextColorRes(@ColorRes int color) 89 | .setItemTextColor(@ColorInt int color) 90 | .setItemTextColorRes(@ColorRes int color) 91 | .setIconColor(@ColorInt int color) 92 | .setIconColorRes(@ColorRes int color) 93 | .setItemSelector(int selector); 94 | .setOnShowListener(new DialogInterface.OnShowListener() { 95 | @Override 96 | public void onShow(DialogInterface dialog) { 97 | } 98 | }); 99 | .setOnDismissListener(new DialogInterface.OnDismissListener() { 100 | @Override 101 | public void onDismiss(DialogInterface dialog) { 102 | } 103 | }); 104 | .setCallback(new BottomSheetCallback() { 105 | @Override 106 | public void onShown() { 107 | } 108 | 109 | @Override 110 | public void onDismissed() { 111 | } 112 | }) 113 | .show(); 114 | ``` 115 | 116 | ## Wiki 117 | For all information check [BottomSheet Wiki][wiki-url]. 118 | 119 | ## Deprecated 120 | BottomSheet is deprecated. No more development will be taking place. Existing version will continue to function. Please, use [BottomSheetDialogFragment][bsdf-url] from Google instead. Thanks! 121 | 122 | ## License 123 | 124 | Copyright 2016 Michael Bely 125 | 126 | Licensed under the Apache License, Version 2.0 (the "License"); 127 | you may not use this file except in compliance with the License. 128 | You may obtain a copy of the License at 129 | 130 | http://www.apache.org/licenses/LICENSE-2.0 131 | 132 | Unless required by applicable law or agreed to in writing, software 133 | distributed under the License is distributed on an "AS IS" BASIS, 134 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135 | See the License for the specific language governing permissions and 136 | limitations under the License. 137 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 28 5 | 6 | defaultConfig { 7 | applicationId "org.michaelbel.bottomsheetdialog" 8 | minSdkVersion 21 9 | targetSdkVersion 28 10 | versionCode 27 11 | versionName "1.2.4" 12 | buildConfigField "String", "VERSION_DATE", '"12 Nov 2018"' 13 | } 14 | 15 | buildTypes { 16 | release { 17 | minifyEnabled false 18 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 19 | } 20 | } 21 | 22 | compileOptions { 23 | sourceCompatibility JavaVersion.VERSION_1_8 24 | targetCompatibility JavaVersion.VERSION_1_8 25 | } 26 | } 27 | 28 | dependencies { 29 | implementation 'com.android.support:design:28.0.0' 30 | implementation 'com.android.support:appcompat-v7:28.0.0' 31 | implementation 'org.michaelbel:material:0.3.6' 32 | implementation project(':bottomsheet') 33 | } -------------------------------------------------------------------------------- /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 C:\Users\User\AppData\Local\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 | #} -------------------------------------------------------------------------------- /app/release/bottomsheet-v1.2.3.apk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/michaelbel/BottomSheet/b32cd0e67419ff28604ed13193ecf49840e53565/app/release/bottomsheet-v1.2.3.apk -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 11 | 12 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /app/src/main/java/org/michaelbel/sample/activity/MainActivity.java: -------------------------------------------------------------------------------- 1 | package org.michaelbel.sample.activity; 2 | 3 | import android.content.Intent; 4 | import android.content.SharedPreferences; 5 | import android.net.Uri; 6 | import android.os.Bundle; 7 | import android.support.annotation.StyleRes; 8 | import android.support.design.widget.FloatingActionButton; 9 | import android.support.v7.app.AlertDialog; 10 | import android.support.v7.app.AppCompatActivity; 11 | import android.support.v7.widget.Toolbar; 12 | import android.view.LayoutInflater; 13 | import android.view.Menu; 14 | import android.view.MenuItem; 15 | import android.view.View; 16 | import android.widget.TextView; 17 | 18 | import org.michaelbel.sample.BuildConfig; 19 | import org.michaelbel.sample.R; 20 | 21 | public class MainActivity extends AppCompatActivity { 22 | 23 | public Toolbar toolbar; 24 | public FloatingActionButton fab; 25 | 26 | @Override 27 | protected void onCreate(Bundle savedInstanceState) { 28 | super.onCreate(savedInstanceState); 29 | setContentView(R.layout.activity_main); 30 | 31 | toolbar = findViewById(R.id.toolbar); 32 | setSupportActionBar(toolbar); 33 | 34 | fab = findViewById(R.id.fab); 35 | } 36 | 37 | @Override 38 | public void setTheme(@StyleRes int resId) { 39 | SharedPreferences prefs = getSharedPreferences("mainconfig", MODE_PRIVATE); 40 | boolean appTheme = prefs.getBoolean("theme", true); 41 | super.setTheme(appTheme ? R.style.AppThemeLight : R.style.AppThemeDark); 42 | } 43 | 44 | @Override 45 | public boolean onCreateOptionsMenu(Menu menu) { 46 | menu.add(R.string.about) 47 | .setIcon(R.drawable.ic_about) 48 | .setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_IF_ROOM) 49 | .setOnMenuItemClickListener(item -> { 50 | View view = LayoutInflater.from(MainActivity.this).inflate(R.layout.about_view, null); 51 | TextView textView = view.findViewById(R.id.text_view); 52 | textView.setText(getString(R.string.version_build_date, BuildConfig.VERSION_NAME, BuildConfig.VERSION_CODE, BuildConfig.VERSION_DATE)); 53 | 54 | AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); 55 | builder.setTitle(R.string.about); 56 | builder.setView(view); 57 | builder.setPositiveButton(R.string.ok, null); 58 | builder.show(); 59 | return true; 60 | }); 61 | 62 | menu.add(R.string.view_github) 63 | .setIcon(R.drawable.ic_github) 64 | .setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_IF_ROOM) 65 | .setOnMenuItemClickListener(menuItem -> { 66 | startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(getString(R.string.github_url)))); 67 | return true; 68 | }); 69 | 70 | menu.add(R.string.change_theme) 71 | .setIcon(R.drawable.ic_theme) 72 | .setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_IF_ROOM) 73 | .setOnMenuItemClickListener(menuItem -> { 74 | SharedPreferences prefs = getSharedPreferences("mainconfig", MODE_PRIVATE); 75 | SharedPreferences.Editor editor = prefs.edit(); 76 | boolean appTheme = prefs.getBoolean("theme", true); 77 | editor.putBoolean("theme", !appTheme); 78 | editor.apply(); 79 | recreate(); 80 | return true; 81 | }); 82 | 83 | return super.onCreateOptionsMenu(menu); 84 | } 85 | } -------------------------------------------------------------------------------- /app/src/main/java/org/michaelbel/sample/fragment/MainFragment.java: -------------------------------------------------------------------------------- 1 | package org.michaelbel.sample.fragment; 2 | 3 | import android.app.Activity; 4 | import android.content.SharedPreferences; 5 | import android.os.Bundle; 6 | import android.support.annotation.NonNull; 7 | import android.support.annotation.Nullable; 8 | import android.support.v4.app.Fragment; 9 | import android.view.LayoutInflater; 10 | import android.view.View; 11 | import android.view.ViewGroup; 12 | import android.widget.Button; 13 | import android.widget.CheckBox; 14 | import android.widget.RadioButton; 15 | import android.widget.SeekBar; 16 | import android.widget.TextView; 17 | import android.widget.Toast; 18 | 19 | import org.michaelbel.bottomsheet.BottomSheet; 20 | import org.michaelbel.bottomsheet.BottomSheetCallback; 21 | import org.michaelbel.bottomsheet.Utils; 22 | import org.michaelbel.sample.activity.MainActivity; 23 | import org.michaelbel.sample.R; 24 | 25 | public class MainFragment extends Fragment implements View.OnClickListener { 26 | 27 | private int[] items = new int[] { 28 | R.string.share, 29 | R.string.upload, 30 | R.string.copy, 31 | R.string.print_this_page 32 | }; 33 | 34 | /*private int[] items = new int[] { 35 | R.string.preview, 36 | R.string.share, 37 | R.string.get_link, 38 | R.string.make_copy 39 | };*/ 40 | 41 | private int[] icons = new int[] { 42 | R.drawable.ic_share, 43 | R.drawable.ic_upload, 44 | R.drawable.ic_copy, 45 | R.drawable.ic_print 46 | }; 47 | 48 | private boolean theme; 49 | private MainActivity activity; 50 | 51 | private Button dialogButton; 52 | 53 | private CheckBox titleCheckBox; 54 | private CheckBox titleMultiCheckBox; 55 | private CheckBox iconsCheckBox; 56 | private CheckBox dividersCheckBox; 57 | private CheckBox fullWidthCheckBox; 58 | private CheckBox callbackCheckBox; 59 | private CheckBox fabCheckBox; 60 | private CheckBox wdCheckBox; 61 | private CheckBox chCheckBox; 62 | 63 | private RadioButton slideUpRadio; 64 | private RadioButton showHideRadio; 65 | 66 | private SeekBar wdSeekBar; 67 | private SeekBar chSeekBar; 68 | 69 | private TextView wdText; 70 | private TextView chText; 71 | 72 | @Override 73 | public void onCreate(@Nullable Bundle savedInstanceState) { 74 | super.onCreate(savedInstanceState); 75 | activity = (MainActivity) getActivity(); 76 | } 77 | 78 | @Nullable 79 | @Override 80 | public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 81 | View view = inflater.inflate(R.layout.fragment_main, container); 82 | 83 | SharedPreferences prefs = activity.getSharedPreferences("mainconfig", Activity.MODE_PRIVATE); 84 | theme = prefs.getBoolean("theme", true); 85 | 86 | dialogButton = view.findViewById(R.id.dialog_button); 87 | dialogButton.setOnClickListener(this); 88 | 89 | titleCheckBox = view.findViewById(R.id.check_title); 90 | titleMultiCheckBox = view.findViewById(R.id.check_title_multi); 91 | iconsCheckBox = view.findViewById(R.id.check_icons); 92 | dividersCheckBox = view.findViewById(R.id.check_dividers); 93 | fullWidthCheckBox = view.findViewById(R.id.check_full_width); 94 | callbackCheckBox = view.findViewById(R.id.check_callback); 95 | fabCheckBox = view.findViewById(R.id.check_fab); 96 | fabCheckBox.setOnCheckedChangeListener((buttonView, isChecked) -> { 97 | slideUpRadio.setEnabled(isChecked); 98 | showHideRadio.setEnabled(isChecked); 99 | }); 100 | wdCheckBox = view.findViewById(R.id.check_wd); 101 | wdCheckBox.setOnCheckedChangeListener((buttonView, isChecked) -> wdSeekBar.setEnabled(isChecked)); 102 | chCheckBox = view.findViewById(R.id.check_ch); 103 | chCheckBox.setOnCheckedChangeListener((buttonView, isChecked) -> chSeekBar.setEnabled(isChecked)); 104 | 105 | slideUpRadio = view.findViewById(R.id.radio_slide_up); 106 | slideUpRadio.setChecked(true); 107 | slideUpRadio.setEnabled(false); 108 | slideUpRadio.setOnCheckedChangeListener((buttonView, isChecked) -> { 109 | slideUpRadio.setChecked(isChecked); 110 | showHideRadio.setChecked(!isChecked); 111 | }); 112 | 113 | showHideRadio = view.findViewById(R.id.radio_show_hide); 114 | showHideRadio.setChecked(false); 115 | showHideRadio.setEnabled(false); 116 | showHideRadio.setOnCheckedChangeListener((buttonView, isChecked) -> { 117 | showHideRadio.setChecked(isChecked); 118 | slideUpRadio.setChecked(!isChecked); 119 | }); 120 | 121 | wdSeekBar = view.findViewById(R.id.wd_seekbar); 122 | wdSeekBar.setEnabled(false); 123 | wdSeekBar.setMax(255); 124 | wdSeekBar.setProgress(80); 125 | wdSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { 126 | @Override 127 | public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 128 | wdText.setText(String.valueOf(progress)); 129 | } 130 | 131 | @Override 132 | public void onStartTrackingTouch(SeekBar seekBar) {} 133 | 134 | @Override 135 | public void onStopTrackingTouch(SeekBar seekBar) {} 136 | }); 137 | 138 | wdText = view.findViewById(R.id.wd_text); 139 | wdText.setText(String.valueOf(wdSeekBar.getProgress())); 140 | 141 | chSeekBar = view.findViewById(R.id.ch_seekbar); 142 | chSeekBar.setEnabled(false); 143 | chSeekBar.setMax(16); 144 | chSeekBar.setProgress(0); 145 | chSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { 146 | @Override 147 | public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 148 | chText.setText(String.valueOf(progress + 48)); 149 | } 150 | 151 | @Override 152 | public void onStartTrackingTouch(SeekBar seekBar) {} 153 | 154 | @Override 155 | public void onStopTrackingTouch(SeekBar seekBar) {} 156 | }); 157 | 158 | chText = view.findViewById(R.id.ch_text); 159 | chText.setText(String.valueOf(chSeekBar.getProgress() + 48)); 160 | 161 | return view; 162 | } 163 | 164 | @Override 165 | public void onClick(View v) { 166 | if (v == dialogButton) { 167 | BottomSheet.Builder builder = new BottomSheet.Builder(activity); 168 | builder.setDarkTheme(!theme); 169 | if (titleCheckBox.isChecked()) { 170 | builder.setTitle(R.string.title_text); 171 | } 172 | if (titleMultiCheckBox.isChecked()) { 173 | builder.setTitle(R.string.title_multiline_text); 174 | builder.setTitleMultiline(true); 175 | } 176 | if (iconsCheckBox.isChecked()) { 177 | builder.setItems(items, icons, (dialogInterface, i) -> 178 | Toast.makeText(activity, items[i], Toast.LENGTH_SHORT).show() 179 | ); 180 | } else { 181 | builder.setItems(items, (dialogInterface, i) -> 182 | Toast.makeText(activity, items[i], Toast.LENGTH_SHORT).show() 183 | ); 184 | } 185 | builder.setDividers(dividersCheckBox.isChecked()); 186 | builder.setFullWidth(fullWidthCheckBox.isChecked()); 187 | if (callbackCheckBox.isChecked()) { 188 | builder.setCallback(new BottomSheetCallback() { 189 | @Override 190 | public void onShown() { 191 | Toast.makeText(activity, R.string.shown, Toast.LENGTH_SHORT).show(); 192 | } 193 | 194 | @Override 195 | public void onDismissed() { 196 | Toast.makeText(activity, R.string.dismissed, Toast.LENGTH_SHORT).show(); 197 | } 198 | }); 199 | } 200 | if (fabCheckBox.isChecked()) { 201 | if (slideUpRadio.isChecked()) { 202 | builder.setFabBehavior(activity.fab, BottomSheet.FAB_SLIDE_UP); 203 | } else { 204 | builder.setFabBehavior(activity.fab); 205 | } 206 | } 207 | if (wdCheckBox.isChecked()) { 208 | builder.setWindowDimming(wdSeekBar.getProgress()); 209 | } 210 | if (chCheckBox.isChecked()) { 211 | builder.setCellHeight(Utils.dp(activity, chSeekBar.getProgress() + 48)); 212 | } 213 | 214 | builder.show(); 215 | } 216 | } 217 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable-v21/selectable_custom.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_about.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_copy.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_copy_48.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_edit.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_facebook.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_github.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_gmail.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_google_plus.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_hangouts.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_mail.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_message.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_print.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_share.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_theme.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_twitter.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_upload.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/selectable_custom.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /app/src/main/res/layout/about_view.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 14 | 15 | 22 | 23 | 30 | 31 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 11 | 12 | 18 | 19 | 20 | 21 | 28 | 29 | 35 | 36 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_main.xml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 14 | 15 | 16 |