Added spotless plugin

This commit is contained in:
Aidan Follestad 2017-06-10 12:30:15 -05:00
commit 8ec5280a01
26 changed files with 1467 additions and 1424 deletions

View file

@ -0,0 +1,9 @@
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="LoggerInitializedWithForeignClass" enabled="false" level="WARNING" enabled_by_default="false">
<option name="loggerClassName" value="org.apache.log4j.Logger,org.slf4j.LoggerFactory,org.apache.commons.logging.LogFactory,java.util.logging.Logger" />
<option name="loggerFactoryMethodName" value="getLogger,getLogger,getLog,getLogger" />
</inspection_tool>
</profile>
</component>

View file

@ -0,0 +1,7 @@
<component name="InspectionProjectProfileManager">
<settings>
<option name="PROJECT_PROFILE" value="Project Default" />
<option name="USE_PROJECT_PROFILE" value="true" />
<version value="1.0" />
</settings>
</component>

2
.idea/modules.xml generated
View file

@ -4,6 +4,8 @@
<modules>
<module fileurl="file://$PROJECT_DIR$/NockNock.iml" filepath="$PROJECT_DIR$/NockNock.iml" />
<module fileurl="file://$PROJECT_DIR$/app/app.iml" filepath="$PROJECT_DIR$/app/app.iml" />
<module fileurl="file://$PROJECT_DIR$/app/app.iml" filepath="$PROJECT_DIR$/app/app.iml" />
<module fileurl="file://$PROJECT_DIR$/nock-nock.iml" filepath="$PROJECT_DIR$/nock-nock.iml" />
<module fileurl="file://$PROJECT_DIR$/nock-nock.iml" filepath="$PROJECT_DIR$/nock-nock.iml" />
</modules>
</component>

View file

@ -4,8 +4,8 @@ android:
components:
- tools
- platform-tools
- build-tools-24.0.1
- android-24
- build-tools-26.0.0
- android-26
- extra-android-support
- extra-android-m2repository
- extra-google-m2repository

View file

