UNPKG

generator-android-hipster

Version:

Android generator based on MVP, Dagger2, RxJava, Java & Kotlin Stack and usefull libraries for Android

482 lines (432 loc) 24.1 kB
'use strict'; var yeoman = require('yeoman-generator'); var chalk = require('chalk'); var yosay = require('yosay'); var mkdirp = require('mkdirp'); var generators = require('yeoman-generator'); var scriptBase = require('../script-base'); var util = require('util'); var AndroidManifest = require('androidmanifest'); var AppGenerator = generators.Base.extend({}); util.inherits(AppGenerator, scriptBase); module.exports = AppGenerator.extend({ initializing: { setupVars: function () { this.baseName = this.config.get('appName'); console.log(this.baseName); this.jhipsterVersion = this.config.get('jhipsterVersion'); this.testFrameworks = this.config.get('testFrameworks'); var configFound = this.baseName != null; if (configFound) { this.existingProject = true; } this.appName = this.config.get('appName'); this.language = this.config.get('language'); this.appPackage = this.config.get('appPackage'); this.nucleus = this.config.get('nucleus') || true; this.mvp = this.config.get('mvp') || 'nucleus'; this.imageLib = this.config.get('imageLib') || 'glide'; this.glide = this.config.get('glide'); this.picasso = this.config.get('picasso'); this.eventbus = this.config.get('eventbus') || true; this.mixpanel = this.config.get('mixpanel') || true; this.timber = this.config.get('timber') || true; this.jodatime = this.config.get('jodatime') || true; this.jodamoney = this.config.get('jodamoney') || true; this.threetenabp = this.config.get('threetenabp') || true; this.butterknife = this.config.get('butterknife') || true; this.androidTargetSdkVersion = this.config.get('androidTargetSdkVersion'); this.androidMinSdkVersion = this.config.get('minSdk'); this.calligraphy = this.config.get('calligraphy') || true; this.playServices = this.config.get('playServices') || []; this.stetho = this.config.get('stetho') || true; this.printview = this.config.get('printview') || true; this.autoparcel = this.config.get('autoparcel') || true; } }, prompting: function () { var done = this.async(); if (this.existingProject) { done(); return; } this.log(yosay( 'Welcome to the ' + chalk.red('Android Hipster') + ' generator!' )); var defaultAppBaseName = 'android.hipster'; var prompts = [ { name: 'name', message: 'What are the name of your app?', store: true, validate: function (input) { if (/^([a-zA-Z0-9_]*)$/.test(input)) return true; return 'Your application name cannot contain special characters or a blank space, using the default name instead : ' + defaultAppBaseName }, default: this.defaultAppBaseName }, { name: 'package', message: 'What is the package name of the app?', validate: function (input) { if (/^([a-z_]{1}[a-z0-9_]*(\.[a-z_]{1}[a-z0-9_]*)*)$/.test(input)) return true; return 'The package name you have provided is not a valid Java package name.' }, default: 'io.android.hipster', store: true }, { type: 'list', name: 'language', message: 'What language would you like to use? ', choices: [ { value: 'kotlin', name: 'Kotlin (Java not supported anymore)' } ], default: 0 }, { type: 'list', name: 'image', message: 'What Image Lib would you like to use? ', choices: [ { value: 'glide', name: 'Glide' }, { value: 'picasso', name: 'Picasso' }, { value: 'none', name: 'None' } ], default: 'glide' }, { type: 'list', name: 'mvp', message: 'What MVP do you want to use? ', choices: [ { value: 'embeed', name: 'Embeed MVP (No Lib)' } ], default: 'embeed' }, { type: 'confirm', name: 'butterknife', message: 'Use ButterKnife? ', default: true }, { type: 'confirm', name: 'eventbus', message: 'Would you like to use EventBus?', default: true }, { type: 'confirm', name: 'calligraphy', message: 'Would you like to use calligraphy for custom fonts?', default: true }, { type: 'list', name: 'dates', message: 'What date Library do you want to use? ', choices: [ { value: 'jodatime', name: 'Joda Time' }, { value: 'threetenabp', name: 'ThreeTenAbp' }, { value: 'none', name: 'None' } ], default: 'jodatime' }, { type: 'confirm', name: 'mixpanel', message: 'Would you like to use MixPanel?', default: true }, { type: 'confirm', name: 'jodamoney', message: 'Would you like to use Joda Money?', default: true }, { type: 'confirm', name: 'timber', message: 'Would you like to use Timber for logs?', default: true }, { type: 'confirm', name: 'printview', message: 'Would you like to use PrintView for icon font?', default: true }, { type: 'confirm', name: 'stetho', message: 'Would you like to use Stetho for Network Monitoring?', default: false }, { when: function (data) { return data.language == 'java'; }, type: 'confirm', name: 'autoparcel', message: 'Would you like to use AutoParcel?', default: false }, { when: function (data) { return data.language == 'kotlin'; }, type: 'confirm', name: 'paperparcel', message: 'Would you like to use PaperParcel?', default: true }, { name: 'targetSdk', message: 'What Android SDK will you be targeting?', store: true, default: 26 }, { name: 'minSdk', message: 'What is the minimum Android SDK you wish to support?', store: true, default: 15 }, { type: 'checkbox', name: 'playServices', message: 'Enable Google Play Services Libraries?', choices: [ {name: 'base', value: 'base'}, {name: 'location', value: 'location'}, {name: 'gcm', value: 'gcm'}, {name: 'maps', value: 'maps'}, {name: 'plus', value: 'plus'}, {name: 'auth', value: 'auth'}, {name: 'identity', value: 'identity'}, {name: 'appindexing', value: 'appindexing'}, {name: 'appinvite', value: 'appinvite'}, {name: 'analytics', value: 'analytics'}, {name: 'cast', value: 'cast'}, {name: 'drive', value: 'drive'}, {name: 'fitness', value: 'fitness'}, {name: 'ads', value: 'ads'}, {name: 'vision', value: 'vision'}, {name: 'nearby', value: 'nearby'}, {name: 'panorama', value: 'panorama'}, {name: 'games', value: 'games'}, {name: 'wearable', value: 'wearable'}, {name: 'safetynet', value: 'safetynet'}, {name: 'wallet', value: 'wallet'}, {name: 'wearable', value: 'wearable'} ], default: ['no'] } ]; this.prompt(prompts, function (props) { this.appName = props.name; this.imageLib = props.image; this.glide = this.imageLib == 'glide'; this.picasso = this.imageLib == 'picasso'; this.eventbus = props.eventbus; this.mixpanel = props.mixpanel; this.timber = props.timber; this.jodatime = props.dates == 'jodatime'; this.threetenabp = props.dates == 'threetenabp'; this.jodamoney = props.jodamoney; this.butterknife = props.butterknife; this.appPackage = props.package; this.androidTargetSdkVersion = props.targetSdk; this.androidMinSdkVersion = props.minSdk; this.language = props.language; this.calligraphy = props.calligraphy; this.playServices = props.playServices; this.paperparcel = props.paperparcel; this.stetho = props.stetho; this.printview = props.printview; this.autoparcel = true; // Yeap, need to be true at this time // this.autoparcel = props.autoparcel this.mvp = props.mvp; this.mvpembeed = props.mvp == 'embeed'; this.nucleus = props.mvp == 'nucleus'; done() }.bind(this)) }, configuring: { saveSettings: function () { if (this.existingProject) { return; } this.config.set('appPackage', this.appPackage); this.config.set('appName', this.appName); this.config.set('language', this.language); this.config.set('nucleus', this.nucleus); this.config.set('mvp', this.mvp); this.config.set('imageLib', this.imageLib); this.config.set('picasso', this.picasso); this.config.set('glide', this.glide); this.config.set('eventbus', this.eventbus); this.config.set('mixpanel', this.mixpanel); this.config.set('timber', this.timber); this.config.set('jodatime', this.jodatime); this.config.set('threetenabp', this.threetenabp); this.config.set('paperparcel', this.paperparcel); this.config.set('jodamoney', this.jodamoney); this.config.set('butterknife', this.butterknife); this.config.set('androidTargetSdkVersion', this.androidTargetSdkVersion); this.config.set('minSdk', this.androidMinSdkVersion); this.config.set('calligraphy', this.calligraphy); this.config.set('playServices', this.playServices); this.config.set('stetho', this.stetho); this.config.set('printview', this.printview); this.config.set('autoparcel', this.autoparcel); this.config.set('mvp', this.mvp); this.config.set('nucleus', this.mvp == 'nucleus'); } }, writing: { projectfiles: function () { this.copy('gitignore', '.gitignore'); this.copy('gradle.properties', 'gradle.properties'); this.copy('gradlew', 'gradlew'); this.copy('gradlew.bat', 'gradlew.bat'); this.template('settings.gradle', 'settings.gradle'); this.directory('gradle', 'gradle'); this.copy('common/gitignore', 'app/.gitignore'); this.copy('common/proguard-rules.pro', 'app/proguard-rules.pro'); this.template('_build.gradle', 'build.gradle', this, {}); this.template('common/_app_build.gradle', 'app/build.gradle', this, {}) }, app: function () { console.log(this.stetho); var packageDir = this.appPackage.replace(/\./g, '/'); mkdirp('app'); mkdirp('app/libs'); var appFolder = 'app-kotlin'; mkdirp('app/src/internal/java/' + packageDir); mkdirp('app/src/internalDebug/java/' + packageDir); mkdirp('app/src/internalRelease/java/' + packageDir); mkdirp('app/src/production/java/' + packageDir); mkdirp('app/src/productionDebug/java/' + packageDir); mkdirp('app/src/productionRelease/java/' + packageDir); mkdirp('app/src/main/java/' + packageDir); var ext = this.language == 'java' ? '.java' : '.kt'; this.template(appFolder + '/src/main/java/network/OAuthInterceptor.kt', 'app/src/main/java/' + packageDir + '/network/OAuthInterceptor.kt', this, {}); this.template(appFolder + '/src/main/java/network/OkHttpNetworkInterceptors.kt', 'app/src/main/java/' + packageDir + '/network/OkHttpNetworkInterceptors.kt', this, {}); this.template(appFolder + '/src/main/java/network/OkHttpInterceptors.kt', 'app/src/main/java/' + packageDir + '/network/OkHttpInterceptors.kt', this, {}); this.template(appFolder + '/src/main/java/network/OkHttpInterceptorsModuleInternal.kt', 'app/src/internal/java/' + packageDir + '/network/OkHttpInterceptorsModule.kt', this, {}); this.template(appFolder + '/src/main/java/network/OkHttpInterceptorsModule.kt', 'app/src/production/java/' + packageDir + '/network/OkHttpInterceptorsModule.kt', this, {}); this.template(appFolder + '/src/main/java/service/LogoutWorker.kt', 'app/src/main/java/' + packageDir + '/service/LogoutWorker.kt', this, {}); this.template(appFolder + '/src/main/java/service/push/PushExtras.kt', 'app/src/main/java/' + packageDir + '/service/push/PushExtras.kt', this, {}); this.template(appFolder + '/src/main/java/environment', 'app/src/internal/java/' + packageDir + '/environment', this, {}); this.template(appFolder + '/src/main/java/environment', 'app/src/production/java/' + packageDir + '/environment', this, {}); this.template(appFolder + '/src/main/java/application', 'app/src/main/java/' + packageDir + '/application', this, {}); this.template(appFolder + '/src/main/java/di', 'app/src/main/java/' + packageDir + '/di', this, {}); this.template(appFolder + '/src/main/java/domain', 'app/src/main/java/' + packageDir + '/domain', this, {}); if (this.language == 'kotlin') { this.template(appFolder + '/src/main/java/extensions/ContextExtensions.kt', 'app/src/main/java/' + packageDir + '/extensions/ContextExtensions.kt', this, {}); this.template(appFolder + '/src/main/java/extensions/Extensions.kt', 'app/src/main/java/' + packageDir + '/extensions/Extensions.kt', this, {}); if (this.nucleus == true) { this.template(appFolder + '/src/main/java/extensions/PresenterExtensions.kt', 'app/src/main/java/' + packageDir + '/extensions/PresenterExtensions.kt', this, {}) } } this.template(appFolder + '/src/main/java/model/OAuth.kt', 'app/src/main/java/' + packageDir + '/model/OAuth.kt', this, {}); this.template(appFolder + '/src/main/java/ui/base/BaseActivity.kt', 'app/src/main/java/' + packageDir + '/ui/base/BaseActivity.kt', this, {}); this.template(appFolder + '/src/main/java/ui/base/BaseAdapter.kt', 'app/src/main/java/' + packageDir + '/ui/base/BaseAdapter.kt', this, {}); this.template(appFolder + '/src/main/java/ui/base/BasePresenter.kt', 'app/src/main/java/' + packageDir + '/ui/base/BasePresenter.kt', this, {}); this.template(appFolder + '/src/main/java/ui/base/BaseFragment.kt', 'app/src/main/java/' + packageDir + '/ui/base/BaseFragment.kt', this, {}); this.template(appFolder + '/src/main/java/ui/base/EmptyPresenter.kt', 'app/src/main/java/' + packageDir + '/ui/base/EmptyPresenter.kt', this, {}); this.template(appFolder + '/src/main/java/ui/base/PresenterView.kt', 'app/src/main/java/' + packageDir + '/ui/base/PresenterView.kt', this, {}); if (this.language == 'kotlin') { if (this.eventbus) { this.template(appFolder + '/src/main/java/ui/base/EventBusUser.kt', 'app/src/main/java/' + packageDir + '/ui/base/EventBusUser.kt', this, {}) } this.template(appFolder + '/src/main/java/ui/base/IFailMessage.kt', 'app/src/main/java/' + packageDir + '/ui/base/IFailMessage.kt', this, {}); this.template(appFolder + '/src/main/java/ui/base/IProgressActivity.kt', 'app/src/main/java/' + packageDir + '/ui/base/IProgressActivity.kt', this, {}); this.template(appFolder + '/src/main/java/ui/base/IToolbarActivity.kt', 'app/src/main/java/' + packageDir + '/ui/base/IToolbarActivity.kt', this, {}); this.template(appFolder + '/src/main/java/ui/base/ProgressPresenterView.kt', 'app/src/main/java/' + packageDir + '/ui/base/ProgressPresenterView.kt', this, {}); } this.template(appFolder + '/src/main/java/storage', 'app/src/main/java/' + packageDir + '/storage', this, {}); if (this.nucleus == false) { this.template(appFolder + '/src/main/java/ui/base/Presenter.kt', 'app/src/main/java/' + packageDir + '/ui/base/Presenter.kt', this, {}) } if (this.timber) { this.template(appFolder + '/src/main/java/util/logging', 'app/src/main/java/' + packageDir + '/util/logging', this, {}) } if (this.jodatime) { this.template(appFolder + '/src/main/java/util/gson/DateTimeTypeConverter.kt', 'app/src/main/java/' + packageDir + '/util/gson/DateTimeTypeConverter.kt', this, {}); this.template(appFolder + '/src/main/java/util/gson/DateTimeZoneTypeConverter.kt', 'app/src/main/java/' + packageDir + '/util/gson/DateTimeZoneTypeConverter.kt', this, {}) } if (this.jodamoney) { this.template(appFolder + '/src/main/java/util/gson/CurrencyUnitTypeConverter.kt', 'app/src/main/java/' + packageDir + '/util/gson/CurrencyUnitTypeConverter.kt', this, {}); this.template(appFolder + '/src/main/java/util/gson/MoneyTypeConverter.kt', 'app/src/main/java/' + packageDir + '/util/gson/MoneyTypeConverter.kt', this, {}) } if (this.autoparcel && this.language == 'java') { this.template(appFolder + '/src/main/java/util/gson/AutoGson.kt', 'app/src/main/java/' + packageDir + '/util/gson/AutoGson.kt', this, {}); this.template(appFolder + '/src/main/java/util/gson/AutoValueTypeAdapterFactory.kt', 'app/src/main/java/' + packageDir + '/util/gson/AutoValueTypeAdapterFactory.kt', this, {}) } this.template(appFolder + '/src/main/java/util/gson/GsonModule.kt', 'app/src/main/java/' + packageDir + '/util/gson/GsonModule.kt', this, {}); this.template(appFolder + '/src/main/java/util/DensityUtil.kt', 'app/src/main/java/' + packageDir + '/util/DensityUtil.kt', this, {}); this.template(appFolder + '/src/main/java/util/ExtractSingleResult.kt', 'app/src/main/java/' + packageDir + '/util/ExtractSingleResult.kt', this, {}); this.template(appFolder + '/src/main/java/util/LinearMarginItemDecoration.kt', 'app/src/main/java/' + packageDir + '/util/LinearMarginItemDecoration.kt', this, {}); this.template(appFolder + '/src/main/java/util/StringUtils.kt', 'app/src/main/java/' + packageDir + '/util/StringUtils.kt', this, {}); this.template(appFolder + '/src/main/java/util/PermissionUtils.kt', 'app/src/main/java/' + packageDir + '/util/PermissionUtils.kt', this, {}); if (this.language == 'kotlin') { this.template(appFolder + '/src/main/java/domain/repository/exception/ApiException.kt', 'app/src/main/java/' + packageDir + '/domain/repository/exception/ApiException.kt', this, {}); this.template(appFolder + '/src/main/java/domain/repository/exception/ErrorMessage.kt', 'app/src/main/java/' + packageDir + '/domain/repository/exception/ErrorMessage.kt', this, {}); this.template(appFolder + '/src/main/java/util/ExtractErrorUtil.kt', 'app/src/main/java/' + packageDir + '/util/ExtractErrorUtil.kt', this, {}); this.template(appFolder + '/src/main/java/util/ExtractResult.kt', 'app/src/main/java/' + packageDir + '/util/ExtractResult.kt', this, {}); this.template(appFolder + '/src/main/java/util/RetryWhen.kt', 'app/src/main/java/' + packageDir + '/util/RetryWhen.kt', this, {}); } if (this.language == 'java') { this.template(appFolder + '/src/main/java/util/AsyncHandler.kt', 'app/src/main/java/' + packageDir + '/util/AsyncHandler.kt', this, {}); this.template(appFolder + '/src/main/java/util/CallInExecutorThanMainThread.kt', 'app/src/main/java/' + packageDir + '/util/CallInExecutorThanMainThread.kt', this, {}); this.template(appFolder + '/src/main/java/util/FilterOrThrow.kt', 'app/src/main/java/' + packageDir + '/util/FilterOrThrow.kt', this, {}); this.template(appFolder + '/src/main/java/util/RetryWhen.kt', 'app/src/main/java/' + packageDir + '/util/RetryWhen.kt', this, {}); this.template(appFolder + '/src/main/java/util/RxUtils.kt', 'app/src/main/java/' + packageDir + '/util/RxUtils.kt', this, {}); this.template(appFolder + '/src/main/java/util/RepositoryUtils.kt', 'app/src/main/java/' + packageDir + '/util/RepositoryUtils.kt', this, {}); this.template(appFolder + '/src/main/java/util/google', 'app/src/main/java/' + packageDir + '/util/google', this, {}); } this.template(appFolder + '/src/main/java/ui/main', 'app/src/main/java/' + packageDir + '/ui/main', this, {}); mkdirp('app/src/main/assets'); mkdirp('app/src/main/res'); this.directory('resources/assets', 'app/src/main/assets'); this.directory('resources/res', 'app/src/main/res'); if (this.language == 'java') { this.directory('config', 'config'); } this.template('resources/_AndroidManifest.xml', 'app/src/main/AndroidManifest.xml', this, {}); this.template('../../dependencies.json', 'dependencies.json', this, {}).on('end', function () { this.installGradleDependencies(this, false); }); mkdirp('app/src/debug'); } }, install: function () { } });