diff --git a/app/build.gradle b/app/build.gradle index d6db35c..0423e87 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,8 +8,8 @@ android { applicationId "com.afollestad.nocknock" minSdkVersion 21 targetSdkVersion 24 - versionCode 5 - versionName "0.1.0.1" + versionCode 6 + versionName "0.1.0.2" jackOptions { enabled true diff --git a/app/src/main/java/com/afollestad/nocknock/services/CheckService.java b/app/src/main/java/com/afollestad/nocknock/services/CheckService.java index ff813a5..5a77a5b 100644 --- a/app/src/main/java/com/afollestad/nocknock/services/CheckService.java +++ b/app/src/main/java/com/afollestad/nocknock/services/CheckService.java @@ -135,6 +135,7 @@ public class CheckService extends Service { .setSmallIcon(R.drawable.ic_notification) .setLargeIcon(BitmapFactory.decodeResource(context.getResources(), R.mipmap.ic_launcher)) .setPriority(Notification.PRIORITY_HIGH) + .setAutoCancel(true) .setDefaults(Notification.DEFAULT_VIBRATE) .build(); nm.notify(site.url, NOTI_ID, noti); @@ -150,6 +151,8 @@ public class CheckService extends Service { Inquiry.init(this, MainActivity.DB_NAME, 1); isRunning(true); + Bridge.config() + .defaultHeader("User-Agent", getString(R.string.app_name) + " (Android)"); new Thread(() -> { final Query query = Inquiry.get() diff --git a/app/src/main/java/com/afollestad/nocknock/ui/AddSiteActivity.java b/app/src/main/java/com/afollestad/nocknock/ui/AddSiteActivity.java index 90ffa0d..b4d2478 100644 --- a/app/src/main/java/com/afollestad/nocknock/ui/AddSiteActivity.java +++ b/app/src/main/java/com/afollestad/nocknock/ui/AddSiteActivity.java @@ -3,6 +3,7 @@ package com.afollestad.nocknock.ui; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.content.Intent; +import android.net.Uri; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.design.widget.TextInputLayout; @@ -17,6 +18,7 @@ import android.view.animation.DecelerateInterpolator; 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; @@ -34,6 +36,8 @@ public class AddSiteActivity extends AppCompatActivity implements View.OnClickLi private EditText inputUrl; private EditText inputInterval; private Spinner spinnerInterval; + private TextView textUrlWarning; + private boolean isClosing; @Override @@ -44,13 +48,12 @@ public class AddSiteActivity extends AppCompatActivity implements View.OnClickLi rootLayout = findViewById(R.id.rootView); inputName = (EditText) findViewById(R.id.inputName); inputUrl = (EditText) findViewById(R.id.inputUrl); + textUrlWarning = (TextView) findViewById(R.id.textUrlWarning); inputInterval = (EditText) findViewById(R.id.checkIntervalInput); spinnerInterval = (Spinner) findViewById(R.id.checkIntervalSpinner); toolbar = (Toolbar) findViewById(R.id.toolbar); - toolbar.setNavigationOnClickListener(view -> { - closeActivityWithReveal(); - }); + toolbar.setNavigationOnClickListener(view -> closeActivityWithReveal()); if (savedInstanceState == null) { rootLayout.setVisibility(View.INVISIBLE); @@ -70,6 +73,23 @@ public class AddSiteActivity extends AppCompatActivity implements View.OnClickLi getResources().getStringArray(R.array.interval_options)); spinnerInterval.setAdapter(intervalOptionsAdapter); + inputUrl.setOnFocusChangeListener((view, hasFocus) -> { + if (!hasFocus) { + final String inputStr = inputUrl.getText().toString().trim(); + if (inputStr.isEmpty()) return; + final Uri uri = Uri.parse(inputStr); + if (uri.getScheme() == null) { + inputUrl.setText("http://" + inputStr); + textUrlWarning.setVisibility(View.GONE); + } else if (!"http".equals(uri.getScheme()) && !"https".equals(uri.getScheme())) { + textUrlWarning.setVisibility(View.VISIBLE); + textUrlWarning.setText(R.string.warning_http_url); + } else { + textUrlWarning.setVisibility(View.GONE); + } + } + }); + findViewById(R.id.doneBtn).setOnClickListener(this); } @@ -144,6 +164,10 @@ public class AddSiteActivity extends AppCompatActivity implements View.OnClickLi urlTl.setError(getString(R.string.please_enter_valid_url)); isClosing = false; return; + } else { + final Uri uri = Uri.parse(model.url); + if (uri.getScheme() == null) + model.url = "http://" + model.url; } } diff --git a/app/src/main/java/com/afollestad/nocknock/ui/ViewSiteActivity.java b/app/src/main/java/com/afollestad/nocknock/ui/ViewSiteActivity.java index 13c9de0..bc7e6ac 100644 --- a/app/src/main/java/com/afollestad/nocknock/ui/ViewSiteActivity.java +++ b/app/src/main/java/com/afollestad/nocknock/ui/ViewSiteActivity.java @@ -5,6 +5,7 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; +import android.net.Uri; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; @@ -42,6 +43,7 @@ public class ViewSiteActivity extends AppCompatActivity implements View.OnClickL private Spinner checkIntervalSpinner; private TextView textLastCheckResult; private TextView textNextCheck; + private TextView textUrlWarning; private ServerModel mModel; @@ -70,6 +72,7 @@ public class ViewSiteActivity extends AppCompatActivity implements View.OnClickL iconStatus = (StatusImageView) findViewById(R.id.iconStatus); inputName = (EditText) findViewById(R.id.inputName); inputUrl = (EditText) findViewById(R.id.inputUrl); + textUrlWarning = (TextView) findViewById(R.id.textUrlWarning); inputCheckInterval = (EditText) findViewById(R.id.checkIntervalInput); checkIntervalSpinner = (Spinner) findViewById(R.id.checkIntervalSpinner); textLastCheckResult = (TextView) findViewById(R.id.textLastCheckResult); @@ -79,6 +82,23 @@ public class ViewSiteActivity extends AppCompatActivity implements View.OnClickL getResources().getStringArray(R.array.interval_options)); checkIntervalSpinner.setAdapter(intervalOptionsAdapter); + inputUrl.setOnFocusChangeListener((view, hasFocus) -> { + if (!hasFocus) { + final String inputStr = inputUrl.getText().toString().trim(); + if (inputStr.isEmpty()) return; + final Uri uri = Uri.parse(inputStr); + if (uri.getScheme() == null) { + inputUrl.setText("http://" + inputStr); + textUrlWarning.setVisibility(View.GONE); + } else if (!"http".equals(uri.getScheme()) && !"https".equals(uri.getScheme())) { + textUrlWarning.setVisibility(View.VISIBLE); + textUrlWarning.setText(R.string.warning_http_url); + } else { + textUrlWarning.setVisibility(View.GONE); + } + } + }); + mModel = (ServerModel) getIntent().getSerializableExtra("model"); update(); @@ -197,6 +217,10 @@ public class ViewSiteActivity extends AppCompatActivity implements View.OnClickL if (!Patterns.WEB_URL.matcher(mModel.url).find()) { inputUrl.setError(getString(R.string.please_enter_valid_url)); return; + } else { + final Uri uri = Uri.parse(mModel.url); + if (uri.getScheme() == null) + mModel.url = "http://" + mModel.url; } } diff --git a/app/src/main/res/layout/activity_addsite.xml b/app/src/main/res/layout/activity_addsite.xml index cef4e76..650bc4a 100644 --- a/app/src/main/res/layout/activity_addsite.xml +++ b/app/src/main/res/layout/activity_addsite.xml @@ -69,6 +69,16 @@ + + + + @@ -140,7 +152,7 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/list_text_spacing" android:fontFamily="sans-serif" - android:textColor="?android:textColorSecondary" + android:textColor="?android:textColorPrimary" android:textSize="@dimen/medium_text_size" tools:text="Everything checks out!" /> @@ -158,7 +170,7 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/list_text_spacing" android:fontFamily="sans-serif" - android:textColor="?android:textColorSecondary" + android:textColor="?android:textColorPrimary" android:textSize="@dimen/medium_text_size" tools:text="In 2 hours" /> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index aff57ee..103b0db 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -46,6 +46,10 @@ Drag the list down to manually refresh site statuses! Otherwise, they will be updated automatically in the background on chosen intervals. Understood! + + Warning: this app checks for server availability with HTTP requests. It\'s recommended that you use an HTTP URL. + + Minute(s) Hour(s)