diff --git a/android/app/app.iml b/android/app/app.iml index 0204579..d5685ba 100644 --- a/android/app/app.iml +++ b/android/app/app.iml @@ -115,14 +115,29 @@ + + + + + + + + + + + + + + + @@ -144,5 +159,7 @@ + + \ No newline at end of file diff --git a/android/app/src/main/ic_card-web.png b/android/app/src/main/ic_card-web.png new file mode 100644 index 0000000..fd8b1c3 Binary files /dev/null and b/android/app/src/main/ic_card-web.png differ diff --git a/android/app/src/main/ic_phone-web.png b/android/app/src/main/ic_phone-web.png new file mode 100644 index 0000000..733b3e7 Binary files /dev/null and b/android/app/src/main/ic_phone-web.png differ diff --git a/android/app/src/main/java/com/dinect/checker/AbstractScannerActivity.java b/android/app/src/main/java/com/dinect/checker/AbstractScannerActivity.java index 9eb0299..807e220 100644 --- a/android/app/src/main/java/com/dinect/checker/AbstractScannerActivity.java +++ b/android/app/src/main/java/com/dinect/checker/AbstractScannerActivity.java @@ -41,8 +41,6 @@ import android.widget.FrameLayout; import android.widget.TextView; import android.widget.Toast; -import com.dinect.checker.net.ApiClient; - import org.json.JSONArray; import org.json.JSONException; @@ -54,12 +52,17 @@ import okhttp3.Callback; import okhttp3.Response; import okhttp3.ResponseBody; +import com.dinect.checker.net.ApiClient; +import com.dinect.checker.StatedImageButton; +import com.dinect.checker.SearchType; +import com.dinect.checker.StatedImageButton.StatedImageButtonInteractorListener; + /** * Created by anonymous */ -public abstract class AbstractScannerActivity extends AppCompatActivity { +public abstract class AbstractScannerActivity extends AppCompatActivity implements StatedImageButtonInteractorListener{ private final static String TAG = "Checker.ScannerActivity"; @@ -70,11 +73,13 @@ public abstract class AbstractScannerActivity extends AppCompatActivity { protected LogoutDialogFragment logoutDialog; private ApiClient mClient; + private StatedImageButton statedImageButton; boolean isCameraAvailable() { Log.d(TAG, "isCameraAvailable"); PackageManager pm = getPackageManager(); return pm.hasSystemFeature(PackageManager.FEATURE_CAMERA); + } void cancelRequest(final @NonNull String message) { @@ -93,6 +98,8 @@ public abstract class AbstractScannerActivity extends AppCompatActivity { mClient = new ApiClient(url, appToken, token); } + + /** * initialize activity * - removes windows title @@ -122,6 +129,8 @@ public abstract class AbstractScannerActivity extends AppCompatActivity { toolbar.setBackgroundColor((int) intent.getLongExtra(MainActivity.PREF_APP_BAR_COLOR, 0xffffff)); setSupportActionBar(toolbar); + +// final ActionBar actionBar = getSupportActionBar(); if (actionBar != null) { @@ -130,9 +139,30 @@ public abstract class AbstractScannerActivity extends AppCompatActivity { } initManualInput(); + initSwitchButton(); setupSecretClickHandler(toolbar); } + private void initSwitchButton() { + statedImageButton = (StatedImageButton) findViewById(R.id.cardPhoneButton); + statedImageButton.setButtonState(SearchType.CARD); + statedImageButton.setStatedImageButtonInteractorListener(this); + } + + @Override + public void onStateChanged(SearchType searchType) { + Log.d(TAG, searchType.toString()); + EditText manualInput = (EditText) findViewById(R.id.manual_input); + switch (searchType) { + case CARD: + manualInput.setHint(getResources().getString(R.string.enter_manual)); + break; + case PHONE_NUMBER: + manualInput.setHint(getResources().getString(R.string.enter_phone)); + break; + } + } + private void initManualInput() { EditText manualInput = (EditText) findViewById(R.id.manual_input); @@ -192,11 +222,11 @@ public abstract class AbstractScannerActivity extends AppCompatActivity { protected abstract View initScanner(); - public void handleBarcode(final @NonNull String card) { - mClient.findUser(card, new Callback() { + public void handleBarcode(final @NonNull String searchString) { + mClient.findUser(searchString, statedImageButton.getCurrentState(), new Callback() { @Override public void onFailure(Call call, IOException e) { - handleFail(card); + handleFail(searchString); } @Override public void onResponse(Call call, Response response) throws IOException { @@ -207,19 +237,19 @@ public abstract class AbstractScannerActivity extends AppCompatActivity { case 200: final JSONArray users = new JSONArray(body.string()); if (users.length() > 0) { - handleSuccess(card, users.get(0).toString()); + handleSuccess(searchString, users.get(0).toString()); } else { - handleFail(card); + handleFail(searchString); } break; case 204: - handleFail(card); + handleFail(searchString); break; } } } catch (final IOException | JSONException e) { Log.e(TAG, e.getMessage(), e); - handleFail(card); + handleFail(searchString); } } }); @@ -235,11 +265,11 @@ public abstract class AbstractScannerActivity extends AppCompatActivity { }); } - protected final void handleFail(final String card) { + protected final void handleFail(final String searchString) { runOnUiThread(new Runnable() { @Override public void run() { - String message = String.format(getString(R.string.identifier_not_found), card) + String message = String.format(getString(R.string.identifier_not_found), searchString) + ".\n" + String.format(getString(R.string.error_contact_support), BuildConfig.supportPhone); Toast.makeText(AbstractScannerActivity.this, message, Toast.LENGTH_SHORT).show(); diff --git a/android/app/src/main/java/com/dinect/checker/SearchType.java b/android/app/src/main/java/com/dinect/checker/SearchType.java new file mode 100644 index 0000000..13b3421 --- /dev/null +++ b/android/app/src/main/java/com/dinect/checker/SearchType.java @@ -0,0 +1,6 @@ +package com.dinect.checker; + +public enum SearchType { + CARD, + PHONE_NUMBER +} diff --git a/android/app/src/main/java/com/dinect/checker/StatedImageButton.java b/android/app/src/main/java/com/dinect/checker/StatedImageButton.java new file mode 100644 index 0000000..1c33632 --- /dev/null +++ b/android/app/src/main/java/com/dinect/checker/StatedImageButton.java @@ -0,0 +1,81 @@ +package com.dinect.checker; + +import android.content.Context; +import android.support.annotation.Nullable; +import android.util.AttributeSet; +import android.view.View; +import android.widget.ImageButton; +import android.widget.LinearLayout; + +import com.dinect.checker.R; +import com.dinect.checker.SearchType; + +public class StatedImageButton extends LinearLayout { + private Context mContext; + private View mRootView; + + private ImageButton mBtnImageState; + private SearchType mCurrentButtonState = SearchType.CARD; + private StatedImageButtonInteractorListener statedImageButtonInteractorListener; + + public StatedImageButton(Context context) { + super(context); + init(context); + } + + public SearchType getCurrentState() { + return mCurrentButtonState; + } + + public StatedImageButton(Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + init(context); + } + + public StatedImageButton(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + init(context); + } + + private void init(Context context) { + mContext = context; + mRootView = inflate(mContext, R.layout.partial_buttons_layout, this); + mBtnImageState = (ImageButton) mRootView.findViewById(R.id.btn_image_state); + mBtnImageState.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + if (mCurrentButtonState == SearchType.CARD) { + mCurrentButtonState = SearchType.PHONE_NUMBER; + } else { + mCurrentButtonState = SearchType.CARD; + } + setButtonState(mCurrentButtonState); + if (statedImageButtonInteractorListener != null) { + statedImageButtonInteractorListener.onStateChanged(mCurrentButtonState); + } + } + }); + } + + public void setButtonState(SearchType searchType) { + mCurrentButtonState = searchType; + + switch (mCurrentButtonState) { + case CARD: + mBtnImageState.setBackground(getResources().getDrawable(R.drawable.ic_card)); + break; + case PHONE_NUMBER: + mBtnImageState.setBackground(getResources().getDrawable(R.drawable.ic_phone)); + break; + } + + } + + public void setStatedImageButtonInteractorListener(StatedImageButtonInteractorListener statedImageButtonInteractorListener) { + this.statedImageButtonInteractorListener = statedImageButtonInteractorListener; + } + + public interface StatedImageButtonInteractorListener { + void onStateChanged(SearchType searchType); + } +} diff --git a/android/app/src/main/java/com/dinect/checker/net/ApiClient.java b/android/app/src/main/java/com/dinect/checker/net/ApiClient.java index 95de9e6..86d01eb 100644 --- a/android/app/src/main/java/com/dinect/checker/net/ApiClient.java +++ b/android/app/src/main/java/com/dinect/checker/net/ApiClient.java @@ -24,6 +24,8 @@ import okhttp3.HttpUrl; import okhttp3.OkHttpClient; import okhttp3.Request; +import com.dinect.checker.SearchType; + /** * Created by anonymous */ @@ -47,11 +49,19 @@ public final class ApiClient { .build(); } - public void findUser(String card, Callback callback) { + public void findUser(String searchString, SearchType searchType, Callback callback) { final Request.Builder requestBuilder = new Request.Builder(); final HttpUrl url = HttpUrl.parse(mEndpoint); if (url != null) { - HttpUrl.Builder httpBuilder = url.newBuilder().addQueryParameter("auto", card); + HttpUrl.Builder httpBuilder = url.newBuilder(); + switch (searchType) { + case CARD: + httpBuilder.addQueryParameter("auto", searchString); + break; + case PHONE_NUMBER: + httpBuilder.addQueryParameter("phone", searchString); + break; + } mHttp.newCall(requestBuilder.url(httpBuilder.build()).build()).enqueue(callback); } } diff --git a/android/app/src/main/res/drawable-xxxhdpi/ic_card.png b/android/app/src/main/res/drawable-xxxhdpi/ic_card.png new file mode 100644 index 0000000..2818c64 Binary files /dev/null and b/android/app/src/main/res/drawable-xxxhdpi/ic_card.png differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/ic_phone.png b/android/app/src/main/res/drawable-xxxhdpi/ic_phone.png new file mode 100644 index 0000000..db5f09e Binary files /dev/null and b/android/app/src/main/res/drawable-xxxhdpi/ic_phone.png differ diff --git a/android/app/src/main/res/layout/partial_buttons_layout.xml b/android/app/src/main/res/layout/partial_buttons_layout.xml new file mode 100644 index 0000000..11b8b70 --- /dev/null +++ b/android/app/src/main/res/layout/partial_buttons_layout.xml @@ -0,0 +1,15 @@ + + + + + + + + \ No newline at end of file diff --git a/android/app/src/main/res/layout/v_custom_toolbar.xml b/android/app/src/main/res/layout/v_custom_toolbar.xml index c7c7145..ce083dc 100644 --- a/android/app/src/main/res/layout/v_custom_toolbar.xml +++ b/android/app/src/main/res/layout/v_custom_toolbar.xml @@ -1,21 +1,31 @@ - + + + + + android:hint="@string/enter_manual" + android:imeOptions="actionDone" + android:inputType="text" + android:maxLines="1" + android:textColor="@android:color/white" + android:textColorHint="@android:color/white"/> - - - \ No newline at end of file + diff --git a/android/app/src/main/res/mipmap-hdpi/ic_card.png b/android/app/src/main/res/mipmap-hdpi/ic_card.png new file mode 100644 index 0000000..77fd0e8 Binary files /dev/null and b/android/app/src/main/res/mipmap-hdpi/ic_card.png differ diff --git a/android/app/src/main/res/mipmap-hdpi/ic_phone.png b/android/app/src/main/res/mipmap-hdpi/ic_phone.png new file mode 100644 index 0000000..2d2a7f5 Binary files /dev/null and b/android/app/src/main/res/mipmap-hdpi/ic_phone.png differ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_card.png b/android/app/src/main/res/mipmap-mdpi/ic_card.png new file mode 100644 index 0000000..6f66ac4 Binary files /dev/null and b/android/app/src/main/res/mipmap-mdpi/ic_card.png differ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_phone.png b/android/app/src/main/res/mipmap-mdpi/ic_phone.png new file mode 100644 index 0000000..c472932 Binary files /dev/null and b/android/app/src/main/res/mipmap-mdpi/ic_phone.png differ diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_card.png b/android/app/src/main/res/mipmap-xhdpi/ic_card.png new file mode 100644 index 0000000..1982b11 Binary files /dev/null and b/android/app/src/main/res/mipmap-xhdpi/ic_card.png differ diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_phone.png b/android/app/src/main/res/mipmap-xhdpi/ic_phone.png new file mode 100644 index 0000000..d4e08ed Binary files /dev/null and b/android/app/src/main/res/mipmap-xhdpi/ic_phone.png differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_card.png b/android/app/src/main/res/mipmap-xxhdpi/ic_card.png new file mode 100644 index 0000000..ba1e151 Binary files /dev/null and b/android/app/src/main/res/mipmap-xxhdpi/ic_card.png differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_phone.png b/android/app/src/main/res/mipmap-xxhdpi/ic_phone.png new file mode 100644 index 0000000..b0fe64f Binary files /dev/null and b/android/app/src/main/res/mipmap-xxhdpi/ic_phone.png differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_card.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_card.png new file mode 100644 index 0000000..bc21528 Binary files /dev/null and b/android/app/src/main/res/mipmap-xxxhdpi/ic_card.png differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_phone.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_phone.png new file mode 100644 index 0000000..97d91a8 Binary files /dev/null and b/android/app/src/main/res/mipmap-xxxhdpi/ic_phone.png differ diff --git a/android/app/src/main/res/values-ru/strings.xml b/android/app/src/main/res/values-ru/strings.xml index 9313589..62c11d4 100644 --- a/android/app/src/main/res/values-ru/strings.xml +++ b/android/app/src/main/res/values-ru/strings.xml @@ -11,5 +11,6 @@ Нет "Идентификатор %s не найден" Введите штрихкод вручную + Введите номер телефона Можете воспользоваться ручным вводом или позвонить на номер:%s diff --git a/android/app/src/main/res/values-ua/strings.xml b/android/app/src/main/res/values-ua/strings.xml index 9a2af0d..b17b757 100644 --- a/android/app/src/main/res/values-ua/strings.xml +++ b/android/app/src/main/res/values-ua/strings.xml @@ -11,5 +11,6 @@ Ні "Ідентифікатор %s не знайден" Введіть штрихкод вручну + Введіть номер телефону Можете скористатися ручним введенням або зателефонувати на номер:\n%s diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml index 85f4376..0127614 100644 --- a/android/app/src/main/res/values/strings.xml +++ b/android/app/src/main/res/values/strings.xml @@ -11,5 +11,6 @@ No "Identifier %s is not found" Enter the barcode manually + Enter the phone number You can use manual input or call the number:\n%s