@ -1,15 +1,15 @@
apply plugin: 'com.android.application'
android {
compileSdkVersion 24
buildToolsVersion "24.0.1"
compileSdkVersion versions.compileSdk
buildToolsVersion versions.buildTools
defaultConfig {
applicationId "com.afollestad.nocknock"
minSdkVersion 21
targetSdkVersion 24
versionCode 14
versionName "0.1.3.1"
minSdkVersion versions.minSdk
targetSdkVersion versions.compileSdk
versionCode versions.publishVersionCode
versionName versions.publishVersion
lintOptions {
abortOnError false
@ -33,11 +33,11 @@ android {
}
dependencies {
compile 'com.android.support:appcompat-v7:24.2.0'
compile 'com.android.support:design:24.2.0'
compile 'com.afollestad.material-dialogs:core:0.9.0.1'
compile 'com.afollestad.material-dialogs:commons:0.9.0.1'
compile 'com.afollestad:bridge:3.2.5'
compile 'com.afollestad:inquiry:3.2.1'
compile 'com.android.support:appcompat-v7:' + versions.supportLib
compile 'com.android.support:design:' + versions.supportLib
compile 'com.afollestad.material-dialogs:core:' + versions.materialDialogs
compile 'com.afollestad.material-dialogs:commons:' + versions.materialDialogs
compile 'com.afollestad:bridge:' + versions.bridge
compile 'com.afollestad:inquiry:' + versions.inquiry
compile files('libs/rhino-1.7.7.1.jar')
}

View file

@ -5,19 +5,15 @@ import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.afollestad.nocknock.R;
import com.afollestad.nocknock.api.ServerModel;
import com.afollestad.nocknock.api.ServerStatus;
import com.afollestad.nocknock.util.TimeUtil;
import com.afollestad.nocknock.views.StatusImageView;
import java.util.ArrayList;
import java.util.Collections;
/**
* @author Aidan Follestad (afollestad)
*/
/** @author Aidan Follestad (afollestad) */
public class ServerAdapter extends RecyclerView.Adapter<ServerAdapter.ServerVH> {
private final Object LOCK = new Object();
@ -93,7 +89,8 @@ public class ServerAdapter extends RecyclerView.Adapter<ServerAdapter.ServerVH>
@Override
public ServerAdapter.ServerVH onCreateViewHolder(ViewGroup parent, int viewType) {
final View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_server, parent, false);
final View v =
LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_server, parent, false);
return new ServerVH(v, this);
}
@ -135,7 +132,8 @@ public class ServerAdapter extends RecyclerView.Adapter<ServerAdapter.ServerVH>
return mServers.size();
}
public static class ServerVH extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener {
public static class ServerVH extends RecyclerView.ViewHolder
implements View.OnClickListener, View.OnLongClickListener {
final StatusImageView iconStatus;
final TextView textName;

View file

@ -1,36 +1,23 @@
package com.afollestad.nocknock.api;
import com.afollestad.inquiry.annotations.Column;
import java.io.Serializable;
/**
* @author Aidan Follestad (afollestad)
*/
/** @author Aidan Follestad (afollestad) */
public class ServerModel implements Serializable {
public ServerModel() {
}
public ServerModel() {}
@Column(name = "_id", primaryKey = true, notNull = true, autoIncrement = true)
public long id;
@Column
public String name;
@Column
public String url;
@Column
@ServerStatus.Enum
public int status;
@Column
public long checkInterval;
@Column
public long lastCheck;
@Column
public String reason;
@Column
@ValidationMode.Enum
public int validationMode;
@Column
public String validationContent;
@Column public String name;
@Column public String url;
@Column @ServerStatus.Enum public int status;
@Column public long checkInterval;
@Column public long lastCheck;
@Column public String reason;
@Column @ValidationMode.Enum public int validationMode;
@Column public String validationContent;
}

View file

@ -1,19 +1,16 @@
package com.afollestad.nocknock.api;
import android.support.annotation.IntDef;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
/**
* @author Aidan Follestad (afollestad)
*/
/** @author Aidan Follestad (afollestad) */
public final class ServerStatus {
public final static int OK = 1;
public final static int WAITING = 2;
public final static int CHECKING = 3;
public final static int ERROR = 4;
public static final int OK = 1;
public static final int WAITING = 2;
public static final int CHECKING = 3;
public static final int ERROR = 4;
@Retention(RetentionPolicy.SOURCE)
@IntDef({OK, WAITING, CHECKING, ERROR})

View file

@ -1,21 +1,17 @@
package com.afollestad.nocknock.api;
import android.support.annotation.IntDef;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
/**
* @author Aidan Follestad (afollestad)
*/
/** @author Aidan Follestad (afollestad) */
public final class ValidationMode {
public final static int STATUS_CODE = 1;
public final static int TERM_SEARCH = 2;
public final static int JAVASCRIPT = 3;
public static final int STATUS_CODE = 1;
public static final int TERM_SEARCH = 2;
public static final int JAVASCRIPT = 3;
@Retention(RetentionPolicy.SOURCE)
@IntDef({STATUS_CODE, TERM_SEARCH, JAVASCRIPT})
public @interface Enum {
}
public @interface Enum {}
}

View file

@ -6,13 +6,10 @@ import android.support.annotation.NonNull;
import android.support.v4.app.DialogFragment;
import android.support.v7.app.AppCompatActivity;
import android.text.Html;
import com.afollestad.materialdialogs.MaterialDialog;
import com.afollestad.nocknock.R;
/**
* @author Aidan Follestad (afollestad)
*/
/** @author Aidan Follestad (afollestad) */
public class AboutDialog extends DialogFragment {
public static void show(AppCompatActivity context) {

View file

@ -3,24 +3,19 @@ package com.afollestad.nocknock.receivers;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import com.afollestad.inquiry.Inquiry;
import com.afollestad.nocknock.api.ServerModel;
import com.afollestad.nocknock.ui.MainActivity;
import com.afollestad.nocknock.util.AlarmUtil;
/**
* @author Aidan Follestad (afollestad)
*/
/** @author Aidan Follestad (afollestad) */
public class BootReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
final Inquiry inq = Inquiry.newInstance(context, MainActivity.DB_NAME).build(false);
ServerModel[] models = inq
.selectFrom(MainActivity.SITES_TABLE_NAME, ServerModel.class)
.all();
ServerModel[] models = inq.selectFrom(MainActivity.SITES_TABLE_NAME, ServerModel.class).all();
AlarmUtil.setSiteChecks(context, models);
inq.destroyInstance();
}

View file

@ -4,13 +4,10 @@ import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import com.afollestad.nocknock.services.CheckService;
import com.afollestad.nocknock.util.NetworkUtil;
/**
* @author Aidan Follestad (afollestad)
*/
/** @author Aidan Follestad (afollestad) */
public class ConnectivityReceiver extends BroadcastReceiver {
@Override
@ -18,8 +15,8 @@ public class ConnectivityReceiver extends BroadcastReceiver {
final boolean hasInternet = NetworkUtil.hasInternet(context);
Log.v("ConnectivityReceiver", "Connectivity state changed... has internet? " + hasInternet);
if (hasInternet) {
context.startService(new Intent(context, CheckService.class)
.putExtra(CheckService.ONLY_WAITING, true));
context.startService(
new Intent(context, CheckService.class).putExtra(CheckService.ONLY_WAITING, true));
}
}
}

View file

@ -3,7 +3,6 @@ package com.afollestad.nocknock.services;
import android.app.IntentService;
import android.app.Notification;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.graphics.BitmapFactory;
@ -13,8 +12,6 @@ import android.support.annotation.Nullable;
import android.support.v4.app.NotificationCompat;
import android.support.v4.app.NotificationManagerCompat;
import android.util.Log;
import android.widget.Toast;
import com.afollestad.bridge.Bridge;
import com.afollestad.bridge.BridgeException;
import com.afollestad.bridge.Response;
@ -29,12 +26,9 @@ import com.afollestad.nocknock.ui.MainActivity;
import com.afollestad.nocknock.ui.ViewSiteActivity;
import com.afollestad.nocknock.util.JsUtil;
import com.afollestad.nocknock.util.NetworkUtil;
import java.util.Locale;
/**
* @author Aidan Follestad (afollestad)
*/
/** @author Aidan Follestad (afollestad) */
@SuppressWarnings("CheckResult")
public class CheckService extends IntentService {
@ -49,8 +43,7 @@ public class CheckService extends IntentService {
}
private static void LOG(String msg, Object... format) {
if (format != null)
msg = String.format(Locale.getDefault(), msg, format);
if (format != null) msg = String.format(Locale.getDefault(), msg, format);
Log.v("NockNockService", msg);
}
@ -64,11 +57,10 @@ public class CheckService extends IntentService {
protected void onHandleIntent(Intent intent) {
Inquiry.newInstance(this, MainActivity.DB_NAME).build();
isRunning(true);
Bridge.config()
.defaultHeader("User-Agent", getString(R.string.app_name) + " (Android)");
Bridge.config().defaultHeader("User-Agent", getString(R.string.app_name) + " (Android)");
final Query<ServerModel, Integer> query = Inquiry.get(this)
.selectFrom(MainActivity.SITES_TABLE_NAME, ServerModel.class);
final Query<ServerModel, Integer> query =
Inquiry.get(this).selectFrom(MainActivity.SITES_TABLE_NAME, ServerModel.class);
if (intent != null && intent.hasExtra(MODEL_ID)) {
query.where("_id = ?", intent.getLongExtra(MODEL_ID, -1));
} else if (intent != null && intent.getBooleanExtra(ONLY_WAITING, false)) {
@ -100,11 +92,8 @@ public class CheckService extends IntentService {
updateStatus(site);
try {
final Response response = Bridge.get(site.url)
.throwIfNotSuccess()
.cancellable(false)
.request()
.response();
final Response response =
Bridge.get(site.url).throwIfNotSuccess().cancellable(false).request().response();
site.reason = null;
site.status = ServerStatus.OK;
@ -118,12 +107,10 @@ public class CheckService extends IntentService {
} else if (site.validationMode == ValidationMode.JAVASCRIPT) {
final String body = response.asString();
site.reason = JsUtil.exec(site.validationContent, body);
if (site.reason != null && !site.toString().isEmpty())
site.status = ServerStatus.ERROR;
if (site.reason != null && !site.toString().isEmpty()) site.status = ServerStatus.ERROR;
}
if (site.status == ServerStatus.ERROR)
showNotification(this, site);
if (site.status == ServerStatus.ERROR) showNotification(this, site);
} catch (BridgeException e) {
processError(e, site);
}
@ -180,13 +167,14 @@ public class CheckService extends IntentService {
.where("_id = ?", site.id)
.values(site)
.run();
sendBroadcast(new Intent(ACTION_CHECK_UPDATE)
.putExtra("model", site));
sendBroadcast(new Intent(ACTION_CHECK_UPDATE).putExtra("model", site));
}
private void isRunning(boolean running) {
PreferenceManager.getDefaultSharedPreferences(this)
.edit().putBoolean("check_service_running", running).commit();
.edit()
.putBoolean("check_service_running", running)
.commit();
}
public static boolean isRunning(Context context) {
@ -196,12 +184,13 @@ public class CheckService extends IntentService {
public static void isAppOpen(Context context, boolean open) {
PreferenceManager.getDefaultSharedPreferences(context)
.edit().putBoolean("is_app_open", open).commit();
.edit()
.putBoolean("is_app_open", open)
.commit();
}
public static boolean isAppOpen(Context context) {
return PreferenceManager.getDefaultSharedPreferences(context)
.getBoolean("is_app_open", false);
return PreferenceManager.getDefaultSharedPreferences(context).getBoolean("is_app_open", false);
}
private static void showNotification(Context context, ServerModel site) {
@ -211,17 +200,22 @@ public class CheckService extends IntentService {
}
final NotificationManagerCompat nm = NotificationManagerCompat.from(context);
final PendingIntent openIntent = PendingIntent.getActivity(context, 9669,
final PendingIntent openIntent =
PendingIntent.getActivity(
context,
9669,
new Intent(context, ViewSiteActivity.class)
.putExtra("model", site)
.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP),
PendingIntent.FLAG_CANCEL_CURRENT);
final Notification noti = new NotificationCompat.Builder(context)
final Notification noti =
new NotificationCompat.Builder(context)
.setContentTitle(site.name)
.setContentText(context.getString(R.string.something_wrong))
.setContentIntent(openIntent)
.setSmallIcon(R.drawable.ic_notification)
.setLargeIcon(BitmapFactory.decodeResource(context.getResources(), R.mipmap.ic_launcher))
.setLargeIcon(
BitmapFactory.decodeResource(context.getResources(), R.mipmap.ic_launcher))
.setPriority(Notification.PRIORITY_HIGH)
.setAutoCancel(true)
.setDefaults(Notification.DEFAULT_VIBRATE)

View file

@ -20,15 +20,12 @@ import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TextView;
import com.afollestad.nocknock.R;
import com.afollestad.nocknock.api.ServerModel;
import com.afollestad.nocknock.api.ServerStatus;
import com.afollestad.nocknock.api.ValidationMode;
/**
* @author Aidan Follestad (afollestad)
*/
/** @author Aidan Follestad (afollestad) */
public class AddSiteActivity extends AppCompatActivity implements View.OnClickListener {
private View rootLayout;
@ -67,7 +64,8 @@ public class AddSiteActivity extends AppCompatActivity implements View.OnClickLi
rootLayout.setVisibility(View.INVISIBLE);
ViewTreeObserver viewTreeObserver = rootLayout.getViewTreeObserver();
if (viewTreeObserver.isAlive()) {
viewTreeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
viewTreeObserver.addOnGlobalLayoutListener(
new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
circularRevealActivity();
@ -77,12 +75,16 @@ public class AddSiteActivity extends AppCompatActivity implements View.OnClickLi
}
}
ArrayAdapter<String> intervalOptionsAdapter = new ArrayAdapter<>(this, R.layout.list_item_spinner,
ArrayAdapter<String> intervalOptionsAdapter =
new ArrayAdapter<>(
this,
R.layout.list_item_spinner,
getResources().getStringArray(R.array.interval_options));
intervalOptionsAdapter.setDropDownViewResource(R.layout.list_item_spinner_dropdown);
spinnerInterval.setAdapter(intervalOptionsAdapter);
inputUrl.setOnFocusChangeListener((view, hasFocus) -> {
inputUrl.setOnFocusChangeListener(
(view, hasFocus) -> {
if (!hasFocus) {
final String inputStr = inputUrl.getText().toString().trim();
if (inputStr.isEmpty()) return;
@ -99,11 +101,15 @@ public class AddSiteActivity extends AppCompatActivity implements View.OnClickLi
}
});
ArrayAdapter<String> validationOptionsAdapter = new ArrayAdapter<>(this, R.layout.list_item_spinner,
ArrayAdapter<String> validationOptionsAdapter =
new ArrayAdapter<>(
this,
R.layout.list_item_spinner,
getResources().getStringArray(R.array.response_validation_options));
validationOptionsAdapter.setDropDownViewResource(R.layout.list_item_spinner_dropdown);
responseValidationSpinner.setAdapter(validationOptionsAdapter);
responseValidationSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
responseValidationSpinner.setOnItemSelectedListener(
new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
final View searchTerm = findViewById(R.id.responseValidationSearchTerm);
@ -127,8 +133,7 @@ public class AddSiteActivity extends AppCompatActivity implements View.OnClickLi
}
@Override
public void onNothingSelected(AdapterView<?> adapterView) {
}
public void onNothingSelected(AdapterView<?> adapterView) {}
});
findViewById(R.id.doneBtn).setOnClickListener(this);
@ -143,14 +148,20 @@ public class AddSiteActivity extends AppCompatActivity implements View.OnClickLi
if (isClosing) return;
isClosing = true;
final int fabSize = getIntent().getIntExtra("fab_size", toolbar.getMeasuredHeight());
final int cx = (int) getIntent().getFloatExtra("fab_x", rootLayout.getMeasuredWidth() / 2) + (fabSize / 2);
final int cy = (int) getIntent().getFloatExtra("fab_y", rootLayout.getMeasuredHeight() / 2) + toolbar.getMeasuredHeight() + (fabSize / 2);
final int cx =
(int) getIntent().getFloatExtra("fab_x", rootLayout.getMeasuredWidth() / 2) + (fabSize / 2);
final int cy =
(int) getIntent().getFloatExtra("fab_y", rootLayout.getMeasuredHeight() / 2)
+ toolbar.getMeasuredHeight()
+ (fabSize / 2);
float initialRadius = Math.max(cx, cy);
final Animator circularReveal = ViewAnimationUtils.createCircularReveal(rootLayout, cx, cy, initialRadius, 0);
final Animator circularReveal =
ViewAnimationUtils.createCircularReveal(rootLayout, cx, cy, initialRadius, 0);
circularReveal.setDuration(300);
circularReveal.setInterpolator(new AccelerateInterpolator());
circularReveal.addListener(new AnimatorListenerAdapter() {
circularReveal.addListener(
new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
@ -167,7 +178,8 @@ public class AddSiteActivity extends AppCompatActivity implements View.OnClickLi
final int cx = rootLayout.getMeasuredWidth() / 2;
final int cy = rootLayout.getMeasuredHeight() / 2;
final float finalRadius = Math.max(cx, cy);
final Animator circularReveal = ViewAnimationUtils.createCircularReveal(rootLayout, cx, cy, 0, finalRadius);
final Animator circularReveal =
ViewAnimationUtils.createCircularReveal(rootLayout, cx, cy, 0, finalRadius);
circularReveal.setDuration(300);
circularReveal.setInterpolator(new DecelerateInterpolator());
@ -206,8 +218,7 @@ public class AddSiteActivity extends AppCompatActivity implements View.OnClickLi
return;
} else {
final Uri uri = Uri.parse(model.url);
if (uri.getScheme() == null)
model.url = "http://" + model.url;
if (uri.getScheme() == null) model.url = "http://" + model.url;
}
}
@ -239,16 +250,23 @@ public class AddSiteActivity extends AppCompatActivity implements View.OnClickLi
break;
case 1:
model.validationMode = ValidationMode.TERM_SEARCH;
model.validationContent = ((EditText) findViewById(R.id.responseValidationSearchTerm)).getText().toString().trim();
model.validationContent =
((EditText) findViewById(R.id.responseValidationSearchTerm))
.getText()
.toString()
.trim();
break;
case 2:
model.validationMode = ValidationMode.JAVASCRIPT;
model.validationContent = ((EditText) findViewById(R.id.responseValidationScriptInput)).getText().toString().trim();
model.validationContent =
((EditText) findViewById(R.id.responseValidationScriptInput))
.getText()
.toString()
.trim();
break;
}
setResult(RESULT_OK, new Intent()
.putExtra("model", model));
setResult(RESULT_OK, new Intent().putExtra("model", model));
finish();
overridePendingTransition(R.anim.fade_out, R.anim.fade_out);
}

View file

@ -27,7 +27,6 @@ import android.view.MenuItem;
import android.view.View;
import android.view.animation.PathInterpolator;
import android.widget.TextView;
import com.afollestad.bridge.Bridge;
import com.afollestad.inquiry.Inquiry;
import com.afollestad.materialdialogs.MaterialDialog;
@ -41,13 +40,16 @@ import com.afollestad.nocknock.util.AlarmUtil;
import com.afollestad.nocknock.util.MathUtil;
import com.afollestad.nocknock.views.DividerItemDecoration;
public class MainActivity extends AppCompatActivity implements SwipeRefreshLayout.OnRefreshListener, View.OnClickListener, ServerAdapter.ClickListener {
public class MainActivity extends AppCompatActivity
implements SwipeRefreshLayout.OnRefreshListener,
View.OnClickListener,
ServerAdapter.ClickListener {
private final static int ADD_SITE_RQ = 6969;
private final static int VIEW_SITE_RQ = 6923;
public final static String DB_NAME = "nock_nock";
public final static String SITES_TABLE_NAME_OLD = "sites";
public final static String SITES_TABLE_NAME = "site_models";
private static final int ADD_SITE_RQ = 6969;
private static final int VIEW_SITE_RQ = 6923;
public static final String DB_NAME = "nock_nock";
public static final String SITES_TABLE_NAME_OLD = "sites";
public static final String SITES_TABLE_NAME = "site_models";
private FloatingActionButton mFab;
private RecyclerView mList;
@ -59,13 +61,13 @@ public class MainActivity extends AppCompatActivity implements SwipeRefreshLayou
private float mOrigFabX;
private float mOrigFabY;
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
private final BroadcastReceiver mReceiver =
new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Log.v("MainActivity", "Received " + intent.getAction());
if (CheckService.ACTION_RUNNING.equals(intent.getAction())) {
if (mRefreshLayout != null)
mRefreshLayout.setRefreshing(false);
if (mRefreshLayout != null) mRefreshLayout.setRefreshing(false);
} else {
final ServerModel model = (ServerModel) intent.getSerializableExtra("model");
if (mAdapter != null && mList != null && model != null) {
@ -91,7 +93,8 @@ public class MainActivity extends AppCompatActivity implements SwipeRefreshLayou
mRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipeRefreshLayout);
mRefreshLayout.setOnRefreshListener(this);
mRefreshLayout.setColorSchemeColors(ContextCompat.getColor(this, R.color.md_green),
mRefreshLayout.setColorSchemeColors(
ContextCompat.getColor(this, R.color.md_green),
ContextCompat.getColor(this, R.color.md_yellow),
ContextCompat.getColor(this, R.color.md_red));
@ -99,15 +102,14 @@ public class MainActivity extends AppCompatActivity implements SwipeRefreshLayou
mFab.setOnClickListener(this);
Inquiry.newInstance(this, DB_NAME).build();
Bridge.config()
.defaultHeader("User-Agent", getString(R.string.app_name) + " (Android)");
Bridge.config().defaultHeader("User-Agent", getString(R.string.app_name) + " (Android)");
final SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
if (!sp.getBoolean("migrated_db", false)) {
final Inquiry mdb = Inquiry.newInstance(this, DB_NAME)
.instanceName("migrate_db")
.build(false);
final ServerModel[] models = Inquiry.get(this)
final Inquiry mdb =
Inquiry.newInstance(this, DB_NAME).instanceName("migrate_db").build(false);
final ServerModel[] models =
Inquiry.get(this)
.selectFrom(SITES_TABLE_NAME_OLD, ServerModel.class)
.projection("_id", "name", "url", "status", "checkInterval", "lastCheck", "reason")
.all();
@ -118,9 +120,7 @@ public class MainActivity extends AppCompatActivity implements SwipeRefreshLayou
model.validationContent = null;
}
//noinspection CheckResult
mdb.insertInto(SITES_TABLE_NAME, ServerModel.class)
.values(models)
.run();
mdb.insertInto(SITES_TABLE_NAME, ServerModel.class).values(models).run();
mdb.dropTable(SITES_TABLE_NAME_OLD);
}
sp.edit().putBoolean("migrated_db", true).commit();
@ -139,7 +139,9 @@ public class MainActivity extends AppCompatActivity implements SwipeRefreshLayou
tutorialView.animate().cancel();
tutorialView.animate().setDuration(300).alpha(1f).start();
findViewById(R.id.understoodBtn).setOnClickListener(view -> {
findViewById(R.id.understoodBtn)
.setOnClickListener(
view -> {
view.setOnClickListener(null);
findViewById(R.id.swipeRefreshTutorial).setVisibility(View.GONE);
pr.edit().putBoolean("shown_swipe_refresh_tutorial", true).commit();
@ -184,9 +186,7 @@ public class MainActivity extends AppCompatActivity implements SwipeRefreshLayou
private void refreshModels() {
mAdapter.clear();
mEmptyText.setVisibility(View.VISIBLE);
Inquiry.get(this)
.selectFrom(SITES_TABLE_NAME, ServerModel.class)
.all(this::setModels);
Inquiry.get(this).selectFrom(SITES_TABLE_NAME, ServerModel.class).all(this::setModels);
}
private void setModels(ServerModel[] models) {
@ -226,24 +226,28 @@ public class MainActivity extends AppCompatActivity implements SwipeRefreshLayou
mOrigFabX = mFab.getX();
mOrigFabY = mFab.getY();
final Path curve = MathUtil.bezierCurve(mFab, mList);
if (mFabAnimator != null)
mFabAnimator.cancel();
if (mFabAnimator != null) mFabAnimator.cancel();
mFabAnimator = ObjectAnimator.ofFloat(view, View.X, View.Y, curve);
mFabAnimator.setInterpolator(new PathInterpolator(.5f, .5f));
mFabAnimator.setDuration(300);
mFabAnimator.addListener(new AnimatorListenerAdapter() {
mFabAnimator.addListener(
new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
startActivityForResult(new Intent(MainActivity.this, AddSiteActivity.class)
startActivityForResult(
new Intent(MainActivity.this, AddSiteActivity.class)
.putExtra("fab_x", mOrigFabX)
.putExtra("fab_y", mOrigFabY)
.putExtra("fab_size", mFab.getMeasuredWidth())
.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION), ADD_SITE_RQ);
mFab.postDelayed(() -> {
.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION),
ADD_SITE_RQ);
mFab.postDelayed(
() -> {
mFab.setX(mOrigFabX);
mFab.setY(mOrigFabY);
}, 600);
},
600);
}
});
mFabAnimator.start();
@ -257,9 +261,11 @@ public class MainActivity extends AppCompatActivity implements SwipeRefreshLayou
if (requestCode == ADD_SITE_RQ) {
mAdapter.add(model);
mEmptyText.setVisibility(View.GONE);
Inquiry.get(this).insertInto(SITES_TABLE_NAME, ServerModel.class)
Inquiry.get(this)
.insertInto(SITES_TABLE_NAME, ServerModel.class)
.values(model)
.run(inserted -> {
.run(
inserted -> {
AlarmUtil.setSiteChecks(MainActivity.this, model);
checkSite(MainActivity.this, model);
});
@ -271,33 +277,32 @@ public class MainActivity extends AppCompatActivity implements SwipeRefreshLayou
}
}
public static void removeSite(final Context context, final ServerModel model, final Runnable onRemoved) {
public static void removeSite(
final Context context, final ServerModel model, final Runnable onRemoved) {
new MaterialDialog.Builder(context)
.title(R.string.remove_site)
.content(Html.fromHtml(context.getString(R.string.remove_site_prompt, model.name)))
.positiveText(R.string.remove)
.negativeText(android.R.string.cancel)
.onPositive((dialog, which) -> {
.onPositive(
(dialog, which) -> {
AlarmUtil.cancelSiteChecks(context, model);
final NotificationManagerCompat nm = NotificationManagerCompat.from(context);
nm.cancel(model.url, CheckService.NOTI_ID);
//noinspection CheckResult
final Inquiry rinq = Inquiry.newInstance(context, DB_NAME)
.instanceName("remove_site")
.build(false);
final Inquiry rinq =
Inquiry.newInstance(context, DB_NAME).instanceName("remove_site").build(false);
//noinspection CheckResult
rinq.deleteFrom(SITES_TABLE_NAME, ServerModel.class)
.where("_id = ?", model.id)
.run();
rinq.deleteFrom(SITES_TABLE_NAME, ServerModel.class).where("_id = ?", model.id).run();
rinq.destroyInstance();
if (onRemoved != null)
onRemoved.run();
}).show();
if (onRemoved != null) onRemoved.run();
})
.show();
}
public static void checkSite(Context context, ServerModel model) {
context.startService(new Intent(context, CheckService.class)
.putExtra(CheckService.MODEL_ID, model.id));
context.startService(
new Intent(context, CheckService.class).putExtra(CheckService.MODEL_ID, model.id));
}
@Override
@ -307,19 +312,26 @@ public class MainActivity extends AppCompatActivity implements SwipeRefreshLayou
.title(R.string.options)
.items(R.array.site_long_options)
.negativeText(android.R.string.cancel)
.itemsCallback((dialog, itemView, which, text) -> {
.itemsCallback(
(dialog, itemView, which, text) -> {
if (which == 0) {
checkSite(MainActivity.this, model);
} else {
removeSite(MainActivity.this, model, () -> {
removeSite(
MainActivity.this,
model,
() -> {
mAdapter.remove(index);
mEmptyText.setVisibility(mAdapter.getItemCount() == 0 ? View.VISIBLE : View.GONE);
mEmptyText.setVisibility(
mAdapter.getItemCount() == 0 ? View.VISIBLE : View.GONE);
});
}
}).show();
})
.show();
} else {
startActivityForResult(new Intent(this, ViewSiteActivity.class)
.putExtra("model", model), VIEW_SITE_RQ,
startActivityForResult(
new Intent(this, ViewSiteActivity.class).putExtra("model", model),
VIEW_SITE_RQ,
ActivityOptions.makeSceneTransitionAnimation(this).toBundle());
}
}

View file

@ -19,7 +19,6 @@ import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TextView;
import com.afollestad.bridge.Bridge;
import com.afollestad.inquiry.Inquiry;
import com.afollestad.nocknock.R;
@ -29,15 +28,13 @@ import com.afollestad.nocknock.api.ValidationMode;
import com.afollestad.nocknock.services.CheckService;
import com.afollestad.nocknock.util.TimeUtil;
import com.afollestad.nocknock.views.StatusImageView;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
/**
* @author Aidan Follestad (afollestad)
*/
public class ViewSiteActivity extends AppCompatActivity implements View.OnClickListener, Toolbar.OnMenuItemClickListener {
/** @author Aidan Follestad (afollestad) */
public class ViewSiteActivity extends AppCompatActivity
implements View.OnClickListener, Toolbar.OnMenuItemClickListener {
private StatusImageView iconStatus;
private EditText inputName;
@ -51,7 +48,8 @@ public class ViewSiteActivity extends AppCompatActivity implements View.OnClickL
private ServerModel mModel;
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
private final BroadcastReceiver mReceiver =
new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Log.v("ViewSiteActivity", "Received " + intent.getAction());
@ -83,12 +81,16 @@ public class ViewSiteActivity extends AppCompatActivity implements View.OnClickL
textNextCheck = (TextView) findViewById(R.id.textNextCheck);
responseValidationSpinner = (Spinner) findViewById(R.id.responseValidationMode);
ArrayAdapter<String> intervalOptionsAdapter = new ArrayAdapter<>(this, R.layout.list_item_spinner,
ArrayAdapter<String> intervalOptionsAdapter =
new ArrayAdapter<>(
this,
R.layout.list_item_spinner,
getResources().getStringArray(R.array.interval_options));
intervalOptionsAdapter.setDropDownViewResource(R.layout.list_item_spinner_dropdown);
checkIntervalSpinner.setAdapter(intervalOptionsAdapter);
inputUrl.setOnFocusChangeListener((view, hasFocus) -> {
inputUrl.setOnFocusChangeListener(
(view, hasFocus) -> {
if (!hasFocus) {
final String inputStr = inputUrl.getText().toString().trim();
if (inputStr.isEmpty()) return;
@ -105,11 +107,15 @@ public class ViewSiteActivity extends AppCompatActivity implements View.OnClickL
}
});
ArrayAdapter<String> validationOptionsAdapter = new ArrayAdapter<>(this, R.layout.list_item_spinner,
ArrayAdapter<String> validationOptionsAdapter =
new ArrayAdapter<>(
this,
R.layout.list_item_spinner,
getResources().getStringArray(R.array.response_validation_options));
validationOptionsAdapter.setDropDownViewResource(R.layout.list_item_spinner_dropdown);
responseValidationSpinner.setAdapter(validationOptionsAdapter);
responseValidationSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
responseValidationSpinner.setOnItemSelectedListener(
new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
final View searchTerm = findViewById(R.id.responseValidationSearchTerm);
@ -133,15 +139,13 @@ public class ViewSiteActivity extends AppCompatActivity implements View.OnClickL
}
@Override
public void onNothingSelected(AdapterView<?> adapterView) {
}
public void onNothingSelected(AdapterView<?> adapterView) {}
});
mModel = (ServerModel) getIntent().getSerializableExtra("model");
update();
Bridge.config()
.defaultHeader("User-Agent", getString(R.string.app_name) + " (Android)");
Bridge.config().defaultHeader("User-Agent", getString(R.string.app_name) + " (Android)");
}
@Override
@ -190,16 +194,24 @@ public class ViewSiteActivity extends AppCompatActivity implements View.OnClickL
textNextCheck.setText(df.format(new Date(lastCheck + mModel.checkInterval)));
if (mModel.checkInterval >= TimeUtil.WEEK) {
inputCheckInterval.setText(Integer.toString((int) Math.ceil(((float) mModel.checkInterval / (float) TimeUtil.WEEK))));
inputCheckInterval.setText(
Integer.toString(
(int) Math.ceil(((float) mModel.checkInterval / (float) TimeUtil.WEEK))));
checkIntervalSpinner.setSelection(3);
} else if (mModel.checkInterval >= TimeUtil.DAY) {
inputCheckInterval.setText(Integer.toString((int) Math.ceil(((float) mModel.checkInterval / (float) TimeUtil.DAY))));
inputCheckInterval.setText(
Integer.toString(
(int) Math.ceil(((float) mModel.checkInterval / (float) TimeUtil.DAY))));
checkIntervalSpinner.setSelection(2);
} else if (mModel.checkInterval >= TimeUtil.HOUR) {
inputCheckInterval.setText(Integer.toString((int) Math.ceil(((float) mModel.checkInterval / (float) TimeUtil.HOUR))));
inputCheckInterval.setText(
Integer.toString(
(int) Math.ceil(((float) mModel.checkInterval / (float) TimeUtil.HOUR))));
checkIntervalSpinner.setSelection(1);
} else if (mModel.checkInterval >= TimeUtil.MINUTE) {
inputCheckInterval.setText(Integer.toString((int) Math.ceil(((float) mModel.checkInterval / (float) TimeUtil.MINUTE))));
inputCheckInterval.setText(
Integer.toString(
(int) Math.ceil(((float) mModel.checkInterval / (float) TimeUtil.MINUTE))));
checkIntervalSpinner.setSelection(0);
} else {
inputCheckInterval.setText("0");
@ -210,10 +222,12 @@ public class ViewSiteActivity extends AppCompatActivity implements View.OnClickL
responseValidationSpinner.setSelection(mModel.validationMode - 1);
switch (mModel.validationMode) {
case ValidationMode.TERM_SEARCH:
((TextView) findViewById(R.id.responseValidationSearchTerm)).setText(mModel.validationContent);
((TextView) findViewById(R.id.responseValidationSearchTerm))
.setText(mModel.validationContent);
break;
case ValidationMode.JAVASCRIPT:
((TextView) findViewById(R.id.responseValidationScriptInput)).setText(mModel.validationContent);
((TextView) findViewById(R.id.responseValidationScriptInput))
.setText(mModel.validationContent);
break;
}
@ -265,8 +279,7 @@ public class ViewSiteActivity extends AppCompatActivity implements View.OnClickL
return;
} else {
final Uri uri = Uri.parse(mModel.url);
if (uri.getScheme() == null)
mModel.url = "http://" + mModel.url;
if (uri.getScheme() == null) mModel.url = "http://" + mModel.url;
}
}
@ -298,16 +311,23 @@ public class ViewSiteActivity extends AppCompatActivity implements View.OnClickL
break;
case 1:
mModel.validationMode = ValidationMode.TERM_SEARCH;
mModel.validationContent = ((EditText) findViewById(R.id.responseValidationSearchTerm)).getText().toString().trim();
mModel.validationContent =
((EditText) findViewById(R.id.responseValidationSearchTerm))
.getText()
.toString()
.trim();
break;
case 2:
mModel.validationMode = ValidationMode.JAVASCRIPT;
mModel.validationContent = ((EditText) findViewById(R.id.responseValidationScriptInput)).getText().toString().trim();
mModel.validationContent =
((EditText) findViewById(R.id.responseValidationScriptInput))
.getText()
.toString()
.trim();
break;
}
final Inquiry inq = Inquiry.newInstance(this, MainActivity.DB_NAME)
.build(false);
final Inquiry inq = Inquiry.newInstance(this, MainActivity.DB_NAME).build(false);
//noinspection CheckResult
inq.update(MainActivity.SITES_TABLE_NAME, ServerModel.class)
.where("_id = ?", mModel.id)

View file

@ -5,26 +5,22 @@ import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import com.afollestad.nocknock.api.ServerModel;
import com.afollestad.nocknock.services.CheckService;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
/**
* @author Aidan Follestad (afollestad)
*/
/** @author Aidan Follestad (afollestad) */
public class AlarmUtil {
private final static int BASE_RQC = 69;
private static final int BASE_RQC = 69;
public static PendingIntent getSiteIntent(Context context, ServerModel site) {
return PendingIntent.getService(context,
return PendingIntent.getService(
context,
BASE_RQC + (int) site.id,
new Intent(context, CheckService.class)
.putExtra(CheckService.MODEL_ID, site.id),
new Intent(context, CheckService.class).putExtra(CheckService.MODEL_ID, site.id),
PendingIntent.FLAG_UPDATE_CURRENT);
}
@ -40,20 +36,26 @@ public class AlarmUtil {
public static void setSiteChecks(Context context, ServerModel site) {
cancelSiteChecks(context, site);
if (site.checkInterval <= 0) return;
if (site.lastCheck <= 0)
site.lastCheck = System.currentTimeMillis();
if (site.lastCheck <= 0) site.lastCheck = System.currentTimeMillis();
final long nextCheck = site.lastCheck + site.checkInterval;
final AlarmManager aMgr = am(context);
final PendingIntent serviceIntent = getSiteIntent(context, site);
aMgr.setRepeating(AlarmManager.RTC_WAKEUP, nextCheck, site.checkInterval, serviceIntent);
final SimpleDateFormat df = new SimpleDateFormat("EEE MMM dd hh:mm:ssa z yyyy", Locale.getDefault());
Log.d("AlarmUtil", String.format(Locale.getDefault(), "Set site check alarm for %s (%s), check interval: %d, next check: %s",
site.name, site.url, site.checkInterval, df.format(new Date(nextCheck))));
final SimpleDateFormat df =
new SimpleDateFormat("EEE MMM dd hh:mm:ssa z yyyy", Locale.getDefault());
Log.d(
"AlarmUtil",
String.format(
Locale.getDefault(),
"Set site check alarm for %s (%s), check interval: %d, next check: %s",
site.name,
site.url,
site.checkInterval,
df.format(new Date(nextCheck))));
}
public static void setSiteChecks(Context context, ServerModel[] sites) {
if (sites == null || sites.length == 0) return;
for (ServerModel site : sites)
setSiteChecks(context, site);
for (ServerModel site : sites) setSiteChecks(context, site);
}
}

View file

@ -1,27 +1,26 @@
package com.afollestad.nocknock.util;
import android.util.Log;
import org.mozilla.javascript.Context;
import org.mozilla.javascript.EvaluatorException;
import org.mozilla.javascript.Function;
import org.mozilla.javascript.Scriptable;
/**
* @author Aidan Follestad (afollestad)
*/
/** @author Aidan Follestad (afollestad) */
public class JsUtil {
public static String exec(String code, String response) {
try {
final String func = String.format(
"function validate(response) { " +
"try { " +
"%s " +
"} catch(e) { " +
"return e; " +
"} " +
"}", code.replace("\n", " "));
final String func =
String.format(
"function validate(response) { "
+ "try { "
+ "%s "
+ "} catch(e) { "
+ "return e; "
+ "} "
+ "}",
code.replace("\n", " "));
// Every Rhino VM begins with the enter()
// This Context is not Android's Context
@ -62,11 +61,8 @@ public class JsUtil {
}
} catch (EvaluatorException e) {
return e.getMessage();
}
}
private JsUtil() {
}
private JsUtil() {}
}

View file

@ -4,9 +4,7 @@ import android.graphics.Path;
import android.support.design.widget.FloatingActionButton;
import android.view.View;
/**
* @author Aidan Follestad (afollestad)
*/
/** @author Aidan Follestad (afollestad) */
public final class MathUtil {
public static Path bezierCurve(FloatingActionButton fab, View rootView) {

View file

@ -4,15 +4,13 @@ import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
/**
* @author Aidan Follestad (afollestad)
*/
/** @author Aidan Follestad (afollestad) */
public class NetworkUtil {
public static boolean hasInternet(Context context) {
final ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
final ConnectivityManager cm =
(ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
final NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
return activeNetwork != null &&
activeNetwork.isConnectedOrConnecting();
return activeNetwork != null && activeNetwork.isConnectedOrConnecting();
}
}

View file

@ -1,16 +1,14 @@
package com.afollestad.nocknock.util;
/**
* @author Aidan Follestad (afollestad)
*/
/** @author Aidan Follestad (afollestad) */
public class TimeUtil {
public final static long SECOND = 1000;
public final static long MINUTE = SECOND * 60;
public final static long HOUR = MINUTE * 60;
public final static long DAY = HOUR * 24;
public final static long WEEK = DAY * 7;
public final static long MONTH = WEEK * 4;
public static final long SECOND = 1000;
public static final long MINUTE = SECOND * 60;
public static final long HOUR = MINUTE * 60;
public static final long DAY = HOUR * 24;
public static final long WEEK = DAY * 7;
public static final long MONTH = WEEK * 4;
public static String str(long duration) {
if (duration <= 0) {

View file

@ -26,9 +26,7 @@ import android.view.View;
*/
public class DividerItemDecoration extends RecyclerView.ItemDecoration {
private static final int[] ATTRS = new int[]{
android.R.attr.listDivider
};
private static final int[] ATTRS = new int[] {android.R.attr.listDivider};
public static final int HORIZONTAL_LIST = LinearLayoutManager.HORIZONTAL;
@ -68,8 +66,7 @@ public class DividerItemDecoration extends RecyclerView.ItemDecoration {
final int childCount = parent.getChildCount();
for (int i = 0; i < childCount; i++) {
final View child = parent.getChildAt(i);
final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
.getLayoutParams();
final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
final int top = child.getBottom() + params.bottomMargin;
final int bottom = top + mDivider.getIntrinsicHeight();
mDivider.setBounds(left, top, right, bottom);
@ -84,8 +81,7 @@ public class DividerItemDecoration extends RecyclerView.ItemDecoration {
final int childCount = parent.getChildCount();
for (int i = 0; i < childCount; i++) {
final View child = parent.getChildAt(i);
final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
.getLayoutParams();
final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
final int left = child.getRight() + params.rightMargin;
final int right = left + mDivider.getIntrinsicHeight();
mDivider.setBounds(left, top, right, bottom);

View file

@ -3,13 +3,10 @@ package com.afollestad.nocknock.views;
import android.content.Context;
import android.util.AttributeSet;
import android.widget.ImageView;
import com.afollestad.nocknock.R;
import com.afollestad.nocknock.api.ServerStatus;
/**
* @author Aidan Follestad (afollestad)
*/
/** @author Aidan Follestad (afollestad) */
public class StatusImageView extends ImageView {
public StatusImageView(Context context) {

View file

@ -1,14 +1,14 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.
apply from: './dependencies.gradle'
buildscript {
apply from: './dependencies.gradle'
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.1.3'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
classpath 'com.android.tools.build:gradle:' + versions.gradlePlugin
classpath "com.diffplug.spotless:spotless-plugin-gradle:" + versions.spotlessPlugin
}
}
@ -17,6 +17,22 @@ allprojects {
jcenter()
maven { url "https://jitpack.io" }
}
buildscript {
repositories {
maven { url "https://plugins.gradle.org/m2/" }
}
}
apply plugin: "com.diffplug.gradle.spotless"
spotless {
java {
target "**/*.java"
trimTrailingWhitespace()
removeUnusedImports()
googleJavaFormat()
endWithNewline()
}
}
}
task clean(type: Delete) {

13
dependencies.gradle Normal file
View file

@ -0,0 +1,13 @@
ext.versions = [
minSdk : 21,
compileSdk : 26,
buildTools : '26.0.0',
publishVersion : '0.1.3.1',
publishVersionCode: 14,
gradlePlugin : '2.3.2',
spotlessPlugin : '3.4.0',
supportLib : '25.3.1',
materialDialogs : '0.9.4.5',
bridge : '5.1.2',
inquiry : '5.0.0'
]

View file

@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-3.5-bin.zip