├── app
├── .gitignore
├── src
│ ├── main
│ │ ├── res
│ │ │ ├── raw
│ │ │ │ ├── ic_heart.png
│ │ │ │ ├── ic_download.png
│ │ │ │ └── test_feed.json
│ │ │ ├── drawable-hdpi
│ │ │ │ ├── ic_back.png
│ │ │ │ ├── ic_search.png
│ │ │ │ ├── ic_share.png
│ │ │ │ ├── ic_sort.png
│ │ │ │ ├── ic_tech.png
│ │ │ │ ├── ic_business.png
│ │ │ │ ├── ic_filters.png
│ │ │ │ ├── ic_category_3.png
│ │ │ │ └── ic_side_menu.png
│ │ │ ├── mipmap-hdpi
│ │ │ │ └── ic_launcher.png
│ │ │ ├── mipmap-mdpi
│ │ │ │ └── ic_launcher.png
│ │ │ ├── mipmap-xhdpi
│ │ │ │ └── ic_launcher.png
│ │ │ ├── mipmap-xxhdpi
│ │ │ │ └── ic_launcher.png
│ │ │ ├── mipmap-xxxhdpi
│ │ │ │ └── ic_launcher.png
│ │ │ ├── drawable
│ │ │ │ ├── list_selector.xml
│ │ │ │ ├── bg_search.xml
│ │ │ │ ├── ripple.xml
│ │ │ │ └── text_selector.xml
│ │ │ ├── drawable-v21
│ │ │ │ └── ripple.xml
│ │ │ ├── layout
│ │ │ │ ├── view_progress.xml
│ │ │ │ ├── activity_webview.xml
│ │ │ │ ├── view_bottom_sheet.xml
│ │ │ │ ├── view_error.xml
│ │ │ │ ├── activity_main.xml
│ │ │ │ ├── fragment_list_item.xml
│ │ │ │ ├── activity_feed.xml
│ │ │ │ ├── fragment_main.xml
│ │ │ │ ├── bottom_list_item.xml
│ │ │ │ ├── view_toolbar.xml
│ │ │ │ └── feed_list_item.xml
│ │ │ └── values
│ │ │ │ ├── styles.xml
│ │ │ │ ├── dimens.xml
│ │ │ │ ├── colors.xml
│ │ │ │ └── strings.xml
│ │ ├── assets
│ │ │ └── fonts
│ │ │ │ └── tiempos_h_medium.otf
│ │ ├── java
│ │ │ └── com
│ │ │ │ └── an
│ │ │ │ └── inshorts
│ │ │ │ ├── service
│ │ │ │ ├── ResponseService.java
│ │ │ │ ├── ResponseServiceImpl.java
│ │ │ │ ├── AbstractServiceImpl.java
│ │ │ │ ├── FeedService.java
│ │ │ │ ├── DataService.java
│ │ │ │ ├── DataServiceImpl.java
│ │ │ │ └── FeedServiceImpl.java
│ │ │ │ ├── listener
│ │ │ │ ├── MenuItemListener.java
│ │ │ │ ├── OnViewItemClickListener.java
│ │ │ │ └── OnFeedChangeListener.java
│ │ │ │ ├── callback
│ │ │ │ └── RESTListener.java
│ │ │ │ ├── fragment
│ │ │ │ ├── BaseFragment.java
│ │ │ │ └── MainFragment.java
│ │ │ │ ├── model
│ │ │ │ ├── MenuItem.java
│ │ │ │ └── Feed.java
│ │ │ │ ├── db
│ │ │ │ ├── DbExecutorService.java
│ │ │ │ ├── FeedDbTask.java
│ │ │ │ ├── FeedModule.java
│ │ │ │ └── FeedDb.java
│ │ │ │ ├── rest
│ │ │ │ ├── RESTExecutorService.java
│ │ │ │ ├── RESTApiTask.java
│ │ │ │ ├── RESTService.java
│ │ │ │ └── RESTCacheRequest.java
│ │ │ │ ├── utils
│ │ │ │ ├── CollectionUtils.java
│ │ │ │ ├── ConnectivityStatus.java
│ │ │ │ ├── NavigatorUtils.java
│ │ │ │ ├── ObjectUtil.java
│ │ │ │ └── BaseUtils.java
│ │ │ │ ├── dialogs
│ │ │ │ ├── BottomSheetHelper.java
│ │ │ │ └── CustomBottomSheetDialog.java
│ │ │ │ ├── BaseApplication.java
│ │ │ │ ├── views
│ │ │ │ ├── AspectRatioCardView.java
│ │ │ │ ├── PaginationScrollListener.java
│ │ │ │ ├── CustomPageTransformer.java
│ │ │ │ ├── CustomWebViewClient.java
│ │ │ │ ├── RecyclerItemClickListener.java
│ │ │ │ ├── CustomViewPager.java
│ │ │ │ └── MenuCreator.java
│ │ │ │ ├── BaseConstants.java
│ │ │ │ ├── adapter
│ │ │ │ ├── MainPagerAdapter.java
│ │ │ │ ├── MenuItemAdapter.java
│ │ │ │ ├── FeedListAdapter.java
│ │ │ │ └── NewsListAdapter.java
│ │ │ │ └── activity
│ │ │ │ ├── CustomWebViewActivity.java
│ │ │ │ ├── BaseActivity.java
│ │ │ │ ├── MainActivity.java
│ │ │ │ └── FeedListActivity.java
│ │ └── AndroidManifest.xml
│ ├── test
│ │ └── java
│ │ │ └── com
│ │ │ └── an
│ │ │ └── inshorts
│ │ │ └── ExampleUnitTest.java
│ └── androidTest
│ │ └── java
│ │ └── com
│ │ └── an
│ │ └── inshorts
│ │ └── ExampleInstrumentedTest.java
├── proguard-rules.pro
└── build.gradle
├── settings.gradle
├── README.md
├── gradle
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── .gitignore
├── gradle.properties
├── gradlew.bat
└── gradlew
/app/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/settings.gradle:
--------------------------------------------------------------------------------
1 | include ':app'
2 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Inshorts
2 | A demo app news app for a hackathon - includes MVP architecture example
3 |
--------------------------------------------------------------------------------
/app/src/main/res/raw/ic_heart.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/anitaa1990/Inshorts/HEAD/app/src/main/res/raw/ic_heart.png
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/anitaa1990/Inshorts/HEAD/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/app/src/main/res/raw/ic_download.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/anitaa1990/Inshorts/HEAD/app/src/main/res/raw/ic_download.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/ic_back.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/anitaa1990/Inshorts/HEAD/app/src/main/res/drawable-hdpi/ic_back.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/ic_search.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/anitaa1990/Inshorts/HEAD/app/src/main/res/drawable-hdpi/ic_search.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/ic_share.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/anitaa1990/Inshorts/HEAD/app/src/main/res/drawable-hdpi/ic_share.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/ic_sort.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/anitaa1990/Inshorts/HEAD/app/src/main/res/drawable-hdpi/ic_sort.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/ic_tech.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/anitaa1990/Inshorts/HEAD/app/src/main/res/drawable-hdpi/ic_tech.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/anitaa1990/Inshorts/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/anitaa1990/Inshorts/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/assets/fonts/tiempos_h_medium.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/anitaa1990/Inshorts/HEAD/app/src/main/assets/fonts/tiempos_h_medium.otf
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/ic_business.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/anitaa1990/Inshorts/HEAD/app/src/main/res/drawable-hdpi/ic_business.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/ic_filters.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/anitaa1990/Inshorts/HEAD/app/src/main/res/drawable-hdpi/ic_filters.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/anitaa1990/Inshorts/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/anitaa1990/Inshorts/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/ic_category_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/anitaa1990/Inshorts/HEAD/app/src/main/res/drawable-hdpi/ic_category_3.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/ic_side_menu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/anitaa1990/Inshorts/HEAD/app/src/main/res/drawable-hdpi/ic_side_menu.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/anitaa1990/Inshorts/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/java/com/an/inshorts/service/ResponseService.java:
--------------------------------------------------------------------------------
1 | package com.an.inshorts.service;
2 |
3 | public interface ResponseService {
4 |
5 | }
6 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | *.iml
2 | .gradle
3 | /local.properties
4 | /.idea/workspace.xml
5 | /.idea/libraries
6 | .DS_Store
7 | /build
8 | /captures
9 | .externalNativeBuild
10 |
--------------------------------------------------------------------------------
/app/src/main/java/com/an/inshorts/listener/MenuItemListener.java:
--------------------------------------------------------------------------------
1 | package com.an.inshorts.listener;
2 |
3 | import com.an.inshorts.model.MenuItem;
4 |
5 | public interface MenuItemListener {
6 | void onMenuItemClick(MenuItem item);
7 | }
8 |
--------------------------------------------------------------------------------
/app/src/main/java/com/an/inshorts/callback/RESTListener.java:
--------------------------------------------------------------------------------
1 | package com.an.inshorts.callback;
2 |
3 |
4 | import com.android.volley.VolleyError;
5 |
6 | public interface RESTListener {
7 |
8 | void onSuccess(Object response);
9 | void onError(VolleyError error);
10 | }
11 |
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Mon Dec 28 10:00:20 PST 2015
2 | distributionBase=GRADLE_USER_HOME
3 | distributionPath=wrapper/dists
4 | zipStoreBase=GRADLE_USER_HOME
5 | zipStorePath=wrapper/dists
6 | distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip
7 |
--------------------------------------------------------------------------------
/app/src/main/java/com/an/inshorts/listener/OnViewItemClickListener.java:
--------------------------------------------------------------------------------
1 | package com.an.inshorts.listener;
2 |
3 |
4 | public interface OnViewItemClickListener {
5 | void onFavClick(int position, boolean checked);
6 | void onOfflineClick(int position, boolean checked);
7 | void onViewClick(int position);
8 | }
9 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/list_selector.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
8 |
--------------------------------------------------------------------------------
/app/src/main/java/com/an/inshorts/listener/OnFeedChangeListener.java:
--------------------------------------------------------------------------------
1 | package com.an.inshorts.listener;
2 |
3 |
4 | import com.an.inshorts.model.Feed;
5 |
6 | import java.util.List;
7 | import java.util.Map;
8 |
9 | public interface OnFeedChangeListener {
10 |
11 | void showError(String message);
12 | void refreshFeed(Map> data);
13 | }
14 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/bg_search.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
7 |
--------------------------------------------------------------------------------
/app/src/main/java/com/an/inshorts/service/ResponseServiceImpl.java:
--------------------------------------------------------------------------------
1 | package com.an.inshorts.service;
2 |
3 | import android.content.Context;
4 |
5 |
6 | /*
7 | * Class to handle the response returned from api
8 | *
9 | * */
10 |
11 | public class ResponseServiceImpl extends DataServiceImpl implements ResponseService {
12 |
13 |
14 | public ResponseServiceImpl(Context context) {
15 | super(context);
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ripple.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 | -
5 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable-v21/ripple.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 | -
5 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/test/java/com/an/inshorts/ExampleUnitTest.java:
--------------------------------------------------------------------------------
1 | package com.an.inshorts;
2 |
3 | import org.junit.Test;
4 |
5 | import static org.junit.Assert.*;
6 |
7 | /**
8 | * Example local unit test, which will execute on the development machine (host).
9 | *
10 | * @see Testing documentation
11 | */
12 | public class ExampleUnitTest {
13 | @Test
14 | public void addition_isCorrect() throws Exception {
15 | assertEquals(4, 2 + 2);
16 | }
17 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/an/inshorts/service/AbstractServiceImpl.java:
--------------------------------------------------------------------------------
1 | package com.an.inshorts.service;
2 |
3 | import android.content.Context;
4 |
5 | import com.an.inshorts.BaseConstants;
6 | import com.an.inshorts.db.FeedModule;
7 |
8 | public abstract class AbstractServiceImpl implements BaseConstants {
9 |
10 | protected Context context;
11 | protected FeedModule feedModule;
12 | public AbstractServiceImpl(Context context) {
13 | this.context = context;
14 | this.feedModule = FeedModule.getInstance();
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/app/src/main/java/com/an/inshorts/fragment/BaseFragment.java:
--------------------------------------------------------------------------------
1 | package com.an.inshorts.fragment;
2 |
3 | import android.app.Activity;
4 | import android.content.Context;
5 | import android.support.v4.app.Fragment;
6 |
7 | import com.an.inshorts.BaseConstants;
8 |
9 | public class BaseFragment extends Fragment implements BaseConstants {
10 |
11 | protected Activity activity;
12 |
13 | @Override
14 | public void onAttach(Context context) {
15 | super.onAttach(context);
16 | this.activity = (Activity) context;
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/app/src/main/java/com/an/inshorts/model/MenuItem.java:
--------------------------------------------------------------------------------
1 | package com.an.inshorts.model;
2 |
3 | import java.io.Serializable;
4 |
5 | public class MenuItem implements Serializable {
6 |
7 | private int mDrawableRes;
8 | private String mTitle;
9 |
10 | public MenuItem(int drawable, String title) {
11 | mDrawableRes = drawable;
12 | mTitle = title;
13 | }
14 |
15 | public int getDrawableResource() {
16 | return mDrawableRes;
17 | }
18 |
19 | public String getTitle() {
20 | return mTitle;
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/app/src/main/java/com/an/inshorts/db/DbExecutorService.java:
--------------------------------------------------------------------------------
1 | package com.an.inshorts.db;
2 |
3 | import java.util.concurrent.ExecutorService;
4 | import java.util.concurrent.Executors;
5 |
6 | public class DbExecutorService {
7 |
8 | private static final ExecutorService _appDbThreadPool = Executors.newFixedThreadPool(5);
9 |
10 | public static void submit(Runnable runnable) {
11 | getAppDbThreadPool().submit(runnable);
12 | }
13 |
14 | private static ExecutorService getAppDbThreadPool() {
15 | return _appDbThreadPool;
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/app/src/main/java/com/an/inshorts/rest/RESTExecutorService.java:
--------------------------------------------------------------------------------
1 | package com.an.inshorts.rest;
2 |
3 |
4 | import java.util.concurrent.ExecutorService;
5 | import java.util.concurrent.Executors;
6 |
7 | public class RESTExecutorService {
8 |
9 | private static final ExecutorService _restAPIThreadPool = Executors.newFixedThreadPool(5);
10 |
11 | public static void submit(Runnable runnable) {
12 | getRestAPIThreadPool().submit(runnable);
13 | }
14 |
15 | private static ExecutorService getRestAPIThreadPool() {
16 | return _restAPIThreadPool;
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/view_progress.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
14 |
15 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/text_selector.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/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/anitaa/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/an/inshorts/service/FeedService.java:
--------------------------------------------------------------------------------
1 | package com.an.inshorts.service;
2 |
3 |
4 | import com.an.inshorts.model.Feed;
5 |
6 | import java.util.List;
7 | import java.util.Map;
8 |
9 | public interface FeedService {
10 |
11 | void handleAction(String type, Feed feed, boolean checked);
12 | Map> handleMenuItemClick(String method, List data);
13 | boolean isFavourite(Long id);
14 | boolean isOfflineFeed(Long id);
15 | List sortFeed(String type, List data);
16 | Map> filterFeed(String type, List data);
17 | Map> fetchFavouriteFeeds();
18 | Map> fetchOfflineFeeds();
19 | List loadMoreFeed(String type, String name, int limit);
20 | }
21 |
--------------------------------------------------------------------------------
/gradle.properties:
--------------------------------------------------------------------------------
1 | # Project-wide Gradle settings.
2 |
3 | # IDE (e.g. Android Studio) users:
4 | # Gradle settings configured through the IDE *will override*
5 | # any settings specified in this file.
6 |
7 | # For more details on how to configure your build environment visit
8 | # http://www.gradle.org/docs/current/userguide/build_environment.html
9 |
10 | # Specifies the JVM arguments used for the daemon process.
11 | # The setting is particularly useful for tweaking memory settings.
12 | org.gradle.jvmargs=-Xmx1536m
13 |
14 | # When configured, Gradle will run in incubating parallel mode.
15 | # This option should only be used with decoupled projects. More details, visit
16 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
17 | # org.gradle.parallel=true
18 |
--------------------------------------------------------------------------------
/app/src/main/java/com/an/inshorts/utils/CollectionUtils.java:
--------------------------------------------------------------------------------
1 | package com.an.inshorts.utils;
2 |
3 | import com.an.inshorts.model.Feed;
4 | import java.util.Collections;
5 | import java.util.Comparator;
6 | import java.util.List;
7 |
8 | public class CollectionUtils {
9 |
10 | public static List sortFeedAsc(List data) {
11 | Collections.sort(data, new Comparator() {
12 | public int compare(Feed o1, Feed o2) {
13 | return o1.getTimestamp().compareTo(o2.getTimestamp());
14 | }
15 | });
16 | return data;
17 | }
18 |
19 | public static List sortFeedDesc(List data) {
20 | List sortedData = sortFeedAsc(data);
21 | Collections.reverse(sortedData);
22 | return sortedData;
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_webview.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
7 |
8 |
9 |
13 |
14 |
20 |
21 |
--------------------------------------------------------------------------------
/app/src/main/java/com/an/inshorts/utils/ConnectivityStatus.java:
--------------------------------------------------------------------------------
1 | package com.an.inshorts.utils;
2 |
3 | import android.content.Context;
4 | import android.content.ContextWrapper;
5 | import android.net.ConnectivityManager;
6 | import android.net.NetworkInfo;
7 |
8 |
9 | public class ConnectivityStatus extends ContextWrapper {
10 |
11 | public ConnectivityStatus(Context base) {
12 | super(base);
13 | }
14 |
15 | public static boolean isConnected(Context context){
16 |
17 | ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
18 | NetworkInfo connection = manager.getActiveNetworkInfo();
19 | if (connection != null && connection.isConnectedOrConnecting()){
20 | return true;
21 | }
22 | return false;
23 | }
24 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/an/inshorts/dialogs/BottomSheetHelper.java:
--------------------------------------------------------------------------------
1 | package com.an.inshorts.dialogs;
2 |
3 | import android.content.Context;
4 |
5 | import com.an.inshorts.listener.MenuItemListener;
6 | import com.an.inshorts.model.MenuItem;
7 | import java.util.List;
8 |
9 |
10 | public class BottomSheetHelper {
11 |
12 | private static BottomSheetHelper instance;
13 | public static BottomSheetHelper getInstance() {
14 | if(instance == null) instance = new BottomSheetHelper();
15 | return instance;
16 | }
17 |
18 | private CustomBottomSheetDialog bottomSheetDialog;
19 |
20 | public void showBottomSheet(Context context, List