RollingGlory is Company or Creative Digital Media studio based in Bandung, Indonesia.
 Â
GlorySDK is bundle API for Utility, Network, UI, Component and Architecture. Use package jetpack androidx and support kotlin in your project.
- Architecture GlorySDK
- Depedency Injection Support AndroidX
- Header Factory
- Drawer Factory
- RxGlory
- Endpoint Glory Builder
- JobGloryRx
- JobMultipleRxGlory
- JobNetworkRxGlory
- JobNetworkMultipleRxGlory
- JobNetworkWithRealmRxGlory
- JobRealmRxGlory
Â
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'
apply plugin: 'realm-android'
repositories {
maven {
url "https://dl.bintray.com/rollingglory/GlorySDK-android"
}
}
android {
//please enable data binding
dataBinding {
enabled = true
}
}
dependencies {
implementation 'com.rollingglory:glorysdk-android:0.0.1-alpha03'
//please include
//org.jetbrains.kotlin
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.31"
//io.reactivex.rxjava2
implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
implementation 'io.reactivex.rxjava2:rxjava:2.2.8'
//com.squareup.retrofit2
implementation 'com.squareup.retrofit2:retrofit:2.5.0'
implementation 'com.squareup.retrofit2:converter-gson:2.5.0'
implementation 'com.squareup.retrofit2:converter-scalars:2.5.0'
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.5.0'
//com.google.*
implementation 'com.google.code.gson:gson:2.8.4'
implementation 'com.google.android.material:material:1.0.0'
//com.google.dagger
implementation 'com.google.dagger:dagger:2.22.1'
kapt 'com.google.dagger:dagger-compiler:2.22.1'
implementation 'com.google.dagger:dagger-android:2.22.1'
implementation 'com.google.dagger:dagger-android-support:2.22.1'
kapt 'com.google.dagger:dagger-android-processor:2.22.1'
implementation 'javax.annotation:javax.annotation-api:1.3.2' //javax.annotation:jsr250-api:1.0 move to javax.annotation-api:1.3.2
//androidx
implementation 'androidx.appcompat:appcompat:1.0.2'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation 'androidx.multidex:multidex:2.0.1'
//androidx.room.*
implementation "androidx.room:room-runtime:2.1.0-rc01"
annotationProcessor "androidx.room:room-compiler:2.1.0-rc01"
implementation "androidx.room:room-rxjava2:2.1.0-rc01"
implementation "androidx.room:room-testing:2.1.0-rc01"
//com.jakewharton.retrofit
implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2'
}buildscript {
ext.kotlin_version = '1.3.31'
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.4.1'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.31"
classpath "io.realm:realm-gradle-plugin:5.11.0"
classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.8.4'
}
}
allprojects {
repositories {
google()
jcenter()
maven {
url "https://dl.bintray.com/rollingglory/GlorySDK-android"
}
maven { url 'https://maven.fabric.io/public' }
}
}
android.useAndroidX=true
android.databinding.enableV2=true
android.enableJetifier=true| Class | Migration Of | Role |
|---|---|---|
| ApplicationGlory | Application | Application |
| ActivityGlory | AppCompatActivity | Activity |
| FragmentGlory | Fragment | Fragment |
| PresenterGlory | - | Presenter |
| PresenterDelegateGlory | - | Presenter Delegate |
| ModuleActivityGlory | - | Provided Module Activity |
| ModuleBindingOnActivityGlory<t1 extends ActivityGlory,t2 extends ViewDataBinding> | - | Provided Module Binding On Activity |
| ModulePresenterOnActivityGlory<t1 extends ActivityGlory,t2 extends PresenterGlory> | - | Provided Module Presenter On Activity |
| ModuleHeaderOnActivityGlory<t1 extends ActivityGlory,t2 extends HeaderGlory.Factory> | - | Provided Module Header Factory On Activity |
| ModuleDrawerOnActivityGlory<t1 extends ActivityGlory,t2 extends DrawerGlory.Factory> | - | Provided Module Drawer Factory On Activity |
| ModuleFragmentGlory | - | Provided Module Fragment |
| ModuleBindingOnFragmentGlory<t1 extends FragmentGlory,t2 extends ViewDataBinding> | - | Provided Module Binding On Fragment |
| ModulePresenterOnFragmentGlory<t1 extends FragmentGlory,t2 extends PresenterGlory> | - | Provided Module Presenter On Fragment |
| ModuleHeaderOnFragmentGlory<t1 extends FragmentGlory,t2 extends HeaderGlory.Factory> | - | Provided Module Header Factory On Fragment |
| ModuleDrawerOnFragmentGlory<t1 extends FragmentGlory,t2 extends DrawerGlory.Factory> | - | Provided Module Drawer Factory On Fragment |
| Class | Migration Of | Role |
|---|---|---|
| AndroidInjectionX | AndroidInjection | Injection |
| HasActivityInjectorX | HasActivityInjector | Mark Activity Has Inject |
| HasFragmentInjectorX | HasFragmentInjector | Mark Fragment Has Inject |
| HasPresenterInjectorX | - | Mark Presenter Has Inject |
Header Factory is header module ui for layer activity or fragment;
Header Factory is drawer module ui for layer activity or fragment;
- ThemeGlory
- ThemeGlory.NoActionBar
- ThemeGlory.NoActionAndStatusBar
- ThemeGlory.AppBarOverlay
RxGlory is custom from RxJava with subscribe and observable, use RxGlroy for Job, Multile Job, Network, Multiple Network and Network with Realm.
EndpointBuilderGlory is Builder network for retrofit.
//ApplicationComponent.java
@Component(modules = {ModuleApplicationGlory.class,
ManifestApplicationModule.class,
ProvidedApplicationModule.class,
AndroidSupportInjectionModule.class})
public interface ApplicationComponent extends AndroidInjector<MainApplication> {
@Override
void inject(MainApplication application);
}
//ApplicationComponent.java
@Component(modules = {ModuleApplicationGlory.class,
ManifestApplicationModule.class,
ProvidedApplicationModule.class,
AndroidSupportInjectionModule.class})
public interface ApplicationComponent extends AndroidInjector<MainApplication> {
@Override
void inject(MainApplication application);
}//ProvidedApplicationModule.java
@Module
public class ProvidedApplicationModule {
private MainApplication mainApplication;
public ProvidedApplicationModule(MainApplication mainApplication){
this.mainApplication = mainApplication;
}
@Provides
public ReqresEndpoint providedEndpointDefault(){
return new EndpointBuilderGlory("https://reqres.id")
.supportConverterFactoryGson(true)
.supportAdapterFactoryRxJava(true)
.create(ReqresEndpoint.class);
}
}@Module
//ManifestApplicationModule.java
abstract class ManifestApplicationModule {
@ContributesAndroidInjector(modules = {HomeModule.class,
HomeModule.Binding.class,
HomeModule.Presenter.class,
HomeModule.Contribute.class})
abstract HomeActivity bindHomeActivity();
@ContributesAndroidInjector()
abstract HomePresenter bindHomePresenter();
}public class MainApplication extends ApplicationGlory {
private ReqresEndpoint defaultEndpoint;
@Override
public Builder onBuilder() {
return new Builder().setFontPath("path");
}
@Override
public void onCreate() {
super.onCreate();
initDagger();
initRealm();
}
private void initDagger(){
DaggerApplicationComponent
.builder()
.providedApplicationModule(new ProvidedApplicationModule(this))
.build()
.inject(this);
}
public ReqresEndpoint getDefaultEndpoint(){
return defaultEndpoint;
}
}Use theme ThemeGlory.NoActionBar
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.rollingglory.rollingglorysdk">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="18" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/ThemeGlory"
android:name=".MainApplication">
<activity
android:name=".layer.home.HomeActivity"
android:label="@string/app_name"
android:theme="@style/ThemeGlory.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>class HomeActivity extends ActivityGlory implements HomeDelegate{
@Inject
HomePresenter presenter;
@Inject
ActivityHomeBinding binding;
@Inject
ToolbarHeader header;
@Inject
HomeDrawer drawer;
@Override
public LayerBuilder onBuilder() {
return new LayerBuilder(R.layout.activity_home)
.presenterDelegate(this)
.presenter(new HomePresenter())
.drawerFactory(new HomeDrawer(this))
.headerFactory(new ToolbarHeader(this))
.inject(true);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding.buttonSingleUser.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
presenter.singleUser();
}
});
drawer.addMenu(new MenuGlory(1,"menu 2"));
drawer.setOnMenuSelected(new OnMenuSelected() {
@Override
public boolean menuSelected(MenuItem menuItem) {
Toast.makeText(HomeActivity.this,menuItem.getTitle(),Toast.LENGTH_LONG).show();
return true;
}
});
binding.buttonListUser.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
presenter.listUser();
}
});
header.addMenu(new MenuGlory(0,"Setting"));
header.setOnMenuSelected(new OnMenuSelected() {
@Override
public boolean menuSelected(MenuItem menuItem) {
if(menuItem.getItemId() == 0){
Toast.makeText(HomeActivity.this,menuItem.getTitle(),Toast.LENGTH_LONG).show();
}
return false;
}
});
}
@Override
public void userResponse(UserItem userItem) {
//todo user item response
}
@Override
public void userResponseError(String e) {
//todo error request user item
}
} class HomePresenter extends PresenterGlory<HomeDelegate> {
@Inject
ReqresEndpoint reqresEndpoint;
public void singleUser(){
new JobNetworkRxGlory().subscribe(reqresEndpoint.singleUser(1), new OnJobNetworkGloryRx<ReqresUser>() {
@Override
public ReqresUser onJob(ReqresUser reqresUser) throws IOException {
//todo job request
return reqresUser;
}
@Override
public void onSuccess(ReqresUser reqresUser) {
getPresenterDelegate().userResponse(reqresUser.userItem);
}
@Override
public void onError(Throwable e) {
//todo error, if request endpoint error adapter, parser json and exception
}
@Override
public void onErrorNetwork(String e) {
//todo error, if request endpooint error http code, timeout and illegal exception
getPresenterDelegate().userResponseError(e);
}
});
}
}interface HomeDelegate extends PresenterDelegateGlory {
void userResponse(UserItem userItem);
void userResponseError(String e);
}@Module
public class HomeModule extends ModuleActivityGlory {
@Module
public static class Drawer extends ModuleDrawerOnActivityGlory<HomeActivity, HomeDrawer> {}
@Module
public static class Binding extends ModuleBindingOnActivityGlory<HomeActivity, ActivityHomeBinding> {}
@Module
public static class Header extends ModuleHeaderOnActivityGlory<HomeActivity, ToolbarHeader> {}
@Module
public static class Presenter extends ModulePresenterOnActivityGlory<HomeActivity, HomePresenter> {}
}class HomePresenter extends PresenterGlory<HomeDelegate> {
void populateUser(){
new JobGloryRx().subscribe(new OnJobGloryRx<List<UserItem>>() {
@Override
public List<UserItem> onJob() throws IOException {
//todo job
return new ArrayList<>();
}
@Override
public void onSuccess(List<UserItem> data) {
//todo success and update ui
}
@Override
public void onError(Throwable e) {
//todo error
}
});
}
}class HomePresenter extends PresenterGlory<HomeDelegate> {
void populateAndFind(){
new JobMultipleRxGlory().subscribe(new OnJobMultipleRxGlory<List<UserItem>,List<ResourceItem>,UserItem,ResourceItem>(){
@Override
public List<UserItem> onJob1() throws IOException {
//todo job first
return new ArrayList<>();
}
@Override
public void onSuccess1(List<UserItem> data) {
//todo success job first and update ui
}
@Override
public void onError1(Throwable e) {
//todo error job first
}
@Override
public List<ResourceItem> onJob2(List<UserItem> data) throws IOException {
//todo job second
return new ArrayList<>();
}
@Override
public void onSuccess2(List<ResourceItem> data) {
//todo success job second and update ui
}
@Override
public void onError2(Throwable e) {
//todo error job second
}
@Override
public UserItem onJob3(List<ResourceItem> data) throws IOException {
//todo job third
return new UserItem();
}
@Override
public void onSuccess3(UserItem data) {
//todo success job third and update ui
}
@Override
public void onError3(Throwable e) {
//todo error job third
}
@Override
public ResourceItem onJob4(UserItem data) throws IOException {
//todo job fourth
return new ResourceItem();
}
@Override
public void onSuccess4(ResourceItem data) {
//todo success job fourth
}
@Override
public void onError4(Throwable e) {
//todo error job fourth
}
@Override
public void onStart() {
//todo start from job first and complete job fourth
}
@Override
public void onComplete() {
//todo complete, if job first to fourth not exception catch error then call complete
}
});
}
}class HomePresenter extends PresenterGlory<HomeDelegate> {
public void requestUser{
new JobNetworkRxGlory().subscribe(reqresEndpoint.singleUser(1), new OnJobNetworkGloryRx<ReqresUser>() {
@Override
public ReqresUser onJob(ReqresUser reqresUser) throws IOException {
//todo job request
return reqresUser;
}
@Override
public void onSuccess(ReqresUser reqresUser) {
//todo job success and update ui
}
@Override
public void onError(Throwable e) {
//todo error, if request endpoint error adapter, parser json and exception
}
@Override
public void onErrorNetwork(String e) {
//todo error, if request endpooint error http code, timeout and illegal exception
}
});
}
}class HomePresenter extends PresenterGlory<HomeDelegate> {
public void requestMultipleUser(){
new JobNetworkMultipleRxGlory().subscribe(reqresEndpoint.singleUser(1), reqresEndpoint.singleUser(2), new OnJobNetworkMultipleGloryRx<ReqresUser, ReqresUser>() {
@Override
public ReqresUser onJob1(ReqresUser reqresUser) throws IOException {
//todo job first
return reqresUser;
}
@Override
public void onSuccess1(ReqresUser reqresUser) {
//todo success job second and update ui
}
@Override
public void onError1(Throwable e) {
//todo error job first, if request endpoint error adapter, parser json and exception
}
@Override
public void onErrorNetwork1(String e) {
//todo error job first, if request endpooint error http code, timeout and illegal exception
}
@Override
public ReqresUser onJob2(ReqresUser reqresUser) throws IOException {
//todo job second
return reqresUser;
}
@Override
public void onSuccess2(ReqresUser reqresUser) {
//todo success job first and update ui
}
@Override
public void onError2(Throwable e) {
//todo error job second, if request endpoint error adapter, parser json and exception
}
@Override
public void onErrorNetwork2(String e) {
//todo error job second, if request endpooint error http code, timeout and illegal exception
}
});
}
}class HomePresenter extends PresenterGlory<HomeDelegate> {
public void requestAndSave(){
new JobNetworkWithRealmRxGlory().subscribe(reqresEndpoint.singleUser(1), new OnJobNetworkWithRealmGloryRx<ReqresUser>() {
@Override
public ReqresUser onJob(ReqresUser reqresUser, Realm realm) throws IOException {
//todo job with realm
return reqresUser;
}
@Override
public void onSuccess(ReqresUser reqresUser) {
//todo job success and update ui
}
@Override
public void onError(Throwable e) {
//todo error job second, if request endpoint error adapter, parser json and exception, or error realm exception
}
@Override
public void onErrorNetwork(String e) {
//todo error job second, if request endpooint error http code, timeout and illegal exception
}
});
}
}class HomePresenter extends PresenterGlory<HomeDelegate> {
public void saveToDatabase(){
new JobRealmRxGlory().subscribe(new OnJobRealmGloryRx<List<ResourceItem>>() {
@Override
public List<ResourceItem> onJob(Realm realm) throws IOException {
//todo job realm
return new ArrayList<>();
}
@Override
public void onSuccess(List<ResourceItem> data) {
//todo job success and update ui
}
@Override
public void onError(Throwable e) {
//todo job error exception realm
}
});
}
}com.yourapp.app
- endpoint
- yourendpointaEndpoint.java
- yourendpointbEndpoint.java
package for interface endpoint
- di
package for configuration depedency injection
- network
- yourendpointa
- request
- response
- yourendpointb
- request
- response
package for param request and response
- yourendpointa
- database
- realm
- entity
- repository
- room
- entity
- repository
package for database entity and repository
- realm
- layer
- youractivitya
- fragmenta
- fragmentb
- youractivityb
package for acivity dan fragment
- youractivitya
def buildString = { k -> "\"${k}\"" }
android {
buildTypes {
staging {
buildConfigField "String", "ENDPOINT_YOUR1", buildString("http://stagging.endpointyour1.com")
buildConfigField "String", "ENDPOINT_YOUR1_TOKEN_AUTH", buildString("endpoint your1 token auth for stagging")
buildConfigField "String", "ENDPOINT_YOUR1_TOKEN_PLATFORM", buildString("endpoint your1 token platform stagging")
buildConfigField "String", "ENDPOINT_YOUR2", buildString("http://stagging.endpointyour2.com")
}
release {
buildConfigField "String", "ENDPOINT_YOUR1", buildString("http://api.endpointyour1.com")
buildConfigField "String", "ENDPOINT_YOUR1_TOKEN_AUTH", buildString("endpoint your1 token auth for release")
buildConfigField "String", "ENDPOINT_YOUR1_TOKEN_PLATFORM", buildString("endpoint your1 token platform release")
buildConfigField "String", "ENDPOINT_YOUR2", buildString("http://api.endpointyour2.com")
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
- Dagger
- RxJava
- Room
- Realm
- Retrofit
- Calligraphy
You can follow us at https://rollingglory.com/