commit bf93c88af3417a7a47ef82e3c60b136c8e8def7c Author: Igor I Date: Mon Nov 6 11:50:11 2023 +0600 Первая diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5edb4ee --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +*.iml +.gradle +/local.properties +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +.DS_Store +/build +/captures +.externalNativeBuild diff --git a/.idea/assetWizardSettings.xml b/.idea/assetWizardSettings.xml new file mode 100644 index 0000000..8495d3e --- /dev/null +++ b/.idea/assetWizardSettings.xml @@ -0,0 +1,327 @@ + + + + + + \ No newline at end of file diff --git a/.idea/caches/build_file_checksums.ser b/.idea/caches/build_file_checksums.ser new file mode 100644 index 0000000..e3d5a67 Binary files /dev/null and b/.idea/caches/build_file_checksums.ser differ diff --git a/.idea/caches/gradle_models.ser b/.idea/caches/gradle_models.ser new file mode 100644 index 0000000..5323176 Binary files /dev/null and b/.idea/caches/gradle_models.ser differ diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml new file mode 100644 index 0000000..0d15693 --- /dev/null +++ b/.idea/codeStyles/Project.xml @@ -0,0 +1,134 @@ + + + + + + + + + + + +
+ + + + xmlns:android + + ^$ + + + +
+
+ + + + xmlns:.* + + ^$ + + + BY_NAME + +
+
+ + + + .*:id + + http://schemas.android.com/apk/res/android + + + +
+
+ + + + .*:name + + http://schemas.android.com/apk/res/android + + + +
+
+ + + + name + + ^$ + + + +
+
+ + + + style + + ^$ + + + +
+
+ + + + .* + + ^$ + + + BY_NAME + +
+
+ + + + .* + + http://schemas.android.com/apk/res/android + + + ANDROID_ATTRIBUTE_ORDER + +
+
+ + + + .* + + .* + + + BY_NAME + +
+
+
+
+
+
\ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..b589d56 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..15a15b2 --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..1431050 --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,21 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..a5f05cd --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..8c8437c --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..45cf85c --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..e95a1e2 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,79 @@ +apply plugin: 'com.android.application' + +android { + signingConfigs { + config { + keyAlias 'ASDC' + keyPassword 'firstg@h0km' + storeFile file('O:/projects/Workspace_Android/Keystore/locustkeystore') + storePassword 'locustg@h0km' + } + } + compileSdkVersion 33 + defaultConfig { + applicationId "kz.istt.locust" + minSdkVersion 15 + targetSdkVersion 33 + versionCode 99 + versionName "2.4.3" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + debug { + signingConfig signingConfigs.config + } + } + packagingOptions { + resources { + excludes += ['META-INF/DEPENDENCIES', 'META-INF/LICENSE'] + } + } + + buildToolsVersion '30.0.3' + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + namespace 'kz.istt.locust' +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation 'androidx.appcompat:appcompat:1.1.0' + implementation 'com.google.android.material:material:1.4.0' + implementation 'androidx.constraintlayout:constraintlayout:1.1.3' + implementation 'androidx.navigation:navigation-fragment:2.0.0' + implementation 'androidx.navigation:navigation-ui:2.0.0' + implementation 'com.google.android.gms:play-services-maps:17.0.0' + implementation 'com.google.android.gms:play-services-vision:20.1.2' + implementation 'com.google.android.gms:play-services-auth:20.4.0' + implementation 'com.google.maps.android:android-maps-utils:1.0.2' + testImplementation 'junit:junit:4.12' + androidTestImplementation 'androidx.test.ext:junit:1.1.1' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' +/* + implementation fileTree(include: ['*.jar'], dir: 'libs') + implementation 'com.android.support:appcompat-v7:28.0.0' + implementation 'com.android.support.constraint:constraint-layout:1.1.2' + implementation 'com.google.android.gms:play-services-maps:17.0.0' + implementation 'androidx.appcompat:appcompat:1.0.2' + testImplementation 'junit:junit:4.12' + androidTestImplementation 'com.android.support.test:runner:1.0.2' + androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' +*/ + + /*compile files('libs/commons-codec-1.6.jar') + compile files('libs/commons-logging-1.1.1.jar') + + compile files('libs/fluent-hc-4.5.2.jar') + compile files('libs/httpclient-4.5.2.jar') + compile files('libs/httpclient-cache-4.5.2.jar') + compile files('libs/httpcore-4.4.4.jar') + compile files('libs/httpmime-4.5.2.jar')*/ +} diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..f1b4245 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile diff --git a/app/release/app-release.apk b/app/release/app-release.apk new file mode 100644 index 0000000..6d392ee Binary files /dev/null and b/app/release/app-release.apk differ diff --git a/app/release/output-metadata.json b/app/release/output-metadata.json new file mode 100644 index 0000000..272c17c --- /dev/null +++ b/app/release/output-metadata.json @@ -0,0 +1,20 @@ +{ + "version": 3, + "artifactType": { + "type": "APK", + "kind": "Directory" + }, + "applicationId": "kz.istt.locust", + "variantName": "release", + "elements": [ + { + "type": "SINGLE", + "filters": [], + "attributes": [], + "versionCode": 99, + "versionName": "2.4.3", + "outputFile": "app-release.apk" + } + ], + "elementType": "File" +} \ No newline at end of file diff --git a/app/src/androidTest/java/kz/istt/locust/ExampleInstrumentedTest.java b/app/src/androidTest/java/kz/istt/locust/ExampleInstrumentedTest.java new file mode 100644 index 0000000..149711e --- /dev/null +++ b/app/src/androidTest/java/kz/istt/locust/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package kz.istt.locust; + +import android.content.Context; +import android.support.test.InstrumentationRegistry; +import android.support.test.runner.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import static org.junit.Assert.*; + +/** + * Instrumented test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + @Test + public void useAppContext() { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getTargetContext(); + + assertEquals("kz.istt.locust", appContext.getPackageName()); + } +} diff --git a/app/src/debug/res/values/google_maps_api.xml b/app/src/debug/res/values/google_maps_api.xml new file mode 100644 index 0000000..7f2312d --- /dev/null +++ b/app/src/debug/res/values/google_maps_api.xml @@ -0,0 +1,24 @@ + + + AIzaSyA_tOZ-AUtAbt0GOkNgWUBtSbEZgTk4vXA + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..33bf1a5 --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000..2313c8c Binary files /dev/null and b/app/src/main/ic_launcher-playstore.png differ diff --git a/app/src/main/ic_launcher-web.png b/app/src/main/ic_launcher-web.png new file mode 100644 index 0000000..fbac213 Binary files /dev/null and b/app/src/main/ic_launcher-web.png differ diff --git a/app/src/main/java/dbfields/AutoCompleteTextViewDB.java b/app/src/main/java/dbfields/AutoCompleteTextViewDB.java new file mode 100644 index 0000000..e5e2f03 --- /dev/null +++ b/app/src/main/java/dbfields/AutoCompleteTextViewDB.java @@ -0,0 +1,246 @@ +package dbfields; + +import android.content.Context; +import android.database.Cursor; +import android.os.Parcel; +import android.os.Parcelable; +import android.text.InputType; +import android.util.AttributeSet; +import android.view.View; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.AutoCompleteTextView; + +import java.util.ArrayList; +import java.util.List; + +import kz.istt.locust.DbOpenHelper; +import kz.istt.locust.LocustActivity; +import kz.istt.locust.R; + +import static android.widget.AdapterView.INVALID_POSITION; + +public class AutoCompleteTextViewDB extends AutoCompleteTextView implements selectDB { + private String m_Value = null; + private List m_lName = new ArrayList(); //Заголовки + private List m_lVal = new ArrayList(); //Значения + public ArrayAdapter dataAdapter = null; + private Context m_context = null; + + private List m_lChange = new ArrayList(); //Слушатели изменений + + /*private AdapterView.OnItemSelectedListener listener = new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView parentView, View selectedItemView, int position, long id) { + if (getSelectedItemPosition() != INVALID_POSITION && position != INVALID_POSITION) + AutoCompleteTextViewDB.this.setValue(m_lVal.get(getSelectedItemPosition())); + } + + @Override + public void onNothingSelected(AdapterView parentView) { + } + };*/ + + private AdapterView.OnItemClickListener listener = new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + int pos=getSelectedItemPosition(); + String val=m_lVal.get(pos); + AutoCompleteTextViewDB.this.setValue(val); + } + }; + + int getSelectedItemPosition() { + String str = this.getText().toString(); + int pos=INVALID_POSITION; + for(int i=0; i(m_context, R.layout.dropdown_item, m_lName); + dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + this.setAdapter(dataAdapter); + //setOnItemSelectedListener(listener); + setOnItemClickListener(listener); + + updatePosition(); //Чтоб установилось на существующее значение если оно есть + } + + public void clearFields() + { + m_lName.clear(); + m_lVal.clear(); + + //Обновляем список + //setOnItemSelectedListener(null); + setOnItemClickListener(null); + dataAdapter = new ArrayAdapter(m_context, R.layout.dropdown_item, m_lName); + dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + this.setAdapter(dataAdapter); + //setOnItemSelectedListener(listener); + setOnItemClickListener(listener); + } + + public void updateAdapter(Context context){ + //Обновляем список + setOnItemClickListener(null); + dataAdapter = new ArrayAdapter(context, R.layout.dropdown_item, m_lName); + dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + this.setAdapter(dataAdapter); + setOnItemClickListener(listener); + } + + + /** + * Обновить позицию вып списка в соответствии со значением + */ + public void updatePosition() + { + Boolean b=true; + for(int i=0;i CREATOR = new Parcelable.Creator() + { + public SavedState createFromParcel(Parcel in) + { + return new SavedState(in); + } + + public SavedState[] newArray(int size) + { + return new SavedState[size]; + } + }; + + private SavedState(Parcel in) + { + super(in); + value = in.readString(); + } + + } + + @Override + public Parcelable onSaveInstanceState() + { + SavedState st = new SavedState(super.onSaveInstanceState()); + st.value = getValue(); + if(st.value==null) st.value=""; + return st; + } + + @Override + public void onRestoreInstanceState(Parcelable state) + { + if (state == null || !(state instanceof SavedState)) + { + super.onRestoreInstanceState(state); + return; + } + + SavedState ss = (SavedState) state; + super.onRestoreInstanceState(ss.getSuperState()); + setValue(ss.value); + }; +*/ +} diff --git a/app/src/main/java/dbfields/DateInput.java b/app/src/main/java/dbfields/DateInput.java new file mode 100644 index 0000000..b98fbf9 --- /dev/null +++ b/app/src/main/java/dbfields/DateInput.java @@ -0,0 +1,246 @@ +package dbfields; + +import android.content.Context; +import android.os.Parcel; +import android.os.Parcelable; +import android.text.InputFilter; +import android.text.InputType; +import android.util.AttributeSet; +import android.view.ViewGroup; +import android.widget.EditText; +import android.widget.LinearLayout; +import android.widget.TextView; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; + +import kz.istt.locust.R; + +public class DateInput extends LinearLayout +{ + private EditText etD = null; + private TextView tv1 = null; //Разделитель дня и месяца + private EditText etM = null; + private EditText etY = null; + + //Задаёт видимость полей + public void setVisibleDMY(String val) + { + if(val.toLowerCase().indexOf("d")==-1) + { + etD.setVisibility(INVISIBLE); + if(etD.getParent()!=null) ((ViewGroup) etD.getParent()).removeView(etD); + if(tv1.getParent()!=null) ((ViewGroup) tv1.getParent()).removeView(tv1); + } else + { + etD.setVisibility(VISIBLE); + if(etD.getParent()==null) addView(etD); + if(tv1.getParent()==null) addView(tv1); + } + + if(val.toLowerCase().indexOf("m")==-1) + { + etM.setVisibility(INVISIBLE); + if(etM.getParent()!=null) + ((ViewGroup) etM.getParent()).removeView(etM); + if(tv1.getParent()!=null) + ((ViewGroup) tv1.getParent()).removeView(tv1); + } else + { + etM.setVisibility(VISIBLE); + if(etM.getParent()==null) addView(etM); + if(tv1.getParent()==null) addView(tv1); + } + } + + public DateInput(Context context, AttributeSet attr) + { + super(context, attr); + + int maxLength = 10; + InputFilter[] fArray = new InputFilter[1]; + fArray[0] = new InputFilter.LengthFilter(maxLength); + + LinearLayout.LayoutParams paramMessage = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); + paramMessage.weight = (float) 1.0; + + etD = new EditText(context); + etD.setHint(context.getResources().getString(R.string.Day)); + etD.setInputType(InputType.TYPE_CLASS_NUMBER); + etD.setFilters(new InputFilter[] { new InputFilter.LengthFilter(2) }); // Почему-то не работает… + etD.setMaxEms(10); + etD.setFilters(fArray); + addView(etD, paramMessage); + + tv1 = new TextView(context); + tv1.setText("."); + addView(tv1); + + etM = new EditText(context); + etM.setHint(context.getResources().getString(R.string.Month)); + etM.setInputType(InputType.TYPE_CLASS_NUMBER); + etM.setFilters(new InputFilter[] { new InputFilter.LengthFilter(2) }); // Почему-то не работает… + etM.setMaxEms(10); + etM.setFilters(fArray); + addView(etM, paramMessage); + + TextView tv = new TextView(context); + tv.setText("."); + addView(tv); + + etY = new EditText(context); + etY.setHint(context.getResources().getString(R.string.Year)); + etY.setInputType(InputType.TYPE_CLASS_NUMBER); + etY.setFilters(new InputFilter[] { new InputFilter.LengthFilter(4) }); // Почему-то не работает… + etY.setMaxEms(10); + etY.setMinWidth(80); + etY.setFilters(fArray); + addView(etY, paramMessage); + } + + /** + * Секунд с начала 1970 года + */ + public void setDate(Long date) + { + if (date == null) + setDate((Date) null); + else + setDate(new Date(date * 1000L)); + } + + public void setDate(Date date) + { + if (date == null) + { + etD.setText(""); + etM.setText(""); + etY.setText(""); + } else + { + etD.setText(new SimpleDateFormat("dd").format(date)); + etM.setText(new SimpleDateFormat("MM").format(date)); + etY.setText(new SimpleDateFormat("yyyy").format(date)); + } + } + + /** + * Получить секунд с начала 1970 года по гринвичу + * + * @return + */ + public Long getDate() + { + Date d = null; + SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy"); + try + { + String day = etD.getText().toString(); + if(day.equals("") && etD.getVisibility() == INVISIBLE) day="01"; //Если не виден и не задан день то 1е число + if(!day.equals("")) + { + if(Integer.valueOf(day)<0 || Integer.valueOf(day)>31) return null; + } + String month = etM.getText().toString(); + if(month.equals("") && etM.getVisibility() == INVISIBLE) month="01"; //Если не виден и не задан день то 1е число + if(!month.equals("")) + { + if(Integer.valueOf(month)<0 || Integer.valueOf(month)>12) return null; + } + String year = etY.getText().toString(); + if(year.equals("") && etY.getVisibility() == INVISIBLE) year="1970"; + if(!year.equals("")) + { + if(Integer.valueOf(year)<1970 || Integer.valueOf(year)>2999) return null; + } + d = sdf.parse(day + "/" + month + "/" + year); + } catch (ParseException e) + { + return null; + } + return d.getTime() / 1000L; + } + + @Override + public String toString() + { + return String.valueOf(getDate()); + } + + @Override + public boolean isSaveEnabled() + { + return true; + } + + // Класс для сохранения изменений сделаных пользователем при повороте экрана + public static class SavedStateDI extends BaseSavedState + { + //Не может быть null почемуто вылетает! + String day = ""; + String month = ""; + String year = ""; + + SavedStateDI(Parcelable superState) + { + super(superState); + } + + @Override + public void writeToParcel(Parcel out, int flags) + { + super.writeToParcel(out, flags); + out.writeString(day); + out.writeString(month); + out.writeString(year); + } + + public static final Parcelable.Creator CREATOR = new Parcelable.Creator() + { + public SavedStateDI createFromParcel(Parcel in) + { + return new SavedStateDI(in); + } + + public SavedStateDI[] newArray(int size) + { + return new SavedStateDI[size]; + } + }; + + private SavedStateDI(Parcel in) + { + super(in); + day = in.readString(); + month = in.readString(); + year = in.readString(); + } + } + + @Override + protected Parcelable onSaveInstanceState() + { + SavedStateDI st = new SavedStateDI(super.onSaveInstanceState()); + st.day = etD.getText().toString(); + st.month = etM.getText().toString(); + st.year = etY.getText().toString(); + return st; + } + + @Override + protected void onRestoreInstanceState(Parcelable state) + { + if (state == null || !(state instanceof SavedStateDI)) + { + super.onRestoreInstanceState(state); + return; + } + SavedStateDI ss = (SavedStateDI) state; + super.onRestoreInstanceState(ss.getSuperState()); + etD.setText(ss.day); + etM.setText(ss.month); + etY.setText(ss.year); + }; + +} diff --git a/app/src/main/java/dbfields/DateTimeTM.java b/app/src/main/java/dbfields/DateTimeTM.java new file mode 100644 index 0000000..25268e8 --- /dev/null +++ b/app/src/main/java/dbfields/DateTimeTM.java @@ -0,0 +1,109 @@ +package dbfields; + +import android.content.Context; +import android.os.Parcel; +import android.os.Parcelable; +import android.util.AttributeSet; +import android.widget.EditText; + +import java.text.SimpleDateFormat; +import java.util.Date; + +public class DateTimeTM extends com.google.android.material.textfield.TextInputEditText implements fieldDB +{ + private String m_Value = null; + + public DateTimeTM(Context context) + { + super(context); + } + public DateTimeTM(Context context, AttributeSet attrs) + { + super(context,attrs); + } + + public String getValue(){ + return m_Value; + } + + //Передаётся в секундах с 1970 года по гринвичу но отображается в локальном времени 1579154400 отображается 16.01.2020 12:00 (в Алмате) + public void setValue(String val) + { + m_Value = val; + if(val!=null && !val.equals("")) + { + Date date = new Date(Long.parseLong(m_Value)*1000); + + SimpleDateFormat format = new SimpleDateFormat("dd.MM.yyyy HH:mm"); + //format.setTimeZone(TimeZone.getTimeZone("UTC")); + + String str = format.format(date); + setText(str); + }else + { + setText(""); + } + } + + // Класс для сохранения изменений сделаных пользователем при повороте экрана + public static class SavedStateTDTM extends BaseSavedState + { + String value = ""; //Не может быть null почемуто вылетает! + + SavedStateTDTM(Parcelable superState) + { + super(superState); + } + + @Override + public void writeToParcel(Parcel out, int flags) + { + super.writeToParcel(out, flags); + out.writeString(value); + } + + public static final Creator CREATOR = new Creator() + { + public SavedStateTDTM createFromParcel(Parcel in) + { + return new SavedStateTDTM(in); + } + + public SavedStateTDTM[] newArray(int size) + { + return new SavedStateTDTM[size]; + } + }; + + private SavedStateTDTM(Parcel in) + { + super(in); + value = in.readString(); + } + + } + + @Override + public Parcelable onSaveInstanceState() + { + SavedStateTDTM st = new SavedStateTDTM(super.onSaveInstanceState()); + st.value = getValue(); + if(st.value==null) st.value=""; + return st; + } + + @Override + public void onRestoreInstanceState(Parcelable state) + { + if (state == null || !(state instanceof SavedStateTDTM)) + { + super.onRestoreInstanceState(state); + return; + } + + SavedStateTDTM ss = (SavedStateTDTM) state; + super.onRestoreInstanceState(ss.getSuperState()); + setValue(ss.value); + }; + +} diff --git a/app/src/main/java/dbfields/DateTimeText.java b/app/src/main/java/dbfields/DateTimeText.java new file mode 100644 index 0000000..d457943 --- /dev/null +++ b/app/src/main/java/dbfields/DateTimeText.java @@ -0,0 +1,110 @@ +package dbfields; + +import android.content.Context; +import android.os.Parcel; +import android.os.Parcelable; +import android.util.AttributeSet; +import android.widget.EditText; + +import java.text.SimpleDateFormat; +import java.util.Date; + +public class DateTimeText extends EditText implements fieldDB +{ + private String m_Value = null; + + public DateTimeText(Context context) + { + super(context); + } + public DateTimeText(Context context, AttributeSet attrs) + { + super(context,attrs); + } + + public String getValue(){ + return m_Value; + } + + //Передаётся в секундах с 1970 года по гринвичу но отображается в локальном времени 1579154400 отображается 16.01.2020 12:00 (в Алмате) + public void setValue(String val) + { + m_Value = val; + if(val!=null && !val.equals("")) + { + Date date = new Date(Long.parseLong(m_Value)*1000); + + SimpleDateFormat format = new SimpleDateFormat("dd.MM.yyyy HH:mm"); + //format.setTimeZone(TimeZone.getTimeZone("UTC")); + + String str = format.format(date); + setText(str); + }else + { + setText(""); + } + } + + + // Класс для сохранения изменений сделаных пользователем при повороте экрана + public static class SavedStateDTT extends BaseSavedState + { + String value = ""; //Не может быть null почемуто вылетает! + + SavedStateDTT(Parcelable superState) + { + super(superState); + } + + @Override + public void writeToParcel(Parcel out, int flags) + { + super.writeToParcel(out, flags); + out.writeString(value); + } + + public static final Parcelable.Creator CREATOR = new Parcelable.Creator() + { + public SavedStateDTT createFromParcel(Parcel in) + { + return new SavedStateDTT(in); + } + + public SavedStateDTT[] newArray(int size) + { + return new SavedStateDTT[size]; + } + }; + + private SavedStateDTT(Parcel in) + { + super(in); + value = in.readString(); + } + + } + + @Override + public Parcelable onSaveInstanceState() + { + SavedStateDTT st = new SavedStateDTT(super.onSaveInstanceState()); + st.value = getValue(); + if(st.value==null) st.value=""; + return st; + } + + @Override + public void onRestoreInstanceState(Parcelable state) + { + if (state == null || !(state instanceof SavedStateDTT)) + { + super.onRestoreInstanceState(state); + return; + } + + SavedStateDTT ss = (SavedStateDTT) state; + super.onRestoreInstanceState(ss.getSuperState()); + setValue(ss.value); + }; + +} diff --git a/app/src/main/java/dbfields/InputFilterMinMax.java b/app/src/main/java/dbfields/InputFilterMinMax.java new file mode 100644 index 0000000..8d1dc63 --- /dev/null +++ b/app/src/main/java/dbfields/InputFilterMinMax.java @@ -0,0 +1,33 @@ +package dbfields; + +import android.text.InputFilter; +import android.text.Spanned; + +public class InputFilterMinMax implements InputFilter { + + private int min, max; + + public InputFilterMinMax(int min, int max) { + this.min = min; + this.max = max; + } + + public InputFilterMinMax(String min, String max) { + this.min = Integer.parseInt(min); + this.max = Integer.parseInt(max); + } + + @Override + public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { + try { + int input = Integer.parseInt(dest.toString() + source.toString()); + if (isInRange(min, max, input)) + return null; + } catch (NumberFormatException nfe) { } + return ""; + } + + private boolean isInRange(int a, int b, int c) { + return b > a ? c >= a && c <= b : c >= b && c <= a; + } +} \ No newline at end of file diff --git a/app/src/main/java/dbfields/SpinnerDB.java b/app/src/main/java/dbfields/SpinnerDB.java new file mode 100644 index 0000000..62ee0c0 --- /dev/null +++ b/app/src/main/java/dbfields/SpinnerDB.java @@ -0,0 +1,213 @@ +package dbfields; + +import android.content.Context; +import android.os.Parcel; +import android.os.Parcelable; +import android.text.Editable; +import android.text.SpannableString; +import android.text.SpannableStringBuilder; +import android.util.AttributeSet; +import android.view.View; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.Spinner; + +import java.util.ArrayList; +import java.util.List; + +public class SpinnerDB extends Spinner implements selectDB +{ + private String m_Value = null; + private List m_lName = new ArrayList(); //Заголовки + private List m_lVal = new ArrayList(); //Значения + private Context m_context = null; + + private List m_lChange = new ArrayList(); //Слушатели изменений + + private OnItemSelectedListener listener = new OnItemSelectedListener() + { + @Override + public void onItemSelected(AdapterView parentView, View selectedItemView, int position, long id) + { + if(getSelectedItemPosition()!=INVALID_POSITION && position != INVALID_POSITION) + SpinnerDB.this.setValue(m_lVal.get(getSelectedItemPosition())); + } + @Override + public void onNothingSelected(AdapterView parentView) + { + } + }; + + /** + * Добавить слушателя смены значения (не клика) + * @param listener + */ + public void addOnChangeValueListener(OnClickListener listener) + { + m_lChange.add(listener); + } + + /** + * Удалить слушателя смены значений + * @param listener + */ + public void remOnChangeValueListener(OnClickListener listener) + { + m_lChange.remove(listener); + } + + public SpinnerDB(Context context, AttributeSet attrs) + { + super(context,attrs); + m_context = context; + setOnItemSelectedListener(listener); + } + + /** + * Получить значение + */ + public String getValue() + { + return m_Value; + } + + /** Присвоить значение полю и попытаться найти его в выподающем списке*/ + public void setValue(String value) + { + if(m_Value == value) return; + m_Value = value; + + updatePosition(); + + //Информируем слушателей о изменении значении + for(int i=0;i dataAdapter = new ArrayAdapter(m_context, android.R.layout.simple_spinner_item, m_lName); + dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + this.setAdapter(dataAdapter); + setOnItemSelectedListener(listener); + + updatePosition(); //Чтоб установилось на существующее значение если оно есть + } + + public void clearFields() + { + m_lName.clear(); + m_lVal.clear(); + + //Обновляем список + setOnItemSelectedListener(null); + ArrayAdapter dataAdapter = new ArrayAdapter(m_context, android.R.layout.simple_spinner_item, m_lName); + dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + this.setAdapter(dataAdapter); + setOnItemSelectedListener(listener); + } + + /** + * Обновить позицию вып списка в соответствии со значением + */ + protected void updatePosition() + { + Boolean b=true; + for(int i=0;i CREATOR = new Parcelable.Creator() + { + public SavedStateSPNR createFromParcel(Parcel in) + { + return new SavedStateSPNR(in); + } + + public SavedStateSPNR[] newArray(int size) + { + return new SavedStateSPNR[size]; + } + }; + + private SavedStateSPNR(Parcel in) + { + super(in); + value = in.readString(); + } + + } + + @Override + public Parcelable onSaveInstanceState() + { + SavedStateSPNR st = new SavedStateSPNR(super.onSaveInstanceState()); + st.value = getValue(); + if(st.value==null) st.value=""; + return st; + } + + @Override + public void onRestoreInstanceState(Parcelable state) + { + if (state == null || !(state instanceof SavedStateSPNR)) + { + super.onRestoreInstanceState(state); + return; + } + + SavedStateSPNR ss = (SavedStateSPNR) state; + super.onRestoreInstanceState(ss.getSuperState()); + setValue(ss.value); + }; + +} diff --git a/app/src/main/java/dbfields/StringDB.java b/app/src/main/java/dbfields/StringDB.java new file mode 100644 index 0000000..f4edee4 --- /dev/null +++ b/app/src/main/java/dbfields/StringDB.java @@ -0,0 +1,27 @@ +package dbfields; + +public class StringDB implements fieldDB +{ + + private String value; + + public StringDB(String val) + { + value = val; + } + + public StringDB(){} + + @Override + public String getValue() + { + return value; + } + + @Override + public void setValue(String val) + { + value=val; + } + +} diff --git a/app/src/main/java/dbfields/TextViewHTML.java b/app/src/main/java/dbfields/TextViewHTML.java new file mode 100644 index 0000000..cbb0e9d --- /dev/null +++ b/app/src/main/java/dbfields/TextViewHTML.java @@ -0,0 +1,33 @@ +package dbfields; + +import android.content.Context; +import android.text.Html; +import android.util.AttributeSet; +import android.widget.TextView; + +public class TextViewHTML extends TextView +{ + public TextViewHTML(Context context, AttributeSet attrs, int defStyleAttr) + { + super(context, attrs, defStyleAttr); + init(); + } + + public TextViewHTML(Context context) + { + super(context); + init(); + } + + public TextViewHTML(Context context, AttributeSet attrs) + { + super(context, attrs); + init(); + } + + private void init() + { + setText(Html.fromHtml(getText().toString())); + } + +} diff --git a/app/src/main/java/dbfields/TimeInput.java b/app/src/main/java/dbfields/TimeInput.java new file mode 100644 index 0000000..0abdb50 --- /dev/null +++ b/app/src/main/java/dbfields/TimeInput.java @@ -0,0 +1,151 @@ +package dbfields; + +import android.content.Context; +import android.text.InputFilter; +import android.text.InputType; +import android.util.AttributeSet; +import android.view.ViewGroup; +import android.widget.EditText; +import android.widget.LinearLayout; +import android.widget.TextView; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.TimeZone; + +import kz.istt.locust.R; + +public class TimeInput extends LinearLayout { + + private EditText etH = null; + private TextView tv1 = null; + private EditText etM = null; + //private EditText etS = null; //Закоментил потому что секунды ненужны + + //Задаёт видимость полей + public void setVisibleHMS(String val) + { + if(val.toLowerCase().indexOf("h")==-1) + { + if(etH.getParent()!=null) + ((ViewGroup) etH.getParent()).removeView(etH); + if(tv1.getParent()!=null) + ((ViewGroup) tv1.getParent()).removeView(tv1); + } else + { + if(etH.getParent()==null) addView(etH); + if(tv1.getParent()==null) addView(tv1); + } + + if(val.toLowerCase().indexOf("m")==-1) + { + if(etM.getParent()!=null) + ((ViewGroup) etM.getParent()).removeView(etM); + if(tv1.getParent()!=null) + ((ViewGroup) tv1.getParent()).removeView(tv1); + } else + { + if(etM.getParent()==null) addView(etM); + if(tv1.getParent()==null) addView(tv1); + } + } + + public TimeInput(Context context, AttributeSet attr) { + super(context, attr); + + int maxLength = 10; + InputFilter[] fArray = new InputFilter[1]; + fArray[0] = new InputFilter.LengthFilter(maxLength); + + LinearLayout.LayoutParams paramMessage = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); + paramMessage.weight = (float) 1.0; + + etH = new EditText(context); + + etH.setHint(context.getResources().getString(R.string.Hours)); + etH.setInputType(InputType.TYPE_CLASS_NUMBER); + etH.setFilters(new InputFilter[] {new InputFilter.LengthFilter(4)}); //Почему-то не работает… + etH.setMaxEms(10); + etH.setFilters(fArray); + addView(etH,paramMessage); + + tv1 = new TextView(context); + tv1.setText(":"); + addView(tv1); + + etM = new EditText(context); + etM.setHint(context.getResources().getString(R.string.Minutes)); + etM.setInputType(InputType.TYPE_CLASS_NUMBER); + etM.setFilters(new InputFilter[] {new InputFilter.LengthFilter(4)}); //Почему-то не работает… + etM.setMaxEms(10); + etM.setFilters(fArray); + addView(etM/*,paramMessage*/); +/* + tv = new TextView(context); + tv.setText(":"); + addView(tv); + + etS = new EditText(context); + etS.setHint(context.getResources().getString(R.string.Seconds)); + etS.setInputType(InputType.TYPE_CLASS_NUMBER); + etS.setFilters(new InputFilter[] {new InputFilter.LengthFilter(4)}); //Почему-то не работает… + etS.setMaxEms(10); + etS.setFilters(fArray); + addView(etS,paramMessage); +*/ + } + + + + /** + * Секунд с начала дня + */ + public void setTime(Long time) + { + if(time == null) setTime((Date)null); + else setTime(new Date(time * 1000L)); + } + + public void setTime(Date time) + { + if(time == null) + { + etH.setText(""); + etM.setText(""); + //etS.setText(""); + }else + { + etH.setText(new SimpleDateFormat("HH").format(time)); + etM.setText(new SimpleDateFormat("mm").format(time)); + //etS.setText(new SimpleDateFormat("ss").format(time)); + } + } + + /** + * Получить секунд с начала дня по гринвичу с учётом временой зоны + * @return + */ + public Long getTime() + { + Date d=null; + SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); + sdf.setTimeZone(TimeZone.getDefault()); + try + { + //d = sdf.parse(etH.getText().toString()+":"+etM.getText().toString()+":"+etS.getText().toString()); + String h = etH.getText().toString(); + if(h=="") h="00"; + + String m = etM.getText().toString(); + if(m=="") m="00"; + //String s = etS.getText().toString(); + //if(s=="") s="00"; + + d = sdf.parse(h+":"+m+":00"); + } catch (ParseException e) { + return null; + } + return d.getTime() / 1000L; + } +} diff --git a/app/src/main/java/dbfields/fieldDB.java b/app/src/main/java/dbfields/fieldDB.java new file mode 100644 index 0000000..0d97d59 --- /dev/null +++ b/app/src/main/java/dbfields/fieldDB.java @@ -0,0 +1,13 @@ +package dbfields; + + +import android.view.View; + +import kz.istt.locust.LocustActivity; + +public interface fieldDB +{ + public String getValue(); + public void setValue(String val); +} + diff --git a/app/src/main/java/dbfields/selectDB.java b/app/src/main/java/dbfields/selectDB.java new file mode 100644 index 0000000..da3ec71 --- /dev/null +++ b/app/src/main/java/dbfields/selectDB.java @@ -0,0 +1,13 @@ +package dbfields; + +import android.text.Editable; +import android.view.View; + +import dbfields.fieldDB; + +public interface selectDB extends fieldDB { + public void addField(String name, String val); + public void clearFields(); //Clear all fields from drop down list + public Editable getText(); + public void setOnChangeValueListener(View.OnClickListener listener); +} \ No newline at end of file diff --git a/app/src/main/java/kz/istt/locust/DBGUITable.java b/app/src/main/java/kz/istt/locust/DBGUITable.java new file mode 100644 index 0000000..bfce264 --- /dev/null +++ b/app/src/main/java/kz/istt/locust/DBGUITable.java @@ -0,0 +1,284 @@ +package kz.istt.locust; + +//import android.content.Context; + +import android.content.ContentValues; +import android.content.Context; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; +import android.util.Log; +import android.widget.CheckBox; +import android.widget.EditText; +import android.widget.Spinner; + +import com.google.android.material.textfield.TextInputEditText; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.UUID; + +import dbfields.DateInput; +import dbfields.DateTimeText; +import dbfields.DateTimeTM; +import dbfields.SpinnerDB; +import dbfields.AutoCompleteTextViewDB; +import dbfields.StringDB; + +/* + * Соответствие GUI полей и полей базы данных + * Для сохранения значений и для их загрузки из базы +*/ + +public class DBGUITable +{ + private Context m_context; + + //private DbOpenHelper m_dboh; + //Для списка полей + private List m_listO; + private List m_listN; //Имена столбцов + private String m_table; + + public DBGUITable(Context context, String table) + { + m_context = context; + m_table = table; + //m_dboh = dboh; + + m_listO = new ArrayList(); + m_listN = new ArrayList(); + } + + /** + * Получить тип столбца из таблицы + * @param name + * @return + */ + public String getType(String name) + { + String type=null; + //Считываем поля и их типы из таблицы + DbOpenHelper dboh = new DbOpenHelper(m_context); + Cursor cursor = dboh.getReadableDatabase().rawQuery("PRAGMA table_info('"+m_table+"');",null); + if(cursor.moveToFirst()) + { + do{ + if(Tools.getStringFromCursor(cursor,"name").equals(name)) + { + type = Tools.getStringFromCursor(cursor,"type"); + break; + } + }while (cursor.moveToNext()); + } + cursor.close(); + dboh.close(); + return type; + } + + /* + * Передаётся компонент и название поля таблицы + */ + public void add(Object component, String name) + { + m_listO.add(component); + m_listN.add(name); + } + + /** + * Найти компонент по имени поля базы + * @param fieldName + * @return + */ + public Object findComponent(String fieldName) + { + for(int i=0;i lrFrmLocust = new ArrayList(); //Список обязательных полей для формы саранцчи + //ArrayList lrFrmLocustDel = new ArrayList(); //Список обязательных полей для формы саранцчи + + private Context _context; //Зачем коментил? + + /*public static final String TABLE_NAME = "users"; + public static final String LOGIN = "login"; + public static final String PASSW = "passw";*/ + + /** Открытие базы + */ + public DbOpenHelper(Context context) + { + super(context, DB_NAME, null, DB_VERSION); + _context = context; + +/* + SQLiteDatabase db = this.getWritableDatabase(); + db.execSQL("DROP TABLE IF EXISTS frmlocust"); + db.execSQL("DROP TABLE IF EXISTS frmlocust_locations"); + db.execSQL("DROP TABLE IF EXISTS frmlocustdel"); + db.execSQL("DROP TABLE IF EXISTS frmlocustdel_locations"); + db.execSQL("DROP TABLE IF EXISTS CountriesRegions"); + db.execSQL("DROP TABLE IF EXISTS CountriesRegionsPoints"); + db.execSQL("DROP TABLE IF EXISTS Countries"); + db.execSQL("DROP TABLE IF EXISTS LocustsTypes"); //Табличка видов саранчи + db.execSQL("DROP TABLE IF EXISTS _languages"); + db.execSQL("DROP TABLE IF EXISTS _translations"); + db.execSQL("DROP TABLE IF EXISTS _user"); + db.execSQL("DROP TABLE IF EXISTS Borns"); //Справочник отрождение "Начало", "Массовое". + db.execSQL("DROP TABLE IF EXISTS list_density"); //Справочник плотност: «низкая», «средняя» и «высокая». + db.execSQL("DROP TABLE IF EXISTS list_phase"); + db.execSQL("DROP TABLE IF EXISTS list_mortality"); //Метод подсчёта смертности + db.execSQL("DROP TABLE IF EXISTS list_directions"); //Стороны света направления + db.execSQL("DROP TABLE IF EXISTS list_damage"); //Справочник повреждений растительного покрова + db.execSQL("DROP TABLE IF EXISTS list_greenery"); + db.execSQL("DROP TABLE IF EXISTS list_biotope"); + db.execSQL("DROP TABLE IF EXISTS list_cover"); + db.execSQL("DROP TABLE IF EXISTS list_age"); + db.execSQL("DROP TABLE IF EXISTS list_actions"); + db.execSQL("DROP TABLE IF EXISTS list_paintings"); + db.execSQL("DROP TABLE IF EXISTS list_behaviors"); // + db.execSQL("DROP TABLE IF EXISTS list_breeding"); //«Одиночные, разреженные, группы» + db.execSQL("DROP TABLE IF EXISTS list_capacities"); //«Полнообъемное», «Малообъемное», «Ультрамалообъемное». + db.execSQL("DROP TABLE IF EXISTS list_markings"); + db.execSQL("DROP TABLE IF EXISTS sprayers"); //Опрыскиватели: "Трактор", "Самолёт" итд. + db.execSQL("DROP TABLE IF EXISTS sprayers_types"); //Виды опрыскивания: "Авиа", "Наземное", "Ручное". + db.execSQL("DROP TABLE IF EXISTS Fledgling"); + onCreate(db); +/**/ + } + + /** Содание новой базы если её нет + */ + @Override + public void onCreate(SQLiteDatabase sqLiteDatabase) + { + String sql; + + //Из-за проблем с многопотчностью создаю таблицу а то андроит сам её создаст в основном потоке + /*sql = "create table if not exists android_metadata(locale TEXT DEFAULT 'en_US')"; + sqLiteDatabase.execSQL(sql); + sql = "INSERT INTO android_metadata VALUES ('en_US');"; + sqLiteDatabase.execSQL(sql);*/ + + //Таблица пользователей + sql = "create table if not exists _user(" + + "id integer NOT NULL PRIMARY KEY," + + "uid text, del boolean NOT NULL DEFAULT 0," + + "seq integer NOT NULL DEFAULT 1," + + "name text," + + "surname text," + + "patronymic text," + + "login text," + + "password text);"; + sqLiteDatabase.execSQL(sql); + + //Список языков (для переводя) + sql = "create table if not exists _languages(" + + "id integer," + + "uid text, " + //Уникальный идентификатор + "del boolean NOT NULL DEFAULT 0," + + "seq integer NOT NULL DEFAULT 1," + //Время изменения + "short_name text NOT NULL," + + "name text NOT NULL" + + ");"; + sqLiteDatabase.execSQL(sql); + + // Таблица переводов для базы данных (пока все языки загружаются) + sql = "create table if not exists _translations(" + + "id integer," + + "uid text, " + //Уникальный идентификатор + "del boolean NOT NULL DEFAULT 0," + + "seq integer NOT NULL DEFAULT 1," + //Время изменения + "language_id integer NOT NULL," + + "identifier text NOT NULL," + + "translation text NOT NULL" + + ");"; + sqLiteDatabase.execSQL(sql); + + // Для идентификации терминала как зарегистрированного (должна быть 1 запись) + sql = "create table if not exists terminals(" + + "id integer NOT NULL PRIMARY KEY," + + "uid text, " + //Уникальный идентификатор + "del boolean NOT NULL DEFAULT 0," + + "seq integer NOT NULL DEFAULT 1," + //Время изменения + "country_id integer," + + "company_id integer," + + "company_name text," + //Временноеполе до обновления таблицы компаний + "name text," + + "serial text," + + "phone text" + + ");"; + sqLiteDatabase.execSQL(sql); + + //Список компаний + sql = "create table if not exists companies(" + + "id integer NOT NULL PRIMARY KEY," + + "uid text, " + //Уникальный идентификатор + "del boolean NOT NULL DEFAULT 0," + + "seq integer NOT NULL DEFAULT 1," + //Время изменения + "name text NOT NULL" + + ");"; + sqLiteDatabase.execSQL(sql); + + //Список стран + sql = "create table if not exists Countries(" + + "id integer NOT NULL PRIMARY KEY," + + "uid text, " + //Уникальный идентификатор + "del boolean NOT NULL DEFAULT 0," + + "seq integer NOT NULL DEFAULT 1," + //Время изменения + "name text NOT NULL" + + ");"; + sqLiteDatabase.execSQL(sql); + + //Список регионов для стран + sql = "create table if not exists CountriesRegions(" + + "id integer NOT NULL PRIMARY KEY," + + "uid text, " + //Уникальный идентификатор + "del boolean NOT NULL DEFAULT 0," + + "seq integer NOT NULL DEFAULT 1," + //Время изменения + "country_id int NOT NULL," + + "name text NOT NULL," + + "lon_max double, " + //Для поиска региона и страны по GPS координатам + "lon_min double, " + + "lat_max double, " + + "lat_min double, " + + "area double " + + ");"; + sqLiteDatabase.execSQL(sql); + + //Коордионаты границы для региона + /*sql = "create table if not exists CountriesRegionsPoints(" + + "id integer NOT NULL PRIMARY KEY AUTOINCREMENT," + + "uid text, " + //Уникальный идентификатор + "del boolean NOT NULL DEFAULT 0," + + "seq integer NOT NULL DEFAULT 1," + //Время изменения + "country_region_id int NOT NULL," + + "pos integer NOT NULL," + + "lon double NOT NULL, " + + "lat double NOT NULL " + + ");"; + sqLiteDatabase.execSQL(sql);*/ + + //Виды саранчи + sql = "create table if not exists LocustsTypes(" + + "id integer NOT NULL PRIMARY KEY," + + "uid text, " + //Уникальный идентификатор + "del boolean NOT NULL DEFAULT 0," + + "seq integer NOT NULL DEFAULT 1," + //Время изменения + "name text NOT NULL," + + "sort integer" + //Порядок сортировки (специально для справичников) + ");"; + sqLiteDatabase.execSQL(sql); + + //Справочник отрождения "Начало", "Массовое". + sql = "create table if not exists Borns(" + + "id integer NOT NULL PRIMARY KEY," + + "uid text, " + //Уникальный идентификатор + "del boolean NOT NULL DEFAULT 0," + + "seq integer NOT NULL DEFAULT 1," + //Время изменения + "name text NOT NULL," + + "sort integer" + //Порядок сортировки (специально для справичников) + ");"; + sqLiteDatabase.execSQL(sql); + + //Справочник окрыление. + sql = "create table if not exists Fledgling(" + + "id integer NOT NULL PRIMARY KEY," + + "uid text, " + //Уникальный идентификатор + "del boolean NOT NULL DEFAULT 0," + + "seq integer NOT NULL DEFAULT 1," + //Время изменения + "name text NOT NULL," + + "sort integer" + //Порядок сортировки (специально для справичников) + ");"; + sqLiteDatabase.execSQL(sql); + + //Справочник плотности «низкая», «средняя» и «высокая». + sql = "create table if not exists list_density(" + + "id integer NOT NULL PRIMARY KEY," + + "uid text, " + //Уникальный идентификатор + "del boolean NOT NULL DEFAULT 0," + + "seq integer NOT NULL DEFAULT 1," + //Время изменения + "name text NOT NULL," + + "percent integer" + + ");"; + sqLiteDatabase.execSQL(sql); + + //Фаза саранчи «одиночная», «переходная» и «стадная». + sql = "create table if not exists list_phase(" + + "id integer NOT NULL PRIMARY KEY," + + "uid text, " + //Уникальный идентификатор + "del boolean NOT NULL DEFAULT 0," + + "seq integer NOT NULL DEFAULT 1," + //Время изменения + "name text NOT NULL," + + "sort integer" + //Порядок сортировки (специально для справичников) + ");"; + sqLiteDatabase.execSQL(sql); + + //Опрыскиватели: "Трактор", "Самолёт" итд. + sql = "create table if not exists Sprayers(" + + "id integer NOT NULL PRIMARY KEY," + + "uid text, " + //Уникальный идентификатор + "del boolean NOT NULL DEFAULT 0," + + "seq integer NOT NULL DEFAULT 1," + //Время изменения + "sprayer_type_id integer," + + "name text NOT NULL," + + "sort integer" + //Порядок сортировки (специально для справичников) + ");"; + sqLiteDatabase.execSQL(sql); + + //Виды опрыскивания: "Авиа", "Наземное", "Ручное". + sql = "create table if not exists sprayers_types(" + + "id integer NOT NULL PRIMARY KEY," + + "uid text, " + //Уникальный идентификатор + "del boolean NOT NULL DEFAULT 0," + + "seq integer NOT NULL DEFAULT 1," + //Время изменения + "name text NOT NULL," + + "sort integer" + //Порядок сортировки (специально для справичников) + ");"; + sqLiteDatabase.execSQL(sql); + + //Метод подсчёта смертности: «визуальный» или «учетная рамка». + sql = "create table if not exists list_mortality(" + + "id integer NOT NULL PRIMARY KEY," + + "uid text, " + //Уникальный идентификатор (пока не используется) + "del boolean NOT NULL DEFAULT 0," + + "seq integer NOT NULL DEFAULT 1," + //Время изменения + "name text NOT NULL," + + "sort integer" + //Порядок сортировки (специально для справичников) + ");"; + sqLiteDatabase.execSQL(sql); + + //Направления + sql = "create table if not exists list_directions(" + + "id integer NOT NULL PRIMARY KEY," + + "uid text, " + //Уникальный идентификатор (пока не используется) + "del boolean NOT NULL DEFAULT 0," + + "seq integer NOT NULL DEFAULT 1," + //Время изменения + "name text NOT NULL," + + "degree integer" + + ");"; + sqLiteDatabase.execSQL(sql); + + //Справочник повреждения растительного покрова + sql = "create table if not exists list_damage(" + + "id integer NOT NULL PRIMARY KEY," + + "uid text, " + //Уникальный идентификатор (пока не используется) + "del boolean NOT NULL DEFAULT 0," + + "seq integer NOT NULL DEFAULT 1," + //Время изменения + "name text NOT NULL," + + "damage integer NOT NULL," + + "sort integer" + //Порядок сортировки (специально для справичников) + ");"; + sqLiteDatabase.execSQL(sql); + + //Справочник зелени «Сухая,Зеленая,Всходы,Засыхающая». + sql = "create table if not exists list_greenery(" + + "id integer NOT NULL PRIMARY KEY," + + "uid text, " + //Уникальный идентификатор (пока не используется) + "del boolean NOT NULL DEFAULT 0," + + "seq integer NOT NULL DEFAULT 1," + //Время изменения + "name text NOT NULL," + + "sort integer" + //Порядок сортировки (специально для справичников) + ");"; + sqLiteDatabase.execSQL(sql); + + sql = "create table if not exists list_biotope(" + + "id integer NOT NULL PRIMARY KEY," + + "uid text, " + //Уникальный идентификатор (пока не используется) + "del boolean NOT NULL DEFAULT 0," + + "seq integer NOT NULL DEFAULT 1," + //Время изменения + "name text NOT NULL," + + "sort integer" + //Порядок сортировки (специально для справичников) + ");"; + sqLiteDatabase.execSQL(sql); + + sql = "create table if not exists list_cover(" + + "id integer NOT NULL PRIMARY KEY," + + "uid text, " + //Уникальный идентификатор (пока не используется) + "del boolean NOT NULL DEFAULT 0," + + "seq integer NOT NULL DEFAULT 1," + //Время изменения + "name text NOT NULL," + + "sort integer" + //Порядок сортировки (специально для справичников) + ");"; + sqLiteDatabase.execSQL(sql); + + sql = "create table if not exists list_age(" + + "id integer NOT NULL PRIMARY KEY," + + "uid text, " + //Уникальный идентификатор (пока не используется) + "del boolean NOT NULL DEFAULT 0," + + "seq integer NOT NULL DEFAULT 1," + //Время изменения + "name text NOT NULL," + + "sort integer" + //Порядок сортировки (специально для справичников) + ");"; + sqLiteDatabase.execSQL(sql); + + sql = "create table if not exists list_actions(" + + "id integer NOT NULL PRIMARY KEY," + + "uid text, " + //Уникальный идентификатор (пока не используется) + "del boolean NOT NULL DEFAULT 0," + + "seq integer NOT NULL DEFAULT 1," + //Время изменения + "name text NOT NULL," + + "sort integer" + //Порядок сортировки (специально для справичников) + ");"; + sqLiteDatabase.execSQL(sql); + + sql = "create table if not exists list_paintings(" + + "id integer NOT NULL PRIMARY KEY," + + "uid text, " + //Уникальный идентификатор (пока не используется) + "del boolean NOT NULL DEFAULT 0," + + "seq integer NOT NULL DEFAULT 1," + //Время изменения + "name text NOT NULL," + + "sort integer" + //Порядок сортировки (специально для справичников) + ");"; + sqLiteDatabase.execSQL(sql); + + sql = "create table if not exists list_behaviors(" + + "id integer NOT NULL PRIMARY KEY," + + "uid text, " + //Уникальный идентификатор (пока не используется) + "del boolean NOT NULL DEFAULT 0," + + "seq integer NOT NULL DEFAULT 1," + //Время изменения + "name text NOT NULL," + + "sort integer" + //Порядок сортировки (специально для справичников) + ");"; + sqLiteDatabase.execSQL(sql); + + //Похожая таблица на "list_behaviors" и содержимое + sql = "create table if not exists list_breeding(" + + "id integer NOT NULL PRIMARY KEY," + + "uid text, " + //Уникальный идентификатор (пока не используется) + "del boolean NOT NULL DEFAULT 0," + + "seq integer NOT NULL DEFAULT 1," + //Время изменения + "name text NOT NULL," + + "sort integer" + //Порядок сортировки (специально для справичников) + ");"; + sqLiteDatabase.execSQL(sql); + + sql = "create table if not exists list_capacities(" + + "id integer NOT NULL PRIMARY KEY," + + "uid text, " + //Уникальный идентификатор (пока не используется) + "del boolean NOT NULL DEFAULT 0," + + "seq integer NOT NULL DEFAULT 1," + //Время изменения + "name text NOT NULL," + + "sort integer" + //Порядок сортировки (специально для справичников) + ");"; + sqLiteDatabase.execSQL(sql); + + sql = "create table if not exists list_markings(" + + "id integer NOT NULL PRIMARY KEY," + + "uid text, " + //Уникальный идентификатор (пока не используется) + "del boolean NOT NULL DEFAULT 0," + + "seq integer NOT NULL DEFAULT 1," + //Время изменения + "name text NOT NULL," + + "sort integer" + //Порядок сортировки (специально для справичников) + ");"; + sqLiteDatabase.execSQL(sql); + + sql = "create table if not exists list_containers(" + + "id integer NOT NULL PRIMARY KEY," + + "uid text, " + //Уникальный идентификатор (пока не используется) + "del boolean NOT NULL DEFAULT 0," + + "seq integer NOT NULL DEFAULT 1," + //Время изменения + "name text NOT NULL," + + "sort integer" + //Порядок сортировки (специально для справичников) + ");"; + sqLiteDatabase.execSQL(sql); + + sql = "create table if not exists list_vegetation(" + + "id integer NOT NULL PRIMARY KEY," + + "uid text, " + //Уникальный идентификатор (пока не используется) + "del boolean NOT NULL DEFAULT 0," + + "seq integer NOT NULL DEFAULT 1," + //Время изменения + "name text NOT NULL," + + "sort integer" + //Порядок сортировки (специально для справичников) + ");"; + sqLiteDatabase.execSQL(sql); + + sql = "create table if not exists list_formulation(" + + "id integer NOT NULL PRIMARY KEY," + + "uid text, " + //Уникальный идентификатор (пока не используется) + "del boolean NOT NULL DEFAULT 0," + + "seq integer NOT NULL DEFAULT 1," + //Время изменения + "name text NOT NULL," + + "sort integer" + //Порядок сортировки (специально для справичников) + ");"; + sqLiteDatabase.execSQL(sql); + + sql = "create table if not exists list_height(" + + "id integer NOT NULL PRIMARY KEY," + + "uid text, " + //Уникальный идентификатор (пока не используется) + "del boolean NOT NULL DEFAULT 0," + + "seq integer NOT NULL DEFAULT 1," + //Время изменения + "name text NOT NULL," + + "sort integer" + //Порядок сортировки (специально для справичников) + ");"; + sqLiteDatabase.execSQL(sql); + + sql = "create table if not exists list_enemies(" + + "id integer NOT NULL PRIMARY KEY," + + "uid text, " + //Уникальный идентификатор (пока не используется) + "del boolean NOT NULL DEFAULT 0," + + "seq integer NOT NULL DEFAULT 1," + //Время изменения + "name text NOT NULL," + + "sort integer" + //Порядок сортировки (специально для справичников) + ");"; + sqLiteDatabase.execSQL(sql); + + //Форма саранчи id может быть пустым (только если создали на КПК) + sql = "create table if not exists frmlocust(" + + "id integer," + + "uid text NOT NULL, " + //Уникальный идентификатор + "del boolean NOT NULL DEFAULT 0," + + "seq integer NOT NULL DEFAULT 1," + //Время изменения + "send boolean NOT NULL DEFAULT 0," + //Отправлена ли запись на сервер (При изменении отмечается как не отправленное false) + "filled boolean NOT NULL DEFAULT 0," + //Заполнена ли анкета (спец поле а не проверка на NULL потому что обязательность полей можно выставлять галочкой в интерфейсе) + "device_id text, " + //Идентификатор устройства + + "user_id integer," + + "image_name1 text, " + //Наименование рисунка 1 + "image_send1 boolean NOT NULL DEFAULT 0," + //Отправили ли рисунок 1 на сервер (При изменении отмечается как не отправленное false) + "image_name2 text, " + //Наименование рисунка 2 + "image_send2 boolean NOT NULL DEFAULT 0," + //Отправили ли рисунок 1 на сервер (При изменении отмечается как не отправленное false) + "image_name3 text, " + //Наименование рисунка 3 + "image_send3 boolean NOT NULL DEFAULT 0," + //Отправили ли рисунок 1 на сервер (При изменении отмечается как не отправленное false) + "country_id integer, " + //Страна + "region_id integer, " + //Регион + "area text, " + //Район + "district text, " + //Сельский округ и/или хозяйство + + "village text, " + //Посёлок + "terrain text, " + //Название местности либо урочища + + "observer text, " + //ФИО наблюдателя + "date integer, " + //Время создания секунд с 1970 года (long) (по гринвичу?) + "timezone text, " + //Временная зона + "lat_center double, " + + "lon_center double, " + + "lat1 double, " + + "lon1 double, " + + "lat2 double, " + + "lon2 double, " + + "lat3 double, " + + "lon3 double, " + + "lat4 double, " + + "lon4 double, " + + "lat5 double, " + + "lon5 double, " + + "lat6 double, " + + "lon6 double, " + + "bio_hectare double, " + //"bio_hectare integer, " ++++++++ + "bio_biotope_id integer," + //тип биотопаCIT (степь, залежь, посевы) тип биотопаDMA (равнины, холмы, посевы) тип биотопаLMI (низкие сухие тростники, высокие влажные тростники, другое) + "bio_greenery_id integer,"+ //растительность: сухая, всходы, зеленая, засыхающая + "bio_greenery_cover_id integer,"+ //растительный покров(Редкий, Ср., Густой) + "bio_temperature float,"+ //погода: температура воздуха(ºC) + "bio_wind float,"+ //погода: ветер(м/с) + + "locust_have integer," + //Присутствует саранча или нет + "locust_type_id integer," + //Тип саранчи + "locust_populated double," + //Заселённая площадь(га) + + "eggs boolean NOT NULL DEFAULT 0," + //For CheckBox + "eggs_capsules_area float," + //залежь кубышек(площадь в м2) + "eggs_capsules_density float," + //кубышки(плотность на м2) + "eggs_capsules_density_to float," + //кубышки(плотность на м2) + "eggs_capsules float," + //яйца(в среднем в кубышке) + "eggs_live float," + //яйца(% жизнеспособных) + "eggs_enemies_id integer," + //наличие естественных врагов(каких?) + + "hoppers boolean NOT NULL DEFAULT 0," + //For CheckBox + "larva_born_id integer," + //отрождение, таблица "borns" начало массовое + "larva_age_id integer," + //возраста: Младшие Средние Старшие + "larva_painting_id integer," + //окраска(одиночнаяS, перехoдная Т, стаднаяG) + "larva_behavior_id integer," + //поведение(Изолир., Разреженные, Группы) + "larva_density float," + //плотность на м2 от + "larva_density_to float," + //плотность на м2 до + + "bands boolean NOT NULL DEFAULT 0," + //For CheckBox + "kuliguli_density float," + //плотн. в кулиге(на м2) + "kuliguli_density_to float," + //плотн. в кулиге(на м2) до + "kuliguli_size double," + //размер кулиг(м2) + "kuliguli_count float," + //число кулиг + "kuliguli_action_id integer," + //поведение: миграция, кормёжка, отдых + "kuliguli_age_id integer," + //возраста: Младшие Средние Старшие + + "adults boolean NOT NULL DEFAULT 0," + //For CheckBox + "imago_wing_id integer," + //окрыление(%, начало, массовое) + "imago_maturity integer," + //половозрелость(- или+) + "imago_phase_id integer," + //фаза(одиночнаяS, перехoдная Т, стаднаяG) + "imago_action_id integer," + //поведение(�?золир., Разреженные, Группы) + "imago_density float," + //плотность(на трансекту или га) + //"imago_density_type boolean," + //плотность имаго 1 - на метр в квадрате, 2 - на гектар + "imago_density_ga float," + //плотность(на трансекту или га) + "imago_feeding integer," + //Питание и размещение на растениях (да, нет) + "imago_copulation integer," + //спаривание (да, нет) + "imago_laying integer," + //яйцекладка (да, нет) + "imago_flying integer," + //полёты(- или+) + + "swarms boolean NOT NULL DEFAULT 0," + //For CheckBox + "swarm_maturity integer," + //половозрелость(- или+) + "swarm_density_id integer," + //плотность(на м2) + "swarm_size float," + //размер стаи(на км2) + "swarm_count float," + //число стай + "swarm_copulation integer," + //Спаривание (да, нет) + "swarm_laying integer," + //Яйцекладка (да, нет) + "swarm_flying_direction_id integer," + //направление полёта (TODO время пролёта добавить) + "swarm_height_id integer," + //высота(Низкая- Средняя- Высокая) + "description text," + //КОММЕНТАРИИ + "test boolean" + + ");"; + sqLiteDatabase.execSQL(sql); + + //Для формы уничтожения саранчи id может быть пустым (только если создали на КПК) + sql = "create table if not exists frmlocustdel(" + + "id integer," + + "uid text NOT NULL, " + //Уникальный идентификатор + "del boolean NOT NULL DEFAULT 0," + + "seq integer NOT NULL DEFAULT 1," + + "send boolean NOT NULL DEFAULT 0," + + "filled boolean," + //Заполнена ли анкета (спец поле а не проверка на NULL потому что обязательность полей можно выставлять галочкой в интерфейсе) + "device_id text, " + //Идентификатор устройства + + "user_id integer," + //Идентификатор пользователя + "image_name1 text," + //Наименование рисунка 1 + "image_send1 boolean NOT NULL DEFAULT 0," + //Отправили ли рисунок 1 на сервер (При изменении отмечается как не отправленное false) + "image_name2 text," + //Наименование рисунка 2 + "image_send2 boolean NOT NULL DEFAULT 0," + //Отправили ли рисунок 1 на сервер (При изменении отмечается как не отправленное false) + "image_name3 text," + //Наименование рисунка 3 + "image_send3 boolean NOT NULL DEFAULT 0," + //Отправили ли рисунок 1 на сервер (При изменении отмечается как не отправленное false) + "country_id integer," + //Страна + "region_id integer," + //Область + "area text," + //Район + "district text, " + //Сельский округ и/или хозяйство + + "village text, " + //Посёлок + "terrain text, " + //Название местности либо урочища + + "observer text, " + //ФИО наблюдателя + "date integer," + //Время создания секунд с 1970 года (long), теоретически должна быть уникальной для пользователя (по гринвичу?) + "timezone text, " + //Временная зона + "lat_center double, " + + "lon_center double, " + + "lat1 double, " + + "lon1 double, " + + "lat2 double, " + + "lon2 double, " + + "lat3 double, " + + "lon3 double, " + + "lat4 double, " + + "lon4 double, " + + "lat5 double, " + + "lon5 double, " + + "lat6 double, " + + "lon6 double, " + + "infested_area double," + //заселенная площадь(га) + "treated_area double," + //обработанная площадь(га) + "vegetation_type_id integer," + //Тип(1 - дикая, 2 - культурная) + "vegetation_height float," + //Высота (м) + "vegetation_crop text," + //Текстовое поле для перечисления произрастающих культур + "vegetation_cover_id integer," + //Густота Растительный покров (%) + "vegetation_damage integer," + //Повреждения растительного покрова выпадающий список (слабая,средняя,сильная,сплошная) + "vegetation_damage_area double," + //Площадь повреждений (га) + "insecticide_name text," + //коммерческое название + "insecticide_active_substance text," + //Наименование активного вещества + //"insecticide_concentration double," + //концентрация(г д.в./л или%) + "insecticide_concentration text," + //концентрация(г д.в./л или%) + "insecticide_formulation_id integer," + //формуляция(1 - УМО, 2 - КЭ, 3 - др.) + "insecticide_dose float," + //норма расхода(л/га) + "insecticide_rate float," + //расход рабочей жидкости(л/га) + "insecticide_used_volume float," + //Общий объем использованной рабочей жидкости (л) + "insecticide_number_spores float," + //Концентрация спор (/мл) + "insecticide_expiry_date integer," + //окончание срока действия (в нов. версии не используется) + "insecticide_mixed text," + //смешивается ли инсектицид с водой или растворителем? (в нов. версии не используется) + "insecticide_mixed_name text," + //если да, то с чем (в нов. версии не используется) + "insecticide_mixed_ratio float," + //если да, то в каком соотношении (%) (в нов. версии не используется) + + "weather_time_start float," + //время начала + "weather_time_end float," + //время окончания + "weather_temperature_start float," + //Температура нач.(°C) + "weather_temperature_end float," + //Температура кон.(°C) + "weather_humidity_start float," + //отн. влажность воздуха нач.(%) + "weather_humidity_end float," + //отн. влажность воздуха кон.(%) + "weather_wind_speed_start float," + //скорость ветра нач. (м/с) + "weather_wind_speed_end float," + //скорость ветра кон. (м/с) + "weather_direction_start integer," + //направление ветра нач. + "weather_direction_end integer," + //направление ветра кон. + "weather_spray_direction_start integer," + //направление опрыскивания нач. + "weather_spray_direction_end integer," + //направление опрыскивания кон. + //"locust_speciese text," + //вид: CIT, DMA, LMI, др. (Не используется теперь поле ниже используется) + "locust_type_id integer," + //вид: CIT, DMA, LMI, др. + //"locust_hoppers text," + //Стадии личинок, возраста: Младшие Средние Старшие + "locust_hoppers_id integer," + //возраста: Младшие Средние Старшие + "locust_imago boolean," + //Имаго (да, нет) + "locust_density float," + //плотность на м2 + //"locust_type text," + //Кулиги, Стаи или Разреженные + "locust_kuliguli boolean," + //Кулиги (да, нет) + "locust_swarm boolean," + //Стаи (да, нет) + "locust_sparse boolean," + //Разреженные (да, нет) + "locust_phase_id integer," + //Фаза саранчи (одиночная, переходная, стадная) + "spray_platform integer," + //Вид опрыскивания + "spray_platform_a integer," + //1) «Авиа» - выпадающий список:«Самолет», «Вертолет», «Дельтаплан». + "spray_platform_g integer," + //2) «Наземное» - выпадающий список:«Трактор», «Машина», «Аэроз.генераторG». + "spray_platform_h integer," + //3) «Ручное» - выпадающий список:«Ранцевый», «Моторный», «Батарейный». + + "spray_capacity_id integer," + //Поле “Вид опрыскивания” (Объём) «Полнообъемное», «Малообъемное», «Ультрамалообъемное». + + //"spray_operator text," + //Оператор (пилот, водитель, др...) + "spray_operatortype_id integer," + //Оператор (пилот, водитель, др...) + //"spray_operator_name text," + //�?мя оператора + "spray_manufacturer_name text," + //Марка опрыскивателя + "spray_model_name text," + //Модель опрыскивателя + //"spray_date_calibration integer," + //Дата последней калибровки + "spray_height float," + //Высота над поверхностью почвы (м) + "spray_width float," + //Ширина захвата (м) + //"spray_spacing float," + //Расстояние между проходами опрыскивателя (м) + "spray_barrier boolean," + //Барьеры (да, нет) + "spray_barrier_width float," + //Ширина (м) + "spray_barrier_space float," + //промежуток (м) + "spray_speed float," + //Скорость движения (км/ч) + "spray_gps boolean," + //Антена: DGPS использовалась + "spray_marking_id boolean," + //Наземная маркировка(Сиг-нальщики, GPS, Машина, Нет) + + "efficiency boolean NOT NULL DEFAULT 0," + //For CheckBox + "efficacy_mortality float," + //смертность саранчи(%) + "efficacy_passed_time float," + //Прошло времени после обработки + "efficacy_mortality_method integer," + //метод подсчета смертности + "safety_clothing text," + //Какой защитной одеждой пользовался оператор + "safety_clothing_clean boolean," + + "safety_operator_health boolean," + + "description text," + //Описание + "safety_inform text," + //Кто был оповещен об обработках? + //"safety_container_id integer," + //Что сделали с контейнером (больше не используется) + "safety_container text," + //Что сделали с контейнером + "safety_non_target boolean," + //воздействие на нецелевые организмы + "safety_non_target_effect text," + //если да, то какое + "safety_incident boolean," + //Другие инциденты по здоровью или окружающей среде, возникшие возможно при обработке + "safety_incident_effect text," + //Если Да, тип инцидента и кем сообщен (описание) + "comments text," + //КОММЕНТАР�?�? + "test boolean" + + ");"; + sqLiteDatabase.execSQL(sql); + + sql = "create table if not exists frmlocust_locations(" + + "id integer NOT NULL PRIMARY KEY," + + "uid text, " + //Уникальный идентификатор (пока не используется) + "del boolean NOT NULL DEFAULT 0," + + "seq integer NOT NULL DEFAULT 1," + //Время изменения + "frmlocust_uid text," + + "pos integer NOT NULL," + //Позиция + "lon double NOT NULL," + + "lat double NOT NULL" + + ");"; + sqLiteDatabase.execSQL(sql); + + sql = "create table if not exists frmlocustdel_locations(" + + "id integer NOT NULL PRIMARY KEY," + + "uid text, " + //Уникальный идентификатор (пока не используется) + "del boolean NOT NULL DEFAULT 0," + + "seq integer NOT NULL DEFAULT 1," + //Время изменения + "frmlocustdel_uid text," + + "pos integer NOT NULL," + //Позиция + "lon double NOT NULL," + + "lat double NOT NULL" + + ");"; + sqLiteDatabase.execSQL(sql); + + Log.i("igor", "Создали базы"); + } + + /** Обновление базы если версия не соответствует + */ + @Override + public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) + { + //В SQLIte можно только добавить столбец либо переименовать таблицу https://sqlite.org/lang_altertable.html поэтому обновление усложняется.... + String sql; + + if(oldVersion==144) + { + sql = "create table if not exists frmlocustdel_new(" + + "id integer,uid text NOT NULL,del boolean NOT NULL DEFAULT 0,seq integer NOT NULL DEFAULT 1,send boolean NOT NULL DEFAULT 0,filled boolean,device_id text,user_id integer," + + "image_name1 text," + + "image_send1 boolean NOT NULL DEFAULT 0," + + "image_name2 text," + + "image_send2 boolean NOT NULL DEFAULT 0," + + "image_name3 text," + + "image_send3 boolean NOT NULL DEFAULT 0," + + "country_id integer," + + "region_id integer," + + "area text," + + "district text, " + + "village text, " + + "terrain text, " + + "observer text, " + + "date integer," + + "lat_center double, " + + "lon_center double, " + + "lat1 double, " + + "lon1 double, " + + "lat2 double, " + + "lon2 double, " + + "lat3 double, " + + "lon3 double, " + + "lat4 double, " + + "lon4 double, " + + "lat5 double, " + + "lon5 double, " + + "lat6 double, " + + "lon6 double, " + + "infested_area double," + + "treated_area double," + + "vegetation_type_id integer," + + "vegetation_height float," + + "vegetation_crop text," + + "vegetation_cover_id integer," + + "vegetation_damage integer," + + "vegetation_damage_area double," + + "insecticide_name text," + + "insecticide_active_substance text," + + "insecticide_concentration text," + + "insecticide_formulation_id integer," + + "insecticide_dose float," + + "insecticide_rate float," + + "insecticide_used_volume float," + + "insecticide_number_spores float," + + "insecticide_expiry_date integer," + + "insecticide_mixed text," + + "insecticide_mixed_name text," + + "insecticide_mixed_ratio float," + + "weather_time_start float," + + "weather_time_end float," + + "weather_temperature_start float," + + "weather_temperature_end float," + + "weather_humidity_start float," + + "weather_humidity_end float," + + "weather_wind_speed_start float," + + "weather_wind_speed_end float," + + "weather_direction_start integer," + + "weather_direction_end integer," + + "weather_spray_direction_start integer," + + "weather_spray_direction_end integer," + + "locust_type_id integer," + + "locust_hoppers_id integer," + + "locust_imago boolean," + + "locust_density float," + + "locust_kuliguli boolean," + + "locust_swarm boolean," + + "locust_sparse boolean," + + "locust_phase_id integer," + + "spray_platform integer," + + "spray_platform_a integer," + + "spray_platform_g integer," + + "spray_platform_h integer," + + "spray_capacity_id integer," + + "spray_operatortype_id integer," + + "spray_manufacturer_name text," + + "spray_model_name text," + + "spray_height float," + + "spray_width float," + + "spray_barrier boolean," + + "spray_barrier_width float," + + "spray_barrier_space float," + + "spray_speed float," + + "spray_gps boolean," + + "spray_marking_id boolean," + + "efficacy_mortality float," + + "efficacy_passed_time float," + + "efficacy_mortality_method integer," + + "safety_clothing text," + + "safety_clothing_clean boolean," + + "safety_operator_health boolean," + + "description text," + + "safety_inform text," + + "safety_container_id integer," + + "safety_non_target boolean," + + "safety_non_target_effect text," + + "safety_incident boolean," + + "safety_incident_effect text," + + "comments text" + + ");"; + db.execSQL(sql); + //Копирую данные из одной таблицы в другую + db.execSQL("INSERT INTO frmlocustdel_new SELECT * FROM frmlocustdel;"); + db.execSQL("DROP TABLE IF EXISTS frmlocustdel;"); + db.execSQL("ALTER TABLE frmlocustdel_new RENAME TO frmlocustdel;"); + + //We converted the version of the database to version 145. + oldVersion=145; + } + if(oldVersion==145) + { + //Добвилось поле safety_container для frmlocustdel + sql = "ALTER TABLE frmlocustdel ADD safety_container text;"; + db.execSQL(sql); + sql = "UPDATE frmlocustdel set safety_container=safety_container_id;"; + db.execSQL(sql); + + //Добавляю временную зону timezone к 2м формам саранчи и проти саранчи + sql = "ALTER TABLE frmlocust ADD timezone text;"; + db.execSQL(sql); + sql = "ALTER TABLE frmlocustdel ADD timezone text;"; + db.execSQL(sql); + + //We converted the version of the database to version 145. + oldVersion=146; + } + if(oldVersion==146) //Новый контракт на 2020 год + { + sql = "ALTER TABLE CountriesRegions ADD lon_max double;"; + db.execSQL(sql); + sql = "ALTER TABLE CountriesRegions ADD lon_min double;"; + db.execSQL(sql); + sql = "ALTER TABLE CountriesRegions ADD lat_max double;"; + db.execSQL(sql); + sql = "ALTER TABLE CountriesRegions ADD lat_min double;"; + db.execSQL(sql); + sql = "ALTER TABLE CountriesRegions ADD area double;"; + db.execSQL(sql); + //Чтобы заново закачался + sql = "update CountriesRegions set seq=1;"; + db.execSQL(sql); + //Коордионаты границы для региона + //sql = "create table if not exists CountriesRegionsPoints(" + + // "id integer NOT NULL PRIMARY KEY AUTOINCREMENT," + + // "uid text, " + //Уникальный идентификатор + // "del boolean NOT NULL DEFAULT 0," + + // "seq integer NOT NULL DEFAULT 1," + //Время изменения + // "country_region_id int NOT NULL," + + // "pos integer NOT NULL," + + // "lon double, " + + // "lat double " + + // ");"; + //db.execSQL(sql); + + oldVersion=147; + } + if(oldVersion==147){ + sql = "ALTER TABLE frmlocustdel ADD efficiency boolean NOT NULL DEFAULT 0;"; + db.execSQL(sql); + + oldVersion=148; + } + if(oldVersion==148) { + // Для идентификации терминала как зарегистрированного (должна быть 1 запись) + sql = "create table if not exists terminals(" + + "id integer NOT NULL PRIMARY KEY," + + "uid text, " + //Уникальный идентификатор + "del boolean NOT NULL DEFAULT 0," + + "seq integer NOT NULL DEFAULT 1," + //Время изменения + "country_id integer," + + "company_id integer," + + "company_name text," + //Временноеполе до обновления таблицы компаний + "name text," + + "serial text," + + "phone text" + + ");"; + db.execSQL(sql); + + //Список компаний + sql = "create table if not exists companies(" + + "id integer NOT NULL PRIMARY KEY," + + "uid text, " + //Уникальный идентификатор + "del boolean NOT NULL DEFAULT 0," + + "seq integer NOT NULL DEFAULT 1," + //Время изменения + "name text NOT NULL" + + ");"; + db.execSQL(sql); + + oldVersion=149; + } + if(oldVersion==149) { + //Добвилось поле тестовая ли анкета + sql = "ALTER TABLE frmlocustdel ADD test boolean;"; + db.execSQL(sql); + sql = "UPDATE frmlocustdel set test=0;"; + db.execSQL(sql); + + //Добвилось поле тестовая ли анкета + sql = "ALTER TABLE frmlocust ADD test boolean;"; + db.execSQL(sql); + sql = "UPDATE frmlocust set test=0;"; + db.execSQL(sql); + + oldVersion=150; + } + if(oldVersion==150) { + sql = "create table if not exists frmlocust_locations(" + + "id integer NOT NULL PRIMARY KEY," + + "uid text, " + //Уникальный идентификатор + "del boolean NOT NULL DEFAULT 0," + + "seq integer NOT NULL DEFAULT 1," + //Время изменения + "frmlocust_uid text," + + "pos integer NOT NULL," + //Позиция + "lon double NOT NULL," + + "lat double NOT NULL" + + ");"; + db.execSQL(sql); + sql = "update frmlocust set lon_center=lon1,lat_center=lat1"; + db.execSQL(sql); + //Если есть старые данные то копирую их в новую таблицу + sql = "insert into frmlocust_locations(frmlocust_uid,lon,lat,pos) select uid,lon1,lat1,1 from frmlocust where lon1 is not null"; + db.execSQL(sql); + sql = "insert into frmlocust_locations(frmlocust_uid,lon,lat,pos) select uid,lon2,lat2,2 from frmlocust where lon2 is not null"; + db.execSQL(sql); + sql = "insert into frmlocust_locations(frmlocust_uid,lon,lat,pos) select uid,lon3,lat3,3 from frmlocust where lon3 is not null"; + db.execSQL(sql); + sql = "insert into frmlocust_locations(frmlocust_uid,lon,lat,pos) select uid,lon4,lat4,4 from frmlocust where lon4 is not null"; + db.execSQL(sql); + sql = "insert into frmlocust_locations(frmlocust_uid,lon,lat,pos) select uid,lon5,lat5,5 from frmlocust where lon5 is not null"; + db.execSQL(sql); + sql = "insert into frmlocust_locations(frmlocust_uid,lon,lat,pos) select uid,lon6,lat6,6 from frmlocust where lon6 is not null"; + db.execSQL(sql); + + sql = "create table if not exists frmlocustdel_locations(" + + "id integer NOT NULL PRIMARY KEY," + + "uid text, " + //Уникальный идентификатор + "del boolean NOT NULL DEFAULT 0," + + "seq integer NOT NULL DEFAULT 1," + //Время изменения + "frmlocustdel_uid text," + + "pos integer NOT NULL," + //Позиция + "lon double NOT NULL," + + "lat double NOT NULL" + + ");"; + db.execSQL(sql); + //Если есть старые данные то копирую их в новую таблицу + sql = "insert into frmlocustdel_locations(frmlocustdel_uid,lon,lat,pos) select uid,lon1,lat1,1 from frmlocustdel where lon1 is not null"; + db.execSQL(sql); + sql = "insert into frmlocustdel_locations(frmlocustdel_uid,lon,lat,pos) select uid,lon2,lat2,2 from frmlocustdel where lon2 is not null"; + db.execSQL(sql); + sql = "insert into frmlocustdel_locations(frmlocustdel_uid,lon,lat,pos) select uid,lon3,lat3,3 from frmlocustdel where lon3 is not null"; + db.execSQL(sql); + sql = "insert into frmlocustdel_locations(frmlocustdel_uid,lon,lat,pos) select uid,lon4,lat4,4 from frmlocustdel where lon4 is not null"; + db.execSQL(sql); + sql = "insert into frmlocustdel_locations(frmlocustdel_uid,lon,lat,pos) select uid,lon5,lat5,5 from frmlocustdel where lon5 is not null"; + db.execSQL(sql); + sql = "insert into frmlocustdel_locations(frmlocustdel_uid,lon,lat,pos) select uid,lon6,lat6,6 from frmlocustdel where lon6 is not null"; + db.execSQL(sql); + + oldVersion=151; + } + + if(oldVersion < newVersion) //Это условие выполняется: если совсем старые версии и не знаю что поменялось... + { + //db.execSQL("DROP TABLE IF EXISTS android_metadata"); + + db.execSQL("DROP TABLE IF EXISTS frmlocust"); + db.execSQL("DROP TABLE IF EXISTS frmlocust_locations"); + db.execSQL("DROP TABLE IF EXISTS frmlocustdel"); + db.execSQL("DROP TABLE IF EXISTS frmlocustdel_locations"); + db.execSQL("DROP TABLE IF EXISTS CountriesRegions"); + db.execSQL("DROP TABLE IF EXISTS CountriesRegionsPoints"); + db.execSQL("DROP TABLE IF EXISTS Countries"); + db.execSQL("DROP TABLE IF EXISTS LocustsTypes"); //Табличка видов саранчи + db.execSQL("DROP TABLE IF EXISTS _languages"); + db.execSQL("DROP TABLE IF EXISTS _translations"); + db.execSQL("DROP TABLE IF EXISTS _user"); + db.execSQL("DROP TABLE IF EXISTS Borns"); //Справочник отрождение "Начало", "Массовое". + db.execSQL("DROP TABLE IF EXISTS list_density"); //Справочник плотност: «низкая», «средняя» и «высокая». + db.execSQL("DROP TABLE IF EXISTS list_phase"); + db.execSQL("DROP TABLE IF EXISTS list_mortality"); //Метод подсчёта смертности + db.execSQL("DROP TABLE IF EXISTS list_directions"); //Стороны света направления + db.execSQL("DROP TABLE IF EXISTS list_damage"); //Справочник повреждений растительного покрова + db.execSQL("DROP TABLE IF EXISTS list_greenery"); + db.execSQL("DROP TABLE IF EXISTS list_biotope"); + db.execSQL("DROP TABLE IF EXISTS list_cover"); + db.execSQL("DROP TABLE IF EXISTS list_age"); + db.execSQL("DROP TABLE IF EXISTS list_actions"); + db.execSQL("DROP TABLE IF EXISTS list_paintings"); + db.execSQL("DROP TABLE IF EXISTS list_behaviors"); // + db.execSQL("DROP TABLE IF EXISTS list_breeding"); //«Одиночные, разреженные, группы» + db.execSQL("DROP TABLE IF EXISTS list_capacities"); //«Полнообъемное», «Малообъемное», «Ультрамалообъемное». + db.execSQL("DROP TABLE IF EXISTS list_markings"); + db.execSQL("DROP TABLE IF EXISTS sprayers"); //Опрыскиватели: "Трактор", "Самолёт" итд. + db.execSQL("DROP TABLE IF EXISTS sprayers_types"); //Виды опрыскивания: "Авиа", "Наземное", "Ручное". + db.execSQL("DROP TABLE IF EXISTS Fledgling"); + + onCreate(db); + } + + } + + //Функция по изменению типа столбца + public boolean changeTableFieldType() + { + // + return true; + } + + + + /** Получить список столбцов*/ + public List GetColumns(String tableName) + { + SQLiteDatabase db = getReadableDatabase(); + + List ar = null; + Cursor c = null; + try { + c = db.rawQuery("select * from " + tableName + " limit 1", null); + if (c != null) { + ar = new ArrayList(Arrays.asList(c.getColumnNames())); + } + } catch (Exception e) { + Log.v(tableName, e.toString(), e); + e.printStackTrace(); + } finally + { + if (c != null) + c.close(); + } + return ar; + } + + /**Функция для обновления или вставки табличных данных*/ + public Boolean updateTable(TCTable tbl) + { + //Проверка на существование полей + Boolean[] fb=new Boolean[tbl.fields.size()]; //Для проверки существования полей в локальной таблице + for(int i=0;i col = GetColumns(tbl.name); + for(int i=0;i col = GetColumns(tbl.name); + if(col==null) return false; + for(int i=0;ilon_min and "+lon+"lat_min and "+lat+" CREATOR = new Parcelable.Creator() { + @Override + public LatLon createFromParcel(Parcel source) { + double lat = source.readDouble(); + double lon = source.readDouble(); + return new LatLon(lat, lon); + } + + @Override + public LatLon[] newArray(int size) { + return new LatLon[size]; + } + }; + + LatLon(double lat, double lon){ + this.lat=lat; + this.lon=lon; + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeDouble(lat); + dest.writeDouble(lon); + } +} diff --git a/app/src/main/java/kz/istt/locust/LatLonAdapter.java b/app/src/main/java/kz/istt/locust/LatLonAdapter.java new file mode 100644 index 0000000..7f2891b --- /dev/null +++ b/app/src/main/java/kz/istt/locust/LatLonAdapter.java @@ -0,0 +1,145 @@ +package kz.istt.locust; + +import android.content.Context; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; +import android.widget.Button; +import android.widget.ListView; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import java.text.DecimalFormat; +import java.text.DecimalFormatSymbols; +import java.util.ArrayList; +import java.util.Locale; + +import tools.LatLonListener; + +public class LatLonAdapter extends ArrayAdapter { + + private LayoutInflater inflater; + private int layout; + public ArrayList latlonList; + LatLonListener latlonListener=null; + ListView productList=null; + View.OnClickListener clc=null; + + LatLonAdapter(Context context, int resource, ArrayList latlon, LatLonListener latlonListener, ListView productList) { + super(context, resource, latlon); + this.latlonList = latlon; + this.layout = resource; + this.inflater = LayoutInflater.from(context); + this.latlonListener = latlonListener; + } + + @Override + public int getCount(){ + return latlonList.size(); + } + + /*public void addItem(LatLon item) { + this.latlonList.add(item); + this.notifyDataSetChanged(); + }*/ + + /*@Override + public void notifyDataSetChanged() { + //ViewGroup.LayoutParams par = productList.getLayoutParams(); + //RelativeLayout.LayoutParams mParam = new RelativeLayout.LayoutParams(par.width,par.height+100); + //productList.setLayoutParams(mParam); + }*/ + + public View getView(int position, View convertView, ViewGroup parent) { + + final ViewHolder viewHolder; + if(convertView==null){ + convertView = inflater.inflate(this.layout, parent, false); + viewHolder = new ViewHolder(convertView); + convertView.setTag(viewHolder); + } + else{ + viewHolder = (ViewHolder) convertView.getTag(); + } + final LatLon latlon = latlonList.get(position); + + DecimalFormatSymbols custom = new DecimalFormatSymbols(new Locale("en", "US")); + custom.setDecimalSeparator('.'); + DecimalFormat df = new DecimalFormat("0.0000000"); + df.setDecimalFormatSymbols(custom); + + if(viewHolder.edtLat!=null) { + if (latlon.lat == 0) viewHolder.edtLat.setText(""); + else viewHolder.edtLat.setText(df.format(latlon.lat)); + } + if(viewHolder.edtLon!=null) { + if (latlon.lon == 0) viewHolder.edtLon.setText(""); + else viewHolder.edtLon.setText(df.format(latlon.lon)); + } + if(viewHolder.btnDelGPS!=null) { + viewHolder.btnDelGPS.setOnClickListener(new OnClickListenerIDDEL(position, this)); + } + if(viewHolder.btnGetGPS!=null) { + viewHolder.btnGetGPS.setOnClickListener(new OnClickListenerIDADD(position, this)); + } + return convertView; + } + + private class ViewHolder { + final com.google.android.material.button.MaterialButton btnGetGPS, btnDelGPS; + final com.google.android.material.textfield.TextInputEditText edtLat, edtLon; + ViewHolder(View view){ + btnGetGPS = view.findViewById(R.id.btnGetGPS); + btnDelGPS = view.findViewById(R.id.btnDelGPS); + edtLat = view.findViewById(R.id.edtLat); + edtLon = view.findViewById(R.id.edtLon); + } + } + + //To add an element to a list + class OnClickListenerIDADD implements View.OnClickListener{ + int position; + LatLonAdapter adapter; + OnClickListenerIDADD(int position,LatLonAdapter adapter){ + this.position=position; + this.adapter=adapter; + } + @Override + public void onClick(View view) { + LatLon latlon = adapter.latlonList.get(position); + latlon.lat=adapter.latlonListener.getLat(); + latlon.lon=adapter.latlonListener.getLon(); + if(adapter.latlonList.get(adapter.latlonList.size()-1).lat!=0 && adapter.latlonList.get(adapter.latlonList.size()-1).lon!=0){ + adapter.latlonList.add(new LatLon(0, 0)); + if(adapter.clc!=null){ + adapter.clc.onClick(null); + } + } + adapter.notifyDataSetChanged(); + } + } + //To remove an element from a list + class OnClickListenerIDDEL implements View.OnClickListener{ + int position; + LatLonAdapter adapter; + OnClickListenerIDDEL(int position,LatLonAdapter adapter){ + this.position=position; + this.adapter=adapter; + } + @Override + public void onClick(View view) { + LatLon latlon = adapter.latlonList.get(position); + latlon.lat=0; + latlon.lon=0; + if(latlonList.size()>1 && position!=latlonList.size()-1) { + latlonList.remove(position); + if(adapter.clc!=null){ + adapter.clc.onClick(null); + } + } + adapter.notifyDataSetChanged(); + } + } +} diff --git a/app/src/main/java/kz/istt/locust/Locust.java b/app/src/main/java/kz/istt/locust/Locust.java new file mode 100644 index 0000000..bb8a403 --- /dev/null +++ b/app/src/main/java/kz/istt/locust/Locust.java @@ -0,0 +1,22 @@ +package kz.istt.locust; + +import android.app.Application; +import android.content.res.Configuration; + +public class Locust extends Application +{ + @Override + public void onCreate() { + + Tools.loadLocale(this); + } + + @Override + public void onConfigurationChanged(Configuration newConfig) + { + super.onConfigurationChanged(newConfig); + + //Задаём ещё раз локализацию, так как андроид сам меняет локализацию в соответствии с системными настройками. + Tools.loadLocale(this); + } +} diff --git a/app/src/main/java/kz/istt/locust/LocustActivity.java b/app/src/main/java/kz/istt/locust/LocustActivity.java new file mode 100644 index 0000000..d00bd13 --- /dev/null +++ b/app/src/main/java/kz/istt/locust/LocustActivity.java @@ -0,0 +1,2756 @@ +package kz.istt.locust; + +import android.Manifest; +import android.app.Activity; +import android.app.AlertDialog; +import android.app.DatePickerDialog; +import android.app.FragmentManager; +import android.app.FragmentTransaction; +import android.app.TimePickerDialog; +import android.app.TimePickerDialog.OnTimeSetListener; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.SharedPreferences; +import android.content.pm.PackageManager; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteStatement; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Color; +import android.location.Location; +import android.location.LocationListener; +import android.location.LocationManager; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; +import android.os.Environment; +import android.os.Parcelable; +import android.provider.MediaStore; +import android.provider.Settings; +import android.provider.Settings.Secure; +import android.util.Log; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; +import android.view.View.OnClickListener; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.CheckBox; +import android.widget.DatePicker; +import android.widget.EditText; +import android.widget.LinearLayout; +import android.widget.ListAdapter; +import android.widget.ListView; +import android.widget.ScrollView; +import android.widget.TextView; +import android.widget.TimePicker; +import android.widget.Toast; + +import androidx.core.app.ActivityCompat; +import androidx.core.content.FileProvider; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentActivity; + +import com.google.android.gms.maps.model.LatLng; + +import java.io.BufferedInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.Serializable; +import java.text.DecimalFormat; +import java.text.DecimalFormatSymbols; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.GregorianCalendar; +import java.util.Locale; +import java.util.zip.CRC32; + +import dbfields.AutoCompleteTextViewDB; +import dbfields.StringDB; +import dbfields.fieldDB; +import dbfields.selectDB; +import tools.LatLonListener; + +public class LocustActivity extends FragmentActivity implements LocationListener, LatLonListener { + private LocationManager lm; + private ScrollView scrollView1 = null; + + public double _lat = 0; // от устройства + public double _lon = 0; // от устройства + + public String uid = ""; // Идентификатор записи null по умолчанию + public Integer del = null; + public Long seq = null; // Дата изменения записи секунд с 1970 года + public StringDB m_Filled = new StringDB("1"); // 1- все обяз. поля заполнены, 0 - не все обяз. поля заполнены + //public Long created = null; // Дата создания записи секунд с 1970 года (только для не синхронизированных записей на планшете) + + //public Integer user_id = null; + + public String ImageName = null; // Название файла рисунка + public String tmp_ImageName = null; // Временое название рисунка + + public EditText edtImage1 = null; // Фотография + public EditText edtImage2 = null; // Фотография + public EditText edtImage3 = null; // Фотография + public View spiCountry = null; // Страна + + public View spiRegion = null; // Регион + public EditText edtArea = null; // Район + public EditText edtDistrict = null; // Сельский округ и/или хозяйство + + public EditText edtVillage = null; // Посёлка + public EditText edtTerrain = null; // Название местности либо урочища + + public EditText edtObserver = null; // ФИО наблюдателя + + public EditText edtDate = null; // Дата (передаётся в секундах с 1970 года) + public EditText edtTimeZone = null; + // public TimeInput edtTime = null; //Время + + public EditText edtLatCenter = null; // Широта + public EditText edtLonCenter = null; // Долгота + public ListView latlonList = null; + + public EditText edtBioHectare = null; // обследованная площадь(га) + + public View spiBioBiotope = null; // тип биотопаCIT (степь, залежь, посевы) тип биотопаDMA (равнины, холмы, посевы) тип биотопаLMI + // (низкие сухие тростники, высокие влажные тростники, другое) + public View spiBioGreenery = null; // растительность: сухая, всходы, зеленая, засыхающая + public View spiBioGreeneryCover = null; // растительный покров(Редкий, Ср., Густой) + public EditText edtBioTemperature = null; // погода: температура воздуха(ºC) + public EditText edtBioWind = null; // погода: ветер(м/с) + public View spiLocustType = null; // Вид саранчи + + public View spiLocustHave = null; // Присутствует саранча или нет + + public EditText edtLocustPopulated = null; // Заселённая площадь(га) + + public CheckBox cbEggs = null; + public EditText edtEggsCapsulesArea = null; // залежь кубышек (площадь в м2) + public EditText edtEggsCapsulesDensity = null; // кубышки(плотность на м2) от + public EditText edtEggsCapsulesDensityTo = null; // кубышки(плотность на м2) до + public EditText edtEggsCapsules = null; // яйца(в среднем в кубышке) + public EditText edtEggsLive = null; // яйца(% жизнеспособных) + public View spiEggsEnemies = null; // Естественные враги + + public CheckBox cbHoppers = null; + public View spiLarvaBorn = null; // отрождение + public View spiLarvaAge = null; // возраста: Младшие Средние Старшие + public View spiLarvaPainting = null; // окраска(одиночнаяS, перехoдная Т, стаднаяG) + public View spiLarvaBehavior = null; // поведение(�?золир., Разреженные, Группы) + public EditText edtLarvaDensity = null; // плотность на м2 + public EditText edtLarvaDensityTo = null; // плотность на м2 + + public CheckBox cbBands = null; + public EditText edtKuliguliDensity = null; // плотн. в кулиге(на м2) + public EditText edtKuliguliDensityTo = null; // плотн. в кулиге(на м2) до + public EditText edtKuliguliSize = null; // размер кулиг(га) + public EditText edtKuliguliCount = null; // число кулиг + public View spiKuliguliAction = null; // поведение: миграция, кормёжка, отдых + public View spiKuliguliAge = null; // возраста: Младшие Средние Старшие + + public CheckBox cbAdults = null; + public View spiImagoWing = null; // окрыление(начало, массовое) + public View spiImagoMaturity = null; // половозрелость(- или+) + public View spiImagoPhase = null; // фаза(одиночнаяS, перехoдная Т, стаднаяG) + public View spiImagoAction = null; // поведение(�?золир., Разреженные, Группы) + public EditText edtImagoDensity = null; // плотность(на трансекту или га) + public EditText edtImagoDensityGa = null; // плотность на га + + public View spiImagoFeeding = null; //Питание и размещение на растениях + + public View spiImagoCopulation = null; // спаривание (да,нет) + public View spiImagolaying = null; // яйцекладка (да,нет) + + public View spiImagoFlying = null; // полёты(- или+) + + public CheckBox cbSwarms = null; + public View spiSwarmMaturity = null; // половозрелость(- или+) + public View spiSwarmDensity = null; // плотность(на м2) + public EditText edtSwarmSize = null; // размер стаи(на км2) + public EditText edtSwarmCount = null; // число стай + public View spiSwarmFlying = null; // полёт(направление, время пролёта) + public View spiSwarmHeight = null; // высота(Низкая- Средняя- Высокая) + + public EditText edtDescription = null; // КОММЕНТАРИИ + public CheckBox cbTest; //Тестовая ли анкета + + public View btnOk = null; + public View btnCancel = null; + public View btnGetGPSCenter = null; + public View btnDelGPSCenter = null; + public View btnOnMap = null; + + public View btnImage1 = null; + public View btnImage2 = null; + public View btnImage3 = null; + public View btnShowImage1 = null; + public View btnShowImage2 = null; + public View btnShowImage3 = null; + public View btnDelImage1 = null; + public View btnDelImage2 = null; + public View btnDelImage3 = null; + + private Uri mImageUri = null; + + private DBGUITable guiTable = null; + + private boolean isInRange(float a, float b, float c) { + return b > a ? c >= a && c <= b : c >= b && c <= a; + } + + public String checkMinMaxI(EditText txt, int min, int max) { + try { + float input = Float.parseFloat(txt.getText().toString()); + if (isInRange(min, max, input)) + return ""; + else + return "MIN=" + Float.toString(min) + " MAX=" + Float.toString(max) + " ! "; + } catch (NumberFormatException nfe) { + } + return ""; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_locust); + + //Загрузка сохранёного языка + Tools.loadLocale(this); + + String sql; + DbOpenHelper dboh; + Cursor cursor; + + Intent intent = getIntent(); + uid = intent.getStringExtra("uid"); + guiTable = new DBGUITable(this, "frmlocust"); + guiTable.add(uid, "uid"); + + Integer user_id = null; + /*DbOpenHelper dboh = new DbOpenHelper(this); + SQLiteDatabase db = dboh.getReadableDatabase(); + Cursor cursor = db.rawQuery("select id from _user where del=0;", null); + if(cursor.moveToFirst()) + { + user_id = Integer.valueOf(cursor.getInt(cursor.getColumnIndex("id"))); + } + cursor.close(); + dboh.close();*/ + guiTable.add(user_id, "user_id"); + String device_id = Secure.getString(getContentResolver(), Secure.ANDROID_ID); + guiTable.add(device_id, "device_id"); //Идентификатор устройства + + //List list; + //ArrayAdapter dataAdapter; + + scrollView1 = (ScrollView) findViewById(R.id.scrollView1); + + guiTable.add(m_Filled, "filled"); + + edtImage1 = (EditText) findViewById(R.id.edtImage1); + guiTable.add(edtImage1, "image_name1"); + edtImage2 = (EditText) findViewById(R.id.edtImage2); + guiTable.add(edtImage2, "image_name2"); + edtImage3 = (EditText) findViewById(R.id.edtImage3); + guiTable.add(edtImage3, "image_name3"); + + spiCountry = findViewById(R.id.spiCountry); // Страна + guiTable.add(spiCountry, "country_id"); //Для сохранения по id + + ((selectDB)spiCountry).addField("", ""); + // Выбираем страны и заполняем поля + dboh = new DbOpenHelper(this); + cursor = dboh.getReadableDatabase().rawQuery("select c.id, COALESCE((SELECT translation FROM _translations t JOIN _languages l ON t.language_id=l.id WHERE t.del = 0 AND identifier = c.name AND l.short_name='" + Tools.getLang() + "' LIMIT 1),c.name) name from countries c where c.del=0 order by c.name", null); + if (cursor.moveToFirst()) { + do { + ((selectDB)spiCountry).addField(cursor.getString(cursor.getColumnIndex("name")), cursor.getString(cursor.getColumnIndex("id"))); + } while (cursor.moveToNext()); + } + cursor.close(); + dboh.close(); + + //---------------------------------------------------------------------------------------------- + /*spiCountry0 = (AutoCompleteTextView) findViewById(R.id.spiCountry0); // Страна + spiCountry0.setInputType(InputType.TYPE_NULL); + List m_lName = new ArrayList(); //Заголовки + m_lName.add(""); + m_lName.add("India"); + m_lName.add("Usa"); + m_lName.add("Canada"); + ArrayAdapter dataAdapter = new ArrayAdapter(this, android.R.layout.simple_spinner_item, m_lName); + dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + spiCountry0.setAdapter(dataAdapter);*/ + //---------------------------------------------------------------------------------------------- + + + // Событие чтоб при изменении страны обновлялся список регионов + ((selectDB)spiCountry).setOnChangeValueListener( + new OnClickListener() { + @Override + public void onClick(View v) { + ((selectDB)spiRegion).clearFields(); + ((selectDB)spiRegion).addField("", ""); + + if (((selectDB)spiCountry).getValue() != null && ((selectDB)spiCountry).getValue() != "") { + DbOpenHelper dboh = new DbOpenHelper(LocustActivity.this); + String sql = "select id, name, lon_min from countriesregions where del=0 and country_id=" + ((selectDB)spiCountry).getValue() + " order by name"; + Cursor cursor = dboh.getReadableDatabase().rawQuery(sql, null); + if (cursor.moveToFirst()) { + do { + ((selectDB)spiRegion).addField(cursor.getString(cursor.getColumnIndex("name")), cursor.getString(cursor.getColumnIndex("id"))); + } while (cursor.moveToNext()); + } + cursor.close(); + dboh.close(); + } + } + } + ); + + spiRegion = findViewById(R.id.spiRegion); // Регион + guiTable.add(spiRegion, "region_id"); + + edtArea = (EditText) findViewById(R.id.edtArea); // Район + guiTable.add(edtArea, "area"); + edtDistrict = (EditText) findViewById(R.id.edtDistrict); // Сельский округ и/или хозяйство + guiTable.add(edtDistrict, "district"); + + edtVillage = (EditText) findViewById(R.id.edtVillage); // Посёлок + guiTable.add(edtVillage, "village"); + edtTerrain = (EditText) findViewById(R.id.edtTerrain); // Местность урощище + guiTable.add(edtTerrain, "terrain"); + + edtObserver = (EditText) findViewById(R.id.edtObserver); // Наблюдатель + guiTable.add(edtObserver, "observer"); + edtDate = (EditText) findViewById(R.id.edtDate); // Дата + guiTable.add(edtDate, "date"); //Обязательное поле! + + View btnGetDate = (View) findViewById(R.id.btnGetDate); + View.OnClickListener clk0 = new View.OnClickListener() { + public void onClick(View v) { + DatePickerDialog.OnDateSetListener myDateListener = new DatePickerDialog.OnDateSetListener() { + @Override + public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { + + //SimpleDateFormat format = new SimpleDateFormat("dd.MM.yyyy HH:mm"); + //format.setTimeZone(TimeZone.getTimeZone("UTC")); + //LocustActivity.this.edtDate.setText(format.format(curDateTime)); + + //Теперь выбираем время + OnTimeSetListener myDateListener = new OnTimeSetListener() { + @Override + public void onTimeSet(TimePicker view, int hourOfDay, int minute) { + long val = Long.parseLong(((fieldDB)LocustActivity.this.edtDate).getValue()); + val += (hourOfDay * 60 + minute) * 60; + ((fieldDB)LocustActivity.this.edtDate).setValue(String.valueOf(val)); + } + }; + + if (((fieldDB)LocustActivity.this.edtDate).getValue() != null && !((fieldDB)LocustActivity.this.edtDate).getValue().equals("")) { + Date time = new Date(Long.parseLong(((fieldDB)LocustActivity.this.edtDate).getValue()) * 1000); + Calendar myCal = new GregorianCalendar(); + myCal.setTime(time); + int hour = myCal.get(Calendar.HOUR_OF_DAY); + int minute = myCal.get(Calendar.MINUTE); + TimePickerDialog tpd = new TimePickerDialog(LocustActivity.this, R.style.AlertDialogTheme, myDateListener, hour, minute, true); + tpd.show(); + } else { + final Calendar myCal = Calendar.getInstance(); + int hour = myCal.get(Calendar.HOUR_OF_DAY); + int minute = myCal.get(Calendar.MINUTE); + TimePickerDialog tpd = new TimePickerDialog(LocustActivity.this, R.style.AlertDialogTheme, myDateListener, hour, minute, true); + tpd.show(); + } + + Date date = new Date(year - 1900, monthOfYear, dayOfMonth); + ((fieldDB)LocustActivity.this.edtDate).setValue(String.valueOf(date.getTime() / 1000)); + + + } + }; + + if (!LocustActivity.this.edtDate.getText().toString().equals("")) { + Date date = null; + SimpleDateFormat format = new SimpleDateFormat("dd.MM.yyyy HH:mm"); + //format.setTimeZone(TimeZone.getTimeZone("UTC")); + try { + date = format.parse(LocustActivity.this.edtDate.getText().toString()); + } catch (ParseException e) { + e.printStackTrace(); + } + if (date != null) { + Calendar myCal = new GregorianCalendar(); + myCal.setTime(date); + int day = myCal.get(Calendar.DAY_OF_MONTH); + int month = myCal.get(Calendar.MONTH); + int year = myCal.get(Calendar.YEAR); + DatePickerDialog dpd = new DatePickerDialog(LocustActivity.this, R.style.AlertDialogTheme, myDateListener, year, month, day); + dpd.show(); + } + } else { + final Calendar c = Calendar.getInstance(); + int year = c.get(Calendar.YEAR); + int month = c.get(Calendar.MONTH); + int day = c.get(Calendar.DAY_OF_MONTH); + + DatePickerDialog dpd = new DatePickerDialog(LocustActivity.this, R.style.AlertDialogTheme, myDateListener, year, month, day); + dpd.show(); + } + } + }; + btnGetDate.setOnClickListener(clk0); + + edtTimeZone = (EditText) findViewById(R.id.edtTimeZone); + guiTable.add(edtTimeZone, "timezone"); + + edtLatCenter = (EditText) findViewById(R.id.edtLatCenter); // Широта + guiTable.add(edtLatCenter, "lat_center"); + edtLonCenter = (EditText) findViewById(R.id.edtLonCenter); // Долгота + guiTable.add(edtLonCenter, "lon_center"); + + ArrayList latlon = new ArrayList(); + if(latlon.size()==0){ + latlon.add(new LatLon(0, 0)); + } + latlonList = findViewById(R.id.latlonList); + LatLonAdapter adapter = new LatLonAdapter(this, R.layout.list_lat_lon, latlon, this, latlonList); + latlonList.setAdapter(adapter); + adapter.clc=new OnClickListener() { + @Override + public void onClick(View view) { + Tools.setListViewHeightBasedOnItems(LocustActivity.this.latlonList); + } + }; + + edtBioHectare = (EditText) findViewById(R.id.edtBioHectare); // обследованная площадь(га) + guiTable.add(edtBioHectare, "bio_hectare"); + + spiBioBiotope = findViewById(R.id.spiBioBiotope); // Тип биотопа + guiTable.add(spiBioBiotope, "bio_biotope_id"); + ((selectDB)spiBioBiotope).addField("", ""); + // Выбираем страны и заполняем поля + dboh = new DbOpenHelper(this); + + cursor = dboh.getReadableDatabase().rawQuery("select b.id, COALESCE((SELECT translation FROM _translations t JOIN _languages l ON t.language_id=l.id WHERE t.del = 0 AND identifier = b.name AND l.short_name='" + Tools.getLang() + "' LIMIT 1),b.name) name from list_biotope b where b.del=0 order by b.name", null); + if (cursor.moveToFirst()) { + do { + ((selectDB)spiBioBiotope).addField(cursor.getString(cursor.getColumnIndex("name")), cursor.getString(cursor.getColumnIndex("id"))); + } while (cursor.moveToNext()); + } + cursor.close(); + dboh.close(); + + spiBioGreenery = findViewById(R.id.spiBioGreenery); // Растительность + guiTable.add(spiBioGreenery, "bio_greenery_id"); + ((selectDB)spiBioGreenery).addField("", ""); + // Выбираем страны и заполняем поля + dboh = new DbOpenHelper(this); + + sql = "select g.id, COALESCE((SELECT translation FROM _translations t JOIN _languages l ON t.language_id=l.id WHERE t.del = 0 AND identifier = g.name AND l.short_name='" + Tools.getLang() + "' LIMIT 1),g.name) name from list_greenery g where g.del=0 order by g.sort"; + cursor = dboh.getReadableDatabase().rawQuery(sql, null); + if (cursor.moveToFirst()) { + do { + ((selectDB)spiBioGreenery).addField(cursor.getString(cursor.getColumnIndex("name")), cursor.getString(cursor.getColumnIndex("id"))); + } while (cursor.moveToNext()); + } + cursor.close(); + dboh.close(); + + spiBioGreeneryCover = findViewById(R.id.spiBioGreeneryCover); // Растительный покров + guiTable.add(spiBioGreeneryCover, "bio_greenery_cover_id"); + ((selectDB)spiBioGreeneryCover).addField("", ""); + // Выбираем страны и заполняем поля + dboh = new DbOpenHelper(this); + + cursor = dboh.getReadableDatabase().rawQuery("select c.id, COALESCE((SELECT translation FROM _translations t JOIN _languages l ON t.language_id=l.id WHERE t.del = 0 AND identifier = c.name AND l.short_name='" + Tools.getLang() + "' LIMIT 1),c.name) name from list_cover c where c.del=0 order by c.sort,c.name", null); + if (cursor.moveToFirst()) { + do { + ((selectDB)spiBioGreeneryCover).addField(cursor.getString(cursor.getColumnIndex("name")), cursor.getString(cursor.getColumnIndex("id"))); + } while (cursor.moveToNext()); + } + cursor.close(); + dboh.close(); + + edtBioTemperature = (EditText) findViewById(R.id.edtBioTemperature); // Температура воздуха + guiTable.add(edtBioTemperature, "bio_temperature"); + edtBioWind = (EditText) findViewById(R.id.edtBioWind); // погода: ветер(м/с) + guiTable.add(edtBioWind, "bio_wind"); + + spiLocustHave = findViewById(R.id.spiLocustHave); // Присутствует саранча или нет + guiTable.add(spiLocustHave, "locust_have"); + //spiLocustHave.addField(this, getString(R.string.Yes), "1"); + ((selectDB)spiLocustHave).addField(getString(R.string.Absent), "0"); + ((selectDB)spiLocustHave).addField(getString(R.string.Egg_pod), "2"); + ((selectDB)spiLocustHave).addField(getString(R.string.HOPPERS_SCATTERED), "3"); + ((selectDB)spiLocustHave).addField(getString(R.string.Bands), "4"); + ((selectDB)spiLocustHave).addField(getString(R.string.Adult), "5"); + ((selectDB)spiLocustHave).addField(getString(R.string.Swarms), "6"); + + spiLocustType = findViewById(R.id.spiLocustType); + guiTable.add(spiLocustType, "locust_type_id"); + ((selectDB)spiLocustType).addField("", ""); + // Выбираем страны и заполняем поля + dboh = new DbOpenHelper(this); + + cursor = dboh.getReadableDatabase().rawQuery("select lt.id, COALESCE((SELECT translation FROM _translations t JOIN _languages l ON t.language_id=l.id WHERE t.del = 0 AND identifier = lt.name AND l.short_name='" + Tools.getLang() + "' LIMIT 1),lt.name) name from LocustsTypes lt where lt.del=0 order by lt.sort,lt.name", null); + if (cursor.moveToFirst()) { + do { + ((selectDB)spiLocustType).addField(cursor.getString(cursor.getColumnIndex("name")), cursor.getString(cursor.getColumnIndex("id"))); + } while (cursor.moveToNext()); + } + cursor.close(); + dboh.close(); + + edtLocustPopulated = (EditText) findViewById(R.id.edtLocustPopulated); + guiTable.add(edtLocustPopulated, "locust_populated"); + + //Яйца + edtEggsCapsulesArea = (EditText) findViewById(R.id.edtEggsCapsulesArea); // залежь кубышек (площадь в м2) + guiTable.add(edtEggsCapsulesArea, "eggs_capsules_area"); + edtEggsCapsulesDensity = (EditText) findViewById(R.id.edtEggsCapsulesDensity); // кубышки(плотность на м2) от + guiTable.add(edtEggsCapsulesDensity, "eggs_capsules_density"); + edtEggsCapsulesDensityTo = (EditText) findViewById(R.id.edtEggsCapsulesDensityTo); // кубышки(плотность на м2) до + guiTable.add(edtEggsCapsulesDensityTo, "eggs_capsules_density_to"); + edtEggsCapsules = (EditText) findViewById(R.id.edtEggsCapsules); // яйца(в среднем в кубышке) + guiTable.add(edtEggsCapsules, "eggs_capsules"); + edtEggsLive = (EditText) findViewById(R.id.edtEggsLive); // яйца(% жизнеспособных) + guiTable.add(edtEggsLive, "eggs_live"); + //edtEggsLive.setFilters(new InputFilter[]{ new InputFilterMinMax("0", "100")}); + + spiEggsEnemies = findViewById(R.id.spiEggsEnemies); // наличие естественных врагов(каких?) + guiTable.add(spiEggsEnemies, "eggs_enemies_id"); + ((selectDB)spiEggsEnemies).addField("", ""); + // Выбираем отрождение и заполняем поля + dboh = new DbOpenHelper(this); + cursor = dboh.getReadableDatabase().rawQuery("select b.id, COALESCE((SELECT translation FROM _translations t JOIN _languages l ON t.language_id=l.id WHERE t.del = 0 AND identifier = b.name AND l.short_name='" + Tools.getLang() + "' LIMIT 1),b.name) name from list_enemies b where b.del=0 order by b.sort", null); + if (cursor.moveToFirst()) { + do { + ((selectDB)spiEggsEnemies).addField(cursor.getString(cursor.getColumnIndex("name")), cursor.getString(cursor.getColumnIndex("id"))); + } while (cursor.moveToNext()); + } + cursor.close(); + dboh.close(); + + // Личинки + spiLarvaBorn = findViewById(R.id.spiLarvaBorn); // Отрождение + guiTable.add(spiLarvaBorn, "larva_born_id"); + ((selectDB)spiLarvaBorn).addField("", ""); + // Выбираем отрождение и заполняем поля + dboh = new DbOpenHelper(this); + cursor = dboh.getReadableDatabase().rawQuery("select b.id, COALESCE((SELECT translation FROM _translations t JOIN _languages l ON t.language_id=l.id WHERE t.del = 0 AND identifier = b.name AND l.short_name='" + Tools.getLang() + "' LIMIT 1),b.name) name from Borns b where b.del=0 order by b.sort", null); + if (cursor.moveToFirst()) { + do { + ((selectDB)spiLarvaBorn).addField(cursor.getString(cursor.getColumnIndex("name")), cursor.getString(cursor.getColumnIndex("id"))); + } while (cursor.moveToNext()); + } + cursor.close(); + dboh.close(); + + spiLarvaAge = findViewById(R.id.spiLarvaAge); + guiTable.add(spiLarvaAge, "larva_age_id"); + ((selectDB)spiLarvaAge).addField("", ""); + // Выбираем отрождение и заполняем поля + dboh = new DbOpenHelper(this); + cursor = dboh.getReadableDatabase().rawQuery("select a.id, COALESCE((SELECT translation FROM _translations t JOIN _languages l ON t.language_id=l.id WHERE t.del = 0 AND identifier = a.name AND l.short_name='" + Tools.getLang() + "' LIMIT 1),a.name) name from list_age a where a.del=0 order by a.sort", null); + if (cursor.moveToFirst()) { + do { + ((selectDB)spiLarvaAge).addField(cursor.getString(cursor.getColumnIndex("name")), cursor.getString(cursor.getColumnIndex("id"))); + } while (cursor.moveToNext()); + } + cursor.close(); + dboh.close(); + + spiLarvaPainting = findViewById(R.id.spiLarvaPainting); + guiTable.add(spiLarvaPainting, "larva_painting_id"); + ((selectDB)spiLarvaPainting).addField("", ""); + // Выбираем отрождение и заполняем поля + dboh = new DbOpenHelper(this); + cursor = dboh.getReadableDatabase().rawQuery("select a.id, COALESCE((SELECT translation FROM _translations t JOIN _languages l ON t.language_id=l.id WHERE t.del = 0 AND identifier = a.name AND l.short_name='" + Tools.getLang() + "' LIMIT 1),a.name) name from list_paintings a where a.del=0 order by a.sort", null); + if (cursor.moveToFirst()) { + do { + ((selectDB)spiLarvaPainting).addField(cursor.getString(cursor.getColumnIndex("name")), cursor.getString(cursor.getColumnIndex("id"))); + } while (cursor.moveToNext()); + } + cursor.close(); + dboh.close(); + + //Поведение личинок + spiLarvaBehavior = findViewById(R.id.spiLarvaBehavior); + guiTable.add(spiLarvaBehavior, "larva_behavior_id"); + ((selectDB)spiLarvaBehavior).addField("", ""); + // Выбираем отрождение и заполняем поля + dboh = new DbOpenHelper(this); + cursor = dboh.getReadableDatabase().rawQuery("select a.id, COALESCE((SELECT translation FROM _translations t JOIN _languages l ON t.language_id=l.id WHERE t.del = 0 AND identifier = a.name AND l.short_name='" + Tools.getLang() + "' LIMIT 1),a.name) name from list_behaviors a where a.del=0 order by a.sort", null); + if (cursor.moveToFirst()) { + do { + ((selectDB)spiLarvaBehavior).addField(cursor.getString(cursor.getColumnIndex("name")), cursor.getString(cursor.getColumnIndex("id"))); + } while (cursor.moveToNext()); + } + cursor.close(); + dboh.close(); + + edtLarvaDensity = (EditText) findViewById(R.id.edtLarvaDensity); // Плотность + guiTable.add(edtLarvaDensity, "larva_density"); + edtLarvaDensityTo = (EditText) findViewById(R.id.edtLarvaDensityTo); // Плотность + guiTable.add(edtLarvaDensityTo, "larva_density_to"); + + // Кулигули + edtKuliguliDensity = (EditText) findViewById(R.id.edtKuliguliDensity); // Кулигули плотность + guiTable.add(edtKuliguliDensity, "kuliguli_density"); + edtKuliguliDensityTo = (EditText) findViewById(R.id.edtKuliguliDensityTo); // Кулигули плотность + guiTable.add(edtKuliguliDensityTo, "kuliguli_density_to"); + + edtKuliguliSize = (EditText) findViewById(R.id.edtKuliguliSize); // Размер + guiTable.add(edtKuliguliSize, "kuliguli_size"); + edtKuliguliCount = (EditText) findViewById(R.id.edtKuliguliCount); + guiTable.add(edtKuliguliCount, "kuliguli_count"); + + spiKuliguliAction = findViewById(R.id.spiKuliguliAction); + guiTable.add(spiKuliguliAction, "kuliguli_action_id"); + ((selectDB)spiKuliguliAction).addField("", ""); + dboh = new DbOpenHelper(this); + cursor = dboh.getReadableDatabase().rawQuery("select a.id,COALESCE((SELECT translation FROM _translations t JOIN _languages l ON t.language_id=l.id WHERE t.del = 0 AND identifier = a.name AND l.short_name='" + Tools.getLang() + "' LIMIT 1),a.name) name from list_actions a where a.del=0 order by a.sort", null); + if (cursor.moveToFirst()) { + do { + ((selectDB)spiKuliguliAction).addField(cursor.getString(cursor.getColumnIndex("name")), cursor.getString(cursor.getColumnIndex("id"))); + } while (cursor.moveToNext()); + } + cursor.close(); + dboh.close(); + + spiKuliguliAge = findViewById(R.id.spiKuliguliAge); + guiTable.add(spiKuliguliAge, "kuliguli_age_id"); + ((selectDB)spiKuliguliAge).addField("", ""); + // Выбираем отрождение и заполняем поля + dboh = new DbOpenHelper(this); + cursor = dboh.getReadableDatabase().rawQuery("select a.id, COALESCE((SELECT translation FROM _translations t JOIN _languages l ON t.language_id=l.id WHERE t.del = 0 AND identifier = a.name AND l.short_name='" + Tools.getLang() + "' LIMIT 1),a.name) name from list_age a where a.del=0 order by a.sort", null); + if (cursor.moveToFirst()) { + do { + ((selectDB)spiKuliguliAge).addField(cursor.getString(cursor.getColumnIndex("name")), cursor.getString(cursor.getColumnIndex("id"))); + } while (cursor.moveToNext()); + } + cursor.close(); + dboh.close(); + + // Имаго + spiImagoWing = findViewById(R.id.spiImagoWing); // окрыления начало массовое + guiTable.add(spiImagoWing, "imago_wing_id"); + ((selectDB)spiImagoWing).addField("", ""); + dboh = new DbOpenHelper(this); + + cursor = dboh.getReadableDatabase().rawQuery("select f.id,COALESCE((SELECT translation FROM _translations t JOIN _languages l ON t.language_id=l.id WHERE t.del = 0 AND identifier = f.name AND l.short_name='" + Tools.getLang() + "' LIMIT 1),f.name) name from Fledgling f where f.del=0 order by f.sort", null); + if (cursor.moveToFirst()) { + do { + ((selectDB)spiImagoWing).addField(cursor.getString(cursor.getColumnIndex("name")), cursor.getString(cursor.getColumnIndex("id"))); + } while (cursor.moveToNext()); + } + cursor.close(); + dboh.close(); + + spiImagoMaturity = findViewById(R.id.spiImagoMaturity); + guiTable.add(spiImagoMaturity, "imago_maturity"); + ((selectDB)spiImagoMaturity).addField("", ""); + ((selectDB)spiImagoMaturity).addField(getString(R.string.Yes), "1"); + ((selectDB)spiImagoMaturity).addField(getString(R.string.No), "0"); + + spiImagoPhase = findViewById(R.id.spiImagoPhase); + guiTable.add(spiImagoPhase, "imago_phase_id"); + ((selectDB)spiImagoPhase).addField("", ""); + dboh = new DbOpenHelper(this); + cursor = dboh.getReadableDatabase().rawQuery("select d.id, COALESCE((SELECT translation FROM _translations t JOIN _languages l ON t.language_id=l.id WHERE t.del = 0 AND identifier = d.name AND l.short_name='" + Tools.getLang() + "' LIMIT 1),d.name) name from list_phase d where d.del=0 order by d.sort,d.name", null); + if (cursor.moveToFirst()) { + do { + ((selectDB)spiImagoPhase).addField(cursor.getString(cursor.getColumnIndex("name")), cursor.getString(cursor.getColumnIndex("id"))); + } while (cursor.moveToNext()); + } + cursor.close(); + dboh.close(); + + //Поведение Имаго + spiImagoAction = findViewById(R.id.spiImagoAction); + guiTable.add(spiImagoAction, "imago_action_id"); + ((selectDB)spiImagoAction).addField("", ""); + dboh = new DbOpenHelper(this); + + cursor = dboh.getReadableDatabase().rawQuery("select f.id,COALESCE((SELECT translation FROM _translations t JOIN _languages l ON t.language_id=l.id WHERE t.del = 0 AND identifier = f.name AND l.short_name='" + Tools.getLang() + "' LIMIT 1),f.name) name from list_breeding f where f.del=0 order by f.sort", null); + if (cursor.moveToFirst()) { + do { + ((selectDB)spiImagoAction).addField(cursor.getString(cursor.getColumnIndex("name")), cursor.getString(cursor.getColumnIndex("id"))); + } while (cursor.moveToNext()); + } + cursor.close(); + dboh.close(); + + edtImagoDensity = (EditText) findViewById(R.id.edtImagoDensity); + guiTable.add(edtImagoDensity, "imago_density"); + + edtImagoDensityGa = (EditText) findViewById(R.id.edtImagoDensityGa); + guiTable.add(edtImagoDensityGa, "imago_density_ga"); + + //Для пересчёта значения при сохранении + /*spiDensityType = findViewById(R.id.spiDensityType); + guiTable.add(spiDensityType,"imago_density_type"); + spiDensityType.addField(this, getString(R.string.on_m), "1"); + spiDensityType.addField(this, getString(R.string.on_ha), "0");*/ + + spiImagoFeeding = findViewById(R.id.spiImagoFeeding); + guiTable.add(spiImagoFeeding, "imago_feeding"); + ((selectDB)spiImagoFeeding).addField("", ""); + ((selectDB)spiImagoFeeding).addField(getString(R.string.Yes), "1"); + ((selectDB)spiImagoFeeding).addField(getString(R.string.No), "0"); + + spiImagoCopulation = findViewById(R.id.spiImagoCopulation); + guiTable.add(spiImagoCopulation, "imago_copulation"); + ((selectDB)spiImagoCopulation).addField("", ""); + ((selectDB)spiImagoCopulation).addField(getString(R.string.Yes), "1"); + ((selectDB)spiImagoCopulation).addField(getString(R.string.No), "0"); + + spiImagolaying = findViewById(R.id.spiImagolaying); + guiTable.add(spiImagolaying, "imago_laying"); + ((selectDB)spiImagolaying).addField("", ""); + ((selectDB)spiImagolaying).addField(getString(R.string.Yes), "1"); + ((selectDB)spiImagolaying).addField(getString(R.string.No), "0"); + + spiImagoFlying = findViewById(R.id.spiImagoFlying); + guiTable.add(spiImagoFlying, "imago_flying"); + ((selectDB)spiImagoFlying).addField("", ""); + ((selectDB)spiImagoFlying).addField(getString(R.string.Yes), "1"); + ((selectDB)spiImagoFlying).addField(getString(R.string.No), "0"); + + // Стаи + spiSwarmMaturity = findViewById(R.id.spiSwarmMaturity); + guiTable.add(spiSwarmMaturity, "swarm_maturity"); + ((selectDB)spiSwarmMaturity).addField("", ""); + ((selectDB)spiSwarmMaturity).addField(getString(R.string.Yes), "1"); + ((selectDB)spiSwarmMaturity).addField(getString(R.string.No), "0"); + + spiSwarmDensity = findViewById(R.id.spiSwarmDensity); + guiTable.add(spiSwarmDensity, "swarm_density_id"); + ((selectDB)spiSwarmDensity).addField("", ""); + dboh = new DbOpenHelper(this); + cursor = dboh.getReadableDatabase().rawQuery("select d.id, COALESCE((SELECT translation FROM _translations t JOIN _languages l ON t.language_id=l.id WHERE t.del = 0 AND identifier = d.name AND l.short_name='" + Tools.getLang() + "' LIMIT 1),d.name) name from list_density d where d.del=0 order by d.percent,d.name", null); + if (cursor.moveToFirst()) { + do { + ((selectDB)spiSwarmDensity).addField(cursor.getString(cursor.getColumnIndex("name")), cursor.getString(cursor.getColumnIndex("id"))); + } while (cursor.moveToNext()); + } + cursor.close(); + dboh.close(); + + edtSwarmSize = (EditText) findViewById(R.id.edtSwarmSize); + guiTable.add(edtSwarmSize, "swarm_size"); + edtSwarmCount = (EditText) findViewById(R.id.edtSwarmCount); + guiTable.add(edtSwarmCount, "swarm_count"); + + // edtSwarmFlying = (EditText) findViewById(R.id.edtSwarmFlying); + spiSwarmFlying = findViewById(R.id.spiSwarmFlying); // полёт(направление, время пролёта) + guiTable.add(spiSwarmFlying, "swarm_flying_direction_id"); + ((selectDB)spiSwarmFlying).addField("", ""); + dboh = new DbOpenHelper(this); + + cursor = dboh.getReadableDatabase().rawQuery("select d.id, COALESCE((SELECT translation FROM _translations t JOIN _languages l ON t.language_id=l.id WHERE t.del = 0 AND identifier = d.name AND l.short_name='" + Tools.getLang() + "' LIMIT 1),d.name) name, d.degree from list_directions d where d.del=0 order by d.degree", null); + if (cursor.moveToFirst()) { + do { + ((selectDB)spiSwarmFlying).addField(cursor.getString(cursor.getColumnIndex("name")), cursor.getString(cursor.getColumnIndex("id"))); + } while (cursor.moveToNext()); + } + cursor.close(); + dboh.close(); + + spiSwarmHeight = findViewById(R.id.spiSwarmHeight); + guiTable.add(spiSwarmHeight, "swarm_height_id"); + ((selectDB)spiSwarmHeight).addField("", ""); + dboh = new DbOpenHelper(this); + cursor = dboh.getReadableDatabase().rawQuery("select d.id, COALESCE((SELECT translation FROM _translations t JOIN _languages l ON t.language_id=l.id WHERE t.del = 0 AND identifier = d.name AND l.short_name='" + Tools.getLang() + "' LIMIT 1),d.name) name from list_height d where d.del=0 order by d.sort,d.name", null); + if (cursor.moveToFirst()) { + do { + ((selectDB)spiSwarmHeight).addField(cursor.getString(cursor.getColumnIndex("name")), cursor.getString(cursor.getColumnIndex("id"))); + } while (cursor.moveToNext()); + } + cursor.close(); + dboh.close(); + + // public CheckBox cbBoxDescription = null; + /*cbBoxDescription = (CheckBox) findViewById(R.id.cbBoxDescription); + OnClickListener oclCbBoxDescription = new OnClickListener() + { + @Override + public void onClick(View v) + { + if (!cbBoxDescription.isChecked()) + { + edtDescription.setText(""); + } + updateAlpha(); + } + }; + cbBoxDescription.setOnClickListener(oclCbBoxDescription);*/ + edtDescription = (EditText) findViewById(R.id.edtDescription); + guiTable.add(edtDescription, "description"); + + cbTest = (CheckBox) findViewById(R.id.cbTest); + guiTable.add(cbTest, "test"); + + // *** Кнопки *** + btnGetGPSCenter = (View) findViewById(R.id.btnGetGPSCenter); + OnClickListener oclBtnGetGPSCenter = new OnClickListener() + { + @Override + public void onClick(View v) + { + DecimalFormatSymbols custom = new DecimalFormatSymbols(new Locale("en", "US")); + custom.setDecimalSeparator('.'); + + DecimalFormat df = new DecimalFormat("0.0000000"); + df.setDecimalFormatSymbols(custom); + + if(LocustActivity.this._lat!=0 && LocustActivity.this._lon!=0) { + LocustActivity.this.edtLatCenter.setText(df.format(LocustActivity.this._lat)); + LocustActivity.this.edtLonCenter.setText(df.format(LocustActivity.this._lon)); + } + //Checking if the GPS is active and if it is inactive, I display a warning about it + LocationManager locationManager = (LocationManager) LocustActivity.this.getSystemService(Context.LOCATION_SERVICE);; + if(!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)){ + Toast.makeText(LocustActivity.this, LocustActivity.this.getResources().getString(R.string.Please_activate_GPS), Toast.LENGTH_LONG).show(); + } + } + }; + btnGetGPSCenter.setOnClickListener(oclBtnGetGPSCenter); + + btnDelGPSCenter = (View) findViewById(R.id.btnDelGPSCenter); + btnDelGPSCenter.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + LocustActivity.this.edtLatCenter.setText(""); + LocustActivity.this.edtLonCenter.setText(""); + } + }); +/* + btnGetGPS1 = (View) findViewById(R.id.btnGetGPS1); + OnClickListener oclBtnGetGPS = new OnClickListener() { + @Override + public void onClick(View v) { + + DecimalFormatSymbols custom = new DecimalFormatSymbols(new Locale("en", "US")); + custom.setDecimalSeparator('.'); + DecimalFormat df = new DecimalFormat("0.0000000"); + df.setDecimalFormatSymbols(custom); + + if(LocustActivity.this._lat!=0 && LocustActivity.this._lon!=0) { + LocustActivity.this.edtLat1.setText(df.format(LocustActivity.this._lat)); + LocustActivity.this.edtLon1.setText(df.format(LocustActivity.this._lon)); + } + //TODO Если удалось получить координаты то добавляем ещё 1 поля для их ввода + + //Checking if the GPS is active and if it is inactive, I display a warning about it + LocationManager locationManager = (LocationManager) LocustActivity.this.getSystemService(Context.LOCATION_SERVICE);; + if(!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)){ + Toast.makeText(LocustActivity.this, LocustActivity.this.getResources().getString(R.string.Please_activate_GPS), Toast.LENGTH_LONG).show(); + } + + } + }; + btnGetGPS1.setOnClickListener(oclBtnGetGPS); + + btnDelGPS1 = (View) findViewById(R.id.btnDelGPS1); + btnDelGPS1.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + LocustActivity.this.edtLat1.setText(""); + LocustActivity.this.edtLon1.setText(""); + } + }); + + btnGetGPS2 = (View) findViewById(R.id.btnGetGPS2); + OnClickListener oclGetGPS2 = new OnClickListener() { + @Override + public void onClick(View v) { + DecimalFormatSymbols custom = new DecimalFormatSymbols(new Locale("en", "US")); + custom.setDecimalSeparator('.'); + DecimalFormat df = new DecimalFormat("0.0000000"); + df.setDecimalFormatSymbols(custom); + if(LocustActivity.this._lat!=0 && LocustActivity.this._lon!=0) { + LocustActivity.this.edtLat2.setText(df.format(LocustActivity.this._lat)); + LocustActivity.this.edtLon2.setText(df.format(LocustActivity.this._lon)); + } + //Checking if the GPS is active and if it is inactive, I display a warning about it + LocationManager locationManager = (LocationManager) LocustActivity.this.getSystemService(Context.LOCATION_SERVICE);; + if(!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)){ + Toast.makeText(LocustActivity.this, LocustActivity.this.getResources().getString(R.string.Please_activate_GPS), Toast.LENGTH_LONG).show(); + } + } + }; + btnGetGPS2.setOnClickListener(oclGetGPS2); + + btnDelGPS2 = (View) findViewById(R.id.btnDelGPS2); + btnDelGPS2.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + LocustActivity.this.edtLat2.setText(""); + LocustActivity.this.edtLon2.setText(""); + } + }); + + btnGetGPS3 = (View) findViewById(R.id.btnGetGPS3); + OnClickListener oclGetGPS3 = new OnClickListener() { + @Override + public void onClick(View v) { + DecimalFormatSymbols custom = new DecimalFormatSymbols(new Locale("en", "US")); + custom.setDecimalSeparator('.'); + DecimalFormat df = new DecimalFormat("0.0000000"); + df.setDecimalFormatSymbols(custom); + if(LocustActivity.this._lat!=0 && LocustActivity.this._lon!=0) { + LocustActivity.this.edtLat3.setText(df.format(LocustActivity.this._lat)); + LocustActivity.this.edtLon3.setText(df.format(LocustActivity.this._lon)); + } + //Checking if the GPS is active and if it is inactive, I display a warning about it + LocationManager locationManager = (LocationManager) LocustActivity.this.getSystemService(Context.LOCATION_SERVICE);; + if(!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)){ + Toast.makeText(LocustActivity.this, LocustActivity.this.getResources().getString(R.string.Please_activate_GPS), Toast.LENGTH_LONG).show(); + } + } + }; + btnGetGPS3.setOnClickListener(oclGetGPS3); + + btnDelGPS3 = (View) findViewById(R.id.btnDelGPS3); + btnDelGPS3.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + LocustActivity.this.edtLat3.setText(""); + LocustActivity.this.edtLon3.setText(""); + } + }); + + + btnGetGPS4 = (View) findViewById(R.id.btnGetGPS4); + OnClickListener oclGetGPS4 = new OnClickListener() { + @Override + public void onClick(View v) { + DecimalFormatSymbols custom = new DecimalFormatSymbols(new Locale("en", "US")); + custom.setDecimalSeparator('.'); + DecimalFormat df = new DecimalFormat("0.0000000"); + df.setDecimalFormatSymbols(custom); + if(LocustActivity.this._lat!=0 && LocustActivity.this._lon!=0) { + LocustActivity.this.edtLat4.setText(df.format(LocustActivity.this._lat)); + LocustActivity.this.edtLon4.setText(df.format(LocustActivity.this._lon)); + } + //Checking if the GPS is active and if it is inactive, I display a warning about it + LocationManager locationManager = (LocationManager) LocustActivity.this.getSystemService(Context.LOCATION_SERVICE);; + if(!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)){ + Toast.makeText(LocustActivity.this, LocustActivity.this.getResources().getString(R.string.Please_activate_GPS), Toast.LENGTH_LONG).show(); + } + } + }; + btnGetGPS4.setOnClickListener(oclGetGPS4); + + btnDelGPS4 = (View) findViewById(R.id.btnDelGPS4); + btnDelGPS4.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + LocustActivity.this.edtLat4.setText(""); + LocustActivity.this.edtLon4.setText(""); + } + }); + + + btnGetGPS5 = (View) findViewById(R.id.btnGetGPS5); + OnClickListener oclGetGPS5 = new OnClickListener() { + @Override + public void onClick(View v) { + DecimalFormatSymbols custom = new DecimalFormatSymbols(new Locale("en", "US")); + custom.setDecimalSeparator('.'); + DecimalFormat df = new DecimalFormat("0.0000000"); + df.setDecimalFormatSymbols(custom); + if(LocustActivity.this._lat!=0 && LocustActivity.this._lon!=0) { + LocustActivity.this.edtLat5.setText(df.format(LocustActivity.this._lat)); + LocustActivity.this.edtLon5.setText(df.format(LocustActivity.this._lon)); + } + //Checking if the GPS is active and if it is inactive, I display a warning about it + LocationManager locationManager = (LocationManager) LocustActivity.this.getSystemService(Context.LOCATION_SERVICE);; + if(!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)){ + Toast.makeText(LocustActivity.this, LocustActivity.this.getResources().getString(R.string.Please_activate_GPS), Toast.LENGTH_LONG).show(); + } + } + }; + btnGetGPS5.setOnClickListener(oclGetGPS5); + + btnDelGPS5 = (View) findViewById(R.id.btnDelGPS5); + btnDelGPS5.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + LocustActivity.this.edtLat5.setText(""); + LocustActivity.this.edtLon5.setText(""); + } + }); + + btnGetGPS6 = (View) findViewById(R.id.btnGetGPS6); + OnClickListener oclGetGPS6 = new OnClickListener() { + @Override + public void onClick(View v) { + DecimalFormatSymbols custom = new DecimalFormatSymbols(new Locale("en", "US")); + custom.setDecimalSeparator('.'); + DecimalFormat df = new DecimalFormat("0.0000000"); + df.setDecimalFormatSymbols(custom); + if(LocustActivity.this._lat!=0 && LocustActivity.this._lon!=0) { + LocustActivity.this.edtLat6.setText(df.format(LocustActivity.this._lat)); + LocustActivity.this.edtLon6.setText(df.format(LocustActivity.this._lon)); + } + //Checking if the GPS is active and if it is inactive, I display a warning about it + LocationManager locationManager = (LocationManager) LocustActivity.this.getSystemService(Context.LOCATION_SERVICE);; + if(!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)){ + Toast.makeText(LocustActivity.this, LocustActivity.this.getResources().getString(R.string.Please_activate_GPS), Toast.LENGTH_LONG).show(); + } + } + }; + btnGetGPS6.setOnClickListener(oclGetGPS6); + + btnDelGPS6 = (View) findViewById(R.id.btnDelGPS6); + btnDelGPS6.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + LocustActivity.this.edtLat6.setText(""); + LocustActivity.this.edtLon6.setText(""); + } + }); +*/ + btnOnMap = (View) findViewById(R.id.btnOnMap); + OnClickListener oclBtnOnMap = new OnClickListener() { + @Override + public void onClick(View v) { + Intent intent = new Intent(LocustActivity.this, MapsActivity.class); + //intent.putExtra("LatLon", ((LatLonAdapter)latlonList.getAdapter()).latlonList); + LatLonAdapter adapter = (LatLonAdapter)latlonList.getAdapter(); + ArrayList list = adapter.latlonList; + intent.putParcelableArrayListExtra("LatLon", list); + intent.putExtra("uid", uid); + startActivityForResult(intent,4); ////startActivity(intent); + } + }; + btnOnMap.setOnClickListener(oclBtnOnMap); + + // android:id="@+id/btnOk" + btnOk = (Button) findViewById(R.id.btnOk); + OnClickListener oclBtnOk = new OnClickListener() { + @Override + public void onClick(View v) { + saveData(); + } + }; + btnOk.setOnClickListener(oclBtnOk); + + btnCancel = (View) findViewById(R.id.btnCancel); + OnClickListener oclBtnCancel = new OnClickListener() { + @Override + public void onClick(View v) { + AlertDialog.Builder adb = new AlertDialog.Builder(LocustActivity.this, R.style.AlertDialogTheme); + adb.setTitle(getString(R.string.Warning)); + adb.setMessage(LocustActivity.this.getResources().getString(R.string.Cancel_filling_form)); + adb.setPositiveButton(LocustActivity.this.getResources().getString(R.string.Yes), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int id) { + LocustActivity.this.finish(); + } + }); + adb.setNegativeButton(LocustActivity.this.getResources().getString(R.string.No), new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int id) { + + } + }); + AlertDialog ad = adb.show(); + ad.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(Color.BLACK); + ad.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(Color.BLACK); + } + }; + btnCancel.setOnClickListener(oclBtnCancel); + + + btnImage1 = (View) findViewById(R.id.btnImage1); + OnClickListener oclBtnImage = new OnClickListener() { + @Override + public void onClick(View v) { + //Создаём папку если её нет + File directory = new File(Environment.getExternalStorageDirectory() + File.separator + "Pictures" + File.separator + "Locust"); + directory.mkdirs(); + + tmp_ImageName = "locust_" + (System.currentTimeMillis() / 1000L) + ".jpg"; + + File file = new File(Environment.getExternalStorageDirectory() + File.separator + "Pictures" + File.separator + "Locust" + File.separator + tmp_ImageName); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) + mImageUri = FileProvider.getUriForFile(LocustActivity.this, BuildConfig.APPLICATION_ID + ".provider", file); + else + mImageUri = Uri.fromFile(file); + + Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); + intent.putExtra(MediaStore.EXTRA_OUTPUT, mImageUri); + startActivityForResult(intent, 1); + } + }; + btnImage1.setOnClickListener(oclBtnImage); + + btnImage2 = (View) findViewById(R.id.btnImage2); + oclBtnImage = new OnClickListener() { + @Override + public void onClick(View v) { + //Создаём папку если её нет + File directory = new File(Environment.getExternalStorageDirectory() + File.separator + "Pictures" + File.separator + "Locust"); + directory.mkdirs(); + + tmp_ImageName = "locust_" + (System.currentTimeMillis() / 1000L) + ".jpg"; + + File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Pictures/Locust/" + tmp_ImageName); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) + mImageUri = FileProvider.getUriForFile(LocustActivity.this, BuildConfig.APPLICATION_ID + ".provider", file); + else + mImageUri = Uri.fromFile(file); + + Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); + intent.putExtra(MediaStore.EXTRA_OUTPUT, mImageUri); + startActivityForResult(intent, 2); + } + }; + btnImage2.setOnClickListener(oclBtnImage); + + + btnImage3 = (View) findViewById(R.id.btnImage3); + oclBtnImage = new OnClickListener() { + @Override + public void onClick(View v) { + //Создаём папку если её нет + File directory = new File(Environment.getExternalStorageDirectory() + File.separator + "Pictures" + File.separator + "Locust"); + directory.mkdirs(); + + tmp_ImageName = "locust_" + (System.currentTimeMillis() / 1000L) + ".jpg"; + + File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Pictures/Locust/" + tmp_ImageName); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) + mImageUri = FileProvider.getUriForFile(LocustActivity.this, BuildConfig.APPLICATION_ID + ".provider", file); + else + mImageUri = Uri.fromFile(file); + + Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); + intent.putExtra(MediaStore.EXTRA_OUTPUT, mImageUri); + startActivityForResult(intent, 3); + } + }; + btnImage3.setOnClickListener(oclBtnImage); + + + btnShowImage1 = (View) findViewById(R.id.btnShowImage1); // Отобразить фотографию 1 в новом окне + OnClickListener oclBtnShowImage = new OnClickListener() { + @Override + public void onClick(View v) { + File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Pictures/Locust/" + edtImage1.getText().toString()); + if (!file.isFile()) + file = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Pictures/Locust/_" + edtImage1.getText().toString()); + + if (file.isFile()) { + Intent i = new Intent(); + i.setAction(android.content.Intent.ACTION_VIEW); + + //Uri uri = Uri.fromFile(file); + Uri uri = FileProvider.getUriForFile(LocustActivity.this, BuildConfig.APPLICATION_ID + ".provider", file); + + i.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + i.setDataAndType(uri, "image/jpg"); + startActivity(i); + } + } + }; + btnShowImage1.setOnClickListener(oclBtnShowImage); + + btnShowImage2 = (View) findViewById(R.id.btnShowImage2); // Отобразить фотографию 1 в новом окне + oclBtnShowImage = new OnClickListener() { + @Override + public void onClick(View v) { + File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Pictures/Locust/" + edtImage2.getText().toString()); + if (!file.isFile()) + file = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Pictures/Locust/_" + edtImage2.getText().toString()); + if (file.isFile()) { + Intent i = new Intent(); + i.setAction(android.content.Intent.ACTION_VIEW); + + //Uri uri = Uri.fromFile(file) + Uri uri = FileProvider.getUriForFile(LocustActivity.this, BuildConfig.APPLICATION_ID + ".provider", file); + + i.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + i.setDataAndType(uri, "image/jpg"); + startActivity(i); + } + } + }; + btnShowImage2.setOnClickListener(oclBtnShowImage); + + btnShowImage3 = (View) findViewById(R.id.btnShowImage3); // Отобразить фотографию 3 в новом окне + oclBtnShowImage = new OnClickListener() { + @Override + public void onClick(View v) { + File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Pictures/Locust/" + edtImage3.getText().toString()); + if (!file.isFile()) + file = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Pictures/Locust/_" + edtImage3.getText().toString()); + if (file.isFile()) { + Intent i = new Intent(); + i.setAction(android.content.Intent.ACTION_VIEW); + + //Uri uri = Uri.fromFile(file) + Uri uri = FileProvider.getUriForFile(LocustActivity.this, BuildConfig.APPLICATION_ID + ".provider", file); + + i.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + i.setDataAndType(uri, "image/jpg"); + startActivity(i); + } + } + }; + btnShowImage3.setOnClickListener(oclBtnShowImage); + + btnDelImage1 = (View) findViewById(R.id.btnDelImage1); + btnDelImage1.setOnClickListener( + new OnClickListener() { + @Override + public void onClick(View v) { + edtImage1.setText(""); + } + } + ); + + btnDelImage2 = (View) findViewById(R.id.btnDelImage2); + btnDelImage2.setOnClickListener( + new OnClickListener() { + @Override + public void onClick(View v) { + edtImage2.setText(""); + } + } + ); + + btnDelImage3 = (View) findViewById(R.id.btnDelImage3); + btnDelImage3.setOnClickListener( + new OnClickListener() { + @Override + public void onClick(View v) { + edtImage3.setText(""); + } + } + ); + + + // public CheckBox cbBoxDescription = null; + /*cbBoxDescription = (CheckBox) findViewById(R.id.cbBoxDescription);*/ + OnClickListener oclCB = new OnClickListener() { + @Override + public void onClick(View v) { + CheckBox cbx = (CheckBox) v; + if (!cbx.isChecked()) { + AlertDialog.Builder adb = new AlertDialog.Builder(LocustActivity.this, R.style.AlertDialogTheme); + adb.setTitle(getString(R.string.Warning)); + adb.setMessage(LocustActivity.this.getResources().getString(R.string.Cancel_filling_section)); + adb.setPositiveButton(LocustActivity.this.getResources().getString(R.string.Yes), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int id) { + updateAlpha(); + } + }); + adb.setNegativeButton(LocustActivity.this.getResources().getString(R.string.No), new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int id) { + cbx.setChecked(true); + } + }); + AlertDialog ad = adb.show(); + ad.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(Color.BLACK); + ad.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(Color.BLACK); + } else { + updateAlpha(); + } + } + }; + + cbEggs = (CheckBox) findViewById(R.id.cbEggs); + guiTable.add(cbEggs, "eggs"); + cbEggs.setOnClickListener(oclCB); + + cbHoppers = (CheckBox) findViewById(R.id.cbHoppers); + guiTable.add(cbHoppers, "hoppers"); + cbHoppers.setOnClickListener(oclCB); + + cbBands = (CheckBox) findViewById(R.id.cbBands); + guiTable.add(cbBands, "bands"); + cbBands.setOnClickListener(oclCB); + + cbAdults = (CheckBox) findViewById(R.id.cbAdults); + guiTable.add(cbAdults, "adults"); + cbAdults.setOnClickListener(oclCB); + + cbSwarms = (CheckBox) findViewById(R.id.cbSwarms); + guiTable.add(cbSwarms, "swarms"); + cbSwarms.setOnClickListener(oclCB); + + + editData(uid); + adapter.notifyDataSetChanged(); + Tools.setListViewHeightBasedOnItems(latlonList); + + + ((selectDB)spiLocustHave).setOnChangeValueListener( + new OnClickListener() { + @Override + public void onClick(View v) { + hideInterfaceByID(((selectDB)spiLocustHave).getValue()); + } + }); + + // Чтоб слушать GPS (в конце метода чтобы успели присвоиться GUI компоненты локальным переменным) + lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE); + if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { + return; + } + lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 500, 1, this); + } + + @Override + public void onResume(){ + super.onResume(); + if(spiCountry.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiCountry).updateAdapter(this); + if(spiRegion.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiRegion).updateAdapter(this); + if(spiBioBiotope.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiBioBiotope).updateAdapter(this); + + if(spiBioGreenery.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiBioGreenery).updateAdapter(this); + if(spiBioGreeneryCover.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiBioGreeneryCover).updateAdapter(this); + if(spiLocustHave.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiLocustHave).updateAdapter(this); + if(spiLocustType.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiLocustType).updateAdapter(this); + if(spiEggsEnemies.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiEggsEnemies).updateAdapter(this); + if(spiLarvaBorn.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiLarvaBorn).updateAdapter(this); + if(spiLarvaAge.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiLarvaAge).updateAdapter(this); + if(spiLarvaPainting.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiLarvaPainting).updateAdapter(this); + if(spiLarvaBehavior.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiLarvaBehavior).updateAdapter(this); + if(spiKuliguliAction.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiKuliguliAction).updateAdapter(this); + if(spiKuliguliAge.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiKuliguliAge).updateAdapter(this); + if(spiImagoWing.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiImagoWing).updateAdapter(this); + if(spiImagoMaturity.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiImagoMaturity).updateAdapter(this); + if(spiImagoPhase.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiImagoPhase).updateAdapter(this); + if(spiImagoAction.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiImagoAction).updateAdapter(this); + if(spiImagoFeeding.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiImagoFeeding).updateAdapter(this); + if(spiImagoCopulation.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiImagoCopulation).updateAdapter(this); + if(spiImagolaying.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiImagolaying).updateAdapter(this); + if(spiImagoFlying.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiImagoFlying).updateAdapter(this); + if(spiSwarmMaturity.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiSwarmMaturity).updateAdapter(this); + if(spiSwarmDensity.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiSwarmDensity).updateAdapter(this); + if(spiSwarmFlying.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiSwarmFlying).updateAdapter(this); + if(spiSwarmHeight.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiSwarmHeight).updateAdapter(this); + + //Moved here from onCreate because it did not save checkboxes in drop-down lists when rotating the screen + updateAlpha(); + } + + public void hideInterfaceByID(String id) + { + if(id.equals("0")) //Отсутствует (скрываем всё) + { + //LinearLayout llEggs = (LinearLayout) findViewById(R.id.llEggs); + //llEggs.setVisibility(View.GONE); + //LinearLayout llHoppers = (LinearLayout) findViewById(R.id.llHoppers); + //llHoppers.setVisibility(View.GONE); + //LinearLayout llBands = (LinearLayout) findViewById(R.id.llBands); + //llBands.setVisibility(View.GONE); + //LinearLayout llAdults = (LinearLayout) findViewById(R.id.llAdults); + //llAdults.setVisibility(View.GONE); + //LinearLayout llSwarms = (LinearLayout) findViewById(R.id.llSwarms); + //llSwarms.setVisibility(View.GONE); + }else if(id.equals("2")) //EGG-PODS + { + CheckBox cbEggs = (CheckBox) findViewById(R.id.cbEggs); + cbEggs.setChecked(true); + + //LinearLayout llEggs = (LinearLayout) findViewById(R.id.llEggs); + //llEggs.setVisibility(View.VISIBLE); + //LinearLayout llHoppers = (LinearLayout) findViewById(R.id.llHoppers); + //llHoppers.setVisibility(View.GONE); + //LinearLayout llBands = (LinearLayout) findViewById(R.id.llBands); + //llBands.setVisibility(View.GONE); + //LinearLayout llAdults = (LinearLayout) findViewById(R.id.llAdults); + //llAdults.setVisibility(View.GONE); + //LinearLayout llSwarms = (LinearLayout) findViewById(R.id.llSwarms); + //llSwarms.setVisibility(View.GONE); + }else if(id.equals("3")) //Личинки разряженные + { + CheckBox cbHoppers = (CheckBox) findViewById(R.id.cbHoppers); + cbHoppers.setChecked(true); + + //LinearLayout llEggs = (LinearLayout) findViewById(R.id.llEggs); + //llEggs.setVisibility(View.GONE); + //LinearLayout llHoppers = (LinearLayout) findViewById(R.id.llHoppers); + //llHoppers.setVisibility(View.VISIBLE); + //LinearLayout llBands = (LinearLayout) findViewById(R.id.llBands); + //llBands.setVisibility(View.GONE); + //LinearLayout llAdults = (LinearLayout) findViewById(R.id.llAdults); + //llAdults.setVisibility(View.GONE); + //LinearLayout llSwarms = (LinearLayout) findViewById(R.id.llSwarms); + //llSwarms.setVisibility(View.GONE); + }else if(id.equals("4")) //Кулиги + { + CheckBox cbBands = (CheckBox) findViewById(R.id.cbBands); + cbBands.setChecked(true); + + //LinearLayout llEggs = (LinearLayout) findViewById(R.id.llEggs); + //llEggs.setVisibility(View.GONE); + //LinearLayout llHoppers = (LinearLayout) findViewById(R.id.llHoppers); + //llHoppers.setVisibility(View.GONE); + //LinearLayout llBands = (LinearLayout) findViewById(R.id.llBands); + //llBands.setVisibility(View.VISIBLE); + //LinearLayout llAdults = (LinearLayout) findViewById(R.id.llAdults); + //llAdults.setVisibility(View.GONE); + //LinearLayout llSwarms = (LinearLayout) findViewById(R.id.llSwarms); + //llSwarms.setVisibility(View.GONE); + }else if(id.equals("5")) //Имаго + { + CheckBox cbAdults = (CheckBox) findViewById(R.id.cbAdults); + cbAdults.setChecked(true); + + //LinearLayout llEggs = (LinearLayout) findViewById(R.id.llEggs); + //llEggs.setVisibility(View.GONE); + //LinearLayout llHoppers = (LinearLayout) findViewById(R.id.llHoppers); + //llHoppers.setVisibility(View.GONE); + //LinearLayout llBands = (LinearLayout) findViewById(R.id.llBands); + //llBands.setVisibility(View.GONE); + //LinearLayout llAdults = (LinearLayout) findViewById(R.id.llAdults); + //llAdults.setVisibility(View.VISIBLE); + //LinearLayout llSwarms = (LinearLayout) findViewById(R.id.llSwarms); + //llSwarms.setVisibility(View.GONE); + }else if(id.equals("6")) //Стаи + { + CheckBox cbSwarms = (CheckBox) findViewById(R.id.cbSwarms); + cbSwarms.setChecked(true); + + //LinearLayout llEggs = (LinearLayout) findViewById(R.id.llEggs); + //llEggs.setVisibility(View.GONE); + //LinearLayout llHoppers = (LinearLayout) findViewById(R.id.llHoppers); + //llHoppers.setVisibility(View.GONE); + //LinearLayout llBands = (LinearLayout) findViewById(R.id.llBands); + //llBands.setVisibility(View.GONE); + //LinearLayout llAdults = (LinearLayout) findViewById(R.id.llAdults); + //llAdults.setVisibility(View.GONE); + //LinearLayout llSwarms = (LinearLayout) findViewById(R.id.llSwarms); + //llSwarms.setVisibility(View.VISIBLE); + } + updateAlpha(); + } + + // Сохраняются настройки перед уничтожением формы + @Override + protected void onSaveInstanceState(Bundle outState) + { + super.onSaveInstanceState(outState); + if (mImageUri != null) + { + outState.putString("cameraImageUri", mImageUri.toString()); + } + // Сохраняем название рисунка (Не знаю почему но автоматом не сохраняет) + outState.putString("ImageName", edtImage1.getText().toString()); + //Сохраняю список координат LatLon + LatLonAdapter adapter = (LatLonAdapter)latlonList.getAdapter(); + ArrayList list = adapter.latlonList; + for(int i=0;i points = data.getParcelableArrayListExtra("LatLon"); + LatLonAdapter adapter = (LatLonAdapter)latlonList.getAdapter(); + ArrayList list = adapter.latlonList; + list.clear(); + for(int i=0;i list = adapter.latlonList; + list.clear(); + DbOpenHelper dboh = new DbOpenHelper(this); + Cursor cursor = dboh.getReadableDatabase().rawQuery("select lat,lon from frmlocust_locations where frmlocust_uid='" + uid + "' order by pos", null); + if (cursor.moveToFirst()) + { + do + { + list.add(new LatLon(cursor.getDouble(0), cursor.getDouble(1))); + } while (cursor.moveToNext()); + } + cursor.close(); + dboh.close(); + list.add(new LatLon(0, 0)); + } + } + + /*** + * Переместить и сфокусировать на переданном элементе + */ + public void scrollTo(View item) + { + int top = 0; + View tmp = item; + while (tmp != null) + { + if (tmp == scrollView1) + { + scrollView1.scrollTo(0, top); + item.requestFocus(); + break; + } + + top += tmp.getTop(); + tmp = (View) tmp.getParent(); + } + } + + public void alert(String text) + { + AlertDialog.Builder adb = new AlertDialog.Builder(this,R.style.AlertDialogTheme); + adb.setTitle(getString(R.string.Warning)); + adb.setMessage(text); + adb.setPositiveButton("OK", new DialogInterface.OnClickListener() //Кнопка открыть + { + @Override + public void onClick(DialogInterface arg0, int arg1) + {} + }); + AlertDialog ad = adb.show(); + ad.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(Color.BLACK); + } + + public boolean isGONE(View view) + { + if (!view.isClickable()) + return true; + try { + while (view != null) { + if (view.getVisibility() == View.GONE) + return true; + + view = (View) view.getParent(); + if(view==getWindow().getDecorView().getRootView()) + break; + } + }catch (Exception e) + {} + return false; + } + + /** + * Сохранить в базу данных (если есть то перезаписать в качестве идентификатора дата создания) + */ + public void saveData() + { + // Проверка на заполненость полей + String atxt = getString(R.string.Not_filled); //Текст для алерта: "Не заполнено поле". + boolean eFields = false; //У анкеты 2 состояния 1) Заполнены все обяз поля 2) Не заполнены все обяз поля + + //Проверка на заполнение обязательных полей для выделения цветом + if(isGONE(spiCountry)) ((selectDB)spiCountry).setValue(null); + //if(!eFields && !isGONE(spiCountry) && spiCountry.getSelectedItem().toString().equals("")) + if(!eFields && !isGONE(spiCountry) && ((selectDB)spiCountry).getText().toString().equals("")) + { + scrollTo(spiCountry); + atxt = atxt + ": \"" + getResources().getString(R.string.Country) + "\"!"; + eFields = true; + } + if(isGONE(spiRegion)) ((selectDB)spiRegion).setValue(null); + //if(!eFields && !isGONE(spiRegion) && spiRegion.getSelectedItem().toString().equals("")) + if(!eFields && !isGONE(spiRegion) && ((selectDB)spiRegion).getText().toString().equals("")) + { + scrollTo(spiRegion); + atxt = atxt + ": \"" + getResources().getString(R.string.Region) + "\"!"; + eFields = true; + } + if(isGONE(edtArea)) edtArea.setText(null); + if(!eFields && !isGONE(edtArea) && edtArea.getText().toString().equals("")) + { + scrollTo(edtArea); + atxt = atxt + ": \"" + getResources().getString(R.string.Area) + "\"!"; + eFields = true; + } +/* if(isGONE(edtVillage)) edtVillage.setValue(null); + if (!eFields && edtVillage.isClickable() && edtVillage.getText().toString().equals("")) + { + scrollTo(edtVillage); + atxt = atxt + ": \"" + getResources().getString(R.string.Village) + "\"!"; + eFields = true; + }*/ +/* if(isGONE(edtDistrict)) edtDistrict.setValue(null); + if(!eFields && edtDistrict.isClickable() && edtDistrict.getText().toString().equals("")) + { + scrollTo(edtDistrict); + atxt = atxt + ": \"" + getResources().getString(R.string.District) + "\"!"; + eFields = true; + }*/ + if(isGONE(edtObserver)) edtObserver.setText(null); + if(!eFields && !isGONE(edtObserver) && edtObserver.getText().toString().equals("")) + { + scrollTo(edtObserver); + atxt = atxt + ": \"" + getResources().getString(R.string.Name_of_survey_team_leader) + "\"!"; + eFields = true; + } + if(isGONE(edtDate)) ((fieldDB)LocustActivity.this.edtDate).setValue(null); + if(!eFields && !isGONE(edtDate) && edtDate.getText().toString().equals("")) + { + scrollTo(edtDate); + atxt = atxt + ": \"" + getResources().getString(R.string.Date) + "\"!"; + eFields = true; + } + //TODO Не забыть раскоментировать при публикации новой версии + if(isGONE(edtLatCenter)) edtLatCenter.setText(null); + if(!eFields && (!isGONE(edtLatCenter) && edtLatCenter.getText().toString().equals("") || Tools.getDouble(edtLatCenter.getText().toString(),0.0) == 0)) + { + scrollTo(edtLatCenter); + atxt = atxt + ": \"" + getResources().getString(R.string.Lat) + "\"!"; + eFields = true; + } + if(isGONE(edtLonCenter)) edtLonCenter.setText(null); + if(!eFields && (!isGONE(edtLonCenter) && edtLonCenter.getText().toString().equals("") || Tools.getDouble(edtLonCenter.getText().toString(),0.0) == 0)) + { + scrollTo(edtLonCenter); + atxt = atxt + ": \"" + getResources().getString(R.string.Lon) + "\"!"; + eFields = true; + } + + if(isGONE(edtBioHectare)) edtBioHectare.setText(null); + if(!eFields && !isGONE(edtBioHectare)) + { + float vErr1=0; + float vErr2=0; + try{ + vErr1= Float.parseFloat(edtBioHectare.getText().toString()); + vErr2= Float.parseFloat(edtLocustPopulated.getText().toString()); + } catch (NumberFormatException nfe) { } + + if(edtBioHectare.getText().toString().equals("")) + { + scrollTo(edtBioHectare); + atxt = atxt + ": \"" + getResources().getString(R.string.Surveyed_area_ha) + "\"!"; + eFields = true; + }else + if(checkMinMaxI(edtBioHectare,0,1000)!="") + { + scrollTo(edtBioHectare); + atxt = checkMinMaxI(edtBioHectare,0,1000) + " \"" + getResources().getString(R.string.Surveyed_area_ha) + "\"!"; + eFields = true; + }else + if(vErr2 > vErr1) //Обследованной площади не может быть меньше заселённой + { + scrollTo(edtBioHectare); + atxt = getResources().getString(R.string.Area_infested_ha) + " > " + getResources().getString(R.string.Surveyed_area_ha); + eFields = true; + } + } + if(isGONE(spiBioBiotope)) ((selectDB)spiBioBiotope).setValue(null); + //if(!eFields && !isGONE(spiBioBiotope) && spiBioBiotope.getSelectedItem().toString().equals("")) + if(!eFields && !isGONE(spiBioBiotope) && ((selectDB)spiBioBiotope).getText().toString().equals("")) + { + scrollTo(spiBioBiotope); + atxt = atxt + ": \"" + getResources().getString(R.string.Type_of_biotope) + "\"!"; + eFields = true; + } + if(isGONE(spiBioGreenery)) ((selectDB)spiBioGreenery).setValue(null); + //if(!eFields && !isGONE(spiBioGreenery) && spiBioGreenery.getSelectedItem().toString().equals("")) + if(!eFields && !isGONE(spiBioGreenery) && ((selectDB)spiBioGreenery).getText().toString().equals("")) + { + scrollTo(spiBioGreenery); + atxt = atxt + ": \"" + getResources().getString(R.string.Vegetation) + "\"!"; + eFields = true; + } + if(isGONE(spiBioGreeneryCover)) ((selectDB)spiBioGreeneryCover).setValue(null); + //if(!eFields && !isGONE(spiBioGreeneryCover) && spiBioGreeneryCover.getSelectedItem().toString().equals("")) //Обратно раскоментил было не обязательным + if(!eFields && !isGONE(spiBioGreeneryCover) && ((selectDB)spiBioGreeneryCover).getText().toString().equals("")) //Обратно раскоментил было не обязательным + { + scrollTo(spiBioGreeneryCover); + atxt = atxt + ": \"" + getResources().getString(R.string.Vegetation_cover) + "\"!"; + eFields = true; + } + if(isGONE(edtBioTemperature)) edtBioTemperature.setText(null); + if(!eFields && !isGONE(edtBioTemperature)) + { + if(checkMinMaxI(edtBioTemperature,0,50)!="") + { + scrollTo(edtBioTemperature); + atxt = checkMinMaxI(edtBioTemperature,0,50) + " \"" + getResources().getString(R.string.Air_temperature) + "\"!"; + eFields = true; + } + } + if(isGONE(edtBioWind)) edtBioWind.setText(null); + if(!eFields && !isGONE(edtBioWind)) + { + if(checkMinMaxI(edtBioWind,0,20)!="") //Проверка на интервалы + { + scrollTo(edtBioWind); + atxt = checkMinMaxI(edtBioWind,0,20) + " \"" + getResources().getString(R.string.Wind_m_s) + "\"!"; + eFields = true; + } + } + if(isGONE(spiLocustHave)) ((selectDB)spiLocustHave).setValue(null); + if(!eFields && !isGONE(spiLocustHave) && ((selectDB)spiLocustHave).getText().toString().equals("")) + { + scrollTo(spiLocustHave); + atxt = atxt + ": \"" + getResources().getString(R.string.Are_locusts_present) + "\"!"; + eFields = true; + } + if(isGONE(spiLocustType)) ((selectDB)spiLocustType).setValue(null); + if(!eFields && !isGONE(spiLocustType) && ((selectDB)spiLocustType).getText().toString().equals("")) + { + scrollTo(spiLocustType); + atxt = atxt + ": \"" + getResources().getString(R.string.Locust_species) + "\"!"; + eFields = true; + } + if(isGONE(edtLocustPopulated)) edtLocustPopulated.setText(null); + if(!eFields && !isGONE(edtLocustPopulated)) + { + if(edtLocustPopulated.getText().toString().equals("")) + { + scrollTo(edtLocustPopulated); + atxt = atxt + ": \"" + getResources().getString(R.string.Area_infested_ha) + "\"!"; + eFields = true; + }else + if(checkMinMaxI(edtLocustPopulated,0,1000)!="") + { + scrollTo(edtLocustPopulated); + atxt = checkMinMaxI(edtLocustPopulated,0,1000) + " \"" + getResources().getString(R.string.Area_infested_ha) + "\"!"; + eFields = true; + } + } + //************************************************** + // залежь кубышек (площадь в м2) + if(isGONE(edtEggsCapsulesArea)) edtEggsCapsulesArea.setText(null); + if(!eFields && !isGONE(edtEggsCapsulesArea)) + { + /*if(edtEggsCapsulesArea.getText().toString().equals("")) + { + scrollTo(edtEggsCapsulesArea); + atxt = atxt + ": \"" + getResources().getString(R.string.Egg_bed_surface_in_ha) + "\"!"; + eFields = true; + }else*/ + if(checkMinMaxI(edtEggsCapsulesArea,0,10000)!="") + { + scrollTo(edtEggsCapsulesArea); + atxt = checkMinMaxI(edtEggsCapsulesArea,0,10000) + " \"" + getResources().getString(R.string.Egg_bed_surface_in_ha) + "\"!"; + eFields = true; + } + } + // кубышки(плотность на м2) от + if(isGONE(edtEggsCapsulesDensity)) edtEggsCapsulesDensity.setText(null); + if(!eFields && !isGONE(edtEggsCapsulesDensity)) + { + if(edtEggsCapsulesDensity.getText().toString().equals("")) + { + scrollTo(edtEggsCapsulesDensity); + atxt = atxt + ": \"" + getResources().getString(R.string.Egg_pods_density_m2) + "\"!"; + eFields = true; + }else + if(checkMinMaxI(edtEggsCapsulesDensity,0,1000)!="") + { + scrollTo(edtEggsCapsulesDensity); + atxt = checkMinMaxI(edtEggsCapsulesDensity,0,1000) + " \"" + getResources().getString(R.string.Egg_pods_density_m2) + "\"!"; + eFields = true; + } + } + // кубышки(плотность на м2) до + if(isGONE(edtEggsCapsulesDensityTo)) edtEggsCapsulesDensityTo.setText(null); + if(!eFields && !isGONE(edtEggsCapsulesDensityTo) && edtEggsCapsulesDensityTo.getText().toString().equals("")) + { + if(edtEggsCapsulesDensityTo.getText().toString().equals("")) + { + scrollTo(edtEggsCapsulesDensityTo); + atxt = atxt + ": \"" + getResources().getString(R.string.Egg_pods_density_m2) + " "+ getResources().getString(R.string.to) + "\"!"; + eFields = true; + }else + if(checkMinMaxI(edtEggsCapsulesDensityTo,0,5000)!="") + { + scrollTo(edtEggsCapsulesDensityTo); + atxt = checkMinMaxI(edtEggsCapsulesDensityTo,0,5000) + " \"" + getResources().getString(R.string.Egg_pods_density_m2) + " "+ getResources().getString(R.string.to) + "\"!"; + eFields = true; + } + } + // яйца(в среднем в кубышке) + if(isGONE(edtEggsCapsules)) edtEggsCapsules.setText(null); + if(!eFields && !isGONE(edtEggsCapsules)) + { + if(checkMinMaxI(edtEggsCapsules,0,150)!="") + { + scrollTo(edtEggsCapsules); + atxt = checkMinMaxI(edtEggsCapsules,0,150) + " \"" + getResources().getString(R.string.Eggs_average_number_egg_pod) + "\"!"; + eFields = true; + } + } + // яйца(% жизнеспособных) + if(isGONE(edtEggsLive)) edtEggsLive.setText(null); + if(!eFields && !isGONE(edtEggsLive)) + { + if(edtEggsLive.getText().toString().equals("")) + { + scrollTo(edtEggsLive); + atxt = atxt + ": \"" + getResources().getString(R.string.Eggs_viable) + "\"!"; + eFields = true; + }else + if(checkMinMaxI(edtEggsLive,0,100)!="") + { + scrollTo(edtEggsLive); + atxt = checkMinMaxI(edtEggsLive,0,100) + " \"" + getResources().getString(R.string.Eggs_viable) + "\"!"; + eFields = true; + } + } + // Естественные враги + if(isGONE(spiEggsEnemies)) ((selectDB)spiEggsEnemies).setValue(null); + if(!eFields && !isGONE(spiEggsEnemies) && ((selectDB)spiEggsEnemies).getText().toString().equals("")) + { + scrollTo(spiEggsEnemies); + atxt = atxt + ": \"" + getResources().getString(R.string.Natural_enemies) + "\"!"; + eFields = true; + } + // отрождение + if(isGONE(spiLarvaBorn)) ((selectDB)spiLarvaBorn).setValue(null); + if(!eFields && !isGONE(spiLarvaBorn) && ((selectDB)spiLarvaBorn).getText().toString().equals("")) + { + scrollTo(spiLarvaBorn); + atxt = atxt + ": \"" + getResources().getString(R.string.Hatching) + "\"!"; + eFields = true; + } + // возраста: Младшие Средние Старшие + if(isGONE(spiLarvaAge)) ((selectDB)spiLarvaAge).setValue(null); + if(!eFields && !isGONE(spiLarvaAge) && ((selectDB)spiLarvaAge).getText().toString().equals("")) + { + scrollTo(spiLarvaAge); + atxt = atxt + ": \"" + getResources().getString(R.string.Hopper_stages) + "\"!"; + eFields = true; + } + //Фаза окраска(одиночнаяS, перехoдная Т, стаднаяG) + //if(isGONE(spiLarvaAge)) spiLarvaAge.setValue(null); земем это было здесь? + + // поведение(�?золир., Разреженные, Группы) + if(isGONE(spiLarvaBehavior)) ((selectDB)spiLarvaBehavior).setValue(null); + if(!eFields && !isGONE(spiLarvaBehavior) && ((selectDB)spiLarvaBehavior).getText().toString().equals("")) + { + scrollTo(spiLarvaBehavior); + atxt = atxt + ": \"" + getResources().getString(R.string.Spatial_distribution) + "\"!"; + eFields = true; + } + // плотность на м2 + if(isGONE(edtLarvaDensity)) edtLarvaDensity.setText(null); + if(!eFields && !isGONE(edtLarvaDensity)) + { + if(edtLarvaDensity.getText().toString().equals("")) + { + scrollTo(edtLarvaDensity); + atxt = atxt + ": \"" + getResources().getString(R.string.Hopper_density_m2) + "\"!"; + eFields = true; + }else + if(checkMinMaxI(edtLarvaDensity,0,80000)!="") + { + scrollTo(edtLarvaDensity); + atxt = checkMinMaxI(edtLarvaDensity,0,80000) + " \"" + getResources().getString(R.string.Hopper_density_m2) + "\"!"; + eFields = true; + } + } + // Плотность на м2 + if(isGONE(edtLarvaDensityTo)) edtLarvaDensityTo.setText(null); + if(!eFields && !isGONE(edtLarvaDensityTo) && edtLarvaDensityTo.getText().toString().equals("")) + { + scrollTo(edtLarvaDensityTo); + atxt = atxt + ": \"" + getResources().getString(R.string.Hopper_density_m2) + "" + getResources().getString(R.string.to) + "\"!"; + eFields = true; + } + //************************************************** + // плотн. в кулиге(на м2) + if(isGONE(edtKuliguliDensity)) edtKuliguliDensity.setText(null); + if(!eFields && !isGONE(edtKuliguliDensity)) + { + if(edtKuliguliDensity.getText().toString().equals("")) + { + scrollTo(edtKuliguliDensity); + atxt = atxt + ": \"" + getResources().getString(R.string.Minimum_density_in_the_band_in_m2) + "\"!"; + eFields = true; + }else + if(checkMinMaxI(edtKuliguliDensity,0,80000)!="") + { + scrollTo(edtKuliguliDensity); + atxt = checkMinMaxI(edtKuliguliDensity,0,80000) + " \"" + getResources().getString(R.string.Minimum_density_in_the_band_in_m2) + "\"!"; + eFields = true; + } + } + // плотн. в кулиге(на м2) до + if(isGONE(edtKuliguliDensityTo)) edtKuliguliDensityTo.setText(null); + if(!eFields && !isGONE(edtKuliguliDensityTo)) + { + if(edtKuliguliDensityTo.getText().toString().equals("")) + { + scrollTo(edtKuliguliDensityTo); + atxt = atxt + ": \"" + getResources().getString(R.string.Minimum_density_in_the_band_in_m2) + " " + getResources().getString(R.string.to) + "\"!"; + eFields = true; + }else + if(checkMinMaxI(edtKuliguliDensityTo,0,80000)!="") + { + scrollTo(edtKuliguliDensityTo); + atxt = checkMinMaxI(edtKuliguliDensityTo,0,80000) + " \"" + getResources().getString(R.string.Minimum_density_in_the_band_in_m2) + " " + getResources().getString(R.string.to) + "\"!"; + eFields = true; + } + } + // размер кулиг(га) + if(isGONE(edtKuliguliSize)) edtKuliguliSize.setText(null); + if(!eFields && !isGONE(edtKuliguliSize)) + { + if(edtKuliguliSize.getText().toString().equals("")) + { + scrollTo(edtKuliguliSize); + atxt = atxt + ": \"" + getResources().getString(R.string.Band_sizes_m2) + "\"!"; + eFields = true; + }else + if(checkMinMaxI(edtKuliguliSize,0,10000)!="") + { + scrollTo(edtKuliguliSize); + atxt = checkMinMaxI(edtKuliguliSize,0,10000) + " \"" + getResources().getString(R.string.Band_sizes_m2) + "\"!"; + eFields = true; + } + } + // число кулиг + if(isGONE(edtKuliguliCount)) edtKuliguliCount.setText(null); + if(!eFields && !isGONE(edtKuliguliCount)) + { + /*if(edtKuliguliCount.getText().toString().equals("")) + { + scrollTo(edtKuliguliCount); + atxt = atxt + ": \"" + getResources().getString(R.string.Number_of_bands_ha) + "\"!"; + eFields = true; + }else*/ + if(checkMinMaxI(edtKuliguliCount,1,50)!="") + { + scrollTo(edtKuliguliCount); + atxt = checkMinMaxI(edtKuliguliCount,1,50) + " \"" + getResources().getString(R.string.Number_of_bands) + "\"!"; + eFields = true; + } + } + // поведение: миграция, кормёжка, отдых + if(isGONE(spiKuliguliAction)) ((selectDB)spiKuliguliAction).setValue(null); + if(!eFields && !isGONE(spiKuliguliAction) && ((selectDB)spiKuliguliAction).getText().toString().equals("")) + { + scrollTo(spiKuliguliAction); + atxt = atxt + ": \"" + getResources().getString(R.string.Action) + "\"!"; + eFields = true; + } + // возраста: Младшие Средние Старшие + if(isGONE(spiKuliguliAge)) ((selectDB)spiKuliguliAge).setValue(null); + if(!eFields && !isGONE(spiKuliguliAge) && ((selectDB)spiKuliguliAge).getText().toString().equals("")) + { + scrollTo(spiKuliguliAge); + atxt = atxt + ": \"" + getResources().getString(R.string.Hopper_stages) + "\"!"; + eFields = true; + } + //************************************************** + // окрыление(начало, массовое) + if(isGONE(spiImagoWing)) ((selectDB)spiImagoWing).setValue(null); + if(!eFields && !isGONE(spiImagoWing) && ((selectDB)spiImagoWing).getText().toString().equals("")) + { + scrollTo(spiImagoWing); + atxt = atxt + ": \"" + getResources().getString(R.string.Fledging) + "\"!"; + eFields = true; + } + // половозрелость(- или+) + if(isGONE(spiImagoMaturity)) ((selectDB)spiImagoMaturity).setValue(null); + if(!eFields && !isGONE(spiImagoMaturity) && ((selectDB)spiImagoMaturity).getText().toString().equals("")) + { + scrollTo(spiImagoMaturity); + atxt = atxt + ": \"" + getResources().getString(R.string.Maturity) + "\"!"; + eFields = true; + } + // фаза(одиночнаяS, перехoдная Т, стаднаяG) + if(isGONE(spiImagoPhase)) ((selectDB)spiImagoPhase).setValue(null); + if(!eFields && !isGONE(spiImagoPhase) && ((selectDB)spiImagoPhase).getText().toString().equals("")) + { + scrollTo(spiImagoPhase); + atxt = atxt + ": \"" + getResources().getString(R.string.Phase) + "\"!"; + eFields = true; + } + // поведение(�?золир., Разреженные, Группы) + if(isGONE(spiImagoAction)) ((selectDB)spiImagoAction).setValue(null); + if(!eFields && !isGONE(spiImagoAction) && ((selectDB)spiImagoAction).getText().toString().equals("")) + { + scrollTo(spiImagoAction); + atxt = atxt + ": \"" + getResources().getString(R.string.Spatial_distribution) + "\"!"; + eFields = true; + } + // плотность(на трансекту или га) + if(isGONE(edtImagoDensity)) edtImagoDensity.setText(null); + if(!eFields && !isGONE(edtImagoDensity)) + { + if(edtImagoDensity.getText().toString().equals("")) + { + scrollTo(edtImagoDensity); + atxt = atxt + ": \"" + getResources().getString(R.string.Adult_density_m2) + "\"!"; + eFields = true; + }else + if(checkMinMaxI(edtImagoDensity,0,3000)!="") + { + scrollTo(edtImagoDensity); + atxt = checkMinMaxI(edtImagoDensity,0,3000) + " \"" + getResources().getString(R.string.Adult_density_m2) + "\"!"; + eFields = true; + } + } + // плотность на га + if(isGONE(edtImagoDensityGa)) edtImagoDensityGa.setText(null); + if(!eFields && !isGONE(edtImagoDensityGa)) + { + if(checkMinMaxI(edtImagoDensityGa,0,50000)!="") + { + scrollTo(edtImagoDensityGa); + atxt = checkMinMaxI(edtImagoDensityGa,0,50000) + " \"" + getResources().getString(R.string.Adult_density_ha) + "\"!"; + eFields = true; + } + } + //Питание и размещение на растениях + if(isGONE(spiImagoFeeding)) ((selectDB)spiImagoFeeding).setValue(null); + if(!eFields && !isGONE(spiImagoFeeding) && ((selectDB)spiImagoFeeding).getText().toString().equals("")) + { + scrollTo(spiImagoFeeding); + atxt = atxt + ": \"" + getResources().getString(R.string.Feeding_and_roosting) + "\"!"; + eFields = true; + } + // спаривание (да,нет) + if(isGONE(spiImagoCopulation)) ((selectDB)spiImagoCopulation).setValue(null); + if(!eFields && !isGONE(spiImagoCopulation) && ((selectDB)spiImagoCopulation).getText().toString().equals("")) + { + scrollTo(spiImagoCopulation); + atxt = atxt + ": \"" + getResources().getString(R.string.Copulating) + "\"!"; + eFields = true; + } + // яйцекладка (да,нет) + if(isGONE(spiImagolaying)) ((selectDB)spiImagolaying).setValue(null); + if(!eFields && !isGONE(spiImagolaying) && ((selectDB)spiImagolaying).getText().toString().equals("")) + { + scrollTo(spiImagolaying); + atxt = atxt + ": \"" + getResources().getString(R.string.Laying) + "\"!"; + eFields = true; + } + // полёты(- или+) + if(isGONE(spiImagoFlying)) ((selectDB)spiImagoFlying).setValue(""); + if(!eFields && !isGONE(spiImagoFlying) && ((selectDB)spiImagoFlying).getText().toString().equals("")) + { + scrollTo(spiImagoFlying); + atxt = atxt + ": \"" + getResources().getString(R.string.Flying) + "\"!"; + eFields = true; + } + //************************************************** + //Половозрелость + if (isGONE(spiSwarmMaturity)) ((selectDB)spiSwarmMaturity).setValue(null); + if (!eFields && !isGONE(spiSwarmMaturity) && ((selectDB)spiSwarmMaturity).getText().toString().equals("")) { + scrollTo(spiSwarmMaturity); + atxt = atxt + ": \"" + getResources().getString(R.string.Maturity) + "\"!"; + eFields = true; + } + //Плотность в стае + if (isGONE(spiSwarmDensity)) ((selectDB)spiSwarmDensity).setValue(null); + if (!eFields && !isGONE(spiSwarmDensity) && ((selectDB)spiSwarmDensity).getText().toString().equals("")) { + scrollTo(spiSwarmDensity); + atxt = atxt + ": \"" + getResources().getString(R.string.Density_of_swarm) + "\"!"; + eFields = true; + } + //Размер стаи + if (isGONE(edtSwarmSize)) edtSwarmSize.setText(null); + if (!eFields && !isGONE(edtSwarmSize)) { + if (checkMinMaxI(edtSwarmSize, 0, 100000) != "") { + scrollTo(edtSwarmSize); + atxt = checkMinMaxI(edtSwarmSize, 0, 100000) + " \"" + getResources().getString(R.string.Swarm_size_ha) + "\"!"; + eFields = true; + } + } + //Число стай + if (isGONE(edtSwarmCount)) edtSwarmCount.setText(null); + if (!eFields && !isGONE(edtSwarmCount)) { + if (checkMinMaxI(edtSwarmCount, 0, 10) != "") { + scrollTo(edtSwarmCount); + atxt = checkMinMaxI(edtSwarmCount, 0, 10) + " \"" + getResources().getString(R.string.Number_of_swarms) + "\"!"; + eFields = true; + } + } + // полёт(направление, время пролёта) + if (isGONE(spiSwarmFlying)) ((selectDB)spiSwarmFlying).setValue(null); + // высота(Низкая- Средняя- Высокая) + if (isGONE(spiSwarmHeight)) ((selectDB)spiSwarmHeight).setValue(null); + + + if(eFields) //Если не заполнены все обязательные поля + { + m_Filled.setValue("0"); + + AlertDialog.Builder adb = new AlertDialog.Builder(this,R.style.AlertDialogTheme); + adb.setTitle(getString(R.string.Warning)); + + adb.setMessage(atxt+"\n" + getString(R.string.not_filled_fields)); + adb.setPositiveButton(getString(R.string.Yes), new DialogInterface.OnClickListener() + { + @Override + public void onClick(DialogInterface arg0, int arg1) + { + //Ничего не делаем + } + }); + adb.setNegativeButton(getString(R.string.No), new DialogInterface.OnClickListener() + { + @Override + public void onClick(DialogInterface arg0, int arg1) + { + //Сохраняем и выходим + String uid=guiTable.write(); //Добавляем либо сохраняем данные + saveLocations(uid); + + LocustActivity.this.finish(); // Закрываем форму + } + }); + AlertDialog ad = adb.show(); + ad.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(Color.BLACK); + ad.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(Color.BLACK); + + }else //Если все обязательные поля заполнены + { + m_Filled.setValue("1"); + String uid=guiTable.write(); //Добавляем либо сохраняем данные + saveLocations(uid); + + startService(new Intent(this, MainService.class).putExtra(MainService.PARAM_ACTION, "1")); // Чтоб вызвать событие таймера в сервисе + LocustActivity.this.finish(); // Закрываем форму + } + } + + //Сохраняем список координат в базу + public void saveLocations(String uid){ + if(uid==null) return; + DbOpenHelper dboh = new DbOpenHelper(LocustActivity.this); + dboh.getReadableDatabase().execSQL("delete from frmlocust_locations where frmlocust_uid=\'" + uid+"\'"); + ArrayList list = ((LatLonAdapter)latlonList.getAdapter()).latlonList; + for(int i=0;i a ? c >= a && c <= b : c >= b && c <= a; + } + + public String checkMinMaxI(EditText txt, double min, double max) + { + try{ + double input = Double.parseDouble(txt.getText().toString()); + if (isInRange(min, max, input)) + return ""; + else + return "MIN="+ Double.toString(min)+" MAX="+ Double.toString(max)+" !"; + } catch (NumberFormatException nfe) { } + return ""; + } + + @Override + protected void onCreate(Bundle savedInstanceState) + { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_locust_del); + + //Загрузка сохранёного языка + Tools.loadLocale(this); + + DbOpenHelper dboh; + Cursor cursor; + + Intent intent = getIntent(); + uid = intent.getStringExtra("uid"); // Параметр для Активити + + guiTable = new DBGUITable(this, "frmlocustdel"); + guiTable.add(uid, "uid"); + + Integer user_id = null; + /*DbOpenHelper dboh = new DbOpenHelper(this); + SQLiteDatabase db = dboh.getReadableDatabase(); + Cursor cursor = db.rawQuery("select id from _user where del=0;", null); + if (cursor.moveToFirst()) + { + user_id = Integer.valueOf(cursor.getInt(cursor.getColumnIndex("id"))); + } + cursor.close(); + dboh.close();*/ + guiTable.add(user_id, "user_id"); //Пользователя больше нет!!! + String device_id= Secure.getString(getContentResolver(), Secure.ANDROID_ID); + guiTable.add(device_id, "device_id"); //Идентификатор устройства + + List list; + ArrayAdapter dataAdapter; + + scrollView1 = (ScrollView) findViewById(R.id.scrollView1); + + guiTable.add(m_Filled, "filled"); + + edtImage1 = (EditText) findViewById(R.id.edtImage1); // Фото + guiTable.add(edtImage1, "image_name1"); + edtImage2 = (EditText) findViewById(R.id.edtImage2); // Фото + guiTable.add(edtImage2, "image_name2"); + edtImage3 = (EditText) findViewById(R.id.edtImage3); // Фото + guiTable.add(edtImage3, "image_name3"); + + spiCountry = findViewById(R.id.spiCountry); // страна + guiTable.add(spiCountry, "country_id"); + ((selectDB)spiCountry).addField("", ""); + // Выбираем страны и заполняем поля + dboh = new DbOpenHelper(this); + cursor = dboh.getReadableDatabase().rawQuery("select id, name from countries where del=0 order by name", null); + if (cursor.moveToFirst()) + { + do + { + ((selectDB)spiCountry).addField(cursor.getString(cursor.getColumnIndex("name")), cursor.getString(cursor.getColumnIndex("id"))); + } while (cursor.moveToNext()); + } + cursor.close(); + dboh.close(); + + // Чтоб при изменении страны обновлялся список регионов + ((selectDB)spiCountry).setOnChangeValueListener(new OnClickListener() + { + @Override + public void onClick(View v) + { + ((selectDB)spiRegion).clearFields(); + ((selectDB)spiRegion).addField("", ""); + + if(((selectDB)spiCountry).getValue() != null && ((selectDB)spiCountry).getValue() != "") + { + DbOpenHelper dboh = new DbOpenHelper(LocustDelActivity.this); + Cursor cursor = dboh.getReadableDatabase().rawQuery( + "select id, name from countriesregions where del=0 and country_id=" + ((selectDB)spiCountry).getValue() + " order by name", null); + if (cursor.moveToFirst()) + { + do + { + ((selectDB)spiRegion).addField(cursor.getString(cursor.getColumnIndex("name")), + cursor.getString(cursor.getColumnIndex("id"))); + } while (cursor.moveToNext()); + } + cursor.close(); + dboh.close(); + } + } + }); + + spiRegion = findViewById(R.id.spiRegion); // Регион + guiTable.add(spiRegion, "region_id"); + + edtArea = (EditText) findViewById(R.id.edtArea); // Район + guiTable.add(edtArea, "area"); + edtDistrict = (EditText) findViewById(R.id.edtDistrict); + guiTable.add(edtDistrict, "district"); + + edtVillage = (EditText) findViewById(R.id.edtVillage); // Название местности либо урочища + guiTable.add(edtVillage, "village"); + edtTerrain = (EditText) findViewById(R.id.edtTerrain); // Название местности либо урочища + guiTable.add(edtTerrain, "terrain"); + + edtObserver = (EditText) findViewById(R.id.edtObserver); + guiTable.add(edtObserver, "observer"); + edtDate = (EditText) findViewById(R.id.edtDate); // Должна быть уникальной + guiTable.add(edtDate, "date"); + + View btnGetDate = (View) findViewById(R.id.btnGetDate); + View.OnClickListener clk0 = new View.OnClickListener() { + public void onClick(View v) + { + DatePickerDialog.OnDateSetListener myDateListener = new DatePickerDialog.OnDateSetListener() { + @Override + public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) + { + + //SimpleDateFormat format = new SimpleDateFormat("dd.MM.yyyy HH:mm"); + //format.setTimeZone(TimeZone.getTimeZone("UTC")); + //LocustDelActivity.this.edtDate.setText(format.format(curDateTime)); + + //Теперь выбираем время + OnTimeSetListener myDateListener = new OnTimeSetListener() { + @Override + public void onTimeSet(TimePicker view, int hourOfDay, int minute) + { + long val = Long.parseLong(((fieldDB)LocustDelActivity.this.edtDate).getValue()); + val += (hourOfDay*60+minute)*60; + ((fieldDB)LocustDelActivity.this.edtDate).setValue(String.valueOf(val)); + } + }; + + if(((fieldDB)LocustDelActivity.this.edtDate).getValue()!=null && !((fieldDB)LocustDelActivity.this.edtDate).getValue().equals("")) + { + Date time = new Date(Long.parseLong(((fieldDB)LocustDelActivity.this.edtDate).getValue())*1000); + Calendar myCal = new GregorianCalendar(); + myCal.setTime(time); + int hour = myCal.get(Calendar.HOUR_OF_DAY); + int minute = myCal.get(Calendar.MINUTE); + TimePickerDialog tpd = new TimePickerDialog(LocustDelActivity.this, R.style.AlertDialogTheme, myDateListener, hour, minute, true); + tpd.show(); + }else + { + final Calendar myCal = Calendar.getInstance(); + int hour = myCal.get(Calendar.HOUR_OF_DAY); + int minute = myCal.get(Calendar.MINUTE); + TimePickerDialog tpd = new TimePickerDialog(LocustDelActivity.this, R.style.AlertDialogTheme, myDateListener, hour, minute, true); + tpd.show(); + } + + Date date = new Date(year-1900, monthOfYear, dayOfMonth); + ((fieldDB)LocustDelActivity.this.edtDate).setValue(String.valueOf(date.getTime()/1000)); + + + } + }; + + if(!LocustDelActivity.this.edtDate.getText().toString().equals("")) + { + Date date=null; + SimpleDateFormat format = new SimpleDateFormat("dd.MM.yyyy HH:mm"); + //format.setTimeZone(TimeZone.getTimeZone("UTC")); + try { + date = format.parse(LocustDelActivity.this.edtDate.getText().toString()); + } catch (ParseException e) { + e.printStackTrace(); + } + if(date!=null) + { + Calendar myCal = new GregorianCalendar(); + myCal.setTime(date); + int day = myCal.get(Calendar.DAY_OF_MONTH); + int month = myCal.get(Calendar.MONTH); + int year = myCal.get(Calendar.YEAR); + DatePickerDialog dpd = new DatePickerDialog(LocustDelActivity.this, R.style.AlertDialogTheme, myDateListener, year, month, day); + dpd.show(); + } + }else + { + final Calendar c = Calendar.getInstance(); + int year = c.get(Calendar.YEAR); + int month = c.get(Calendar.MONTH); + int day = c.get(Calendar.DAY_OF_MONTH); + + DatePickerDialog dpd = new DatePickerDialog(LocustDelActivity.this, R.style.AlertDialogTheme, myDateListener, year, month, day); + dpd.show(); + } + } + }; + btnGetDate.setOnClickListener(clk0); + + edtTimeZone = (EditText) findViewById(R.id.edtTimeZone); + guiTable.add(edtTimeZone,"timezone"); + + edtLatCenter = (EditText) findViewById(R.id.edtLatCenter); // Широта + guiTable.add(edtLatCenter, "lat_center"); + edtLonCenter = (EditText) findViewById(R.id.edtLonCenter); // Долгота + guiTable.add(edtLonCenter, "lon_center"); + + ArrayList latlon = new ArrayList(); + if(latlon.size()==0){ + latlon.add(new LatLon(0, 0)); + } + latlonList = findViewById(R.id.latlonList); + LatLonAdapter adapter = new LatLonAdapter(this, R.layout.list_lat_lon, latlon, this, latlonList); + latlonList.setAdapter(adapter); + adapter.clc=new OnClickListener() { + @Override + public void onClick(View view) { + Tools.setListViewHeightBasedOnItems(LocustDelActivity.this.latlonList); + } + }; + + edtInfestedArea = (EditText) findViewById(R.id.edtInfestedArea); // заселенная площадь(га) + guiTable.add(edtInfestedArea, "infested_area"); + edtTreatedArea = (EditText) findViewById(R.id.edtTreatedArea); // обработанная площадь(га) + guiTable.add(edtTreatedArea, "treated_area"); + + spiVegType = findViewById(R.id.spiVegType); // Тип(Дикая, Культурная) + guiTable.add(spiVegType, "vegetation_type_id"); + ((selectDB)spiVegType).addField("", ""); + dboh = new DbOpenHelper(this); + cursor = dboh + .getReadableDatabase() + .rawQuery( + "select d.id, COALESCE((SELECT translation FROM _translations t JOIN _languages l ON t.language_id=l.id WHERE t.del = 0 AND identifier = d.name AND l.short_name='" + + Tools.getLang() + "' LIMIT 1),d.name) name from list_vegetation d where d.del=0 order by d.sort, d.name", null); + if (cursor.moveToFirst()) + { + do + { + ((selectDB)spiVegType).addField(cursor.getString(cursor.getColumnIndex("name")), cursor.getString(cursor.getColumnIndex("id"))); + } while (cursor.moveToNext()); + } + cursor.close(); + dboh.close(); + + edtVegHeight = (EditText) findViewById(R.id.edtVegHeight); // Высота (м) + guiTable.add(edtVegHeight, "vegetation_height"); + + spiVegCover = findViewById(R.id.spiVegCover); // Густота растительного покрова(%) + guiTable.add(spiVegCover, "vegetation_cover_id"); + ((selectDB)spiVegCover).addField("", ""); + dboh = new DbOpenHelper(this); + cursor = dboh + .getReadableDatabase() + .rawQuery( + "select d.id, COALESCE((SELECT translation FROM _translations t JOIN _languages l ON t.language_id=l.id WHERE t.del = 0 AND identifier = d.name AND l.short_name='" + + Tools.getLang() + "' LIMIT 1),d.name) name from list_cover d where d.del=0 order by d.sort, d.name", null); + if (cursor.moveToFirst()) + { + do + { + ((selectDB)spiVegCover).addField(cursor.getString(cursor.getColumnIndex("name")), cursor.getString(cursor.getColumnIndex("id"))); + } while (cursor.moveToNext()); + } + cursor.close(); + dboh.close(); + + edtVegCrop = (EditText) findViewById(R.id.edtVegCrop); // Перечисление культур + guiTable.add(edtVegCrop, "vegetation_crop"); + + spiVegDamage = findViewById(R.id.spiVegDamage); // Повреждения растительного покрова(%) + guiTable.add(spiVegDamage, "vegetation_damage"); + ((selectDB)spiVegDamage).addField("", ""); + // Выбираем страны и заполняем поля + dboh = new DbOpenHelper(this); + cursor = dboh + .getReadableDatabase() + .rawQuery( + "select d.id, COALESCE((SELECT translation FROM _translations t JOIN _languages l ON t.language_id=l.id WHERE t.del = 0 AND identifier = d.name AND l.short_name='" + + Tools.getLang() + "' LIMIT 1),d.name) name from list_damage d where d.del=0 order by d.sort, d.name", null); + if (cursor.moveToFirst()) + { + do + { + ((selectDB)spiVegDamage).addField(cursor.getString(cursor.getColumnIndex("name")), cursor.getString(cursor.getColumnIndex("id"))); + } while (cursor.moveToNext()); + } + cursor.close(); + dboh.close(); + + edtVegDamageArea = (EditText) findViewById(R.id.edtVegDamageArea); // Площядь повреждения + guiTable.add(edtVegDamageArea, "vegetation_damage_area"); + + edtInsName = (EditText) findViewById(R.id.edtInsName); // коммерческое название + guiTable.add(edtInsName, "insecticide_name"); + edtInsActiveSubstance = (EditText) findViewById(R.id.edtInsActiveSubstance); // Наименование активного вещества отравы + guiTable.add(edtInsActiveSubstance, "insecticide_active_substance"); + edtInsConcentration = (EditText) findViewById(R.id.edtInsConcentration); // концентрация(г д.в./л или%) + guiTable.add(edtInsConcentration, "insecticide_concentration"); + //edtInsConcentration.setFilters(new InputFilter[] { new InputFilterMinMax("0", "100") }); потому что текст + + spiInsFormulation = findViewById(R.id.spiInsFormulation); // формуляция(УМО, КЭ, др.) + guiTable.add(spiInsFormulation, "insecticide_formulation_id"); + ((selectDB)spiInsFormulation).addField("", ""); + // Выбираем страны и заполняем поля + dboh = new DbOpenHelper(this); + cursor = dboh + .getReadableDatabase() + .rawQuery( + "select d.id, COALESCE((SELECT translation FROM _translations t JOIN _languages l ON t.language_id=l.id WHERE t.del = 0 AND identifier = d.name AND l.short_name='" + + Tools.getLang() + "' LIMIT 1),d.name) name from list_formulation d where d.del=0 order by d.sort, d.name", null); + if (cursor.moveToFirst()) + { + do + { + ((selectDB)spiInsFormulation).addField(cursor.getString(cursor.getColumnIndex("name")), cursor.getString(cursor.getColumnIndex("id"))); + } while (cursor.moveToNext()); + } + cursor.close(); + dboh.close(); + + edtInsDose = (EditText) findViewById(R.id.edtInsDose); // норма расхода(л/га) + guiTable.add(edtInsDose, "insecticide_dose"); + edtInsRate = (EditText) findViewById(R.id.edtInsRate); // расход рабочей жидкости(л/га) + guiTable.add(edtInsRate, "insecticide_rate"); + + /* + * edtInsExpiryDate = (DateInput) findViewById(R.id.edtInsExpiryDate); // окончание срока годности (дата) guiTable.add(edtInsExpiryDate,"insecticide_expiry_date"); edtInsExpiryDate.setVisibleDMY("my"); //Кроме дня + * + * spiInsMixed = findViewById(R.id.spiInsMixed); // смешивается ли инсектицид с водой или растворителем? guiTable.add(spiInsMixed,"insecticide_mixed"); spiInsMixed.addField(this, "", ""); spiInsMixed.addField(this, getString(R.string.Yes),"1"); spiInsMixed.addField(this, getString(R.string.No),"0"); + * + * edtInsMixedName = (EditText) findViewById(R.id.edtInsMixedName); guiTable.add(edtInsMixedName,"insecticide_mixed_name"); edtInsMixedRatio = (EditText) findViewById(R.id.edtInsMixedRatio); // если да, то в каком соотношении (%) guiTable.add(edtInsMixedRatio,"insecticide_mixed_ratio"); edtInsMixedRatio.setFilters(new InputFilter[]{ new InputFilterMinMax("0", "100")}); + */ + edtInsUsedVolume = (EditText) findViewById(R.id.edtInsUsedVolume); // Общий объем использованной рабочей жидкости (л) + guiTable.add(edtInsUsedVolume, "insecticide_used_volume"); + edtInsNumberSpores = (EditText) findViewById(R.id.edtInsNumberSpores); // Концентрация спор (/мл) + guiTable.add(edtInsNumberSpores, "insecticide_number_spores"); + + spiWeaTimeStart = findViewById(R.id.spiWeaTimeStart); // время начала + guiTable.add(spiWeaTimeStart, "weather_time_start"); + ((selectDB)spiWeaTimeStart).addField("", ""); + for (int i = 0; i < 24; i++) { + ((selectDB) spiWeaTimeStart).addField(String.valueOf(i), String.valueOf(i)+".0"); + } + spiWeaTimeEnd = findViewById(R.id.spiWeaTimeEnd); // время окончания + guiTable.add(spiWeaTimeEnd, "weather_time_end"); + ((selectDB)spiWeaTimeEnd).addField("", ""); + for (int i = 0; i < 24; i++) { + ((selectDB) spiWeaTimeEnd).addField(String.valueOf(i), String.valueOf(i)+".0"); + } + edtWeaTemperatureStart = (EditText) findViewById(R.id.edtWeaTemperatureStart); // Температура нач.(°C) + guiTable.add(edtWeaTemperatureStart, "weather_temperature_start"); + edtWeaTemperatureEnd = (EditText) findViewById(R.id.edtWeaTemperatureEnd); // Температура кон.(°C) + guiTable.add(edtWeaTemperatureEnd, "weather_temperature_end"); + edtWeaHumidityStart = (EditText) findViewById(R.id.edtWeaHumidityStart); // отн. влажность воздуха нач.(%) + guiTable.add(edtWeaHumidityStart, "weather_humidity_start"); + //edtWeaHumidityStart.setFilters(new InputFilter[] { new InputFilterMinMax("0", "100") }); + + edtWeaHumidityEnd = (EditText) findViewById(R.id.edtWeaHumidityEnd); // отн. влажность воздуха кон.(%) + guiTable.add(edtWeaHumidityEnd, "weather_humidity_end"); + //edtWeaHumidityEnd.setFilters(new InputFilter[] { new InputFilterMinMax("0", "100") }); + + edtWeaWindSpeedStart = (EditText) findViewById(R.id.edtWeaWindSpeedStart); // скорость ветра нач. (м/с) + guiTable.add(edtWeaWindSpeedStart, "weather_wind_speed_start"); + edtWeaWindSpeedEnd = (EditText) findViewById(R.id.edtWeaWindSpeedEnd); // скорость ветра кон. (м/с) + guiTable.add(edtWeaWindSpeedEnd, "weather_wind_speed_end"); + + spiWindDirectionStart = findViewById(R.id.spiWindDirectionStart); // направление ветра нач. + guiTable.add(spiWindDirectionStart, "weather_direction_start"); + ((selectDB)spiWindDirectionStart).addField("", ""); + dboh = new DbOpenHelper(this); + + cursor = dboh + .getReadableDatabase() + .rawQuery( + "select d.id, COALESCE((SELECT translation FROM _translations t JOIN _languages l ON t.language_id=l.id WHERE t.del = 0 AND identifier = d.name AND l.short_name='" + + Tools.getLang() + "' LIMIT 1),d.name) name, degree from list_directions d where d.del=0 order by d.degree", null); + if (cursor.moveToFirst()) + { + do + { + ((selectDB)spiWindDirectionStart).addField(cursor.getString(cursor.getColumnIndex("name")), cursor.getString(cursor.getColumnIndex("id"))); + } while (cursor.moveToNext()); + } + cursor.close(); + dboh.close(); + + spiWindDirectionEnd = findViewById(R.id.spiWindDirectionEnd); // направление ветра кон. + guiTable.add(spiWindDirectionEnd, "weather_direction_end"); + ((selectDB)spiWindDirectionEnd).addField("", ""); + dboh = new DbOpenHelper(this); + cursor = dboh + .getReadableDatabase() + .rawQuery( + "select d.id, COALESCE((SELECT translation FROM _translations t JOIN _languages l ON t.language_id=l.id WHERE t.del = 0 AND identifier = d.name AND l.short_name='" + + Tools.getLang() + "' LIMIT 1),d.name) name, degree from list_directions d where d.del=0 order by d.degree", null); + if (cursor.moveToFirst()) + { + do + { + ((selectDB)spiWindDirectionEnd).addField(cursor.getString(cursor.getColumnIndex("name")), cursor.getString(cursor.getColumnIndex("id"))); + } while (cursor.moveToNext()); + } + cursor.close(); + dboh.close(); + + spiSprayDirectionStart = findViewById(R.id.spiSprayDirectionStart); // направление опрыскивания нач. + guiTable.add(spiSprayDirectionStart, "weather_spray_direction_start"); + ((selectDB)spiSprayDirectionStart).addField("", ""); + dboh = new DbOpenHelper(this); + cursor = dboh + .getReadableDatabase() + .rawQuery( + "select d.id, COALESCE((SELECT translation FROM _translations t JOIN _languages l ON t.language_id=l.id WHERE t.del = 0 AND identifier = d.name AND l.short_name='" + + Tools.getLang() + "' LIMIT 1),d.name) name, d.degree from list_directions d where d.del=0 and d.degree>=0 order by d.degree", + null); + if (cursor.moveToFirst()) + { + do + { + ((selectDB)spiSprayDirectionStart).addField(cursor.getString(cursor.getColumnIndex("name")), cursor.getString(cursor.getColumnIndex("id"))); + } while (cursor.moveToNext()); + } + cursor.close(); + dboh.close(); + + spiSprayDirectionEnd = findViewById(R.id.spiSprayDirectionEnd); // направление опрыскивания кон. + guiTable.add(spiSprayDirectionEnd, "weather_spray_direction_end"); + ((selectDB)spiSprayDirectionEnd).addField("", ""); + dboh = new DbOpenHelper(this); + cursor = dboh + .getReadableDatabase() + .rawQuery( + "select d.id, COALESCE((SELECT translation FROM _translations t JOIN _languages l ON t.language_id=l.id WHERE t.del = 0 AND identifier = d.name AND l.short_name='" + + Tools.getLang() + "' LIMIT 1),d.name) name, degree from list_directions d where d.del=0 and d.degree>=0 order by d.degree", + null); + if (cursor.moveToFirst()) + { + do + { + ((selectDB)spiSprayDirectionEnd).addField(cursor.getString(cursor.getColumnIndex("name")), cursor.getString(cursor.getColumnIndex("id"))); + } while (cursor.moveToNext()); + } + cursor.close(); + dboh.close(); + + // locuststypes + spiLocSpeciese = findViewById(R.id.spiLocSpeciese); + guiTable.add(spiLocSpeciese, "locust_type_id"); + ((selectDB)spiLocSpeciese).addField("", ""); + dboh = new DbOpenHelper(this); + cursor = dboh + .getReadableDatabase() + .rawQuery( + "select lt.id, COALESCE((SELECT translation FROM _translations t JOIN _languages l ON t.language_id=l.id WHERE t.del = 0 AND identifier = lt.name AND l.short_name='" + + Tools.getLang() + "' LIMIT 1),lt.name) name from LocustsTypes lt where lt.del=0 order by lt.sort,lt.name", null); + if (cursor.moveToFirst()) + { + do + { + ((selectDB)spiLocSpeciese).addField(cursor.getString(cursor.getColumnIndex("name")), cursor.getString(cursor.getColumnIndex("id"))); + } while (cursor.moveToNext()); + } + cursor.close(); + dboh.close(); + + spiLocHoppers = findViewById(R.id.spiLocHoppers); // Стадии личинок + guiTable.add(spiLocHoppers, "locust_hoppers_id"); + ((selectDB)spiLocHoppers).addField("", ""); + dboh = new DbOpenHelper(this); + cursor = dboh + .getReadableDatabase() + .rawQuery( + "select lt.id, COALESCE((SELECT translation FROM _translations t JOIN _languages l ON t.language_id=l.id WHERE t.del = 0 AND identifier = lt.name AND l.short_name='" + + Tools.getLang() + "' LIMIT 1),lt.name) name from list_age lt where lt.del=0 order by lt.sort,lt.name", null); + if (cursor.moveToFirst()) + { + do + { + ((selectDB)spiLocHoppers).addField(cursor.getString(cursor.getColumnIndex("name")), cursor.getString(cursor.getColumnIndex("id"))); + } while (cursor.moveToNext()); + } + cursor.close(); + dboh.close(); + + /* + * list = new ArrayList(); list.add(""); list.add(getString(R.string.Younger)); // Младшие list.add(getString(R.string.Middle)); // Средние list.add(getString(R.string.Senior)); // Старшие list.add(getString(R.string.Adult)); // Имаго + * + * dataAdapter = new ArrayAdapter(this, android.R.layout.simple_spinner_item, list); dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spiLocHoppers.setAdapter(dataAdapter); + */ + + spiImago = findViewById(R.id.spiImago); // Стаи (да, нет) + guiTable.add(spiImago, "locust_imago"); + ((selectDB)spiImago).addField("", ""); + ((selectDB)spiImago).addField(getString(R.string.Have), "1"); + ((selectDB)spiImago).addField(getString(R.string.No), "0"); + + edtLocDensity = (EditText) findViewById(R.id.edtLocDensity); // плотность на м2 + guiTable.add(edtLocDensity, "locust_density"); + + spiKuliguli = findViewById(R.id.spiKuliguli); // Кулиги (да, нет) + guiTable.add(spiKuliguli, "locust_kuliguli"); + ((selectDB)spiKuliguli).addField("", ""); + ((selectDB)spiKuliguli).addField(getString(R.string.Have), "1"); + ((selectDB)spiKuliguli).addField(getString(R.string.No), "0"); + + spiSwarm = findViewById(R.id.spiSwarm); // Стаи (да, нет) + guiTable.add(spiSwarm, "locust_swarm"); + ((selectDB)spiSwarm).addField("", ""); + ((selectDB)spiSwarm).addField(getString(R.string.Have), "1"); + ((selectDB)spiSwarm).addField(getString(R.string.No), "0"); + + spiSparse = findViewById(R.id.spiSparse); // Разреженные (да, нет) + guiTable.add(spiSparse, "locust_sparse"); + ((selectDB)spiSparse).addField("", ""); + ((selectDB)spiSparse).addField(getString(R.string.Have), "1"); + ((selectDB)spiSparse).addField(getString(R.string.No), "0"); + + spiLocustPhaseId = findViewById(R.id.spiLocustPhaseId); + guiTable.add(spiLocustPhaseId, "locust_phase_id"); + ((selectDB)spiLocustPhaseId).addField("", ""); + dboh = new DbOpenHelper(this); + cursor = dboh + .getReadableDatabase() + .rawQuery( + "select d.id, COALESCE((SELECT translation FROM _translations t JOIN _languages l ON t.language_id=l.id WHERE t.del = 0 AND identifier = d.name AND l.short_name='" + + Tools.getLang() + "' LIMIT 1),d.name) name from list_phase d where d.del=0 order by d.sort,d.name", null); + if (cursor.moveToFirst()) + { + do + { + ((selectDB)spiLocustPhaseId).addField(cursor.getString(cursor.getColumnIndex("name")), cursor.getString(cursor.getColumnIndex("id"))); + } while (cursor.moveToNext()); + } + cursor.close(); + dboh.close(); + + spiSprPlatform = findViewById(R.id.spiSprPlatform); // Вид опрыскивания + guiTable.add(spiSprPlatform, "spray_platform"); + ((selectDB)spiSprPlatform).addField("", ""); + dboh = new DbOpenHelper(this); + cursor = dboh + .getReadableDatabase() + .rawQuery( + "select d.id, COALESCE((SELECT translation FROM _translations t JOIN _languages l ON t.language_id=l.id WHERE t.del = 0 AND identifier = d.name AND l.short_name='" + + Tools.getLang() + "' LIMIT 1),d.name) name from sprayers_types d where d.del=0 order by d.sort,d.name", null); + if (cursor.moveToFirst()) + { + do + { + ((selectDB)spiSprPlatform).addField(cursor.getString(cursor.getColumnIndex("name")), cursor.getString(cursor.getColumnIndex("id"))); + } while (cursor.moveToNext()); + } + cursor.close(); + dboh.close(); + + spiSprPlatformA = findViewById(R.id.spiSprPlatformA); // «Авиа» - выпадающий список:«Самолет», «Вертолет», «Дельтаплан». + guiTable.add(spiSprPlatformA, "spray_platform_a"); + ((selectDB)spiSprPlatformA).addField("", ""); + dboh = new DbOpenHelper(this); + cursor = dboh + .getReadableDatabase() + .rawQuery( + "select d.id, COALESCE((SELECT translation FROM _translations t JOIN _languages l ON t.language_id=l.id WHERE t.del = 0 AND identifier = d.name AND l.short_name='" + + Tools.getLang() + "' LIMIT 1),d.name) name from sprayers d where d.del=0 and d.sprayer_type_id=1 order by d.sort,d.name", + null); + if (cursor.moveToFirst()) + { + do + { + ((selectDB)spiSprPlatformA).addField(cursor.getString(cursor.getColumnIndex("name")), cursor.getString(cursor.getColumnIndex("id"))); + } while (cursor.moveToNext()); + } + cursor.close(); + dboh.close(); + + spiSprPlatformG = findViewById(R.id.spiSprPlatformG); // «Наземное» - выпадающий список:«Трактор», «Машина», «Аэроз.генераторG». + guiTable.add(spiSprPlatformG, "spray_platform_g"); + ((selectDB)spiSprPlatformG).addField("", ""); + dboh = new DbOpenHelper(this); + cursor = dboh + .getReadableDatabase() + .rawQuery( + "select d.id, COALESCE((SELECT translation FROM _translations t JOIN _languages l ON t.language_id=l.id WHERE t.del = 0 AND identifier = d.name AND l.short_name='" + + Tools.getLang() + "' LIMIT 1),d.name) name from sprayers d where d.del=0 and d.sprayer_type_id=3 order by d.sort,d.name", + null); + if (cursor.moveToFirst()) + { + do + { + ((selectDB)spiSprPlatformG).addField(cursor.getString(cursor.getColumnIndex("name")), cursor.getString(cursor.getColumnIndex("id"))); + } while (cursor.moveToNext()); + } + cursor.close(); + dboh.close(); + + spiSprPlatformH = findViewById(R.id.spiSprPlatformH); // «Ручное» - выпадающий список:«Ранцевый», «Моторный», «Батарейный». + guiTable.add(spiSprPlatformH, "spray_platform_h"); + ((selectDB)spiSprPlatformH).addField("", ""); + dboh = new DbOpenHelper(this); + cursor = dboh + .getReadableDatabase() + .rawQuery( + "select d.id, COALESCE((SELECT translation FROM _translations t JOIN _languages l ON t.language_id=l.id WHERE t.del = 0 AND identifier = d.name AND l.short_name='" + + Tools.getLang() + "' LIMIT 1),d.name) name from sprayers d where d.del=0 and d.sprayer_type_id=5 order by d.sort,d.name", + null); + if (cursor.moveToFirst()) + { + do + { + ((selectDB)spiSprPlatformH).addField(cursor.getString(cursor.getColumnIndex("name")), cursor.getString(cursor.getColumnIndex("id"))); + } while (cursor.moveToNext()); + } + cursor.close(); + dboh.close(); + + spiSprCapacity = findViewById(R.id.spiSprCapacity); + guiTable.add(spiSprCapacity, "spray_capacity_id"); + ((selectDB)spiSprCapacity).addField("", ""); + dboh = new DbOpenHelper(this); + cursor = dboh + .getReadableDatabase() + .rawQuery( + "select d.id, COALESCE((SELECT translation FROM _translations t JOIN _languages l ON t.language_id=l.id WHERE t.del = 0 AND identifier = d.name AND l.short_name='" + + Tools.getLang() + "' LIMIT 1),d.name) name from list_capacities d where d.del=0 order by d.sort,d.name", null); + if (cursor.moveToFirst()) + { + do + { + ((selectDB)spiSprCapacity).addField(cursor.getString(cursor.getColumnIndex("name")), cursor.getString(cursor.getColumnIndex("id"))); + } while (cursor.moveToNext()); + } + cursor.close(); + dboh.close(); + + /* + * spiSprOperator = findViewById(R.id.spiSprOperator); // Оператор (пилот, водитель, др...) guiTable.add(spiSprOperator,"spray_operatortype_id"); spiSprOperator.addField(this, "", ""); dboh = new DbOpenHelper(this); cursor = + * dboh.getReadableDatabase().rawQuery("select d.id, COALESCE((SELECT translation FROM _translations t JOIN _languages l ON t.language_id=l.id WHERE t.del = 0 AND identifier = d.name AND l.short_name='"+Tools.getLang()+"' LIMIT 1),d.name) name from list_operatorstypes d where d.del=0 order by d.sort,d.name", null); if (cursor.moveToFirst()) { do { spiSprOperator.addField(this, cursor.getString(cursor.getColumnIndex("name")), cursor.getString(cursor.getColumnIndex("id"))); } while + * (cursor.moveToNext()); } cursor.close(); dboh.close(); + */ + + // edtSprOperatorName = (EditText) findViewById(R.id.edtSprOperatorName); // Имя оператора + // guiTable.add(edtSprOperatorName,"spray_operator_name"); + edtSprManufacturer = (EditText) findViewById(R.id.edtSprManufacturer); // Марка опрыскивателя + guiTable.add(edtSprManufacturer, "spray_manufacturer_name"); + edtSprModel = (EditText) findViewById(R.id.edtSprModel); // Модель опрыскивателя + guiTable.add(edtSprModel, "spray_model_name"); + + // edtDateCalibration = (DateInput) findViewById(R.id.edtDateCalibration); // Дата последней калибровки + // guiTable.add(edtDateCalibration,"spray_date_calibration"); + // edtDateCalibration.setVisibleDMY("my"); //Кроме дня + + edtSprHeight = (EditText) findViewById(R.id.edtSprHeight); // Высота над поверхностью почвы (м) + guiTable.add(edtSprHeight, "spray_height"); + // edtSprWidth = (EditText) findViewById(R.id.edtSprWidth); // Ширина захвата (м) + // guiTable.add(edtSprWidth,"spray_width"); + // edtSprSpacing = (EditText) findViewById(R.id.edtSprSpacing); // Расстояние между проходами опрыскивателя (м) + // guiTable.add(edtSprSpacing,"spray_spacing"); + spiSprBarrier = findViewById(R.id.spiSprBarrier); // Барьеры (да, нет) + guiTable.add(spiSprBarrier, "spray_barrier"); + ((selectDB)spiSprBarrier).addField("", ""); + ((selectDB)spiSprBarrier).addField(getString(R.string.Yes), "1"); + ((selectDB)spiSprBarrier).addField(getString(R.string.No), "0"); + edtSprBarrierWidth = (EditText) findViewById(R.id.edtSprBarrierWidth); // ширина (м) + guiTable.add(edtSprBarrierWidth, "spray_barrier_width"); + edtSprBarrierSpace = (EditText) findViewById(R.id.edtSprBarrierSpace); // промежуток (м) + guiTable.add(edtSprBarrierSpace, "spray_barrier_space"); + + edtSprSpeed = (EditText) findViewById(R.id.edtSprSpeed); // Скорость движения (км/ч) + guiTable.add(edtSprSpeed, "spray_speed"); + + spiSprGPS = findViewById(R.id.spiSprGPS); // Антена: DGPS использовалась + guiTable.add(spiSprGPS, "spray_gps"); + ((selectDB)spiSprGPS).addField("", ""); + ((selectDB)spiSprGPS).addField(getString(R.string.Yes), "1"); + ((selectDB)spiSprGPS).addField(getString(R.string.No), "0"); + + spiSprMarking = findViewById(R.id.spiSprMarking); // Наземная маркировка(Сиг-нальщики, GPS, Машина, Нет) + guiTable.add(spiSprMarking, "spray_marking_id"); + ((selectDB)spiSprMarking).addField("", ""); + dboh = new DbOpenHelper(this); + cursor = dboh + .getReadableDatabase() + .rawQuery( + "select d.id, COALESCE((SELECT translation FROM _translations t JOIN _languages l ON t.language_id=l.id WHERE t.del = 0 AND identifier = d.name AND l.short_name='" + + Tools.getLang() + "' LIMIT 1),d.name) name from list_markings d where d.del=0 order by d.sort,d.name", null); + if (cursor.moveToFirst()) + { + do + { + ((selectDB)spiSprMarking).addField(cursor.getString(cursor.getColumnIndex("name")), cursor.getString(cursor.getColumnIndex("id"))); + } while (cursor.moveToNext()); + } + cursor.close(); + dboh.close(); + + cbEffectiveness = (CheckBox) findViewById(R.id.cbEffectiveness); + guiTable.add(cbEffectiveness, "efficiency"); + + OnClickListener oclCbBoxEggs = new OnClickListener() + { + @Override + public void onClick(View v) + { + CheckBox cbx=(CheckBox)v; + if(!cbx.isChecked()) { + AlertDialog.Builder adb = new AlertDialog.Builder(LocustDelActivity.this, R.style.AlertDialogTheme); + adb.setTitle(getString(R.string.Warning)); + adb.setMessage(LocustDelActivity.this.getResources().getString(R.string.Cancel_filling_section)); + adb.setPositiveButton(LocustDelActivity.this.getResources().getString(R.string.Yes), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int id) { + updateAlpha(); + } + }); + adb.setNegativeButton(LocustDelActivity.this.getResources().getString(R.string.No), new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int id) { + cbx.setChecked(true); + } + }); + AlertDialog ad = adb.show(); + ad.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(Color.BLACK); + ad.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(Color.BLACK); + + + }else{ + updateAlpha(); + } + + } + }; + cbEffectiveness.setOnClickListener(oclCbBoxEggs); + + + edtEffMortality = (EditText) findViewById(R.id.edtEffMortality); // смертность саранчи(%) + guiTable.add(edtEffMortality, "efficacy_mortality"); + //edtEffMortality.setFilters(new InputFilter[] { new InputFilterMinMax("0", "100") }); + + edtEffTime = (EditText) findViewById(R.id.edtEffTime); // Прошло времени после обработки + guiTable.add(edtEffTime, "efficacy_passed_time"); + + spiEffMethod = findViewById(R.id.spiEffMethod); // метод подсчета смертности "Визуальный", "Учётная рамка". + guiTable.add(spiEffMethod, "efficacy_mortality_method"); + ((selectDB)spiEffMethod).addField("", ""); + dboh = new DbOpenHelper(this); + cursor = dboh + .getReadableDatabase() + .rawQuery( + "select d.id, COALESCE((SELECT translation FROM _translations t JOIN _languages l ON t.language_id=l.id WHERE t.del = 0 AND identifier = d.name AND l.short_name='" + + Tools.getLang() + "' LIMIT 1),d.name) name from list_mortality d where d.del=0 order by d.sort,d.name", null); + if (cursor.moveToFirst()) + { + do + { + ((selectDB)spiEffMethod).addField(cursor.getString(cursor.getColumnIndex("name")), cursor.getString(cursor.getColumnIndex("id"))); + } while (cursor.moveToNext()); + } + cursor.close(); + dboh.close(); + + OnCheckedChangeListener cclsl = new OnCheckedChangeListener() + { + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) + { + String val = ""; + if (LocustDelActivity.this.cbSafClothingGoggles.isChecked()) + val += '1'; + if (LocustDelActivity.this.cbSafClothingMasks.isChecked()) + val += '2'; + if (LocustDelActivity.this.cbSafClothingGloves.isChecked()) + val += '3'; + if (LocustDelActivity.this.cbSafClothingOveralls.isChecked()) + val += '4'; + if (LocustDelActivity.this.cbSafClothingCaps.isChecked()) + val += '5'; + if (LocustDelActivity.this.cbSafClothingBoots.isChecked()) + val += '6'; + + if (LocustDelActivity.this.cbSafClothingAbsent.isChecked()) + { + val = "7"; + LocustDelActivity.this.cbSafClothingGoggles.setEnabled(false); + LocustDelActivity.this.cbSafClothingMasks.setEnabled(false); + LocustDelActivity.this.cbSafClothingGloves.setEnabled(false); + LocustDelActivity.this.cbSafClothingOveralls.setEnabled(false); + LocustDelActivity.this.cbSafClothingCaps.setEnabled(false); + LocustDelActivity.this.cbSafClothingBoots.setEnabled(false); + } else + { + LocustDelActivity.this.cbSafClothingGoggles.setEnabled(true); + LocustDelActivity.this.cbSafClothingMasks.setEnabled(true); + LocustDelActivity.this.cbSafClothingGloves.setEnabled(true); + LocustDelActivity.this.cbSafClothingOveralls.setEnabled(true); + LocustDelActivity.this.cbSafClothingCaps.setEnabled(true); + LocustDelActivity.this.cbSafClothingBoots.setEnabled(true); + } + LocustDelActivity.this.edtClothing.setText(val); + } + }; + cbSafClothingGoggles = (CheckBox) findViewById(R.id.cbSafClothingGoggles); + cbSafClothingGoggles.setOnCheckedChangeListener(cclsl); + cbSafClothingMasks = (CheckBox) findViewById(R.id.cbSafClothingMasks); + cbSafClothingMasks.setOnCheckedChangeListener(cclsl); + cbSafClothingGloves = (CheckBox) findViewById(R.id.cbSafClothingGloves); + cbSafClothingGloves.setOnCheckedChangeListener(cclsl); + cbSafClothingOveralls = (CheckBox) findViewById(R.id.cbSafClothingOveralls); + cbSafClothingOveralls.setOnCheckedChangeListener(cclsl); + cbSafClothingCaps = (CheckBox) findViewById(R.id.cbSafClothingCaps); + cbSafClothingCaps.setOnCheckedChangeListener(cclsl); + cbSafClothingBoots = (CheckBox) findViewById(R.id.cbSafClothingBoots); + cbSafClothingBoots.setOnCheckedChangeListener(cclsl); + cbSafClothingAbsent = (CheckBox) findViewById(R.id.cbSafClothingAbsent); + cbSafClothingAbsent.setOnCheckedChangeListener(cclsl); + + edtClothing = (EditText) findViewById(R.id.edtClothing); + guiTable.add(edtClothing, "safety_clothing"); + + edtClothing.addTextChangedListener(new TextWatcher() + { + public void afterTextChanged(Editable s) + { + } + + public void beforeTextChanged(CharSequence s, int start, int count, int after) + { + } + + public void onTextChanged(CharSequence s, int start, int before, int count) + { + String str = LocustDelActivity.this.edtClothing.getText().toString(); + + if (str.indexOf("1") != -1) + LocustDelActivity.this.cbSafClothingGoggles.setChecked(true); + if (str.indexOf("2") != -1) + LocustDelActivity.this.cbSafClothingMasks.setChecked(true); + if (str.indexOf("3") != -1) + LocustDelActivity.this.cbSafClothingGloves.setChecked(true); + if (str.indexOf("4") != -1) + LocustDelActivity.this.cbSafClothingOveralls.setChecked(true); + if (str.indexOf("5") != -1) + LocustDelActivity.this.cbSafClothingCaps.setChecked(true); + if (str.indexOf("6") != -1) + LocustDelActivity.this.cbSafClothingBoots.setChecked(true); + if (str.indexOf("7") != -1) + LocustDelActivity.this.cbSafClothingAbsent.setChecked(true); + + } + }); + + spiProtectiveClothingClean = findViewById(R.id.spiProtectiveClothingClean); + guiTable.add(spiProtectiveClothingClean, "safety_clothing_clean"); + ((selectDB)spiProtectiveClothingClean).addField("", ""); + ((selectDB)spiProtectiveClothingClean).addField(getString(R.string.Yes), "1"); + ((selectDB)spiProtectiveClothingClean).addField(getString(R.string.No), "0"); + + spiOperatorExposedInsecticide = findViewById(R.id.spiOperatorExposedInsecticide); + guiTable.add(spiOperatorExposedInsecticide, "safety_operator_health"); + ((selectDB)spiOperatorExposedInsecticide).addField("", ""); + ((selectDB)spiOperatorExposedInsecticide).addField(getString(R.string.Yes), "1"); + ((selectDB)spiOperatorExposedInsecticide).addField(getString(R.string.No), "0"); + + edtDescription = (EditText) findViewById(R.id.edtDescription); // если да, то какое + guiTable.add(edtDescription, "description"); + + cbTest = (CheckBox) findViewById(R.id.cbTest); + guiTable.add(cbTest, "test"); + + OnCheckedChangeListener ccl = new OnCheckedChangeListener() + { + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) + { + String val = ""; + if (LocustDelActivity.this.cbSafInformFarmer.isChecked()) + val += '1'; + if (LocustDelActivity.this.cbSafInformShepherd.isChecked()) + val += '6'; + if (LocustDelActivity.this.cbSafInformVillager.isChecked()) + val += '2'; + if (LocustDelActivity.this.cbSafInformOfficial.isChecked()) + val += '3'; + if (LocustDelActivity.this.cbSafInformBeekeeper.isChecked()) + val += '4'; + if (LocustDelActivity.this.cbSafInformOther.isChecked()) + val += '5'; + LocustDelActivity.this.edtInform.setText(val); + } + }; + cbSafInformFarmer = (CheckBox) findViewById(R.id.cbSafInformFarmer); // Кто был оповещен об обработках? Фермер + cbSafInformFarmer.setOnCheckedChangeListener(ccl); + cbSafInformShepherd = (CheckBox) findViewById(R.id.cbSafInformShepherd); // Кто был оповещен об обработках? Пастух + cbSafInformShepherd.setOnCheckedChangeListener(ccl); + cbSafInformVillager = (CheckBox) findViewById(R.id.cbSafInformVillager); // Кто был оповещен об обработках? Сельский житель + cbSafInformVillager.setOnCheckedChangeListener(ccl); + cbSafInformOfficial = (CheckBox) findViewById(R.id.cbSafInformOfficial); // Кто был оповещен об обработках? Чиновник + cbSafInformOfficial.setOnCheckedChangeListener(ccl); + cbSafInformBeekeeper = (CheckBox) findViewById(R.id.cbSafInformBeekeeper); // Кто был оповещен об обработках? Пчеловод + cbSafInformBeekeeper.setOnCheckedChangeListener(ccl); + cbSafInformOther = (CheckBox) findViewById(R.id.cbSafInformOther); // Кто был оповещен об обработках? Другие + cbSafInformOther.setOnCheckedChangeListener(ccl); + + edtInform = (EditText) findViewById(R.id.edtInform); + guiTable.add(edtInform, "safety_inform"); + + edtInform.addTextChangedListener(new TextWatcher() + { + public void afterTextChanged(Editable s) + { + } + + public void beforeTextChanged(CharSequence s, int start, int count, int after) + { + } + + public void onTextChanged(CharSequence s, int start, int before, int count) + { + String str = LocustDelActivity.this.edtInform.getText().toString(); + + if (str.indexOf("1") != -1) + LocustDelActivity.this.cbSafInformFarmer.setChecked(true); // Кто был оповещен об обработках? Фермер + if (str.indexOf("6") != -1) + LocustDelActivity.this.cbSafInformShepherd.setChecked(true); // Кто был оповещен об обработках? Фермер + if (str.indexOf("2") != -1) + LocustDelActivity.this.cbSafInformVillager.setChecked(true); // Кто был оповещен об обработках? Сельский житель + if (str.indexOf("3") != -1) + LocustDelActivity.this.cbSafInformOfficial.setChecked(true); // Кто был оповещен об обработках? Чиновник + if (str.indexOf("4") != -1) + LocustDelActivity.this.cbSafInformBeekeeper.setChecked(true); // Кто был оповещен об обработках? Пчеловод + if (str.indexOf("5") != -1) + LocustDelActivity.this.cbSafInformOther.setChecked(true); // Кто был оповещен об обработках? Пчеловод + + } + }); + + + //spiSafEmptyСontainers = findViewById(R.id.spiSafEmptyContainers); // Что сделали с пустыми контейнерами + //guiTable.add(spiSafEmptyСontainers, "safety_container_id"); + //spiSafEmptyСontainers.addField(this, "", ""); + dboh = new DbOpenHelper(this); + cursor = dboh + .getReadableDatabase() + .rawQuery( + "select d.id, COALESCE((SELECT translation FROM _translations t JOIN _languages l ON t.language_id=l.id WHERE t.del = 0 AND identifier = d.name AND l.short_name='" + + Tools.getLang() + "' LIMIT 1),d.name) name from list_containers d where d.del=0 order by d.sort,d.name", null); + if (cursor.moveToFirst()) + { + do + { + //spiSafEmptyСontainers.addField(this, cursor.getString(cursor.getColumnIndex("name")), cursor.getString(cursor.getColumnIndex("id"))); + + if(cursor.getLong(cursor.getColumnIndex("id"))==1) + ((CheckBox) findViewById(R.id.cbTripleRinsed)).setText(cursor.getString(cursor.getColumnIndex("name"))); + if(cursor.getLong(cursor.getColumnIndex("id"))==2) + ((CheckBox) findViewById(R.id.cbPunctured)).setText(cursor.getString(cursor.getColumnIndex("name"))); + if(cursor.getLong(cursor.getColumnIndex("id"))==3) + ((CheckBox) findViewById(R.id.cbTakenBackToBase)).setText(cursor.getString(cursor.getColumnIndex("name"))); + if(cursor.getLong(cursor.getColumnIndex("id"))==4) + ((CheckBox) findViewById(R.id.cbLeftInField)).setText(cursor.getString(cursor.getColumnIndex("name"))); + if(cursor.getLong(cursor.getColumnIndex("id"))==5) + ((CheckBox) findViewById(R.id.cbBuried)).setText(cursor.getString(cursor.getColumnIndex("name"))); + if(cursor.getLong(cursor.getColumnIndex("id"))==6) + ((CheckBox) findViewById(R.id.cbBurned)).setText(cursor.getString(cursor.getColumnIndex("name"))); + + } while (cursor.moveToNext()); + } + cursor.close(); + dboh.close(); + + ccl = new OnCheckedChangeListener() + { + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) + { + String val = ""; + if (LocustDelActivity.this.cbTripleRinsed.isChecked()) + val += '1'; + if (LocustDelActivity.this.cbPunctured.isChecked()) + val += '2'; + if (LocustDelActivity.this.cbTakenBackToBase.isChecked()) + val += '3'; + if (LocustDelActivity.this.cbLeftInField.isChecked()) + val += '4'; + if (LocustDelActivity.this.cbBuried.isChecked()) + val += '5'; + if (LocustDelActivity.this.cbBurned.isChecked()) + val += '6'; + LocustDelActivity.this.edtSafEmptyContainers.setText(val); + } + }; + cbTripleRinsed = (CheckBox) findViewById(R.id.cbTripleRinsed); + cbTripleRinsed.setOnCheckedChangeListener(ccl); + cbPunctured = (CheckBox) findViewById(R.id.cbPunctured); + cbPunctured.setOnCheckedChangeListener(ccl); + cbTakenBackToBase = (CheckBox) findViewById(R.id.cbTakenBackToBase); + cbTakenBackToBase.setOnCheckedChangeListener(ccl); + cbLeftInField = (CheckBox) findViewById(R.id.cbLeftInField); + cbLeftInField.setOnCheckedChangeListener(ccl); + cbBuried = (CheckBox) findViewById(R.id.cbBuried); + cbBuried.setOnCheckedChangeListener(ccl); + cbBurned = (CheckBox) findViewById(R.id.cbBurned); + cbBurned.setOnCheckedChangeListener(ccl); + + edtSafEmptyContainers = (EditText) findViewById(R.id.edtSafEmptyContainers); + guiTable.add(edtSafEmptyContainers, "safety_container"); + + + edtSafEmptyContainers.addTextChangedListener(new TextWatcher() + { + public void afterTextChanged(Editable s) + { + } + + public void beforeTextChanged(CharSequence s, int start, int count, int after) + { + } + + public void onTextChanged(CharSequence s, int start, int before, int count) + { + String str = LocustDelActivity.this.edtSafEmptyContainers.getText().toString(); + if (str.indexOf("1") != -1) + LocustDelActivity.this.cbTripleRinsed.setChecked(true); + if (str.indexOf("2") != -1) + LocustDelActivity.this.cbPunctured.setChecked(true); + if (str.indexOf("3") != -1) + LocustDelActivity.this.cbTakenBackToBase.setChecked(true); + if (str.indexOf("4") != -1) + LocustDelActivity.this.cbLeftInField.setChecked(true); + if (str.indexOf("5") != -1) + LocustDelActivity.this.cbBuried.setChecked(true); + if (str.indexOf("6") != -1) + LocustDelActivity.this.cbBurned.setChecked(true); + } + }); + + spiSafNonTarget = findViewById(R.id.spiSafNonTarget); // воздействие на нецелевые организмы + guiTable.add(spiSafNonTarget, "safety_non_target"); + ((selectDB)spiSafNonTarget).addField("", ""); + ((selectDB)spiSafNonTarget).addField(getString(R.string.Yes), "1"); + ((selectDB)spiSafNonTarget).addField(getString(R.string.No), "0"); + + edtSafNonTargetEffect = (EditText) findViewById(R.id.edtSafNonTargetEffect); // если да, то какое + guiTable.add(edtSafNonTargetEffect, "safety_non_target_effect"); + + // "safety_incident boolean," + //Другие инциденты по здоровью или окружающей среде, возникшие возможно при обработке + // "safety_incident_effect text," + //Если Да, тип инцидента и кем сообщен (описание) + spiSafIncident = findViewById(R.id.spiSafIncident); // Другие инциденты по здоровью или окружающей среде, возникшие возможно при обработке + guiTable.add(spiSafIncident, "safety_incident"); + ((selectDB)spiSafIncident).addField("", ""); + ((selectDB)spiSafIncident).addField(getString(R.string.Yes), "1"); + ((selectDB)spiSafIncident).addField(getString(R.string.No), "0"); + + edtSafIncidentEffect = (EditText) findViewById(R.id.edtSafIncidentEffect); // Если Да, тип инцидента и кем сообщен (описание) + guiTable.add(edtSafIncidentEffect, "safety_incident_effect"); + + edtComments = (EditText) findViewById(R.id.edtComments); // КОММЕНТАР�?�? + guiTable.add(edtComments, "comments"); + + // *** Кнопки *** + btnGetGPSCenter = (View) findViewById(R.id.btnGetGPSCenter); + OnClickListener oclBtnGetGPSCenter = new OnClickListener() + { + @Override + public void onClick(View v) + { + DecimalFormatSymbols custom = new DecimalFormatSymbols(new Locale("en", "US")); + custom.setDecimalSeparator('.'); + + DecimalFormat df = new DecimalFormat("0.0000000"); + df.setDecimalFormatSymbols(custom); + + if(LocustDelActivity.this._lat!=0 && LocustDelActivity.this._lon!=0) { + LocustDelActivity.this.edtLatCenter.setText(df.format(LocustDelActivity.this._lat)); + LocustDelActivity.this.edtLonCenter.setText(df.format(LocustDelActivity.this._lon)); + } + //Checking if the GPS is active and if it is inactive, I display a warning about it + LocationManager locationManager = (LocationManager) LocustDelActivity.this.getSystemService(Context.LOCATION_SERVICE);; + if(!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)){ + Toast.makeText(LocustDelActivity.this, LocustDelActivity.this.getResources().getString(R.string.Please_activate_GPS), Toast.LENGTH_LONG).show(); + } + } + }; + btnGetGPSCenter.setOnClickListener(oclBtnGetGPSCenter); + + btnDelGPSCenter = (View) findViewById(R.id.btnDelGPSCenter); + btnDelGPSCenter.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + LocustDelActivity.this.edtLatCenter.setText(""); + LocustDelActivity.this.edtLonCenter.setText(""); + } + }); + + btnOnMap = (View) findViewById(R.id.btnOnMap); + OnClickListener oclBtnOnMap = new OnClickListener() + { + @Override + public void onClick(View v) + { + Intent intent = new Intent(LocustDelActivity.this, MapsActivity.class); + intent.putParcelableArrayListExtra("LatLon", ((LatLonAdapter)latlonList.getAdapter()).latlonList); + intent.putExtra("uid", uid); + startActivityForResult(intent,4); + } + }; + btnOnMap.setOnClickListener(oclBtnOnMap); + + // android:id="@+id/btnOk" + btnOk = (View) findViewById(R.id.btnOk); + OnClickListener oclBtnOk = new OnClickListener() + { + @Override + public void onClick(View v) + { + saveData(); + } + }; + btnOk.setOnClickListener(oclBtnOk); + + btnCancel = (View) findViewById(R.id.btnCancel); + OnClickListener oclBtnCancel = new OnClickListener() + { + @Override + public void onClick(View v) + { + AlertDialog.Builder adb = new AlertDialog.Builder(LocustDelActivity.this, R.style.AlertDialogTheme); + adb.setTitle(getString(R.string.Warning)); + adb.setMessage(LocustDelActivity.this.getResources().getString(R.string.Cancel_filling_form)); + adb.setPositiveButton(LocustDelActivity.this.getResources().getString(R.string.Yes), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int id) { + LocustDelActivity.this.finish(); + } + }); + adb.setNegativeButton(LocustDelActivity.this.getResources().getString(R.string.No), new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int id) { + + } + }); + AlertDialog ad = adb.show(); + ad.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(Color.BLACK); + ad.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(Color.BLACK); + } + }; + btnCancel.setOnClickListener(oclBtnCancel); + /* + * btnImage = (View) findViewById(R.id.btnImage); OnClickListener oclBtnImage = new OnClickListener() { + * + * @Override public void onClick(View v) { File directory = new File(Environment.getExternalStorageDirectory() + File.separator + "Pictures" + File.separator + "Locust"); directory.mkdirs(); + * + * tmp_ImageName = "locust_" + (System.currentTimeMillis() / 1000L) + ".jpg"; + * + * File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Pictures/Locust/" + tmp_ImageName); mImageUri = Uri.fromFile(file); + * + * Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, mImageUri); startActivityForResult(intent, 1); } }; btnImage.setOnClickListener(oclBtnImage); + */ + + btnImage1 = (View) findViewById(R.id.btnImage1); + OnClickListener oclBtnImage = new OnClickListener() + { + @Override + public void onClick(View v) + { + // Создаём папку если её нет + File directory = new File(Environment.getExternalStorageDirectory() + File.separator + "Pictures" + File.separator + "Locust"); + directory.mkdirs(); + + tmp_ImageName = "locust_" + (System.currentTimeMillis() / 1000L) + ".jpg"; + + File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Pictures/Locust/" + tmp_ImageName); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) + mImageUri = FileProvider.getUriForFile(LocustDelActivity.this, BuildConfig.APPLICATION_ID + ".provider",file); + else + mImageUri = Uri.fromFile(file); + + Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); + intent.putExtra(MediaStore.EXTRA_OUTPUT, mImageUri); + startActivityForResult(intent, 1); + } + }; + btnImage1.setOnClickListener(oclBtnImage); + + btnImage2 = (View) findViewById(R.id.btnImage2); + oclBtnImage = new OnClickListener() + { + @Override + public void onClick(View v) + { + // Создаём папку если её нет + File directory = new File(Environment.getExternalStorageDirectory() + File.separator + "Pictures" + File.separator + "Locust"); + directory.mkdirs(); + + tmp_ImageName = "locust_" + (System.currentTimeMillis() / 1000L) + ".jpg"; + + File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Pictures/Locust/" + tmp_ImageName); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) + mImageUri = FileProvider.getUriForFile(LocustDelActivity.this, BuildConfig.APPLICATION_ID + ".provider",file); + else + mImageUri = Uri.fromFile(file); + + + Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); + intent.putExtra(MediaStore.EXTRA_OUTPUT, mImageUri); + startActivityForResult(intent, 2); + } + }; + btnImage2.setOnClickListener(oclBtnImage); + + btnImage3 = (View) findViewById(R.id.btnImage3); + oclBtnImage = new OnClickListener() + { + @Override + public void onClick(View v) + { + // Создаём папку если её нет + File directory = new File(Environment.getExternalStorageDirectory() + File.separator + "Pictures" + File.separator + "Locust"); + directory.mkdirs(); + + tmp_ImageName = "locust_" + (System.currentTimeMillis() / 1000L) + ".jpg"; + + File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Pictures/Locust/" + tmp_ImageName); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) + mImageUri = FileProvider.getUriForFile(LocustDelActivity.this, BuildConfig.APPLICATION_ID + ".provider",file); + else + mImageUri = Uri.fromFile(file); + + Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); + intent.putExtra(MediaStore.EXTRA_OUTPUT, mImageUri); + startActivityForResult(intent, 3); + } + }; + btnImage3.setOnClickListener(oclBtnImage); + + /* + * btnShowImage = (View) findViewById(R.id.btnShowImage1); OnClickListener oclBtnShowImage = new OnClickListener() { + * + * @Override public void onClick(View v) { File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Pictures/Locust/" + edtImage1.getText().toString()); Intent i = new Intent(); i.setAction(android.content.Intent.ACTION_VIEW); i.setDataAndType(Uri.fromFile(file), "image/jpg"); startActivity(i); } }; btnShowImage.setOnClickListener(oclBtnShowImage); + */ + + btnShowImage1 = (View) findViewById(R.id.btnShowImage1); // Отобразить фотографию 1 в новом окне + OnClickListener oclBtnShowImage = new OnClickListener() + { + @Override + public void onClick(View v) + { + File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Pictures/Locust/" + edtImage1.getText().toString()); + if(!file.isFile()) file = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Pictures/Locust/_" + edtImage1.getText().toString()); + if (file.isFile()) { + //Uri uri = Uri.fromFile(file); + Uri uri = FileProvider.getUriForFile(LocustDelActivity.this, BuildConfig.APPLICATION_ID + ".provider", file); + + Intent i = new Intent(); + i.setAction(android.content.Intent.ACTION_VIEW); + i.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + i.setDataAndType(uri, "image/jpg"); + startActivity(i); + } + } + }; + btnShowImage1.setOnClickListener(oclBtnShowImage); + + btnShowImage2 = (View) findViewById(R.id.btnShowImage2); // Отобразить фотографию 1 в новом окне + oclBtnShowImage = new OnClickListener() + { + @Override + public void onClick(View v) + { + File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Pictures/Locust/" + edtImage2.getText().toString()); + if(!file.isFile()) file = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Pictures/Locust/_" + edtImage2.getText().toString()); + if (file.isFile()) { + //Uri uri = Uri.fromFile(file); + Uri uri = FileProvider.getUriForFile(LocustDelActivity.this, BuildConfig.APPLICATION_ID + ".provider", file); + + Intent i = new Intent(); + i.setAction(android.content.Intent.ACTION_VIEW); + i.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + i.setDataAndType(uri, "image/jpg"); + startActivity(i); + } + } + }; + btnShowImage2.setOnClickListener(oclBtnShowImage); + + btnShowImage3 = (View) findViewById(R.id.btnShowImage3); // Отобразить фотографию 3 в новом окне + oclBtnShowImage = new OnClickListener() + { + @Override + public void onClick(View v) + { + File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Pictures/Locust/" + edtImage3.getText().toString()); + if(!file.isFile()) file = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Pictures/Locust/_" + edtImage3.getText().toString()); + if (file.isFile()) { + //Uri uri = Uri.fromFile(file); + Uri uri = FileProvider.getUriForFile(LocustDelActivity.this, BuildConfig.APPLICATION_ID + ".provider", file); + + Intent i = new Intent(); + i.setAction(android.content.Intent.ACTION_VIEW); + i.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + i.setDataAndType(uri, "image/jpg"); + startActivity(i); + } + } + }; + btnShowImage3.setOnClickListener(oclBtnShowImage); + + btnDelImage1 = (View) findViewById(R.id.btnDelImage1); + btnDelImage1.setOnClickListener( + new OnClickListener() + { + @Override + public void onClick(View v) + { + edtImage1.setText(""); + } + } + ); + + btnDelImage2 = (View) findViewById(R.id.btnDelImage2); + btnDelImage2.setOnClickListener( + new OnClickListener() + { + @Override + public void onClick(View v) + { + edtImage2.setText(""); + } + } + ); + + btnDelImage3 = (View) findViewById(R.id.btnDelImage3); + btnDelImage3.setOnClickListener( + new OnClickListener() + { + @Override + public void onClick(View v) + { + edtImage3.setText(""); + } + } + ); + + + // Взависимости от параметров создание или редактирование + editData(uid); + adapter.notifyDataSetChanged(); + Tools.setListViewHeightBasedOnItems(latlonList); + + //updateAlpha(); movied to onResume + + // Чтоб слушать GPS (в конце метода чтобы успели присвоиться GUI компоненты локальным переменным) + _lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE); + if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { + return; + } + _lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 500, 1, this); + } + + @Override + public void onResume(){ + super.onResume(); + + if(spiCountry.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiCountry).updateAdapter(this); + if(spiRegion.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiRegion).updateAdapter(this); + if(spiVegType.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiVegType).updateAdapter(this); + if(spiVegCover.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiVegCover).updateAdapter(this); + if(spiVegDamage.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiVegDamage).updateAdapter(this); + if(spiInsFormulation.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiInsFormulation).updateAdapter(this); + if(spiWeaTimeStart.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiWeaTimeStart).updateAdapter(this); + if(spiWeaTimeEnd.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiWeaTimeEnd).updateAdapter(this); + if(spiWindDirectionStart.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiWindDirectionStart).updateAdapter(this); + if(spiWindDirectionEnd.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiWindDirectionEnd).updateAdapter(this); + if(spiSprayDirectionStart.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiSprayDirectionStart).updateAdapter(this); + if(spiSprayDirectionEnd.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiSprayDirectionEnd).updateAdapter(this); + if(spiLocSpeciese.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiLocSpeciese).updateAdapter(this); + if(spiLocHoppers.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiLocHoppers).updateAdapter(this); + if(spiImago.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiImago).updateAdapter(this); + if(spiKuliguli.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiKuliguli).updateAdapter(this); + if(spiSwarm.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiSwarm).updateAdapter(this); + if(spiSparse.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiSparse).updateAdapter(this); + if(spiLocustPhaseId.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiLocustPhaseId).updateAdapter(this); + if(spiSprPlatform.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiSprPlatform).updateAdapter(this); + if(spiSprPlatformA.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiSprPlatformA).updateAdapter(this); + if(spiSprPlatformG.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiSprPlatformG).updateAdapter(this); + if(spiSprPlatformH.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiSprPlatformH).updateAdapter(this); + if(spiSprCapacity.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiSprCapacity).updateAdapter(this); + if(spiSprBarrier.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiSprBarrier).updateAdapter(this); + if(spiSprGPS.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiSprGPS).updateAdapter(this); + if(spiSprMarking.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiSprMarking).updateAdapter(this); + if(spiEffMethod.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiEffMethod).updateAdapter(this); + if(spiProtectiveClothingClean.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiProtectiveClothingClean).updateAdapter(this); + if(spiOperatorExposedInsecticide.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiOperatorExposedInsecticide).updateAdapter(this); + if(spiSafNonTarget.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiSafNonTarget).updateAdapter(this); + if(spiSafIncident.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiSafIncident).updateAdapter(this); + + updateAlpha(); + } + + // Сохраняются настройки перед уничтожением формы + @Override + protected void onSaveInstanceState(Bundle outState) + { + super.onSaveInstanceState(outState); + if (mImageUri != null) + { + outState.putString("cameraImageUri", mImageUri.toString()); + } + // Сохраняем название рисунка (Не знаю почему но автоматом не сохраняет) + outState.putString("ImageName", edtImage1.getText().toString()); + //Сохраняю список координат LatLon + LatLonAdapter adapter = (LatLonAdapter)latlonList.getAdapter(); + ArrayList list = adapter.latlonList; + for(int i=0;i points = data.getParcelableArrayListExtra("LatLon"); + LatLonAdapter adapter = (LatLonAdapter)latlonList.getAdapter(); + ArrayList list = adapter.latlonList; + list.clear(); + for(int i=0;i list = ((LatLonAdapter)latlonList.getAdapter()).latlonList; + for(int i=0;i list = adapter.latlonList; + list.clear(); + DbOpenHelper dboh = new DbOpenHelper(this); + Cursor cursor = dboh.getReadableDatabase().rawQuery("select lat,lon from frmlocustdel_locations where frmlocustdel_uid='" + uid + "' order by pos", null); + if (cursor.moveToFirst()) + { + do + { + list.add(new LatLon(cursor.getDouble(0), cursor.getDouble(1))); + } while (cursor.moveToNext()); + } + cursor.close(); + dboh.close(); + list.add(new LatLon(0, 0)); + } + } + + /*** + * Переместить и сфокусировать на переданном элементе + */ + public void scrollTo(View item) + { + int top = 0; + View tmp = item; + while (tmp != null) + { + if (tmp == scrollView1) + { + scrollView1.scrollTo(0, top); + item.requestFocus(); + break; + } + + top += tmp.getTop(); + tmp = (View) tmp.getParent(); + } + } + + public void alert(String text) + { + AlertDialog.Builder adb = new AlertDialog.Builder(this,R.style.AlertDialogTheme); + adb.setTitle(getString(R.string.Warning)); + adb.setMessage(text); + adb.setPositiveButton("OK", new DialogInterface.OnClickListener() // Кнопка открыть + { + @Override + public void onClick(DialogInterface arg0, int arg1) + { + } + }); + AlertDialog ad = adb.show(); + ad.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(Color.BLACK); + } + + public boolean isGONE(View view) + { + if (!view.isClickable()) + return true; + try { + while (view != null) { + if (view.getVisibility() == View.GONE) + return true; + + view = (View) view.getParent(); + if(view==getWindow().getDecorView().getRootView()) + break; + } + }catch (Exception e) + {} + return false; + } + + /** + * Save to the database + */ + public void saveData() + { + // Checking for fullness of fields + String atxt = getString(R.string.Not_filled); // Текст для алерта: "Не заполнено поле". + boolean eFields = false; // У анкеты 2 состояния 1) Заполнены все обяз поля 2) Не заполнены все обяз поля + + if (!eFields && !isGONE(spiCountry) && ((selectDB)spiCountry).getText().toString().equals("")) + { + scrollTo(spiCountry); + atxt = atxt + ": \"" + getResources().getString(R.string.Country) + "\"!"; //@string/Country + eFields = true; + } + if (!eFields && !isGONE(spiRegion) && (((selectDB)spiRegion).getValue() == null || ((selectDB)spiRegion).getValue().equals(""))) + { + scrollTo(spiRegion); + atxt = atxt + ": \"" + getResources().getString(R.string.Region) + "\"!"; + eFields = true; + } + if (!eFields && !isGONE(edtArea) && edtArea.getText().toString().equals("")) + { + scrollTo(edtArea); + atxt = atxt + ": \"" + getResources().getString(R.string.Area) + "\"!"; + eFields = true; + } + if (!eFields && !isGONE(edtVillage) && edtVillage.getText().toString().equals("")) + { + scrollTo(edtVillage); + atxt = atxt + ": \"" + getResources().getString(R.string.Name_of_the_village) + "\"!"; + eFields = true; + } + if(!eFields && !isGONE(edtObserver) && edtObserver.getText().toString().equals("")) + { + scrollTo(edtObserver); + atxt = atxt + ": \"" + getResources().getString(R.string.Name_of_survey_team_leader) + "\"!"; + eFields = true; + } + + if (!eFields && !isGONE(edtDate) && (((fieldDB)edtDate).getValue() == null || ((fieldDB)edtDate).getValue().equals(""))) + { + scrollTo(edtDate); + atxt = atxt + ": \"" + getResources().getString(R.string.Date) + "\"!"; + eFields = true; + } + // TODO Не забыть раскоментировать при публикации новой версии + if (!eFields && (!isGONE(edtLatCenter) && edtLatCenter.getText().toString().equals("") || Tools.getDouble(edtLatCenter.getText().toString(),0.0) == 0)) + { + scrollTo(edtLatCenter); + atxt = atxt + ": \"" + getResources().getString(R.string.Lat_center) + "\"!"; + eFields = true; + } + if (!eFields && (!isGONE(edtLonCenter) && edtLonCenter.getText().toString().equals("") || Tools.getDouble(edtLonCenter.getText().toString(),0.0) == 0)) + { + scrollTo(edtLonCenter); + atxt = atxt + ": \"" + getResources().getString(R.string.Lon_center) + "\"!"; + eFields = true; + } + + if (!eFields && !isGONE(edtInfestedArea)) + { + if(edtInfestedArea.getText().toString().equals("")) + { + scrollTo(edtInfestedArea); + atxt = atxt + ": \"" + getResources().getString(R.string.Area_infested_ha) + "\"!"; + eFields = true; + }else + if(checkMinMaxI(edtInfestedArea,0,1000)!="") + { + scrollTo(edtInfestedArea); + atxt = checkMinMaxI(edtInfestedArea,0,1000) + " \"" + getResources().getString(R.string.Area_infested_ha) + "\"!"; + eFields = true; + } + } + if (!eFields && !isGONE(edtTreatedArea)) + { + if(edtTreatedArea.getText().toString().equals("")) + { + scrollTo(edtTreatedArea); + atxt = atxt + ": \"" + getResources().getString(R.string.Area_treated_ha) + "\"!"; + eFields = true; + }else + if(checkMinMaxI(edtTreatedArea,0,1000)!="") + { + scrollTo(edtTreatedArea); + atxt = checkMinMaxI(edtTreatedArea,0,1000) + " \"" + getResources().getString(R.string.Area_treated_ha) + "\"!"; + eFields = true; + } + } + if (!eFields && !isGONE(spiVegType) && ((selectDB)spiVegType).getText().toString().equals("")) + { + scrollTo(spiVegType); + atxt = atxt + ": \"" + getResources().getString(R.string.Vegetation_type) + "\"!"; + eFields = true; + } + if (!eFields && !isGONE(edtVegHeight)) + { + if(edtVegHeight.getText().toString().equals("")) + { + scrollTo(edtVegHeight); + atxt = atxt + ": \"" + getResources().getString(R.string.Height_cm) + "\"!"; + eFields = true; + }else + if(checkMinMaxI(edtVegHeight,0,600)!="") + { + scrollTo(edtVegHeight); + atxt = checkMinMaxI(edtVegHeight,0,600) + " \"" + getResources().getString(R.string.Height_cm) + "\"!"; + eFields = true; + } + } + if (!eFields && !isGONE(spiVegCover) && ((selectDB)spiVegCover).getText().toString().equals("")) + { + scrollTo(spiVegCover); + atxt = atxt + ": \"" + getResources().getString(R.string.Del_Vegetation_cover) + "\"!"; + eFields = true; + } + if (!eFields && !isGONE(spiVegDamage) && ((selectDB)spiVegDamage).getText().toString().equals("")) + { + scrollTo(spiVegDamage); + atxt = atxt + ": \"" + getResources().getString(R.string.Damage) + "\"!"; + eFields = true; + } + if (!eFields && !isGONE(edtVegDamageArea)) + { + if(checkMinMaxI(edtVegDamageArea,0,100000)!="") + { + scrollTo(edtVegDamageArea); + atxt = checkMinMaxI(edtVegDamageArea,0,100000) + " \"" + getResources().getString(R.string.Damage_area_ha) + "\"!"; + eFields = true; + } + } + if (!eFields && !isGONE(edtInsName) && edtInsName.getText().toString().equals("")) + { + scrollTo(edtInsName); + atxt = atxt + ": \"" + getResources().getString(R.string.Trade_name) + "\"!"; + eFields = true; + } + if (!eFields && !isGONE(edtInsActiveSubstance) && edtInsActiveSubstance.getText().toString().equals("")) + { + scrollTo(edtInsActiveSubstance); + atxt = atxt + ": \"" + getResources().getString(R.string.The_active_substance) + "\"!"; + eFields = true; + } + if (!eFields && !isGONE(edtInsConcentration)) + { + if(edtInsConcentration.getText().toString().equals("")) + { + scrollTo(edtInsConcentration); + atxt = atxt + ": \"" + getResources().getString(R.string.Concentration_A_S) + "\"!"; + eFields = true; + }/*else + if(checkMinMaxI(edtInsConcentration,0,100)!="") + { + scrollTo(edtInsConcentration); + atxt = checkMinMaxI(edtInsConcentration,0,100) + " \"" + getResources().getString(R.string.Concentration_A_S) + "\"!"; + eFields = true; + }*/ + } + if (!eFields && !isGONE(spiInsFormulation) && ((selectDB)spiInsFormulation).getText().toString().equals("")) + { + scrollTo(spiInsFormulation); + atxt = atxt + ": \"" + getResources().getString(R.string.Formulation) + "\"!"; + eFields = true; + } + if (!eFields && !isGONE(edtInsDose)) + { + if(checkMinMaxI(edtInsDose,0.005f,5)!="") + { + scrollTo(edtInsDose); + atxt = checkMinMaxI(edtInsDose,0.005f,5) + " \"" + getResources().getString(R.string.Dose_rate_l_of_commercial_product_ha) + "\"!"; + eFields = true; + } + } + if (!eFields && !isGONE(edtInsRate)) + { + if(checkMinMaxI(edtInsRate,0.1f,600)!="") + { + scrollTo(edtInsRate); + atxt = checkMinMaxI(edtInsRate,0.1f,600) + " \"" + getResources().getString(R.string.Rate_of_working_solution_l_ha) + "\"!"; + eFields = true; + } + } + if (!eFields && !isGONE(edtInsUsedVolume)) + { + if(checkMinMaxI(edtInsUsedVolume,1,450000)!="") + { + scrollTo(edtInsUsedVolume); + atxt = checkMinMaxI(edtInsUsedVolume,1,450000) + " \"" + getResources().getString(R.string.Total_volume_of_working_solution_actually_applied_l) + "\"!"; + eFields = true; + } + } + if (!eFields && !isGONE(edtInsNumberSpores)) + { + if(checkMinMaxI(edtInsNumberSpores,1f,1000000000)!="") + { + scrollTo(edtInsNumberSpores); + atxt = checkMinMaxI(edtInsNumberSpores,1f,1000000000) + " \"" + getResources().getString(R.string.Number_of_spores_ml) + "\"!"; + eFields = true; + } + } + if (!eFields && !isGONE(spiWeaTimeStart) && ((selectDB)spiWeaTimeStart).getText().toString().equals("")) + { + scrollTo(spiWeaTimeStart); + atxt = atxt + ": \"" + getResources().getString(R.string.Time_start) + "\"!"; + eFields = true; + } + if (!eFields && !isGONE(spiWeaTimeEnd) && ((selectDB)spiWeaTimeEnd).getText().toString().equals("")) + { + scrollTo(spiWeaTimeEnd); + atxt = atxt + ": \"" + getResources().getString(R.string.Time_end) + "\"!"; + eFields = true; + } + if (!eFields && !isGONE(edtWeaTemperatureStart)) + { + if(checkMinMaxI(edtWeaTemperatureStart,0,50)!="") + { + scrollTo(edtWeaTemperatureStart); + atxt = checkMinMaxI(edtWeaTemperatureStart,0,50) + " \"" + getResources().getString(R.string.Temperature_start) + "\"!"; + eFields = true; + } + } + if (!eFields && !isGONE(edtWeaTemperatureEnd)) + { + if(checkMinMaxI(edtWeaTemperatureEnd,0,50)!="") + { + scrollTo(edtWeaTemperatureEnd); + atxt = checkMinMaxI(edtWeaTemperatureEnd,0,50) + " \"" + getResources().getString(R.string.Temperature_end) + "\"!"; + eFields = true; + } + } + + if (!eFields && !isGONE(edtWeaHumidityStart)) + { + if(checkMinMaxI(edtWeaHumidityStart,0,100)!="") + { + scrollTo(edtWeaHumidityStart); + atxt = checkMinMaxI(edtWeaHumidityStart,0,100) + " \"" + getResources().getString(R.string.Relative_humidity_start) + "\"!"; + eFields = true; + } + } + if (!eFields && !isGONE(edtWeaHumidityEnd)) + { + if(checkMinMaxI(edtWeaHumidityEnd,0,100)!="") + { + scrollTo(edtWeaHumidityEnd); + atxt = checkMinMaxI(edtWeaHumidityEnd,0,100) + " \"" + getResources().getString(R.string.Relative_humidity_end) + "\"!"; + eFields = true; + } + } + if (!eFields && !isGONE(edtWeaWindSpeedStart)) + { + if(checkMinMaxI(edtWeaWindSpeedStart,0,20)!="") + { + scrollTo(edtWeaWindSpeedStart); + atxt = checkMinMaxI(edtWeaWindSpeedStart,0,20) + " \"" + getResources().getString(R.string.Wind_speed_start_m_s) + "\"!"; + eFields = true; + } + } + if (!eFields && !isGONE(edtWeaWindSpeedEnd)) + { + if(checkMinMaxI(edtWeaWindSpeedEnd,0,20)!="") + { + scrollTo(edtWeaWindSpeedEnd); + atxt = checkMinMaxI(edtWeaWindSpeedEnd,0,20) + " \"" + getResources().getString(R.string.Wind_speed_end_m_s) + "\"!"; + eFields = true; + } + } + if (!eFields && !isGONE(spiLocSpeciese) && ((selectDB)spiLocSpeciese).getText().toString().equals("")) + { + scrollTo(spiLocSpeciese); + atxt = atxt + ": \"" + getResources().getString(R.string.Type) + "\"!"; + eFields = true; + } + if (!eFields && !isGONE(spiLocHoppers) && ((selectDB)spiLocHoppers).getText().toString().equals("")) + { + scrollTo(spiLocHoppers); + atxt = atxt + ": \"" + getResources().getString(R.string.Hopper_stages) + "\"!"; + eFields = true; + } + if (!eFields && !isGONE(edtLocDensity)) + { + if(edtLocDensity.getText().toString().equals("")) + { + scrollTo(edtLocDensity); + atxt = atxt + ": \"" + getResources().getString(R.string.Density_m2) + "\"!"; + eFields = true; + }else + if(checkMinMaxI(edtLocDensity,0,80000)!="") + { + scrollTo(edtLocDensity); + atxt = checkMinMaxI(edtLocDensity,0,80000) + " \"" + getResources().getString(R.string.Density_m2) + "\"!"; + eFields = true; + } + } + if (!eFields && !isGONE(spiKuliguli) && ((selectDB)spiKuliguli).getText().toString().equals("")) + { + scrollTo(spiKuliguli); + atxt = atxt + ": \"" + getResources().getString(R.string.Bands) + "\"!"; + eFields = true; + } + if (!eFields && !isGONE(spiSwarm) && ((selectDB)spiSwarm).getText().toString().equals("")) + { + scrollTo(spiSwarm); + atxt = atxt + ": \"" + getResources().getString(R.string.Swarms) + "\"!"; + eFields = true; + } + if (!eFields && !isGONE(spiSparse) && ((selectDB)spiSparse).getText().toString().equals("")) + { + scrollTo(spiSparse); + atxt = atxt + ": \"" + getResources().getString(R.string.Del_Scattered) + "\"!"; + eFields = true; + } + if (!eFields && !isGONE(spiSprPlatform) && ((selectDB)spiSprPlatform).getText().toString().equals("")) + { + scrollTo(spiSprPlatform); + atxt = atxt + ": \"" + getResources().getString(R.string.Spray_platform) + "\"!"; + eFields = true; + } + if (!eFields && !isGONE(edtSprHeight)) + { + if(checkMinMaxI(edtSprHeight,1,100)!="") + { + scrollTo(edtSprHeight); + atxt = checkMinMaxI(edtSprHeight,1,100) + " \"" + getResources().getString(R.string.Atomizer_height_above_ground_m) + "\"!"; + eFields = true; + } + } + if (!eFields && !isGONE(spiSprBarrier) && ((selectDB)spiSprBarrier).getText().toString().equals("")) + { + scrollTo(spiSprBarrier); + atxt = atxt + ": \"" + getResources().getString(R.string.Barriers) + "\"!"; + eFields = true; + } + + if (!eFields && !isGONE(edtSprBarrierWidth)) + { + if(checkMinMaxI(edtSprBarrierWidth,1,300)!="") + { + scrollTo(edtSprBarrierWidth); + atxt = checkMinMaxI(edtSprBarrierWidth,1,300) + " \"" + getResources().getString(R.string.Barrier_width_m) + "\"!"; + eFields = true; + } + } + if (!eFields && !isGONE(edtSprBarrierSpace)) + { + if(checkMinMaxI(edtSprBarrierSpace,1,1000)!="") + { + scrollTo(edtSprBarrierSpace); + atxt = checkMinMaxI(edtSprBarrierSpace,1,1000) + " \"" + getResources().getString(R.string.Spacing_of_barriers_m) + "\"!"; + eFields = true; + } + } + + if (!eFields && !isGONE(edtSprSpeed)) + { + if(edtSprSpeed.getText().toString().equals("")) + { + scrollTo(edtSprSpeed); + atxt = atxt + ": \"" + getResources().getString(R.string.Forward_speed_km_h) + "\"!"; + eFields = true; + }else + if(checkMinMaxI(edtSprSpeed,1,300)!="") + { + scrollTo(edtSprSpeed); + atxt = checkMinMaxI(edtSprSpeed,1,300) + " \"" + getResources().getString(R.string.Forward_speed_km_h) + "\"!"; + eFields = true; + } + } + if(!eFields && !isGONE(edtEffMortality) ) + { + if(edtEffMortality.getText().toString().equals("")) + { + scrollTo(edtEffMortality); + atxt = atxt + ": \"" + getResources().getString(R.string.Biological_efficiency_of_treatment) + "\"!"; + eFields = true; + }else + if(checkMinMaxI(edtEffMortality,0,100)!="") + { + scrollTo(edtEffMortality); + atxt = checkMinMaxI(edtEffMortality,0,100) + " \"" + getResources().getString(R.string.Biological_efficiency_of_treatment) + "\"!"; + eFields = true; + } + } + if(!eFields && !isGONE(edtEffTime)) + { + if(edtEffTime.getText().toString().equals("")) + { + scrollTo(edtEffTime); + atxt = atxt + ": \"" + getResources().getString(R.string.Time_after_treatment_hours) + "\"!"; + eFields = true; + }else + if(checkMinMaxI(edtEffTime,0,240)!="") + { + scrollTo(edtEffTime); + atxt = checkMinMaxI(edtEffTime,0,240) + " \"" + getResources().getString(R.string.Time_after_treatment_hours) + "\"!"; + eFields = true; + } + } + if(!eFields && !isGONE(edtClothing) && edtClothing.getText().toString().equals("")) + { + scrollTo(edtClothing); + atxt = atxt + ": \"" + getResources().getString(R.string.Protective_clothing) + "\"!"; + eFields = true; + } + if(!eFields && !isGONE(spiSafNonTarget) && ((selectDB)spiSafNonTarget).getText().toString().equals("")) // воздействие на нецелевые организмы + { + scrollTo(spiSafNonTarget); + atxt = atxt + ": \"" + getResources().getString(R.string.Effect_on_non_terget_organism) + "\"!"; + eFields = true; + } + if (eFields) // Если не заполнены все обязательные поля + { + m_Filled.setValue("0"); + + AlertDialog.Builder adb = new AlertDialog.Builder(this,R.style.AlertDialogTheme); + adb.setTitle(getString(R.string.Warning)); + + adb.setMessage(atxt + "\n" + getString(R.string.not_filled_fields)); + adb.setPositiveButton(getString(R.string.Yes), new DialogInterface.OnClickListener() + { + @Override + public void onClick(DialogInterface arg0, int arg1) + { + // Do nothing + } + }); + adb.setNegativeButton(getString(R.string.No), new DialogInterface.OnClickListener() + { + @Override + public void onClick(DialogInterface arg0, int arg1) + { + String uid=guiTable.write(); //Add or save data + saveLocations(uid); + LocustDelActivity.this.finish(); // Close the form + } + }); + AlertDialog ad = adb.show(); + ad.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(Color.BLACK); + ad.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(Color.BLACK); + + } else + { + m_Filled.setValue("1"); + + String uid=guiTable.write(); //Добавляем либо сохраняем данные + saveLocations(uid); + + startService(new Intent(this, MainService.class).putExtra(MainService.PARAM_ACTION, "1")); // Чтоб вызвать событие таймера в сервисе + LocustDelActivity.this.finish(); // Закрываем форму + } + + } + + /** + * СМ. http://developer.android.com/reference/android/app/Activity.html Событие происходит при старте и при возврате на этот Activity + * */ + @Override + public void onStart() { + super.onStart(); + + DbOpenHelper dboh = new DbOpenHelper(this); + SQLiteDatabase db = dboh.getReadableDatabase(); + Cursor cursor = db.rawQuery("select * from terminals where del=0 and serial='"+ Settings.Secure.getString(getContentResolver(), Settings.Secure.ANDROID_ID)+"';", null); + if(!cursor.moveToFirst()) + { + Toast toast = Toast.makeText(getApplicationContext(), + getResources().getString(R.string.Please_authorize_the_tablet), Toast.LENGTH_LONG); + toast.show(); + } + cursor.close(); + dboh.close(); + } + + @Override + public double getLat() { + return this._lat; + } + + @Override + public double getLon() { + return this._lon; + } +} diff --git a/app/src/main/java/kz/istt/locust/LocustDelListActivity.java b/app/src/main/java/kz/istt/locust/LocustDelListActivity.java new file mode 100644 index 0000000..bcf0424 --- /dev/null +++ b/app/src/main/java/kz/istt/locust/LocustDelListActivity.java @@ -0,0 +1,682 @@ +package kz.istt.locust; + +import android.annotation.SuppressLint; +import android.app.Activity; +import android.app.AlertDialog; +import android.content.DialogInterface; +import android.content.Intent; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; +import android.graphics.Color; +import android.os.Bundle; +import android.os.Handler; +import android.os.Message; +import android.provider.Settings; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; +import android.view.View.OnClickListener; +import android.widget.AdapterView; +import android.widget.AdapterView.OnItemSelectedListener; +import android.widget.ArrayAdapter; +import android.widget.LinearLayout; +import android.widget.LinearLayout.LayoutParams; +import android.widget.Spinner; +import android.widget.Toast; + +import androidx.appcompat.app.AppCompatActivity; + +import com.google.android.material.floatingactionbutton.FloatingActionButton; + +import java.io.File; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.Timer; +import java.util.TimerTask; + +public class LocustDelListActivity extends AppCompatActivity +{ + + public LinearLayout llList; + public MyButton btn; + public FloatingActionButton btnAdd = null; + public Spinner spiList = null; + + private Timer timer = new Timer(); + public File file = null; + + public void alert(String text) + { + AlertDialog.Builder adb = new AlertDialog.Builder(this,R.style.AlertDialogTheme); + adb.setTitle(getString(R.string.Warning)); + adb.setMessage(text); + adb.setPositiveButton("OK", new DialogInterface.OnClickListener() //Кнопка открыть + { + @Override + public void onClick(DialogInterface arg0, int arg1) + {} + }); + AlertDialog ad = adb.show(); + ad.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(Color.BLACK); + } + + @Override + protected void onCreate(Bundle savedInstanceState) + { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_locust_del_list); + + //Загрузка сохранёного языка + Tools.loadLocale(this); + + + llList = (LinearLayout) findViewById(R.id.llList); + + /* + * btn = (Button) findViewById(R.id.button1); OnClickListener oclBtnRus = new OnClickListener() { + * + * @Override public void onClick(View v) { //Отобразим окно уничтожения саранчи Intent intent = new Intent(LocustDelListActivity.this, LocustDelActivity.class); //intent.putExtra("id", b.id); //intent.putExtra("date", b.date); startActivity(intent); } }; btn.setOnClickListener(oclBtnRus); + */ + + spiList = (Spinner) findViewById(R.id.spiList); // Оператор (пилот, водитель, др...) + ArrayList list = new ArrayList(); + list.add(getString(R.string.Waiting_to_be_filled)); + list.add(getString(R.string.Not_submitted)); + list.add(getString(R.string.Submitted)); + list.add(getString(R.string.All)); + ArrayAdapter dataAdapter = new ArrayAdapter(this, android.R.layout.simple_spinner_item, list); + dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + spiList.setAdapter(dataAdapter); + + spiList.setOnItemSelectedListener(new OnItemSelectedListener() + { + @Override + public void onItemSelected(AdapterView parentView, View selectedItemView, int position, long id) + { + //onStart(); + updateList(); + } + @Override + public void onNothingSelected(AdapterView parentView) + { + } + }); + + btnAdd = (FloatingActionButton) findViewById(R.id.btnAdd); + btnAdd.setOnClickListener(new View.OnClickListener() { + public void onClick(View v) { + Intent intent = new Intent(LocustDelListActivity.this, LocustDelActivity.class); + startActivity(intent); + } + }); + + //Чтоб список обновлялся раз в минуту в соответствии с текущем фильтром (для наглядности отправки данных) + timer.scheduleAtFixedRate(new TimerTask() + { + @SuppressLint("HandlerLeak") + private Handler myHandle = new Handler() { + @Override + public void handleMessage(Message msg) + { + //onStart(); + updateList(); + } + }; + + @Override + public void run() { + myHandle.sendMessage(myHandle.obtainMessage()); + } + }, 0, 1000 ); //Раз в секунду + + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) + { + getMenuInflater().inflate(R.menu.locust_del_list, menu); + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) + { + switch (item.getItemId()) + { + case R.id.itemCreate: // Создание карточки + + Intent intent = new Intent(this, LocustDelActivity.class); + startActivity(intent); + + break; + case R.id.itemDelete: //Удаление всех отправленных из базы + + AlertDialog.Builder alertDialog = new AlertDialog.Builder(LocustDelListActivity.this,R.style.AlertDialogTheme);//new AlertDialog.Builder(this).create(); + alertDialog.setCancelable(false); + alertDialog.setTitle(getString(R.string.Warning)); + alertDialog.setMessage(getString(R.string.Cleaning)); + alertDialog.setPositiveButton(getString(R.string.action_delete), new DialogInterface.OnClickListener(){ + @Override + public void onClick(DialogInterface dialog, int arg1) + { + DbOpenHelper dboh = new DbOpenHelper(LocustDelListActivity.this); + dboh.getReadableDatabase().execSQL("delete from frmlocustdel where send=1"); + dboh.close(); + LocustDelListActivity.this.onStart(); + } + }); + alertDialog.setNegativeButton(getString(R.string.Cancel), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int arg1) + { + dialog.cancel(); + } + }); + AlertDialog ad = alertDialog.show(); + ad.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(Color.BLACK); + ad.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(Color.BLACK); + + break; +/* case R.id.itemExport: // Экспорт в Excel всего что накопилось + + SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss dd.MM.yyyy"); + + DbOpenHelper dboh = new DbOpenHelper(this); + SQLiteDatabase db = dboh.getReadableDatabase(); + + String user = ""; + Cursor cursor = db.rawQuery("select name,surname,patronymic from _user where del=0;", null); + if (cursor.moveToFirst()) + { + user = cursor.getString(cursor.getColumnIndex("surname")) + " " + cursor.getString(cursor.getColumnIndex("name")) + " " + + cursor.getString(cursor.getColumnIndex("patronymic")); + } + cursor.close(); + + String html = ""; + + html += "\n"; + html += " \n"; + html += " Locust\n"; + html += " \n"; + html += " "; + html += " \n"; + html += " \n"; + + html += "" + getString(R.string.title_activity_locust_del) + ":
"; + html += "" + getString(R.string.Date) + ": " + sdf.format(new Date()) + "
"; + html += "" + getString(R.string.User) + ": " + user; + + html += " \n"; + html += " \n"; + html += " \n"; + html += " "; + + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; //СВЕДЕНИЯ ПО ОПРЫСКИВАНИЮ + html += ""; + html += ""; + //html += ""; + + html += " "; + html += " "; + + html += ""; + + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + //html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + //html += ""; //Расстояние между проходами опрыскивателя (м) + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + + html += " \n"; + html += " \n"; + html += " \n"; + + int n = 0; + String sql=""; + + sql+="SELECT\n"; + sql+=" fld.id,\n"; + sql+=" c.name country_name,\n"; + sql+=" cr.name region_name,\n"; + sql+=" fld.area,\n"; //Район + sql+=" fld.district,\n"; //Сельский округ и/или хозяйство + sql+=" fld.observer,\n"; //ФИО наблюдателя + sql+=" date(fld.date, 'unixepoch') date,\n"; //Должна быть уникальной + sql+=" fld.terrain,\n"; //Название местности либо урочища + sql+=" fld.lat,\n"; //Широта + sql+=" fld.lon,\n"; //Долгота + sql+=" fld.infested_area,\n"; //заселенная площадь(га) + sql+=" fld.treated_area,\n"; //обработанная площадь(га) + sql+=" fld.vegetation_type,\n"; //Тип(дикая, культурная) + sql+=" fld.vegetation_height,\n"; //Высота (м) + sql+=" fld.vegetation_crop,\n"; //Текстовое поле для перечисления произрастающих культур + sql+=" fld.vegetation_cover,\n"; //Растительный покров (%) + sql+=" fld.vegetation_damage,\n"; //Повреждения растительного покрова(%) + sql+=" fld.vegetation_damage_area,\n"; //Площадь повреждений (га) + sql+=" fld.insecticide_name,\n"; //коммерческое название + sql+=" fld.insecticide_active_substance,\n"; //Наименование активного вещества + sql+=" fld.insecticide_concentration,\n"; //концентрация(г д.в./л или%) + sql+=" fld.insecticide_formulation,\n"; //формуляция(УМО, КЭ, др.) + sql+=" fld.insecticide_dose,\n"; //норма расхода(л/га) + sql+=" fld.insecticide_rate,\n"; //расход рабочей жидкости(л/га) + sql+=" date(fld.insecticide_expiry_date, 'unixepoch') insecticide_expiry_date,\n"; //окончание срока действия + sql+=" CASE fld.insecticide_mixed WHEN 1 THEN 'Yes' WHEN 0 THEN 'No' ELSE '' END insecticide_mixed,\n"; //смешивается ли инсектицид с водой или растворителем? + sql+=" fld.insecticide_mixed_name,\n"; //если да, то с чем + sql+=" fld.insecticide_mixed_ratio,\n"; //если да, то в каком соотношении (%) + sql+=" fld.weather_time_start,\n"; //время начала + sql+=" fld.weather_time_end,\n"; //время окончания + sql+=" fld.weather_temperature_start,\n"; //Температура нач.(°C) + sql+=" fld.weather_temperature_end,\n"; //Температура кон.(°C) + sql+=" fld.weather_humidity_start,\n"; //отн. влажность воздуха нач.(%) + sql+=" fld.weather_humidity_end,\n"; //отн. влажность воздуха кон.(%) + sql+=" fld.weather_wind_speed_start,\n"; //скорость ветра нач. (м/с) + sql+=" fld.weather_wind_speed_end,\n"; //скорость ветра кон. (м/с) + sql+=" ld1.name weather_direction_start,\n"; //направление ветра нач. + sql+=" ld2.name weather_direction_end,\n"; //направление ветра кон. + sql+=" ld3.name weather_spray_direction_start,\n"; //направление опрыскивания нач. + sql+=" ld4.name weather_spray_direction_end,\n"; //направление опрыскивания кон. + sql+=" fld.locust_speciese,\n"; //вид: CIT, DMA, LMI, др. + sql+=" fld.locust_hoppers,\n"; //Стадии личинок + sql+=" fld.locust_density,\n"; //плотность на м2 + sql+=" CASE fld.locust_kuliguli WHEN 1 THEN 'Yes' WHEN 0 THEN 'No' ELSE '' END locust_kuliguli,\n"; //Кулиги (да, нет) + sql+=" CASE fld.locust_swarm WHEN 1 THEN 'Yes' WHEN 0 THEN 'No' ELSE '' END locust_swarm,\n"; ////Стаи (да, нет) + sql+=" CASE fld.locust_sparse WHEN 1 THEN 'Yes' WHEN 0 THEN 'No' ELSE '' END locust_sparse,\n"; //Разреженные (да, нет) + sql+=" p.name locust_phase_name,\n"; //Фаза саранчи (одиночная, переходная, стадная) + sql+=" st.name spray_platform,\n"; //Вид опрыскивания + sql+=" sp_a.name spray_platform_a,\n"; //1) «Авиа» - выпадающий список:«Самолет», «Вертолет», «Дельтаплан». + sql+=" sp_g.name spray_platform_g,\n"; //2) «Наземное» - выпадающий список:«Трактор», «Машина», «Аэроз.генераторG». + sql+=" sp_h.name spray_platform_h,\n"; //3) «Ручное» - выпадающий список:«Ранцевый», «Моторный», «Батарейный». + //sql+=" lot.name spray_operatortype_name,\n"; //Оператор (пилот, водитель, др...) + //sql+=" fld.spray_operator_name,\n"; //Имя оператора + sql+=" fld.spray_manufacturer_name,\n"; //Марка опрыскивателя + sql+=" fld.spray_model_name,\n"; //Модель опрыскивателя + //sql+=" date(fld.spray_date_calibration, 'unixepoch') spray_date_calibration,\n"; //Дата последней калибровки + sql+=" fld.spray_height,\n"; //Высота над поверхностью почвы (м) + sql+=" fld.spray_width,\n"; //Ширина захвата (м) + //sql+=" fld.spray_spacing,\n"; //Расстояние между проходами опрыскивателя (м) + sql+=" CASE fld.spray_barrier WHEN 1 THEN 'Yes' WHEN 0 THEN 'No' ELSE '' END spray_barrier,\n"; //Барьеры (да, нет) + sql+=" fld.spray_barrier_width,\n"; //Ширина (м) + sql+=" fld.spray_barrier_space,\n"; //промежуток (м) + sql+=" fld.spray_speed,\n"; //Скорость движения (км/ч) + sql+=" CASE fld.spray_gps WHEN 1 THEN 'Yes' WHEN 0 THEN 'No' ELSE '' END spray_gps,\n"; //Антена: DGPS использовалась + sql+=" fld.spray_marking,\n"; //Наземная маркировка(Сиг-нальщики, GPS, Машина, Нет) + sql+=" fld.efficacy_mortality,\n"; //смертность саранчи(%) + sql+=" fld.efficacy_passed_time,\n"; //Прошло времени после обработки + sql+=" lm.name efficacy_mortality_method,\n"; //метод подсчета смертности + sql+=" CASE fld.safety_clothing WHEN 1 THEN 'Yes' WHEN 0 THEN 'No' ELSE '' END safety_clothing,\n"; //Какой защитной одеждой пользовался оператор (да, нет) + sql+=" fld.safety_inform,\n"; //Кто был оповещен об обработках? + sql+=" CASE fld.safety_non_target WHEN 1 THEN 'Yes' WHEN 0 THEN 'No' ELSE '' END safety_non_target,\n"; //воздействие на нецелевые организмы (да, нет) + sql+=" fld.safety_non_target_effect,\n"; //если да, то какое + sql+=" fld.description\n"; //КОММЕНТАРИИ + sql+="FROM\n"; + sql+=" frmlocustdel fld\n"; + sql+=" LEFT JOIN countries c ON fld.country_id = c.id\n"; + sql+=" LEFT JOIN countriesregions cr ON fld.region_id = cr.id\n"; + sql+=" LEFT JOIN list_phase p ON fld.locust_phase_id = p.id\n"; + //sql+=" LEFT JOIN list_operatorstypes lot ON lot.id = fld.spray_operatortype_id\n"; + sql+=" LEFT JOIN list_directions ld1 ON ld1.id = fld.weather_direction_start\n"; + sql+=" LEFT JOIN list_directions ld2 ON ld2.id = fld.weather_direction_end\n"; + sql+=" LEFT JOIN list_directions ld3 ON ld3.id = fld.weather_spray_direction_start\n"; + sql+=" LEFT JOIN list_directions ld4 ON ld4.id = fld.weather_spray_direction_end\n"; + sql+=" LEFT JOIN sprayers_types st ON st.id = fld.spray_platform\n"; + sql+=" LEFT JOIN Sprayers sp_a ON sp_a.id = fld.spray_platform_a\n"; + sql+=" LEFT JOIN Sprayers sp_g ON sp_g.id = fld.spray_platform_g\n"; + sql+=" LEFT JOIN Sprayers sp_h ON sp_h.id = fld.spray_platform_h\n"; + sql+=" LEFT JOIN list_mortality lm ON lm.id = fld.efficacy_mortality_method\n"; + sql+="where fld.del=0\n"; + + cursor = dboh.getReadableDatabase().rawQuery(sql, null); + if (cursor.moveToFirst()) + { + do + { + n++; + + html += " "; + html += ""; + + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + //html += ""; + //html += ""; + html += ""; + html += ""; + //html += ""; + html += ""; + html += ""; + //html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + //html += ""; + + html += ""; + + html += ""; + html += ""; + html += ""; + + html += "\n"; + + } while (cursor.moveToNext()); + } + cursor.close(); + dboh.close(); + + html += " \n"; + html += "
" + getString(R.string.Attributes) + "
  " + getString(R.string.CONTROL_LOCATION) + "" + getString(R.string.VEGETATION_DATA) + "" + getString(R.string.INSECTICIDE_DATA) + "" + getString(R.string.WEATHER_CONDITIONS) + "" + getString(R.string.LOCUST_INFORMATION_INCLUDING_EGG_PODS) + "" + getString(R.string.SPRAY_APPLICATION) + "" + getString(R.string.EFFECTIVENESS) + "" + getString(R.string.SAFETY_AND_ENVIRONMENT) + " 
" + getString(R.string.Country) + "" + getString(R.string.Region) + "" + getString(R.string.Area) + "" + getString(R.string.Rural_district) + "" + getString(R.string.Name_of_survey_team_leader) + "" + getString(R.string.Date) + "" + getString(R.string.Village) + "" + getString(R.string.Lat) + "" + getString(R.string.Lon) + "" + getString(R.string.Area_infested) + "" + getString(R.string.Area_treated) + "" + getString(R.string.Vegetation_type) + "" + getString(R.string.Height_cm) + "" + getString(R.string.Vegetation_crops) + "" + getString(R.string.Vegetation_cover) + "" + getString(R.string.Damage) + "" + getString(R.string.Veg_damage_area) + "" + getString(R.string.Trade_name) + "" + getString(R.string.The_active_substance) + "" + getString(R.string.Concentration) + "" + getString(R.string.Formulation) + "" + getString(R.string.Dose_rate) + "" + getString(R.string.Rate_of_working_solution) + "" + getString(R.string.Expiry_date) + "" + getString(R.string.Is_insecticide_mixed_with_water_or_solvent) + "" + getString(R.string.If_yes_what_solvent_and_mixing_name) + "" + getString(R.string.If_yes_what_solvent_and_mixing_ratio) + "" + getString(R.string.Time_start) + "" + getString(R.string.Time_end) + "" + getString(R.string.Temperature_start) + "" + getString(R.string.Temperature_end) + "" + getString(R.string.Relative_humidity_start) + "" + getString(R.string.Relative_humidity_end) + "" + getString(R.string.Wind_speed_start) + "" + getString(R.string.Wind_speed_end) + "" + getString(R.string.Wind_direction_start) + "" + getString(R.string.Wind_direction_end) + "" + getString(R.string.Spray_direction_start) + "" + getString(R.string.Spray_direction_end) + "" + getString(R.string.Species) + "" + getString(R.string.Hoppers) + "" + getString(R.string.Density) + "" + getString(R.string.Kuliguli) + "" + getString(R.string.Swarm) + "" + getString(R.string.Del_Scattered) + "" + getString(R.string.Phase) + "" + getString(R.string.Spray_platform) + "" + getString(R.string.Spray_platform_a) + "" + getString(R.string.Spray_platform_g) + "" + getString(R.string.Spray_platform_h) + "" + getString(R.string.Spray_operator) + "" + getString(R.string.Name_of_operator) + "" + getString(R.string.Spray_manufacturer) + "" + getString(R.string.Model_sprayer) + "" + getString(R.string.Date_of_last_calibration) + "" + getString(R.string.Atomizer_height_above_ground_m) + "" + getString(R.string.Coverage_width) + "" + getString(R.string.Spacing_between_the_sprayer) + "" + getString(R.string.Barriers) + "" + getString(R.string.Barrier_width) + "" + getString(R.string.Spacing_of_barriers_m) + "" + getString(R.string.Speed) + "" + getString(R.string.Antenna_DGPS_used) + "" + getString(R.string.Ground_marking) + "" + getString(R.string.Biological_efficiency_of_treatment) + "" + getString(R.string.Time_after_treatment_hours) + "" + getString(R.string.Efficacy_mortality_method) + "" + getString(R.string.Protective_clothing) + "" + getString(R.string.Inform_abaut_spraying) + "" + getString(R.string.Safety_non_target) + "" + getString(R.string.Safety_non_target_effect) + "" + getString(R.string.Comments) + "
" + n + "" + Tools.getStringFromCursor(cursor, "country_name") + " " + Tools.getStringFromCursor(cursor, "region_name") + " " + Tools.getStringFromCursor(cursor, "area") + " " + Tools.getStringFromCursor(cursor, "district") + " " + Tools.getStringFromCursor(cursor, "observer") + " " + Tools.getStringFromCursor(cursor, "date") + " " + Tools.getStringFromCursor(cursor, "terrain") + " " + Tools.getStringFromCursor(cursor, "lat") + " " + Tools.getStringFromCursor(cursor, "lon") + " " + Tools.getStringFromCursor(cursor, "infested_area") + " " + Tools.getStringFromCursor(cursor, "treated_area") + " " + Tools.getStringFromCursor(cursor, "vegetation_type") + " " + Tools.getStringFromCursor(cursor, "vegetation_height") + " " + Tools.getStringFromCursor(cursor, "vegetation_crop") + " " + Tools.getStringFromCursor(cursor, "vegetation_cover") + " " + Tools.getStringFromCursor(cursor, "vegetation_damage") + " " + Tools.getStringFromCursor(cursor, "vegetation_damage_area") + " " + Tools.getStringFromCursor(cursor, "insecticide_name") + " " + Tools.getStringFromCursor(cursor, "insecticide_active_substance") + " " + Tools.getStringFromCursor(cursor, "insecticide_concentration") + " " + Tools.getStringFromCursor(cursor, "insecticide_formulation") + " " + Tools.getStringFromCursor(cursor, "insecticide_dose") + " " + Tools.getStringFromCursor(cursor, "insecticide_rate") + " " + Tools.getStringFromCursor(cursor, "insecticide_expiry_date") + " " + Tools.getStringFromCursor(cursor, "insecticide_mixed") + " " + Tools.getStringFromCursor(cursor, "insecticide_mixed_name") + " " + Tools.getStringFromCursor(cursor, "insecticide_mixed_ratio") + " " + Tools.getStringFromCursor(cursor, "weather_time_start") + " " + Tools.getStringFromCursor(cursor, "weather_time_end") + " " + Tools.getStringFromCursor(cursor, "weather_temperature_start") + " " + Tools.getStringFromCursor(cursor, "weather_temperature_end") + " " + Tools.getStringFromCursor(cursor, "weather_humidity_start") + " " + Tools.getStringFromCursor(cursor, "weather_humidity_end") + " " + Tools.getStringFromCursor(cursor, "weather_wind_speed_start") + " " + Tools.getStringFromCursor(cursor, "weather_wind_speed_end") + " " + Tools.getStringFromCursor(cursor, "weather_direction_start") + " " + Tools.getStringFromCursor(cursor, "weather_direction_end") + " " + Tools.getStringFromCursor(cursor, "weather_spray_direction_start") + " " + Tools.getStringFromCursor(cursor, "weather_spray_direction_end") + " " + Tools.getStringFromCursor(cursor, "locust_speciese") + " " + Tools.getStringFromCursor(cursor, "locust_hoppers") + " " + Tools.getStringFromCursor(cursor, "locust_density") + " " + Tools.getStringFromCursor(cursor, "locust_kuliguli") + " " + Tools.getStringFromCursor(cursor, "locust_swarm") + " " + Tools.getStringFromCursor(cursor, "locust_sparse") + " " + Tools.getStringFromCursor(cursor, "locust_phase_name") + " " + Tools.getStringFromCursor(cursor, "spray_platform") + " " + Tools.getStringFromCursor(cursor, "spray_platform_a") + " " + Tools.getStringFromCursor(cursor, "spray_platform_g") + " " + Tools.getStringFromCursor(cursor, "spray_platform_h") + " " + Tools.getStringFromCursor(cursor, "spray_operatortype_name") + " " + Tools.getStringFromCursor(cursor, "spray_operator_name") + " " + Tools.getStringFromCursor(cursor, "spray_manufacturer_name") + " " + Tools.getStringFromCursor(cursor, "spray_model_name") + " " + Tools.getStringFromCursor(cursor, "spray_date_calibration") + " " + Tools.getStringFromCursor(cursor, "spray_height") + " " + Tools.getStringFromCursor(cursor, "spray_width") + " " + Tools.getStringFromCursor(cursor, "spray_spacing") + " " + Tools.getStringFromCursor(cursor, "spray_barrier") + " " + Tools.getStringFromCursor(cursor, "spray_barrier_width") + " " + Tools.getStringFromCursor(cursor, "spray_barrier_space") + " " + Tools.getStringFromCursor(cursor, "spray_speed") + " " + Tools.getStringFromCursor(cursor, "spray_gps") + " " + Tools.getStringFromCursor(cursor, "spray_marking") + " " + Tools.getStringFromCursor(cursor, "efficacy_mortality") + " " + Tools.getStringFromCursor(cursor, "efficacy_passed_time") + " " + Tools.getStringFromCursor(cursor, "efficacy_mortality_method") + " " + Tools.getStringFromCursor(cursor, "safety_clothing") + " " + Tools.getStringFromCursor(cursor, "safety_inform") + " "; + String dv=""; + if(Tools.getStringFromCursor(cursor, "safety_inform").indexOf("1") != -1) + { + html += dv + getString(R.string.Farmer); + dv = ", "; + } + if(Tools.getStringFromCursor(cursor, "safety_inform").indexOf("2") != -1) + { + html += dv + getString(R.string.Villager); + dv = ", "; + } + if(Tools.getStringFromCursor(cursor, "safety_inform").indexOf("3") != -1) + { + html += dv + getString(R.string.Official); + dv = ", "; + } + if(Tools.getStringFromCursor(cursor, "safety_inform").indexOf("4") != -1) + { + html += dv + getString(R.string.Beekeeper); + dv = ", "; + } + if(Tools.getStringFromCursor(cursor, "safety_inform").indexOf("5") != -1) + { + html += dv + getString(R.string.Other); + dv = ", "; + } + html += " " + Tools.getStringFromCursor(cursor, "safety_non_target") + " " + Tools.getStringFromCursor(cursor, "safety_non_target_effect") + " " + Tools.getStringFromCursor(cursor, "description") + " 
\n"; + html += " \n"; + html += "\n"; + + // Сохраняем на карточку + sdf = new SimpleDateFormat("yyyyMMdd_HHmmss"); + file = new File(Environment.getExternalStorageDirectory() + File.separator + "Data" + File.separator + "Locust" + File.separator + + "locust_" + sdf.format(new Date()) + ".html"); + file.getParentFile().mkdirs(); + // создади переменную для записи создания и наполнения файла + FileWriter writer = null; + try + { + writer = new FileWriter(file); + } catch (IOException e) + { + Log.e("Error", "Не создался writer", e); + } + + // запишем в файл пару строк + try + { + writer.write(html); + writer.flush(); + writer.close(); + } catch (IOException e) + { + Log.e("Error", "Не записываются строки", e); + } + + //Предлагаем открыть созданый файл + AlertDialog.Builder adb; + adb = new AlertDialog.Builder(this); + adb.setTitle(getString(R.string.Warning)); // заголовок + adb.setMessage(getString(R.string.File_saved_in)+" "+file.getAbsolutePath()); // сообщение + adb.setPositiveButton(getString(R.string.Open), new DialogInterface.OnClickListener() //Кнопка открыть + { + @Override + public void onClick(DialogInterface arg0, int arg1) + { + //Предлагаем открыть созданый файл + if(LocustDelListActivity.this.file.exists()) + { + Intent i = new Intent(); + i.setAction(android.content.Intent.ACTION_VIEW); + i.setDataAndType(Uri.fromFile(LocustDelListActivity.this.file), "text/html"); + startActivity(i); + } + } + }); + adb.setNegativeButton(getString(R.string.Cancel), new DialogInterface.OnClickListener() //Кнопка отмена + { + @Override + public void onClick(DialogInterface arg0, int arg1) + { + + } + }); + AlertDialog ad = adb.show(); + ad.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(Color.BLACK); + ad.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(Color.BLACK); + + break; +*/ + default: + return false; + } + return true; + } + + public void updateList() + { + llList.removeAllViews(); + + DbOpenHelper dboh = new DbOpenHelper(LocustDelListActivity.this); + Cursor cursor = null; + switch (spiList.getSelectedItemPosition()) + { + case 0: + cursor = dboh.getReadableDatabase().rawQuery("select uid, coalesce(district,'') || ' ' || coalesce(terrain,'') terrain, date from frmlocustdel where del=0 and filled!=1", null); //Не отправленные + break; + case 1: + cursor = dboh.getReadableDatabase().rawQuery("select uid, coalesce(district,'') || ' ' || coalesce(terrain,'') terrain, date from frmlocustdel where del=0 and send=0 and filled=1", null); //Не отправленные + break; + case 2: + cursor = dboh.getReadableDatabase().rawQuery("select uid, coalesce(district,'') || ' ' || coalesce(terrain,'') terrain, date from frmlocustdel where del=0 and send=1", null); //Отправленные + break; + default: + cursor = dboh.getReadableDatabase().rawQuery("select uid, coalesce(district,'') || ' ' || coalesce(terrain,'') terrain, date from frmlocustdel where del=0", null); //Все + break; + } + + // Tools.logCursor(cursor); + OnClickListener oclBtn = new OnClickListener() + { + @Override + public void onClick(View v) + { + MyButton b = (MyButton) v; + + Intent intent = new Intent(LocustDelListActivity.this, LocustDelActivity.class); + intent.putExtra("uid", b.uid); + startActivity(intent); + } + }; + + if (cursor.moveToFirst()) + { + do + { + btn = new MyButton(this); + + btn.setOnClickListener(oclBtn); + + btn.uid = cursor.getString(cursor.getColumnIndex("uid")); + + // Преобразует с учётом временой зоны (пример long dv = 946684800L * 1000L; //2000 ный по гринвичу дало 6 утра) + long dv = cursor.getLong(cursor.getColumnIndex("date")) * (long) 1000;// its need to be in milisecond + Date df = new java.util.Date(dv); + String vv = new SimpleDateFormat("dd.MM.yyyy").format(df); + + btn.setText(cursor.getString(cursor.getColumnIndex("terrain")) + " (" + vv + ")"); + + LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); + params.bottomMargin = 2; + + llList.addView(btn,params); + + } while (cursor.moveToNext()); + } + cursor.close(); + dboh.close(); + } + + /** + * СМ. http://developer.android.com/reference/android/app/Activity.html Событие происходит при старте и при возврате на этот Activity + * */ + @Override + public void onStart() + { + super.onStart(); + + DbOpenHelper dboh = new DbOpenHelper(this); + SQLiteDatabase db = dboh.getReadableDatabase(); + Cursor cursor = db.rawQuery("select * from terminals where del=0 and serial='"+ Settings.Secure.getString(getContentResolver(), Settings.Secure.ANDROID_ID)+"';", null); + if(!cursor.moveToFirst()) + { + Toast toast = Toast.makeText(getApplicationContext(), + getResources().getString(R.string.Please_authorize_the_tablet), Toast.LENGTH_LONG); + toast.show(); + } + cursor.close(); + dboh.close(); + } + +} diff --git a/app/src/main/java/kz/istt/locust/LocustListActivity.java b/app/src/main/java/kz/istt/locust/LocustListActivity.java new file mode 100644 index 0000000..7e57a79 --- /dev/null +++ b/app/src/main/java/kz/istt/locust/LocustListActivity.java @@ -0,0 +1,668 @@ +package kz.istt.locust; + + +import android.annotation.SuppressLint; +import android.app.AlertDialog; +import android.app.DatePickerDialog; +import android.app.TimePickerDialog; +import android.content.DialogInterface; +import android.content.Intent; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; +import android.graphics.Color; +import android.os.Bundle; +import android.os.Handler; +import android.os.Message; +import android.provider.Settings; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; +import android.view.View.OnClickListener; +import android.widget.AdapterView; +import android.widget.AdapterView.OnItemSelectedListener; +import android.widget.ArrayAdapter; +import android.widget.DatePicker; +import android.widget.LinearLayout; +import android.widget.LinearLayout.LayoutParams; +import android.widget.Spinner; +import android.widget.TimePicker; +import android.widget.Toast; + +import androidx.appcompat.app.AppCompatActivity; + +import com.google.android.material.floatingactionbutton.FloatingActionButton; + +import java.io.File; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.GregorianCalendar; +import java.util.Timer; +import java.util.TimerTask; + +import dbfields.fieldDB; + +public class LocustListActivity extends AppCompatActivity +{ + private static final int PERMISSION_REQUEST_CODE_CAMERA = 1; + + public LinearLayout llList; + public MyButton btn; + public FloatingActionButton btnAdd = null; + public Spinner spiList = null; + + private Timer timer = new Timer(); + public File file = null; + //public int g_button=0; + + public void alert(String text) + { + AlertDialog.Builder adb = new AlertDialog.Builder(this,R.style.AlertDialogTheme); + adb.setTitle(getString(R.string.Warning)); + adb.setMessage(text); + adb.setPositiveButton("OK", new DialogInterface.OnClickListener() //Кнопка открыть + { + @Override + public void onClick(DialogInterface arg0, int arg1) + {} + }); + AlertDialog ad = adb.show(); + ad.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(Color.BLACK); + } + + @Override + protected void onCreate(Bundle savedInstanceState) + { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_locust_list); + + //Загрузка сохранёного языка + Tools.loadLocale(this); + + + llList = (LinearLayout) findViewById(R.id.llList); + + spiList = (Spinner) findViewById(R.id.spiList); + ArrayList list = new ArrayList(); + list.add(getString(R.string.Waiting_to_be_filled)); // 0 + list.add(getString(R.string.Not_submitted)); // 1 + list.add(getString(R.string.Submitted)); // 2 + list.add(getString(R.string.All)); // 3 + ArrayAdapter dataAdapter = new ArrayAdapter(this, android.R.layout.simple_spinner_item, list); + dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + spiList.setAdapter(dataAdapter); + + //Событие смены вып списка + spiList.setOnItemSelectedListener(new OnItemSelectedListener() + { + @Override + public void onItemSelected(AdapterView parentView, View selectedItemView, int position, long id) + { + //onStart(); + updateList(); + } + @Override + public void onNothingSelected(AdapterView parentView) + { + } + }); + + btnAdd = (FloatingActionButton) findViewById(R.id.btnAdd); + btnAdd.setOnClickListener(new View.OnClickListener() { + public void onClick(View v) { + Intent intent = new Intent(LocustListActivity.this, LocustActivity.class); + startActivity(intent); + } + }); + + + //Чтоб список обновлялся раз в минуту в соответствии с текущем фильтром (для наглядности отправки данных) + timer.scheduleAtFixedRate(new TimerTask() + { + @SuppressLint("HandlerLeak") + private Handler myHandle = new Handler() { + @Override + public void handleMessage(Message msg) + { + //onStart(); + updateList(); + } + }; + @Override + public void run() { + myHandle.sendMessage(myHandle.obtainMessage()); + } + }, 0, 1000 ); //Раз в минуту + + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) + { + getMenuInflater().inflate(R.menu.locust_list, menu); + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) + { + switch (item.getItemId()) + { + case R.id.itemCreate: // Создание карточки + + //onGetPermissions(1); + Intent intent = new Intent(this, LocustActivity.class); + startActivity(intent); + + break; + case R.id.itemDelete: //Удаление всех отправленных из базы + + AlertDialog.Builder alertDialog = new AlertDialog.Builder(LocustListActivity.this,R.style.AlertDialogTheme);//new AlertDialog.Builder(this).create(); + alertDialog.setCancelable(false); + alertDialog.setTitle(getString(R.string.Warning)); + alertDialog.setMessage(getString(R.string.Cleaning)); + alertDialog.setPositiveButton(getString(R.string.action_delete), new DialogInterface.OnClickListener(){ + @Override + public void onClick(DialogInterface dialog, int arg1) + { + DbOpenHelper dboh = new DbOpenHelper(LocustListActivity.this); + dboh.getReadableDatabase().execSQL("delete from frmlocust where send=1"); + dboh.close(); + LocustListActivity.this.onStart(); + } + }); + alertDialog.setNegativeButton(getString(R.string.Cancel), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int arg1) + { + dialog.cancel(); + } + }); + AlertDialog ad = alertDialog.show(); + ad.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(Color.BLACK); + ad.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(Color.BLACK); + + break; +/* case R.id.itemExport: // Экспорт в Excel всего что накопилось + + SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss dd.MM.yyyy"); + + DbOpenHelper dboh = new DbOpenHelper(this); + SQLiteDatabase db = dboh.getReadableDatabase(); + + String user = ""; + Cursor cursor = db.rawQuery("select name,surname,patronymic from _user where del=0;", null); + if (cursor.moveToFirst()) + { + user = cursor.getString(cursor.getColumnIndex("surname")) + " " + cursor.getString(cursor.getColumnIndex("name")) + " " + + cursor.getString(cursor.getColumnIndex("patronymic")); + } + cursor.close(); + + String html = ""; + + html += "\n"; + html += " \n"; + html += " Locust\n"; + html += " \n"; + html += " "; + html += " \n"; + html += " \n"; + + html += "" + getString(R.string.title_activity_locust) + "
"; + html += "" + getString(R.string.Date) + ": " + sdf.format(new Date()) + "
"; + html += "" + getString(R.string.User) + ": " + user; + + html += " \n"; + html += " \n"; + html += " \n"; + html += " "; + + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; //Кулиги + html += ""; //Имаго + html += ""; + html += ""; + + html += " "; + html += " "; + html += ""; + html += ""; //Страна + html += ""; //Область + html += ""; //Район + html += ""; //Сельский округ и/или хозяйство + html += ""; //Наблюдатель + html += ""; //Дата + html += ""; //Название местности или урочища + html += ""; //Широта + html += ""; //Долгота + html += ""; //Обследованная площадь(га) + html += ""; //Тип биотопа + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; //Заселённая площадь(га) + html += ""; //Залежь кубышек (площадь м) + html += ""; //Кубышки(плотность на м) от/до + html += ""; //Яйца(в среднем в кубышке) + html += ""; //Яйца(% жизнеспособных) + html += ""; //Наличие естественных врагов(перечисление) + html += ""; //Отрождение + html += ""; //Возраст + html += ""; //Окраска (Фаза) + html += ""; + html += ""; + //Кулиги + html += ""; //Возраст + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + //Имаго + html += ""; //окрыление(%, начало, массовое) + html += ""; //половозрелость(- или+) + html += ""; //фаза(одиночнаяS, перехoдная Т, стаднаяG) + html += ""; //поведение(Изолир., Разреженные, Группы) + html += ""; //плотность(на трансекту или га) + html += ""; //Спаривание (да или нет) + html += ""; //Яйцекладка (да да нет) + html += ""; //полёты(- или+) + //Стаи + html += ""; + html += ""; + html += ""; + html += ""; //Число стай (на га) + html += ""; + html += ""; + html += ""; + html += ""; + + html += ""; + + html += " \n"; + html += " \n"; + html += " \n"; + + int n = 0; + String sql=""; + sql+="SELECT\n"; + sql+=" c.name country_name,\n"; + sql+=" cr.name region_name,\n"; + sql+=" area,\n"; + sql+=" district,\n"; + sql+=" observer,\n"; + sql+=" datetime(date, 'unixepoch') date,\n"; + sql+=" terrain,\n"; + sql+=" lat,\n"; + sql+=" lon,\n"; + sql+=" bio_hectare,\n"; + sql+=" COALESCE((SELECT translation FROM _translations t JOIN _languages l ON t.language_id=l.id WHERE t.del = 0 AND identifier = lb.name AND l.short_name='"+Tools.getLang()+"' LIMIT 1),lb.name) bio_biotope_name,\n"; + sql+=" lgr.name bio_greenery,\n"; + sql+=" COALESCE((SELECT translation FROM _translations t JOIN _languages l ON t.language_id=l.id WHERE t.del = 0 AND identifier = lc.name AND l.short_name='"+Tools.getLang()+"' LIMIT 1),lc.name) bio_greenery_cover_name,\n"; + sql+=" bio_temperature,\n"; + sql+=" bio_wind,\n"; + sql+=" CASE locust_have WHEN 1 THEN 'Yes' WHEN 0 THEN 'No' ELSE '' END locust_have,\n"; + sql+=" COALESCE((SELECT translation FROM _translations t JOIN _languages l ON t.language_id=l.id WHERE t.del = 0 AND identifier = lt.name AND l.short_name='"+Tools.getLang()+"' LIMIT 1),lt.name) locust_type_name,\n"; + sql+=" locust_populated,\n"; + sql+=" eggs_capsules_area,\n"; + sql+=" eggs_capsules_density,\n"; + sql+=" eggs_capsules_density_to,\n"; + sql+=" eggs_capsules,\n"; + sql+=" eggs_live,\n"; + sql+=" eggs_enemies,\n"; + sql+=" COALESCE((SELECT translation FROM _translations t JOIN _languages l ON t.language_id=l.id WHERE t.del = 0 AND identifier = b.name AND l.short_name='"+Tools.getLang()+"' LIMIT 1),b.name) larva_born_name,\n"; + sql+=" COALESCE((SELECT translation FROM _translations t JOIN _languages l ON t.language_id=l.id WHERE t.del = 0 AND identifier = lag2.name AND l.short_name='"+Tools.getLang()+"' LIMIT 1),lag2.name) larva_age,\n"; + sql+=" COALESCE((SELECT translation FROM _translations t JOIN _languages l ON t.language_id=l.id WHERE t.del = 0 AND identifier = lp.name AND l.short_name='"+Tools.getLang()+"' LIMIT 1),lp.name) larva_painting_name,\n"; + sql+=" COALESCE((SELECT translation FROM _translations t JOIN _languages l ON t.language_id=l.id WHERE t.del = 0 AND identifier = lbh.name AND l.short_name='"+Tools.getLang()+"' LIMIT 1),lbh.name) larva_behavior_name,\n"; + sql+=" larva_density,\n"; + sql+=" larva_density_to,\n"; + + sql+=" COALESCE((SELECT translation FROM _translations t JOIN _languages l ON t.language_id=l.id WHERE t.del = 0 AND identifier = lag.name AND l.short_name='"+Tools.getLang()+"' LIMIT 1),lag.name) kuliguli_age,\n"; + sql+=" kuliguli_density,\n"; + sql+=" kuliguli_density_to,\n"; + sql+=" kuliguli_size,\n"; + sql+=" kuliguli_count,\n"; + sql+=" COALESCE((SELECT translation FROM _translations t JOIN _languages l ON t.language_id=l.id WHERE t.del = 0 AND identifier = lac.name AND l.short_name='"+Tools.getLang()+"' LIMIT 1),lac.name) kuliguli_action_name,\n"; + + sql+=" COALESCE((SELECT translation FROM _translations t JOIN _languages l ON t.language_id=l.id WHERE t.del = 0 AND identifier = flg.name AND l.short_name='"+Tools.getLang()+"' LIMIT 1),flg.name) imago_wing_name,\n"; + sql+=" CASE imago_maturity WHEN 1 THEN 'Yes' WHEN 0 THEN 'No' ELSE '' END imago_maturity,\n"; + sql+=" imago_phase,\n"; + sql+=" imago_action,\n"; + sql+=" imago_density,\n"; + sql+=" CASE imago_copulation WHEN 1 THEN 'Yes' WHEN 0 THEN 'No' ELSE '' END imago_copulation,\n"; + sql+=" CASE imago_laying WHEN 1 THEN 'Yes' WHEN 0 THEN 'No' ELSE '' END imago_laying,\n"; + sql+=" CASE imago_flying WHEN 1 THEN 'Yes' WHEN 0 THEN 'No' ELSE '' END imago_flying,\n"; + sql+=" CASE swarm_maturity WHEN 1 THEN 'Yes' WHEN 0 THEN 'No' ELSE '' END swarm_maturity,\n"; + + sql+=" COALESCE((SELECT translation FROM _translations t JOIN _languages l ON t.language_id=l.id WHERE t.del = 0 AND identifier = ldy.name AND l.short_name='"+Tools.getLang()+"' LIMIT 1),ldy.name) swarm_density_name,\n"; + sql+=" swarm_size,\n"; + sql+=" swarm_count,\n"; + sql+=" CASE swarm_copulation WHEN 1 THEN 'Yes' WHEN 0 THEN 'No' ELSE '' END swarm_copulation,\n"; + sql+=" CASE swarm_laying WHEN 1 THEN 'Yes' WHEN 0 THEN 'No' ELSE '' END swarm_laying,\n"; + sql+=" COALESCE((SELECT translation FROM _translations t JOIN _languages l ON t.language_id=l.id WHERE t.del = 0 AND identifier = lds.name AND l.short_name='"+Tools.getLang()+"' LIMIT 1),lds.name) swarm_flying_direction_name,\n"; + sql+=" ldy2.name swarm_height,\n"; + + sql+=" description\n"; + sql+="FROM\n"; + sql+=" frmlocust fl\n"; + sql+=" LEFT JOIN countries c ON fl.country_id = c.id\n"; + sql+=" LEFT JOIN countriesregions cr ON fl.region_id = cr.id\n"; + sql+=" LEFT JOIN locuststypes lt ON fl.locust_type_id = lt.id\n"; + sql+=" LEFT JOIN list_density ldy ON fl.swarm_density_id = ldy.id\n"; + sql+=" LEFT JOIN list_directions lds ON fl.swarm_flying_direction_id = lds.id\n"; + sql+=" LEFT JOIN list_greenery lgr ON fl.bio_greenery_id = lgr.id\n"; + sql+=" LEFT JOIN list_density ldy2 ON ldy2.id=fl.swarm_height_id\n"; + sql+=" LEFT JOIN list_age lag ON lag.id = fl.kuliguli_age_id\n"; + sql+=" LEFT JOIN list_age lag2 ON lag.id = fl.larva_age_id\n"; + sql+=" LEFT JOIN list_biotope lb on lb.id=fl.bio_biotope_id\n"; + sql+=" LEFT JOIN list_cover lc on lc.id=fl.bio_greenery_cover_id\n"; + sql+=" LEFT JOIN Borns b on b.id=fl.larva_born_id\n"; + sql+=" LEFT JOIN list_paintings lp on lp.id=fl.larva_painting_id\n"; + sql+=" LEFT JOIN list_behaviors lbh on lbh.id=fl.larva_behavior_id\n"; + sql+=" LEFT JOIN list_actions lac on lac.id=fl.kuliguli_action_id\n"; + sql+=" LEFT JOIN Fledgling flg on flg.id=fl.imago_wing_id\n"; + + sql+="where fl.del=0\n"; + + cursor = dboh.getReadableDatabase().rawQuery(sql, null); + if (cursor.moveToFirst()) + { + do + { + n++; + + html += " "; + html += ""; + html += ""; //Страна + html += "";//Область + html += ""; //Район + html += ""; //Сельский округ и/или хозяйство + html += ""; //Наблюдатель + html += ""; + html += ""; //Название местности либо урочища + html += ""; + html += ""; + html += ""; //обследованная площадь(га) + html += ""; //Тип биотопа + html += ""; //растительность: сухая, всходы, зеленая, засыхающая + html += ""; //растительный покров(Редкий, Ср., Густой) + html += ""; //погода: температура воздуха(C) + html += ""; //погода: ветер(м/с) + html += ""; //Присутствует саранча или нет + html += ""; //Вид саранчи + html += ""; //Заселённая площадь(га) + html += ""; //залежь кубышек(площадь в м2) + html += ""; //кубышки(плотность на м2) от + html += ""; //яйца(в среднем в кубышке) + html += ""; //яйца(% жизнеспособных) + html += ""; //наличие естественных врагов(каких?) + html += ""; //отрождение + html += ""; //возраста: Младшие Средние Старшие + html += ""; //окраска(одиночнаяS, перехoдная Т, стаднаяG) + html += ""; //поведение(Изолир., Разреженные, Группы) + html += ""; //плотность на м2 от .. до + + html += ""; //cр. возраст(Младшие Средние Старшие) + html += ""; //плотн. в кулиге(на м2) + html += ""; //плотн. в кулиге(на м2) до + html += ""; //размер кулиг(м2) + html += ""; //число кулиг + html += ""; //поведение: миграция, кормёжка, отдых + + html += ""; //окрыление(%, начало, массовое) + html += ""; //половозрелость(- или+) + html += ""; //фаза(одиночнаяS, перехoдная Т, стаднаяG) + html += ""; //поведение(Изолир., Разреженные, Группы) + html += ""; //плотность(на трансекту или га) + html += ""; //Спаривание (да или нет) + html += ""; //Яйцекладка (да да нет) + html += ""; //полёты(- или+) + //Стаи + html += ""; //половозрелость(- или+) + html += ""; //плотность(на м2) + html += ""; //размер стаи(на км2) + html += ""; //число стай + html += ""; //Спаривание (да, нет) + html += ""; //Яйцекладка (да, нет) + html += ""; //направление полёта + html += ""; //высота(Низкая- Средняя- Высокая) + + html += ""; //КОММЕНТАРИИ + + html += "\n"; + + } while (cursor.moveToNext()); + } + cursor.close(); + dboh.close(); + + html += " \n"; + html += "
" + getString(R.string.Attributes) + "
  " + getString(R.string.Identification_of_the_place) + "" + getString(R.string.ECOLOGICAL_INFORMATION) + "" + getString(R.string.LOCUST_INFORMATION_INCLUDING_EGG_PODS) + "" + getString(R.string.Eggs) + "" + getString(R.string.Hoppers) + "" + getString(R.string.BANDS) + "" + getString(R.string.Adults) + "" + getString(R.string.Swarms) + " 
" + getString(R.string.Country) + "" + getString(R.string.Region) + "" + getString(R.string.Area) + "" + getString(R.string.Rural_district) + "" + getString(R.string.Name_of_survey_team_leader) + "" + getString(R.string.Date) + "" + getString(R.string.Village) + "" + getString(R.string.Lat) + "" + getString(R.string.Lon) + "" + getString(R.string.Surveyed_area_ha) + "" + getString(R.string.Type_of_biotope) + "" + getString(R.string.Vegetation) + "" + getString(R.string.Vegetation_cover) + "" + getString(R.string.Air_temperature) + "" + getString(R.string.Wind) + "" + getString(R.string.LOCUST_INFORMATION_INCLUDING_EGG_PODS) + "" + getString(R.string.Locust_species) + "" + getString(R.string.Area_infested) + "" + getString(R.string.Egg_bed) + "" + getString(R.string.Egg_pods)+ " .. "+ getString(R.string.to) + "" + getString(R.string.Eggs_number) + "" + getString(R.string.Eggs_viable) + "" + getString(R.string.Natural_enemies) + "" + getString(R.string.Hatching) + "" + getString(R.string.Hopper_stages) + "" + getString(R.string.Phase) + "" + getString(R.string.Spatial_distribution) + "" + getString(R.string.Hopper_density) + " .. " + getString(R.string.to) + "" + getString(R.string.Band_stage) + "" + getString(R.string.Band_density) + "" + getString(R.string.Band_density_to) + "" + getString(R.string.Band_sizes) + "" + getString(R.string.Number_of_bands) + "" + getString(R.string.Action) + "" + getString(R.string.Fledging) + "" + getString(R.string.Maturity) + "" + getString(R.string.Phase) + "" + getString(R.string.Spatial_distribution) + "" + getString(R.string.Adult_density) + "" + getString(R.string.Copulating) + "" + getString(R.string.Laying) + "" + getString(R.string.Flying) + "" + getString(R.string.Swarm_maturity) + "" + getString(R.string.Density_of_swarm) + "" + getString(R.string.Swarm_size) + "" + getString(R.string.Number_of_swarms) + "" + getString(R.string.Copulating) + "" + getString(R.string.Laying) + "" + getString(R.string.Flying_direction) + "" + getString(R.string.Flying_height) + "" + getString(R.string.Comments) + "
" + n + " " + Tools.getStringFromCursor(cursor, "country_name") + " " + Tools.getStringFromCursor(cursor, "region_name") + " " + Tools.getStringFromCursor(cursor, "area") + " " + Tools.getStringFromCursor(cursor, "district") + " " + Tools.getStringFromCursor(cursor, "observer") + " " + Tools.getStringFromCursor(cursor, "date") + " " + Tools.getStringFromCursor(cursor, "terrain") + " " + Tools.getStringFromCursor(cursor, "lat1") + " " + Tools.getStringFromCursor(cursor, "lon1") + " " + Tools.getStringFromCursor(cursor, "bio_hectare") + " " + Tools.getStringFromCursor(cursor, "bio_biotope_name") + " " + Tools.getStringFromCursor(cursor, "bio_greenery") + " " + Tools.getStringFromCursor(cursor, "bio_greenery_cover_name") + " " + Tools.getStringFromCursor(cursor, "bio_temperature") + " " + Tools.getStringFromCursor(cursor, "bio_wind") + " " + Tools.getStringFromCursor(cursor, "locust_have") + " " + Tools.getStringFromCursor(cursor, "locust_type_name") + " " + Tools.getStringFromCursor(cursor, "locust_populated") + " " + Tools.getStringFromCursor(cursor, "eggs_capsules_area") + " " + Tools.getStringFromCursor(cursor, "eggs_capsules_density")+" .. "+Tools.getStringFromCursor(cursor, "eggs_capsules_density_to") + " " + Tools.getStringFromCursor(cursor, "eggs_capsules") + " " + Tools.getStringFromCursor(cursor, "eggs_live") + " " + Tools.getStringFromCursor(cursor, "eggs_enemies") + " " + Tools.getStringFromCursor(cursor, "larva_born_name") + " " + Tools.getStringFromCursor(cursor, "larva_age") + " " + Tools.getStringFromCursor(cursor, "larva_painting_name") + " " + Tools.getStringFromCursor(cursor, "larva_behavior_name") + " " + Tools.getStringFromCursor(cursor, "larva_density") + " .. " + Tools.getStringFromCursor(cursor, "larva_density_to") + " " + Tools.getStringFromCursor(cursor, "kuliguli_age") + " " + Tools.getStringFromCursor(cursor, "kuliguli_density") + " " + Tools.getStringFromCursor(cursor, "kuliguli_density_to") + " " + Tools.getStringFromCursor(cursor, "kuliguli_size") + " " + Tools.getStringFromCursor(cursor, "kuliguli_count") + " " + Tools.getStringFromCursor(cursor, "kuliguli_action_name") + " " + Tools.getStringFromCursor(cursor, "imago_wing_name") + " " + Tools.getStringFromCursor(cursor, "imago_maturity") + " " + Tools.getStringFromCursor(cursor, "imago_phase") + " " + Tools.getStringFromCursor(cursor, "imago_action") + " " + Tools.getStringFromCursor(cursor, "imago_density") + " " + Tools.getStringFromCursor(cursor, "imago_copulation") + " " + Tools.getStringFromCursor(cursor, "imago_laying") + " " + Tools.getStringFromCursor(cursor, "imago_flying") + " " + Tools.getStringFromCursor(cursor, "swarm_maturity") + " " + Tools.getStringFromCursor(cursor, "swarm_density_name") + " " + Tools.getStringFromCursor(cursor, "swarm_size") + " " + Tools.getStringFromCursor(cursor, "swarm_count") + " " + Tools.getStringFromCursor(cursor, "swarm_copulation") + " " + Tools.getStringFromCursor(cursor, "swarm_laying") + " " + Tools.getStringFromCursor(cursor, "swarm_flying_direction_name") + " " + Tools.getStringFromCursor(cursor, "swarm_height") + " " + Tools.getStringFromCursor(cursor, "description") + " 
\n"; + html += " \n"; + html += "\n"; + + // Сохраняем на карточку + sdf = new SimpleDateFormat("yyyyMMdd_HHmmss"); + file = new File(Environment.getExternalStorageDirectory() + File.separator + "Data" + File.separator + "Locust" + File.separator + + "locust_" + sdf.format(new Date()) + ".html"); + file.getParentFile().mkdirs(); + // создади переменную для записи создания и наполнения файла + FileWriter writer = null; + try + { + writer = new FileWriter(file); + } catch (IOException e) + { + Log.e("Error", "Не создался writer", e); + } + + // запишем в файл пару строк + try + { + writer.write(html); + writer.flush(); + writer.close(); + } catch (IOException e) + { + Log.e("Error", "Не записываются строки", e); + } + + //Предлагаем открыть созданый файл + AlertDialog.Builder adb; + adb = new AlertDialog.Builder(this); + adb.setTitle(getString(R.string.Warning)); // заголовок + adb.setMessage(getString(R.string.File_saved_in)+" "+file.getAbsolutePath()); // сообщение + adb.setPositiveButton(getString(R.string.Open), new DialogInterface.OnClickListener() + { + @Override + public void onClick(DialogInterface arg0, int arg1) + { + //Предлагаем открыть созданый файл + Intent i = new Intent(); + i.setAction(android.content.Intent.ACTION_VIEW); + i.setDataAndType(Uri.fromFile(LocustListActivity.this.file), "text/html"); + startActivity(i); + } + }); + adb.setNegativeButton(getString(R.string.Cancel), new DialogInterface.OnClickListener() + { + @Override + public void onClick(DialogInterface arg0, int arg1) + { + + } + }); + + AlertDialog ad = adb.show(); + ad.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(Color.BLACK); + ad.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(Color.BLACK); + + break; +*/ + default: + return false; + } + return true; + } + + //Запрашиваю разрешения сдесь хотя GPS на другой форме использую + //WRITE_EXTERNAL_STORAGE +/* public void onGetPermissions(int button) + { + g_button = button; + + boolean granted=false; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + + List list = new ArrayList(); + + if (ContextCompat.checkSelfPermission(LocustListActivity.this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { + list.add(Manifest.permission.CAMERA); + } + + if(!list.isEmpty()) + { + ActivityCompat.requestPermissions(LocustListActivity.this,list.toArray(new String[list.size()]),PERMISSION_REQUEST_CODE_CAMERA); + granted=false; + }else + { + granted=true; + } + } + if(granted && g_button==1) + { + Intent intent = new Intent(this, LocustActivity.class); + startActivity(intent); + } + if(granted && g_button==2) + { + //ShowLocustDelActivity(); + } + } + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) + { + if (requestCode == PERMISSION_REQUEST_CODE_CAMERA) { + + boolean grant=true; + for(int i=0;i= Build.VERSION_CODES.M) { + + List list = new ArrayList(); + + if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { + list.add(Manifest.permission.ACCESS_COARSE_LOCATION); + } + if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { + list.add(Manifest.permission.ACCESS_FINE_LOCATION); + } + if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { + list.add(Manifest.permission.CAMERA); + } + if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { + list.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); + } + if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { + list.add(Manifest.permission.READ_EXTERNAL_STORAGE); + } + + + if(!list.isEmpty()) + { + ActivityCompat.requestPermissions(MainActivity.this,list.toArray(new String[list.size()]),PERMISSION_REQUEST_CODE); + granted=false; + }else + { + granted=true; + } + }else + { + granted=true; + } + + if(granted && button==1) + { + ShowLocustActivity(); + } + if(granted && button==2) + { + ShowLocustDelActivity(); + } + if(granted && button==3) + { + ShowSetupActivity();; + } + } + + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) + { + if (requestCode == PERMISSION_REQUEST_CODE) { + + boolean grant=true; + for(int i=0;i places = new ArrayList<>(); + private String mapsApiKey; + private int width; + + private double _lat = 0; // от устройства + private double _lon = 0; // от устройства + ArrayList points=new ArrayList(); + ArrayList polygons=new ArrayList(); + Polygon polygon=null; + + String uid=""; + private Marker marker=null; + private LocationManager lm; + + + //To use vector image as marker icon need convert him in bitmap + public Bitmap getMarker(int resID) { + IconGenerator iconGen = new IconGenerator(this); + + // Define the size you want from dimensions file + int shapeSize = 32;//this.getResources().getDimensionPixelSize(R.dimen.custom_marker_size); + + Drawable shapeDrawable = ResourcesCompat.getDrawable(this.getResources(), resID, null); + iconGen.setBackground(shapeDrawable); + + // Create a view container to set the size + View view = new View(this); + view.setLayoutParams(new ViewGroup.LayoutParams(shapeSize, shapeSize)); + iconGen.setContentView(view); + + // Create the bitmap + Bitmap bitmap = iconGen.makeIcon(); + return bitmap; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_maps); + // Obtain the SupportMapFragment and get notified when the map is ready to be used. + SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() + .findFragmentById(R.id.map); + mapFragment.getMapAsync(this); + + + Intent intent = getIntent(); + points = intent.getParcelableArrayListExtra("LatLon"); + uid = intent.getStringExtra("uid"); + + // Чтоб слушать GPS + lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE); + lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 500, 1, this); + } + + /** + * Manipulates the map once available. + * This callback is triggered when the map is ready to be used. + * This is where we can add markers or lines, add listeners or move the camera. In this case, + * we just add a marker near Sydney, Australia. + * If Google Play services is not installed on the device, the user will be prompted to install + * it inside the SupportMapFragment. This method will only be triggered once the user has + * installed Google Play services and returned to the app. + */ + @Override + public void onMapReady(GoogleMap googleMap) { + mMap = googleMap; + mMap.setOnMapLongClickListener(this); + polygons.clear(); + + // Add a marker in Sydney and move the camera + LatLng center = new LatLng(46.24, 50.30); + marker=mMap.addMarker(new MarkerOptions() + .position(center) + .title("Inspector") + .icon(BitmapDescriptorFactory.fromBitmap(getMarker(R.drawable.ic_inspector))) + ); + marker.setVisible(false); + + + //Геозоны обследования саранчи + DbOpenHelper dboh = new DbOpenHelper(this); + Cursor cursor = dboh.getReadableDatabase().rawQuery("select frmlocust_uid,lat,lon from frmlocust_locations where frmlocust_uid!='"+uid+"' order by frmlocust_uid,pos;", null); + if (cursor.moveToFirst()) { + String uid=""; + PolygonOptions pOptions2 = new PolygonOptions(); + do { + if(!uid.equals(cursor.getString(0)) && pOptions2.getPoints().size()>1) { + Polygon polygon = mMap.addPolygon(pOptions2); + polygons.add(polygon); + polygon.setFillColor(0x7F0000FF); + } + if(!uid.equals(cursor.getString(0))) { + pOptions2 = new PolygonOptions(); + uid=cursor.getString(0); + } + pOptions2.add(new LatLng(cursor.getDouble(1), cursor.getDouble(2))); + } while (cursor.moveToNext()); + if(pOptions2.getPoints().size()>1){ + Polygon polygon = mMap.addPolygon(pOptions2); + polygons.add(polygon); + polygon.setFillColor(0x7F0000FF); + } + } + cursor.close(); + //Геозоны противосаначовой обработки + cursor = dboh.getReadableDatabase().rawQuery("select frmlocustdel_uid,lat,lon from frmlocustdel_locations where frmlocustdel_uid!='"+uid+"' order by frmlocustdel_uid,pos;", null); + if (cursor.moveToFirst()) { + String uid=""; + PolygonOptions pOptions2 = new PolygonOptions(); + do { + if(!uid.equals(cursor.getString(0)) && pOptions2.getPoints().size()>1) { + Polygon polygon = mMap.addPolygon(pOptions2); + polygons.add(polygon); + polygon.setFillColor(0x7FFF0000); + } + if(!uid.equals(cursor.getString(0))) { + pOptions2 = new PolygonOptions(); + uid=cursor.getString(0); + } + pOptions2.add(new LatLng(cursor.getDouble(1), cursor.getDouble(2))); + } while (cursor.moveToNext()); + if(pOptions2.getPoints().size()>1){ + Polygon polygon = mMap.addPolygon(pOptions2); + polygons.add(polygon); + polygon.setFillColor(0x7FFF0000); + } + } + cursor.close(); + dboh.close(); +/**/ + //Сreating a polygon. (The main polygon at the end since they overlap each) + PolygonOptions pOptions = new PolygonOptions(); + + for(int i=0;i0) { + Polygon polygon = mMap.addPolygon(pOptions); + polygon.setFillColor(0x7F00FF00); + center = getPolygonCenterPoint(pOptions.getPoints()); + + //I derive the square of the region + double area=SphericalUtil.computeArea(pOptions.getPoints())/10000.0; + DecimalFormat df = new DecimalFormat("#.###"); + IconGenerator iconFactory = new IconGenerator(this); + iconFactory.setColor(Color.CYAN); + addIcon(mMap, iconFactory, df.format(area) + "ha", center); + } + + mMap.moveCamera(CameraUpdateFactory.zoomTo( 5.0f ) ); + mMap.moveCamera(CameraUpdateFactory.newLatLng(center)); + mMap.setMapType(GoogleMap.MAP_TYPE_HYBRID); + } + + @Override + public void onLocationChanged(Location location) { + _lat = location.getLatitude(); // от устройства + _lon = location.getLongitude(); // от устройства + + if(marker!=null) + { + marker.setPosition(new LatLng(_lat,_lon)); + marker.setVisible(true); + if(first) { + mMap.moveCamera(CameraUpdateFactory.newLatLng(marker.getPosition())); + mMap.animateCamera(CameraUpdateFactory.zoomTo(12.0f)); + first=false; + } + } + } + + @Override + public void onStatusChanged(String provider, int status, Bundle extras) { + + } + + @Override + public void onProviderEnabled(String provider) { + + } + + @Override + public void onProviderDisabled(String provider) { + + } + //GoogleMap gm; +//gm.setOnMapLongClickListener(this); + + @Override + public void onMapLongClick(LatLng point) { + boolean find=false; + if(mMap!=null){ + for(int i=0;i list=new ArrayList(); + for(int j=0;j polygonPointsList){ + LatLng centerLatLng = null; + LatLngBounds.Builder builder = new LatLngBounds.Builder(); + for(int i = 0 ; i < polygonPointsList.size() ; i++) + { + builder.include(polygonPointsList.get(i)); + } + LatLngBounds bounds = builder.build(); + centerLatLng = bounds.getCenter(); + + return centerLatLng; + } + + private void addIcon(GoogleMap googleMap, IconGenerator iconFactory, CharSequence text, LatLng position) { + MarkerOptions markerOptions = new MarkerOptions(). + icon(BitmapDescriptorFactory.fromBitmap(iconFactory.makeIcon(text))). + position(position). + anchor(iconFactory.getAnchorU(), iconFactory.getAnchorV()); + + googleMap.addMarker(markerOptions); + } + +} + diff --git a/app/src/main/java/kz/istt/locust/MyBroadReceiv.java b/app/src/main/java/kz/istt/locust/MyBroadReceiv.java new file mode 100644 index 0000000..b05873c --- /dev/null +++ b/app/src/main/java/kz/istt/locust/MyBroadReceiv.java @@ -0,0 +1,16 @@ +package kz.istt.locust; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; + +public class MyBroadReceiv extends BroadcastReceiver { + + final String LOG_TAG = "myLogs"; + + @Override + public void onReceive(Context context, Intent intent) + { + //может и не раскоментивать? context.startService(new Intent(context, MainService.class)); + } +} diff --git a/app/src/main/java/kz/istt/locust/MyButton.java b/app/src/main/java/kz/istt/locust/MyButton.java new file mode 100644 index 0000000..6fe7905 --- /dev/null +++ b/app/src/main/java/kz/istt/locust/MyButton.java @@ -0,0 +1,14 @@ +package kz.istt.locust; + +import android.content.Context; +import android.widget.Button; + +public class MyButton extends Button +{ + public String uid; //Идентификатор записи может быть NULL если она создана на КПК + + MyButton(Context context) + { + super(context); + } +} diff --git a/app/src/main/java/kz/istt/locust/MySynchronizationNew.java b/app/src/main/java/kz/istt/locust/MySynchronizationNew.java new file mode 100644 index 0000000..1f290f7 --- /dev/null +++ b/app/src/main/java/kz/istt/locust/MySynchronizationNew.java @@ -0,0 +1,545 @@ +package kz.istt.locust; + +import android.content.ContentValues; +import android.content.Context; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; +import android.os.AsyncTask; +import android.os.Environment; +import android.util.Log; + +/*import org.apache.http.HttpResponse; +import org.apache.http.HttpVersion; +import org.apache.http.client.ClientProtocolException; +import org.apache.http.client.HttpClient; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.entity.mime.MultipartEntity; +import org.apache.http.entity.mime.content.ContentBody; +import org.apache.http.entity.mime.content.FileBody; +import org.apache.http.impl.client.DefaultHttpClient; +import org.apache.http.params.CoreProtocolPNames; +import org.apache.http.util.EntityUtils;*/ +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.xml.sax.InputSource; + +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.IOException; +import java.io.StringReader; +import java.io.UnsupportedEncodingException; +import java.util.ArrayList; +import java.util.concurrent.Semaphore; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; + +import tctable.TCTable; +//import org.apache.http.entity.MultipartEntity; + +/** Синхронизация данных с сервером + * Нужно сделать глобальным + * */ +public class MySynchronizationNew +{ + //public static String URL="https://ccalm.org"; + //public static String URL="http://192.168.0.89:8080/CCALM"; + public static String URL="https://ccalm.org"; + private Context m_context=null; + private SendData sd=null; + + public MySynchronizationNew(Context context) + { + m_context=context; + } + + public void Synch() + { + if(sd!=null && sd.getCount()!=0) + return; + + sd=new SendData(m_context); + + sd.addTask("frmlocust"); + sd.addTask("frmlocustdel"); + + sd.addTask("borns"); //Справочник отрождение "Начало", "Массовое". + sd.addTask("countries"); + sd.addTask("countriesregions"); + sd.addTask("locuststypes"); + sd.addTask("sprayers"); + sd.addTask("sprayers_types"); + sd.addTask("fledgling"); + sd.addTask("list_density"); + sd.addTask("list_phase"); + sd.addTask("list_directions"); //Стороны света (направления) + sd.addTask("list_damage"); //Справочник степень повреждения растительного покрова + sd.addTask("list_mortality"); //Справочник степень повреждения растительного покрова + sd.addTask("list_greenery"); + sd.addTask("list_biotope"); + sd.addTask("list_cover"); + sd.addTask("list_age"); + sd.addTask("list_actions"); + sd.addTask("list_paintings"); + sd.addTask("list_behaviors"); + sd.addTask("list_breeding"); + sd.addTask("list_capacities"); + sd.addTask("list_markings"); + sd.addTask("list_containers"); + sd.addTask("list_vegetation"); + sd.addTask("list_formulation"); + sd.addTask("list_height"); + sd.addTask("list_enemies"); + sd.addTask("terminals"); + sd.addTask("_languages"); + sd.addTask("_translations"); + + sd.addTask("files"); + + sd.execute(); + } + + public int getCount() + { + if(sd!=null) + return sd.getCount(); + else + return 0; + } + + public class SendData extends AsyncTask + { + private Context mContext; + //private String mTableName; + private ArrayList mTList = new ArrayList(); //Защищёный список + private Semaphore mSemaphore = null; //Семафор для доступа к списку заданий + + public void addTask(String tableName) + { + try + { + mSemaphore.acquire(); + mTList.add(tableName); + } catch (InterruptedException e) { + e.printStackTrace(); + } finally + { mSemaphore.release(); + } + } + + public int getCount() + { + int result=0; + try + { + mSemaphore.acquire(); + result=mTList.size(); + } catch (InterruptedException e) { + e.printStackTrace(); + } finally + { mSemaphore.release(); + } + return result; + } + + SendData(Context context) + { + mContext = context; + mSemaphore = new Semaphore(1); + } + + @Override + protected void onPreExecute() { + super.onPreExecute(); + } + + //Отправляю файлик на сервер + protected boolean sendFile(String fName) + { + boolean result=false; +/* try + { + HttpClient httpClient = new DefaultHttpClient(); + httpClient.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1); + HttpPost httpPost = new HttpPost(MySynchronizationNew.URL+"/get/?fn=6"); + + File file = new File(fName); + if(file.exists()) + { + MultipartEntity mpEntity = new MultipartEntity(); + ContentBody cbFile = new FileBody(file, "image/jpeg"); + mpEntity.addPart("file", cbFile); + httpPost.setEntity(mpEntity); + } + HttpResponse response = httpClient.execute(httpPost); + if(response != null) + { + StringReader sr = new StringReader(EntityUtils.toString(response.getEntity(),"utf-8")); + InputSource is = new InputSource(sr); + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + try + { + DocumentBuilder builder = factory.newDocumentBuilder(); + Document doc = null; + try + { + doc = builder.parse(is); + Element root = doc.getDocumentElement(); + result= XMLTools.getCDATAValue(root).equals("0"); //Признак что успешно отправили на сервер файл + } catch (Exception e) + { + } + } catch (Exception e) { + } + } + } catch (UnsupportedEncodingException e) + { + } catch (ClientProtocolException e) + { + } catch (IOException e) + { + }*/ + return result; + } + + Document sendXML(String url, String xml) + { + Document doc=null; +/* + HttpClient httpClient = new DefaultHttpClient(); + httpClient.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1); + + HttpPost httpPost = new HttpPost(url); + + httpPost.addHeader("Content-Type", "application/xml"); + + StringEntity entity = null; + entity = new StringEntity(xml, "UTF-8"); + + entity.setContentType("application/xml"); + httpPost.setEntity(entity); + HttpResponse response=null; + try { + response = httpClient.execute(httpPost); + } catch (IOException e) { + e.printStackTrace(); + } + + if(response != null) + { + xml=""; + try { + xml = EntityUtils.toString(response.getEntity(),"utf-8"); + } catch (IOException e) { + e.printStackTrace(); + } + StringReader sr = new StringReader(xml); + InputSource is = new InputSource(sr); + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + DocumentBuilder builder = null; + try { + builder = factory.newDocumentBuilder(); + doc = builder.parse(is); + } catch (ParserConfigurationException e) { + e.printStackTrace(); + } catch (Exception e) + { + e.printStackTrace(); + } + } +*/ + return doc; + } + + @Override + protected Void doInBackground(Void... params) + { +/* + while(true) + { + String tableName=""; + try + { + mSemaphore.acquire(); + + if(mTList.size()==0) break; + tableName=mTList.get(0); + } catch (InterruptedException e) { + e.printStackTrace(); + } finally + { mSemaphore.release(); + } + + Log.e("CCALM", "tableName = " + tableName); + + DbOpenHelper dboh=null; + try + { + dboh = new DbOpenHelper(mContext); + + if(tableName.equals("frmlocust")) + { + //Отправляю файлы на сервер + SQLiteDatabase db = dboh.getReadableDatabase(); + + Cursor cursor; + //image1 + cursor = db.rawQuery("select uid,image_name1 from frmlocust where image_name1 is not null and image_send1=0 and filled=1;", null); + if (cursor.moveToFirst()) + { + if(sendFile(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Pictures/Locust/" + cursor.getString(cursor.getColumnIndex("image_name1")))) + { + ContentValues cv = new ContentValues(); + cv.put("image_send1", 1); //Отмечаем как отправленное + db.beginTransaction(); //Вроде как защита от многопоточности (для сервиса) + try { + db.update("frmlocust", cv, "uid = ?", new String[] { String.valueOf(cursor.getString(cursor.getColumnIndex("uid"))) }); + db.setTransactionSuccessful(); + } finally { + db.endTransaction(); + } + } + } + cursor.close(); + //image2 + cursor = db.rawQuery("select uid,image_name2 from frmlocust where image_name2 is not null and image_send2=0 and filled=1;", null); + if (cursor.moveToFirst()) + { + if(sendFile(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Pictures/Locust/" + cursor.getString(cursor.getColumnIndex("image_name1")))) + { + ContentValues cv = new ContentValues(); + cv.put("image_send1", 1); //Отмечаем как отправленное + db.beginTransaction(); //Вроде как защита от многопоточности (для сервиса) + try { + db.update("frmlocust", cv, "uid = ?", new String[] { String.valueOf(cursor.getString(cursor.getColumnIndex("uid"))) }); + db.setTransactionSuccessful(); + } finally { + db.endTransaction(); + } + } + } + cursor.close(); + //image3 + cursor = db.rawQuery("select uid,image_name3 from frmlocust where image_name3 is not null and image_send3=0 and filled=1;", null); + if (cursor.moveToFirst()) + { + if(sendFile(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Pictures/Locust/" + cursor.getString(cursor.getColumnIndex("image_name1")))) + { + ContentValues cv = new ContentValues(); + cv.put("image_send1", 1); //Отмечаем как отправленное + db.beginTransaction(); //Вроде как защита от многопоточности (для сервиса) + try { + db.update("frmlocust", cv, "uid = ?", new String[] { String.valueOf(cursor.getString(cursor.getColumnIndex("uid"))) }); + db.setTransactionSuccessful(); + } finally { + db.endTransaction(); + } + } + } + cursor.close(); + + //Отправляю данные в виде XML + cursor = db.rawQuery("select * from frmlocust where filled=1 and send=0", null); + if(cursor.moveToFirst()) + { + do{ + String xml=""; + xml+=""; + for(int i=0;i\n"; + } + xml+=""; + Document doc = sendXML(MySynchronizationNew.URL+"/get/",xml); + if(doc!=null) + { + //Incoming XML: + Element root = doc.getDocumentElement(); + String uid= XMLTools.getCDATAValue(XMLTools.findFirstNode(root,"uid")); + if(uid!="" || uid!="null") + { + ContentValues cv = new ContentValues(); + cv.put("send", 1); //Отмечаем как отправленное + db.beginTransaction(); //Вроде как защита от многопоточности (для сервиса) + try { + db.update("frmlocust", cv, "uid = ?", new String[] { String.valueOf(uid) }); + db.setTransactionSuccessful(); + } finally { + db.endTransaction(); + } + } + } + }while (cursor.moveToNext()); + } + cursor.close(); + + + + }else if(tableName.equals("frmlocustdel")) { + //Отправляю файлы на сервер + SQLiteDatabase db = dboh.getReadableDatabase(); + + Cursor cursor; + //image1 + cursor = db.rawQuery("select uid,image_name1 from frmlocustdel where image_send1=0 and filled=1;", null); + if (cursor.moveToFirst()) { + if (sendFile(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Pictures/Locust/" + cursor.getString(cursor.getColumnIndex("image_name1")))) { + ContentValues cv = new ContentValues(); + cv.put("image_send1", 1); //Отмечаем как отправленное + db.beginTransaction(); //Вроде как защита от многопоточности (для сервиса) + try { + db.update("frmlocustdel", cv, "uid = ?", new String[]{String.valueOf(cursor.getString(cursor.getColumnIndex("uid")))}); + db.setTransactionSuccessful(); + } finally { + db.endTransaction(); + } + } + } + cursor.close(); + //image2 + cursor = db.rawQuery("select uid,image_name2 from frmlocustdel where image_send2=0 and filled=1;", null); + if (cursor.moveToFirst()) { + if (sendFile(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Pictures/Locust/" + cursor.getString(cursor.getColumnIndex("image_name1")))) { + ContentValues cv = new ContentValues(); + cv.put("image_send1", 1); //Отмечаем как отправленное + db.beginTransaction(); //Вроде как защита от многопоточности (для сервиса) + try { + db.update("frmlocustdel", cv, "uid = ?", new String[]{String.valueOf(cursor.getString(cursor.getColumnIndex("uid")))}); + db.setTransactionSuccessful(); + } finally { + db.endTransaction(); + } + } + } + cursor.close(); + //image3 + cursor = db.rawQuery("select uid,image_name3 from frmlocustdel where image_send3=0 and filled=1;", null); + if (cursor.moveToFirst()) { + if (sendFile(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Pictures/Locust/" + cursor.getString(cursor.getColumnIndex("image_name1")))) { + ContentValues cv = new ContentValues(); + cv.put("image_send1", 1); //Отмечаем как отправленное + db.beginTransaction(); //Вроде как защита от многопоточности (для сервиса) + try { + db.update("frmlocustdel", cv, "uid = ?", new String[]{String.valueOf(cursor.getString(cursor.getColumnIndex("uid")))}); + db.setTransactionSuccessful(); + } finally { + db.endTransaction(); + } + } + } + cursor.close(); + + //Отправляю данные в виде XML + cursor = db.rawQuery("select * from frmlocustdel where filled=1 and send=0", null); + if (cursor.moveToFirst()) { + do { + String xml = ""; + xml += ""; + for (int i = 0; i < cursor.getColumnCount(); i++) { + String val = cursor.getString(i); + if (val == null) val = ""; + xml += " <" + cursor.getColumnName(i) + ">\n"; + } + xml += ""; + Document doc = sendXML(MySynchronizationNew.URL + "/get/", xml); + if (doc != null) { + //Incoming XML: + Element root = doc.getDocumentElement(); + String uid = XMLTools.getCDATAValue(XMLTools.findFirstNode(root, "uid")); + if (uid != "" || uid != "null") { + ContentValues cv = new ContentValues(); + cv.put("send", 1); //Отмечаем как отправленное + db.beginTransaction(); //Вроде как защита от многопоточности (для сервиса) + try { + db.update("frmlocustdel", cv, "uid = ?", new String[]{String.valueOf(uid)}); + db.setTransactionSuccessful(); + } finally { + db.endTransaction(); + } + } + } + } while (cursor.moveToNext()); + } + cursor.close(); + }else if(tableName.equals("files")) + { + + }else { //Все остальные стравочники + + try { + String seq = "0"; + + SQLiteDatabase db = dboh.getReadableDatabase(); + Cursor cursor = db.rawQuery("select max(seq) as seq from " + tableName + ";", null); + if (cursor.moveToFirst()) { + seq = cursor.getString(cursor.getColumnIndex("seq")); + } + if (seq == null) seq = "0"; + cursor.close(); + + //Отправляем данные на сервер + HttpClient httpClient = new DefaultHttpClient(); + httpClient.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1); + + //String url = MySynchronizationNew.URL + "/get/?fn=1&r=0&n=" + tableName + "&s=" + seq + "&l=1000"; + String url = MySynchronizationNew.URL + "/get/?fn=1&r=0&n=" + tableName + "&s=0&l=1000"; + + HttpPost httpPost = new HttpPost(url); + HttpResponse response = httpClient.execute(httpPost); + if (response != null) { + TCTable tbl = new TCTable("", 0); + if (tbl.OpenTableH(new ByteArrayInputStream(EntityUtils.toByteArray(response.getEntity())))) { + dboh.updateTable(tbl); + } + }else + { + Log.e("CCALM", "Error load table \"" + tableName + "\";"); + } + + + } catch (ClientProtocolException e) { + Log.e("CCALM", "ClientProtocolException = " + e.toString()); + } catch (IOException e) { + Log.e("CCALM", "IOException = " + e.toString()); + } + } + + } finally + { + if(dboh!=null) + dboh.close(); + } + + //Удаляю после выполнения задания (а то блокировало базу и вылетали ошибки) + try + { + mSemaphore.acquire(); + mTList.remove(0); + } catch (InterruptedException e) { + e.printStackTrace(); + } finally + { mSemaphore.release(); + } + } + Log.e("CCALM", "END SYNCHONIZATION"); + */ + return null; + } + + @Override + protected void onPostExecute(Void result) + { + super.onPostExecute(result); + } + + @Override + protected void onCancelled() + { + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/kz/istt/locust/MySynchronizationOld.java b/app/src/main/java/kz/istt/locust/MySynchronizationOld.java new file mode 100644 index 0000000..c3e1585 --- /dev/null +++ b/app/src/main/java/kz/istt/locust/MySynchronizationOld.java @@ -0,0 +1,911 @@ +package kz.istt.locust; + +import android.content.ContentValues; +import android.content.Context; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; +import android.os.Bundle; +import android.os.Environment; +import android.os.Handler; +import android.os.Message; +import android.util.Log; + +/*import org.apache.http.HttpResponse; +import org.apache.http.HttpVersion; +import org.apache.http.client.ClientProtocolException; +import org.apache.http.client.HttpClient; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.conn.ClientConnectionManager; +import org.apache.http.conn.scheme.Scheme; +import org.apache.http.conn.scheme.SchemeRegistry; +import org.apache.http.conn.ssl.TrustStrategy; +import org.apache.http.entity.StringEntity; +import org.apache.http.entity.mime.MultipartEntity; +import org.apache.http.entity.mime.content.ContentBody; +import org.apache.http.entity.mime.content.FileBody; +import org.apache.http.impl.client.DefaultHttpClient; +import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager; +import org.apache.http.params.CoreProtocolPNames;*/ +import org.w3c.dom.Document; +import org.w3c.dom.Element; + +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.DataOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.io.OutputStreamWriter; +import java.io.UnsupportedEncodingException; +import java.net.HttpURLConnection; +import java.net.InetAddress; +import java.net.Socket; +import java.net.URL; +import java.net.UnknownHostException; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; +import java.util.ArrayList; +import java.util.Locale; +import java.util.UUID; +import java.util.concurrent.Semaphore; + +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLSocketFactory; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; + +import tctable.TCTable; + +//import org.apache.http.entity.MultipartEntity; + +/** Синхронизация данных с сервером + * Нужно сделать глобальным + * */ +public class MySynchronizationOld +{ + public static String URL="https://ccalm.org"; + //public static String URL="http://192.168.0.89:8080/CCALM"; + + private Context _context; //От какого контекста показывать алерты + //private boolean _showAlert; //Показывать ли окно подождите пожалуйста (его нельзя создавать если в сервисе) + //public ProgressDialog dialog; + + public MyThread myThread = null; + + private int rid_sendFrmLocust = -1; //Для отправки данных + private int rid_sendFrmLocustDel = -1; //Для отправки данных + private int rid_frmlocust = -1; //Для запроса данных + private int rid_frmlocustdel = -1; //Для запроса данных + + private int rid_Borns = -1; + private int rid_countries=-1; //Для идентификации прихода данных списка стран + private int rid_CountriesRegions = -1; //Для идентификации прихода данных списка регионов + private int rid__languages = -1; + private int rid__translations = -1; + private int rid_LocustsTypes = -1; //Виды саранчи + private int rid_list_density = -1; + private int rid_list_directions = -1; //Стороны света (направления) + private int rid_list_phase = -1; + private int rid_sprayers = -1; + private int rid_sprayers_types = -1; + private int rid_Fledgling = -1; //Окрыление + private int rid_list_damage = -1; + private int rid_list_mortality = -1; //Метод подсчёта смертности (визуальный либо учётная рамка) + private int rid_list_greenery = -1; //Состояние растительности + private int rid_list_biotope = -1; + private int rid_list_cover = -1; + private int rid_list_age = -1; + private int rid_list_actions = -1; + private int rid_list_paintings = -1; + private int rid_list_behaviors = -1; + private int rid_list_breeding = -1; + //int rid_list_operatorstypes = -1; + private int rid_list_capacities = -1; + private int rid_list_markings = -1; + private int rid_list_containers = -1; //Что сделали с пустыми контейнерами от отравы + private int rid_list_vegetation = -1; + private int rid_list_formulation = -1; + private int rid_list_height = -1; + private int rid_list_enemies = -1; + private int rid_terminals = -1; //На кого зарегистрирован данныей планшет + private int rid_companies = -1; + + MySynchronizationOld(Context context) + { + _context = context; + + String appPath = _context.getApplicationContext().getFilesDir().getAbsolutePath(); + //Thread for downloading from Internet + myThread = new MyThread(this, appPath); + myThread.start(); //Стартуем поток + } + + /*public static HttpClient getTestHttpClient() { + try { + SSLContextBuilder builder = new SSLContextBuilder(); + builder.loadTrustMaterial(null, new TrustStrategy() { + @Override + public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException { + return true; + } + }); + SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(builder.build(), new NoopHostnameVerifier()); + CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build(); + return httpclient; + } catch (Exception e) { + throw new RuntimeException(e); + } + } + }*/ + + public int getCount() + { + if(myThread!=null) + return myThread.getCountTasks(); + else + return 0; + } + + /** Отправить анкету саранчи на сервер по идентификатору либо по времени создания (время должно быть уникальным) + * */ + public void sendFrmLocust(String uid) + { + if(uid==null || uid=="") return; + + String xml=""; + DbOpenHelper dboh = new DbOpenHelper(_context); + Cursor cursor = null; + cursor = dboh.getReadableDatabase().rawQuery("select * from frmlocust where uid=?", new String[] { String.valueOf(uid) }); + + if(cursor.moveToFirst()) + { + do{ + //Если задано имя файла то добавляем его в очередь на отправку на сервер + String fname; + fname=cursor.getString(cursor.getColumnIndex("image_name1")); + if(fname!=null && !fname.equals("")) + myThread.addRequest(MySynchronizationOld.URL+"/get/?fn=6", null, Environment.getExternalStorageDirectory().getAbsolutePath() + "/Pictures/Locust/" + fname); + + fname = cursor.getString(cursor.getColumnIndex("image_name2")); + if(fname!=null && !fname.equals("")) + myThread.addRequest(MySynchronizationOld.URL+"/get/?fn=6", null, Environment.getExternalStorageDirectory().getAbsolutePath() + "/Pictures/Locust/" + fname); + + fname = cursor.getString(cursor.getColumnIndex("image_name3")); + if(fname!=null && !fname.equals("")) + myThread.addRequest(MySynchronizationOld.URL+"/get/?fn=6", null, Environment.getExternalStorageDirectory().getAbsolutePath() + "/Pictures/Locust/" + fname); + + xml=""; + xml+=""; + for(int i=0;i\n"; + } + + String geom=""; + Cursor cursor2 = dboh.getReadableDatabase().rawQuery("select lat,lon from frmlocust_locations where frmlocust_uid=? order by pos", new String[] { String.valueOf(uid) }); + if(cursor2.moveToFirst()) { + String first="["+cursor2.getDouble(1)+","+cursor2.getDouble(0)+"]"; + do { + geom+="["+cursor2.getDouble(1)+","+cursor2.getDouble(0)+"],"; + }while (cursor2.moveToNext()); + geom += first; + geom="{\"type\":\"Polygon\",\"coordinates\":[["+geom+"]]}"; + } + xml+=" "; + cursor2.close(); + xml+=""; + + rid_sendFrmLocust = myThread.addRequest(MySynchronizationOld.URL+"/get/", xml, null); + + }while (cursor.moveToNext()); + } + cursor.close(); + dboh.close(); + } + + /** + * Отправить форму уничтожения саранчи из базы по идентификатору из базы + * @param uid + */ + public void sendFrmLocustDel(String uid) + { + if(uid==null || uid=="") return; + + String xml=""; + DbOpenHelper dboh = new DbOpenHelper(_context); + Cursor cursor = null; + cursor = dboh.getReadableDatabase().rawQuery("select * from frmlocustdel where uid=?", new String[] { String.valueOf(uid) }); + + if(cursor.moveToFirst()) + { + do{ + //Если задано имя файла то добавляем его в очередь на отправку на сервер + String fname; + fname=cursor.getString(cursor.getColumnIndex("image_name1")); + if(fname!=null && !fname.equals("")) + myThread.addRequest(MySynchronizationOld.URL+"/get/?fn=6", null, Environment.getExternalStorageDirectory().getAbsolutePath() + "/Pictures/Locust/" + fname); + + fname = cursor.getString(cursor.getColumnIndex("image_name2")); + if(fname!=null && !fname.equals("")) + myThread.addRequest(MySynchronizationOld.URL+"/get/?fn=6", null, Environment.getExternalStorageDirectory().getAbsolutePath() + "/Pictures/Locust/" + fname); + + fname = cursor.getString(cursor.getColumnIndex("image_name3")); + if(fname!=null && !fname.equals("")) + myThread.addRequest(MySynchronizationOld.URL+"/get/?fn=6", null, Environment.getExternalStorageDirectory().getAbsolutePath() + "/Pictures/Locust/" + fname); + + + xml=""; + xml+=""; + for(int i=0;i\n"; + } + String geom=""; + Cursor cursor2 = dboh.getReadableDatabase().rawQuery("select lat,lon from frmlocustdel_locations where frmlocustdel_uid=? order by pos", new String[] { String.valueOf(uid) }); + if(cursor2.moveToFirst()) { + String first="["+cursor2.getDouble(1)+","+cursor2.getDouble(0)+"]"; + do { + geom+="["+cursor2.getDouble(1)+","+cursor2.getDouble(0)+"],"; + }while (cursor2.moveToNext()); + geom += first; + geom="{\"type\":\"Polygon\",\"coordinates\":[["+geom+"]]}"; + } + xml+=" "; + cursor2.close(); + xml+=""; + + rid_sendFrmLocustDel = myThread.addRequest(MySynchronizationOld.URL+"/get/", xml, null); + + }while (cursor.moveToNext()); + } + cursor.close(); + dboh.close(); + } + + //Для обновления справочников + int makeRequest(String tableName) + { + String seq=""; + DbOpenHelper dboh = new DbOpenHelper(_context); + SQLiteDatabase db = dboh.getReadableDatabase(); + Cursor cursor = db.rawQuery("select max(seq) as seq from " + tableName + ";", null); + if (cursor.moveToFirst()) { + seq = cursor.getString(cursor.getColumnIndex("seq")); + } + if (seq == null) seq = "0"; + cursor.close(); + dboh.close(); + return myThread.addRequest(MySynchronizationOld.URL+"/get/?fn=1&r=0&n="+tableName+"&s=" + seq + "&l=1000","", null); + } + + + /** + * Синхронизовать данные с сервером (добавляет задания в поток) + * Если в задании синхронизации есть хоть 1 задание не должно синхронизироваться + * boolean bAll - Синхронизировать ли всё (задания и пользователи запрашиваются при запуске программы) + */ + public void Synch() + { + if(myThread.getCountTasks()!=0) + return; //Не начинать новую синхронизацию текущая не закончилась (так мы защищаемся от повторной отправки) + + String xml=""; + + //Последовательно отправляю изменёные пользователям записи (send=0 и они заполнены) + DbOpenHelper dboh = new DbOpenHelper(_context); + Cursor cursor = dboh.getReadableDatabase().rawQuery("select uid from frmlocust where send=0 and filled=1", null); + if(cursor.moveToFirst()) + { + do{ + sendFrmLocust(cursor.getString(cursor.getColumnIndex("uid"))); + }while (cursor.moveToNext()); + } + cursor.close(); + dboh.close(); + + //Последовательно отправляю изменёные пользователям записи (send=0 и они заполнены) + dboh = new DbOpenHelper(_context); + cursor = dboh.getReadableDatabase().rawQuery("select uid from frmlocustdel where send=0 and filled=1", null); + if(cursor.moveToFirst()) + { + do{ + sendFrmLocustDel(cursor.getString(cursor.getColumnIndex("uid"))); + }while (cursor.moveToNext()); + } + cursor.close(); + dboh.close(); + + //Запрос в очередь на получение списка стран, направлений, итд. + rid_LocustsTypes = makeRequest("locuststypes"); + rid_sprayers = makeRequest("sprayers"); + rid_sprayers_types = makeRequest("sprayers_types"); + rid_Fledgling = makeRequest("fledgling"); + rid_list_density = makeRequest("list_density"); + rid_list_phase = makeRequest("list_phase"); + rid_list_directions = makeRequest("list_directions"); //Стороны света (направления) + rid_list_damage = makeRequest("list_damage"); //Справочник степень повреждения растительного покрова + rid_list_mortality = makeRequest("list_mortality"); //Справочник степень повреждения растительного покрова + rid_list_greenery = makeRequest("list_greenery"); + rid_list_biotope = makeRequest("list_biotope"); + rid_list_cover = makeRequest("list_cover"); + rid_list_age = makeRequest("list_age"); + rid_list_actions = makeRequest("list_actions"); + rid_list_paintings = makeRequest("list_paintings"); + rid_list_behaviors = makeRequest("list_behaviors"); + rid_list_breeding = makeRequest("list_breeding"); + rid_list_capacities = makeRequest("list_capacities"); + rid_list_markings = makeRequest("list_markings"); + rid_list_containers = makeRequest("list_containers"); + rid_list_vegetation = makeRequest("list_vegetation"); + rid_list_formulation = makeRequest("list_formulation"); + rid_list_height = makeRequest("list_height"); + rid_list_enemies = makeRequest("list_enemies"); + rid_terminals = makeRequest("terminals"); + rid_companies = makeRequest("companies"); + + rid_countries = makeRequest("countries"); //Если есть хоть 1 запись то считается что справояники хоть 1 раз загрузились + rid_CountriesRegions = makeRequest("countriesregions"); + + rid__languages = makeRequest("_languages"); + rid__translations = makeRequest("_translations"); + + rid_Borns = makeRequest("borns"); //Справочник отрождение "Начало", "Массовое". + } + + //Пришел ответ от HTTP сервера + //Если резутьтат true то сохранено (данные корректны) + //public boolean incomingData(int rid, byte[] data) + public boolean incomingData(int rid, String filePath) + { + /*if (BuildConfig.DEBUG && ( 0 != ( getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE ) )) { + try { + String log=Tools.getStringFromFile(filePath,1024); + Log.e("CCALM", log); + }catch(Exception ex) + {} + }*/ + + Boolean result=true; + if(filePath==null || filePath.equals("")) return false; + File file=new File(filePath); + if(!file.exists()) return false; + try + { + FileInputStream is=new FileInputStream(file); + + DbOpenHelper dbOpenHelper = new DbOpenHelper(_context); + + //Пока не однообразно то по идентификаторам определяем что в двоичном формате + if((rid == rid_list_mortality && rid_list_mortality!=-1) || (rid == rid_list_damage && rid_list_damage!=-1) || + (rid == rid_list_directions && rid_list_directions!=-1) || (rid == rid_Fledgling && rid_Fledgling!=-1) || + (rid == rid_sprayers && rid_sprayers!=-1) || (rid == rid_sprayers_types && rid_sprayers_types!=-1) || + (rid == rid_list_phase && rid_list_phase!=-1) || (rid == rid_list_density && rid_list_density!=-1) || + (rid == rid_Borns && rid_Borns!=-1) || (rid == rid_LocustsTypes && rid_LocustsTypes!=-1) || + (rid == rid_countries && rid_countries!=-1) || (rid==rid_CountriesRegions && rid_CountriesRegions!=-1) || + (rid == rid__languages && rid__languages != -1) || (rid == rid__translations && rid__translations != -1) || + (rid == rid_frmlocust && rid_frmlocust!=-1) || (rid == rid_frmlocustdel && rid_frmlocustdel!=-1) || + (rid == rid_list_greenery && rid_list_greenery!=-1) || (rid == rid_list_biotope && rid_list_biotope!=-1) || + (rid == rid_list_cover && rid_list_cover!=-1) || (rid == rid_list_age && rid_list_age!=-1) || + (rid == rid_list_actions && rid_list_actions!=-1) || (rid == rid_list_paintings && rid_list_paintings!=-1) || + (rid == rid_list_behaviors && rid_list_behaviors!=-1) || + (rid == rid_list_breeding && rid_list_breeding!=-1) || + (rid == rid_list_capacities && rid_list_capacities!=-1) || + (rid == rid_list_markings && rid_list_markings!=-1) || + (rid == rid_list_containers && rid_list_containers!=-1) || + (rid == rid_list_vegetation && rid_list_vegetation!=-1) || + (rid == rid_list_formulation && rid_list_formulation!=-1) || + (rid == rid_list_height && rid_list_height!=-1) || + (rid == rid_list_enemies && rid_list_enemies!=-1) || + (rid == rid_terminals && rid_terminals!=-1) || + (rid == rid_companies && rid_companies!=-1) + ) + { + TCTable tbl=new TCTable("",0); + if(tbl.OpenTableH(is)) + { + result = dbOpenHelper.updateTable(tbl); + } + + }else //Данные в виде XML файла + { + //Парсим файл + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + try { + DocumentBuilder builder = factory.newDocumentBuilder(); + Document doc = null; + try { + doc = builder.parse(is); + } catch (Exception e) { + is.close(); + file.delete(); + return false; + } + + Element root = doc.getDocumentElement(); + + String fn=root.getAttribute("fn"); + if (fn.equals("-1")) { + String error= XMLTools.getCDATAValue(root); + Log.e("CCALM", "Error = " + error); + //MyAlert("ASDC: Error!",XMLTools.getCDATAValue(root)); + } else if (fn.equals("1")) //Пришли данные о пользователе устройства обновим либо добавим + { + } else if (fn.equals("2")) //Пришли данные заданий по сбору инфы о саранче + { + } else if (fn.equals("3")) //Пришли данные заданий по сбору инфы об уничтожении саранчи + { + } else if (fn.equals("4")) //Сохранили данные о саранче на сервере ставим признак отправленности + { + String uid = XMLTools.getCDATAValue(XMLTools.findFirstNode(root, "uid")); + if (uid == "" || uid == "null") uid = null; + + Cursor cursor; + DbOpenHelper dboh = new DbOpenHelper(_context); + SQLiteDatabase db = dboh.getReadableDatabase(); + + ContentValues cv = new ContentValues(); + cv.put("send", 1); //Отмечаем как отправленное + //cv.put("changed", 0); //Отмечаем как не измененное + + db.beginTransaction(); //Вроде как защита от многопоточности (для сервиса) + try { + db.update("frmlocust", cv, "uid = ?", new String[]{String.valueOf(uid)}); + db.setTransactionSuccessful(); + } finally { + db.endTransaction(); + } + + //Ищем имя файла по id и удаляем фотографии + cursor = db.rawQuery("select image_name1, image_name2, image_name3 from frmlocust where uid=?;", new String[]{String.valueOf(uid)}); + if (cursor.moveToFirst()) { + String path; + File pFile; + path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Pictures/Locust/" + cursor.getString(cursor.getColumnIndex("image_name1")); + pFile = new File(path); + if (pFile.exists()) //Переименовываю файл чтобы зановоне отправить при редактировании + { + pFile.renameTo(new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Pictures/Locust/_" + cursor.getString(cursor.getColumnIndex("image_name1")))); + } + path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Pictures/Locust/" + cursor.getString(cursor.getColumnIndex("image_name2")); + pFile = new File(path); + if (pFile.exists()) //Переименовываю файл чтобы зановоне отправить при редактировании + { + pFile.renameTo(new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Pictures/Locust/_" + cursor.getString(cursor.getColumnIndex("image_name2")))); + } + path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Pictures/Locust/" + cursor.getString(cursor.getColumnIndex("image_name3")); + pFile = new File(path); + if (pFile.exists()) //Переименовываю файл чтобы зановоне отправить при редактировании + { + pFile.renameTo(new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Pictures/Locust/_" + cursor.getString(cursor.getColumnIndex("image_name3")))); + } + } + db.close(); + + } else if (fn.equals("5")) //Сохранили данные о саранче на сервере ставим признак отправленности + { + String uid = XMLTools.getCDATAValue(XMLTools.findFirstNode(root, "uid")); + if (uid == "" || uid == "null") uid = null; + + Cursor cursor; + DbOpenHelper dboh = new DbOpenHelper(_context); + SQLiteDatabase db = dboh.getReadableDatabase(); + + ContentValues cv = new ContentValues(); + cv.put("send", 1); //Отмечаем как отправленное + //cv.put("changed", 0); //Отмечаем как не измененное + + db.beginTransaction(); //Вроде как защита от многопоточности (для сервиса) + try { + db.update("frmlocustdel", cv, "uid = ?", new String[]{String.valueOf(uid)}); + db.setTransactionSuccessful(); + } finally { + db.endTransaction(); + } + + //Ищем имя файла по id и удаляем фотографии + cursor = db.rawQuery("select image_name1, image_name2, image_name3 from frmlocustdel where uid=?;", new String[]{String.valueOf(uid)}); + if (cursor.moveToFirst()) { + String path; + File pFile; + path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Pictures/Locust/" + cursor.getString(cursor.getColumnIndex("image_name1")); + pFile = new File(path); + if (pFile.exists()) //Переименовываю файл чтобы заново не отправить при редактировании + { + pFile.renameTo(new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Pictures/Locust/_" + cursor.getString(cursor.getColumnIndex("image_name1")))); + } + path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Pictures/Locust/" + cursor.getString(cursor.getColumnIndex("image_name2")); + pFile = new File(path); + if (pFile.exists()) //Переименовываю файл чтобы заново не отправить при редактировании + { + pFile.renameTo(new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Pictures/Locust/_" + cursor.getString(cursor.getColumnIndex("image_name2")))); + } + path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Pictures/Locust/" + cursor.getString(cursor.getColumnIndex("image_name3")); + pFile = new File(path); + if (pFile.exists()) //Переименовываю файл чтобы заново не отправить при редактировании + { + pFile.renameTo(new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Pictures/Locust/_" + cursor.getString(cursor.getColumnIndex("image_name3")))); + } + } + db.close(); + + } else if (fn.equals("6")) //Фото отправлено + { + } + + } catch (Exception e) { + //throw new RuntimeException(e); + //MyAlert("ASDC: Synchronization error", e.toString()); + //Toast.makeText(this, "MyAlarmService.onDestroy()", Toast.LENGTH_LONG).show(); + } + //if(_showAlert) dialog.dismiss(); + } + + + is.close(); + file.delete(); + + } catch (Exception e) { + result = false; + } + return result; + } + +} + +/* Поток заданий на отправку данных на сервер */ +class MyThread extends Thread +{ + private int rid = 0; //Инкреминтальный номер ответа для сохранения уникальных файлов + + class Tsk //Задание отправки данных + { + String url = ""; //URL куда отправлять данные + String str = ""; //Отправляемая строка + String file = ""; //Отправляемый файл + Boolean s = false; //Integer s = 0; // false - не отправлялось true - в процессе отправки (если ошибка то ставиться статус не отправлено иначе удаляется из списка заданий) + int id = 0; //Инкриментальный идентификатор запроса + int wait = 10; //Милисекунд ждать перед отправкой текущего задания + int t=0; //Количество совершенных попыток отправки + } + + private int mId=0; //Инкриментальный идентификатор запроса + private Semaphore mSemaphore = null; //Семафор для доступа к списку заданий + private ArrayList mTList = new ArrayList(); //Защищёный список + private MySynchronizationOld mListener = null; //Для отправки ответов в основной поток + private String mAppPath = ""; + + //@SuppressLint("HandlerLeak") //Подавить предупреждения о неоптимальности + private Handler myHandle = new Handler() //Для ловли сообщений из другого потока + { + @Override + public void handleMessage(Message msg) //Слушатель ответа после отправки данных на сервер + { + int rid = msg.getData().getInt("id"); + //Boolean b = mListener.incomingData(rid, msg.getData().getByteArray("data")); //Слушатель должен вернуть true иниче запрос останется в очереди + Boolean b = mListener.incomingData(rid, msg.getData().getString("file")); //Слушатель должен вернуть true иниче запрос останется в очереди + + try + { + mSemaphore.acquire(); + for(int i=0; i 1000 * 60 * 30 ) mTList.get(i).wait = 1000 * 60 * 30; //Ограничение 30 минут + mTList.get(i).s = false; //Отмечаем как не отправленное + mTList.get(i).t++; //Увиличиваем счётчик количество попыток отправки + if(mTList.get(i).t>10) mTList.remove(i); //Удаляем задание после 10 попыток отправки + break; + } + } + } + + } catch (InterruptedException ex) + { + } finally + { mSemaphore.release(); + } + + } + }; + + public MyThread(MySynchronizationOld listener, String appPath) + { + mListener = listener; + mAppPath = appPath; + assert(mListener != null); + + mSemaphore = new Semaphore(1); + } + + // Добавление в задание на отправку до того как не получен ответ от предедущего запроса следующий не отсылается те. последовательно это делает (обработка результатов не в потоке загрузки а в основном потоке) + //return id запроса + public int addRequest(String url, String str, String file) + { + mId++; //Инкрементируем идентификатор запроса + try + { + mSemaphore.acquire(); + + Tsk t = new Tsk(); + t.url = url; + t.str = str; + t.file = file; + t.s = false; + t.id = mId; + mTList.add(t); + } catch (InterruptedException ex) + { + } finally + { mSemaphore.release(); + } + return mId; + } + + /** + * Получить количество заданий ожидающих выполнение + * @return + */ + public int getCountTasks() + { + int result=0; + try + { + mSemaphore.acquire(); + result = mTList.size(); + } catch (InterruptedException ex) + { + } finally + { mSemaphore.release(); + } + return result; + } + + @Override + public void run() + { + Tsk tsk; + while(true) + { + //Считываем первое задание из защищёного семафором списка + tsk = null; + try { + + mSemaphore.acquire(); + for(int i=0;i 0) { + try { + dos.write(buffer, 0, bytesRead); + } catch (OutOfMemoryError e) { + e.printStackTrace(); + } + bytesRead = fileInputStream.read(buffer); + } + } catch (Exception e) { + e.printStackTrace(); + } + fileInputStream.close(); + + dos.writeBytes(crlf); + dos.writeBytes("--"+boundary + "--" + crlf); + dos.flush(); + dos.close(); + } + }else{ + conn.setRequestProperty("Accept-Charset", "UTF-8"); + conn.setRequestProperty("Content-Type", "application/xml; charset=utf-8"); + conn.setRequestProperty("Accept", "application/xml"); + + OutputStream os = conn.getOutputStream(); + BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os, "UTF-8")); + writer.write(tsk.str); + writer.flush(); + writer.close(); + os.close(); + } + + int responseCode=conn.getResponseCode(); + if (responseCode == HttpsURLConnection.HTTP_OK) { + rid++; + String filePath = mAppPath+"/"+"data_"+ String.valueOf(rid)+".txt"; + + //Так как файл может быть большим и он может не поместиться в памяти то сохраняем его на диск (допустим таблица с языками очень большая) + try { + BufferedInputStream bis = new BufferedInputStream(conn.getInputStream()); + BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File(filePath))); + int inByte; + while ((inByte = bis.read()) != -1) bos.write(inByte); + bis.close(); + bos.close(); + }catch(Exception ex) + {} + + //Информирую слушателя о приёме данных + Message msg = myHandle.obtainMessage(); + Bundle b = new Bundle(); + b.putString("file", filePath); + b.putInt("id", tsk.id); + msg.setData(b); + myHandle.sendMessage(msg); + } + } catch (Exception ex) { + bError = true; + Log.i("igor", ex.toString()); + } +/* + HttpClient httpClient = new DefaultHttpClient(); + httpClient.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1); + HttpPost httpPost = new HttpPost(tsk.url); + if(tsk.file!=null) //Отправляем файл на сервер + { + File file = new File(tsk.file); + if(file.exists()) + { + MultipartEntity mpEntity = new MultipartEntity(); + ContentBody cbFile = new FileBody(file, "image/jpeg"); + mpEntity.addPart("file", cbFile); + httpPost.setEntity(mpEntity); + } + }else //Отправляем XML строку + { + httpPost.addHeader("Content-Type", "application/xml"); + + StringEntity entity = new StringEntity(tsk.str, "UTF-8"); + entity.setContentType("application/xml"); + httpPost.setEntity(entity); + } + + HttpResponse response = httpClient.execute(httpPost); + if(response != null) + { + rid++; + String filePath = mAppPath+"/"+"data_"+ String.valueOf(rid)+".txt"; + + //Так как файл может быть большим и он может не поместиться в памяти то сохраняем его на диск + try { + BufferedInputStream bis = new BufferedInputStream(response.getEntity().getContent()); + BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File(filePath))); + int inByte; + while ((inByte = bis.read()) != -1) bos.write(inByte); + bis.close(); + bos.close(); + }catch(Exception ex) + {} + + Message msg = myHandle.obtainMessage(); + Bundle b = new Bundle(); + b.putString("file", filePath); + b.putInt("id", tsk.id); + msg.setData(b); + myHandle.sendMessage(msg); + }else + bError = true; //Если ошибка при принятии ответа + + + } catch (UnsupportedEncodingException ex) + { + bError = true; + Log.i("igor", "Error 5 = " + ex.toString()); + } catch (ClientProtocolException ex) + { + bError = true; + Log.i("igor", "Error 6 = " + ex.toString()); + } catch (IOException ex) + { + bError = true; + Log.i("igor", "Error 7 = " + ex.toString()); + } +*/ + + if(bError) //Если произошла ошибка при отправке. + { + tsk.wait += 1000 * 60 * 1; //Увеличиваем ожидание перед новой отправкой на 1 минуту + if(tsk.wait > 1000 * 60 * 10 ) tsk.wait = 1000 * 60 * 10; //Ограничение 10 минут + tsk.s = false; //Отмечаем как не отправленное + tsk.t++; //Увеличиваем счётчик количество попыток отправки + + if(tsk.t>10) //Удаляем задание после 10 попыток отправки + { + try { + mSemaphore.acquire(); + mTList.remove(tsk); + } catch (InterruptedException ex) + { + // вот такое может произойти, если поток например прервут thread.interrupt() + } finally + { + mSemaphore.release(); //Отдаем семафор + } + } + } + + } + + try { + sleep(100); //Задержка между каждым выполнением задания + } catch (InterruptedException e) { } + + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/kz/istt/locust/ScanActivity.java b/app/src/main/java/kz/istt/locust/ScanActivity.java new file mode 100644 index 0000000..c9f044e --- /dev/null +++ b/app/src/main/java/kz/istt/locust/ScanActivity.java @@ -0,0 +1,500 @@ +package kz.istt.locust; + +import static kz.istt.locust.Tools.md5; + +import android.Manifest; +import android.app.Activity; +import android.app.AlertDialog; +import android.app.Dialog; +import android.app.ProgressDialog; +import android.content.Context; +import android.content.ContextWrapper; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteStatement; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.drawable.ColorDrawable; +import android.graphics.drawable.Drawable; +import android.os.AsyncTask; +import android.os.Bundle; +import android.os.Handler; +import android.provider.Settings; +import android.util.SparseArray; +import android.view.Display; +import android.view.SurfaceHolder; +import android.view.SurfaceView; +import android.view.View; +import android.view.ViewGroup; +import android.view.Window; +import android.widget.Button; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.RelativeLayout; +import android.widget.Space; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.app.ActivityCompat; + +import com.google.android.gms.vision.CameraSource; +import com.google.android.gms.vision.Detector; +import com.google.android.gms.vision.Frame; +import com.google.android.gms.vision.barcode.Barcode; +import com.google.android.gms.vision.barcode.BarcodeDetector; +import com.google.android.material.floatingactionbutton.FloatingActionButton; + +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.io.OutputStreamWriter; +import java.io.UnsupportedEncodingException; +import java.net.HttpURLConnection; +import java.net.URL; + +import javax.net.ssl.HttpsURLConnection; + +public class ScanActivity extends Activity { + + public static final int PICK_IMAGE = 1; + + final Handler mHandler = new Handler(); + + public ProgressDialog mPd=null; + public SurfaceView surfaceView; + //public SurfaceView svDrawingFrame; + //public TextView txtBarcodeValue; + private Detector barcodeDetector=null; + private CameraSource cameraSource; + private static final int REQUEST_CAMERA_PERMISSION = 201; + public FloatingActionButton btnOpen = null; + public String intentData = ""; + public boolean isEmail = false; + public String qrcode = ""; + + public TextView tvName = null; + public TextView tvCountry = null; + public TextView tvOrganization = null; + + public void showProgress(boolean show,String title) + { + if(mPd==null && show) { + mPd = new ProgressDialog(this); + mPd.setTitle(title); + + mPd.setMessage(getResources().getString(R.string.Wait_please)); + mPd.setCanceledOnTouchOutside(false); + mPd.setCancelable(false); + mPd.setIndeterminate(true); + mPd.show(); + } + if(mPd!=null && !show) { + mPd.hide(); + mPd=null; + } + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_scan); + + //txtBarcodeValue = findViewById(R.id.txtBarcodeValue); + surfaceView = findViewById(R.id.surfaceView); + + tvName = (TextView) findViewById(R.id.tvName); + tvCountry = (TextView) findViewById(R.id.tvCountry); + tvOrganization = (TextView) findViewById(R.id.tvOrganization); + + DbOpenHelper dboh = new DbOpenHelper(this); + SQLiteDatabase db = dboh.getReadableDatabase(); + Cursor cursor = db.rawQuery("select " + + " cr.name as country_name," + + " cp.name as company_name," + + " t.name " + + "from " + + " terminals t " + + " left join countries cr on cr.id=t.country_id " + + " left join companies cp on cp.id=t.company_id " + + "where t.del=0 and t.serial='"+Settings.Secure.getString(getContentResolver(), Settings.Secure.ANDROID_ID)+"';", null); + if(cursor.moveToFirst()) + { + tvCountry.setText(cursor.getString(cursor.getColumnIndex("country_name"))); + tvOrganization.setText(cursor.getString(cursor.getColumnIndex("company_name"))); + tvName.setText(cursor.getString(cursor.getColumnIndex("name"))); + } + cursor.close(); + dboh.close(); + + + //surfaceView.setZOrderOnTop(false); //CODE TO SET VIDEO VIEW TO BACK + + //svDrawingFrame = findViewById(R.id.svDrawingFrame); + //svDrawingFrame.setZOrderOnTop(true); + + /*btnAction = findViewById(R.id.btnAction); + btnAction.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (intentData.length() > 0) { + if (isEmail) { + //startActivity(new Intent(ScanActivity.this, EmailActivity.class).putExtra("email_address", intentData)); + }else { + startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(intentData))); + } + } + } + });*/ + + btnOpen = (FloatingActionButton) findViewById(R.id.btnOpen); + btnOpen.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent intent = new Intent(); + intent.setType("image/*"); + intent.setAction(Intent.ACTION_GET_CONTENT); + startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_IMAGE); + } + }); + + //Если QR не работает то и не отображаю кнопки + BarcodeDetector bDetector = new BarcodeDetector.Builder(ScanActivity.this) + .setBarcodeFormats(Barcode.QR_CODE) // set QR code as the format type + .build(); + if(!bDetector.isOperational()) { + btnOpen.setVisibility(View.GONE); + surfaceView.setVisibility(View.GONE); + }else{ + ((TextView) findViewById(R.id.tvUpdate)).setVisibility(View.GONE); + ((Space) findViewById(R.id.sUpdate)).setVisibility(View.GONE); + } + bDetector.release(); + + } + + @Override + public void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + + if (requestCode == PICK_IMAGE) { + if (data == null) { + return; + } + InputStream inputStream = null; + try { + inputStream = getContentResolver().openInputStream(data.getData()); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } + if (inputStream != null) { + + BarcodeDetector bDetector = new BarcodeDetector.Builder(ScanActivity.this) + .setBarcodeFormats(Barcode.QR_CODE) // set QR code as the format type + .build(); + Bitmap bitmap = BitmapFactory.decodeStream(inputStream); + Frame frame = new Frame.Builder().setBitmap(bitmap).build(); + if (bDetector.isOperational()) { + final SparseArray barcodes = bDetector.detect(frame); + if (barcodes.size() == 0) { + Toast toast = Toast.makeText(getApplicationContext(), + getResources().getString(R.string.QR_code_not_found), Toast.LENGTH_LONG); + toast.show(); + } else { + qrcode = barcodes.valueAt(0).displayValue; + if(qrcode.indexOf("ccalm")>=0){ + String android_id = Settings.Secure.getString(getContentResolver(), Settings.Secure.ANDROID_ID); + DataActSendTask send = new DataActSendTask(qrcode,android_id); + send.execute(); + }else{ + Toast toast = Toast.makeText(getApplicationContext(), + getResources().getString(R.string.Error_QR_code)+": \""+qrcode+"\"", Toast.LENGTH_LONG); + toast.show(); + } + } + } + bDetector.release(); + } + } + } + + public void setJSONObject(JSONObject json) + { + try { + if(json.getInt("errorCode")==0) { + tvName.setText(json.getString("name")); + tvCountry.setText(json.getString("country_name")); + tvOrganization.setText(json.getString("company_name")); + + //Update terminals table (After that, the terminal tables will be updated using synchronization.) + String sql="select * from terminals where id="+json.getString("id"); + boolean exists=false; + DbOpenHelper dboh = new DbOpenHelper(this); + SQLiteDatabase db = dboh.getReadableDatabase(); + Cursor cursor = db.rawQuery(sql, null); + if(cursor.moveToFirst()) + { + exists=true; + } + cursor.close(); + if(exists){ + sql="update terminals set country_id=?,company_id=?,name=?,serial=? where id=?"; + SQLiteDatabase wdb = dboh.getWritableDatabase(); + SQLiteStatement stmt = wdb.compileStatement(sql); + stmt.bindLong(1, json.getLong("country_id")); + stmt.bindLong(2, json.getLong("company_id")); + stmt.bindString(3, json.getString("name")); + stmt.bindString(4, Settings.Secure.getString(getContentResolver(), Settings.Secure.ANDROID_ID)); + stmt.bindLong(5, json.getLong("id")); + stmt.executeUpdateDelete(); + }else{ + sql="insert into terminals(id,country_id,company_id,name,serial)values(?,?,?,?,?);"; + SQLiteDatabase wdb = dboh.getWritableDatabase(); + SQLiteStatement stmt = wdb.compileStatement(sql); + stmt.bindLong(1, json.getLong("id")); + stmt.bindLong(2, json.getLong("country_id")); + stmt.bindLong(3, json.getLong("company_id")); + stmt.bindString(4, json.getString("name")); + stmt.bindString(5, Settings.Secure.getString(getContentResolver(), Settings.Secure.ANDROID_ID)); + stmt.executeInsert(); + } + dboh.close(); + + }else { + String errorMessage = json.getString("errorMessage"); + if (!errorMessage.equals("")) { + AlertDialog alertDialog = new AlertDialog.Builder(ScanActivity.this).create(); + alertDialog.setTitle(getResources().getString(R.string.Attention)); + alertDialog.setMessage(errorMessage); + alertDialog.setButton("OK", new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + } + }); + //alertDialog.setIcon(R.drawable.icon); + alertDialog.show(); + } + qrcode = ""; + } + } catch (JSONException e) { + e.printStackTrace(); + } + } + + private void initialiseDetectorsAndSources() { + + //Toast.makeText(getApplicationContext(), "Barcode scanner started", Toast.LENGTH_SHORT).show(); + + barcodeDetector = new BarcodeDetector.Builder(this) + .setBarcodeFormats(Barcode.QR_CODE) + .build(); + + cameraSource = new CameraSource.Builder(this, barcodeDetector) + .setRequestedPreviewSize(800, 800) + .setAutoFocusEnabled(true) //you should add this feature + .build(); + + surfaceView.getHolder().addCallback(new SurfaceHolder.Callback() { + @Override + public void surfaceCreated(SurfaceHolder holder) { + try { + if (ActivityCompat.checkSelfPermission(ScanActivity.this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) { + cameraSource.start(surfaceView.getHolder()); + } else { + ActivityCompat.requestPermissions(ScanActivity.this, new + String[]{Manifest.permission.CAMERA}, REQUEST_CAMERA_PERMISSION); + } + + } catch (IOException e) { + e.printStackTrace(); + } + } + + @Override + public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { + } + + @Override + public void surfaceDestroyed(SurfaceHolder holder) { + cameraSource.stop(); + } + }); + + barcodeDetector.setProcessor(new Detector.Processor() { + +/* private final Handler handler = null; + + public Detector.Processor() { + handler = new Handler(); + } +*/ + @Override + public void release() { + //Toast.makeText(getApplicationContext(), "Для предотвращения утечки памяти сканер штрих-кода остановлен", Toast.LENGTH_SHORT).show(); + } + + @Override + public void receiveDetections(Detector.Detections detections) { + final SparseArray barcodes = detections.getDetectedItems(); + if (barcodes.size() != 0) { + mHandler.post(new Runnable() { + @Override + public void run() { + + if(!qrcode.equals(barcodes.valueAt(0).displayValue)) { + qrcode = barcodes.valueAt(0).displayValue; + if(qrcode.indexOf("ccalm")>=0){ + String android_id = Settings.Secure.getString(getContentResolver(), Settings.Secure.ANDROID_ID); + DataActSendTask send = new DataActSendTask(qrcode,android_id); + send.execute(); + }else{ + Toast toast = Toast.makeText(getApplicationContext(), + getResources().getString(R.string.Error_QR_code)+": \""+qrcode+"\"", Toast.LENGTH_LONG); + toast.show(); + } + } + } + }); + } + } + }); + } + + @Override + protected void onPause() { + super.onPause(); + cameraSource.release(); + } + + @Override + protected void onResume() { + super.onResume(); + initialiseDetectorsAndSources(); + + //Подгоняем размер под квадран + ViewGroup.LayoutParams params = surfaceView.getLayoutParams(); + params.height = getWindowManager().getDefaultDisplay().getWidth(); + surfaceView.setLayoutParams(params); + } + + //Запрашиваю данные с сервера + public class DataActSendTask extends AsyncTask { + private final String mQRCode; + private final String mAndroid_id; + + private String mErrmsg; + private JSONObject mResult; //Результирующий JSONObject + // mainObject = new JSONObject(Your_Sring_data); + + DataActSendTask(String qrcode,String android_id) { + mQRCode=qrcode; + mAndroid_id = android_id; + + mErrmsg = ""; + mResult = null; + } + + @Override + protected void onPreExecute() { + super.onPreExecute(); + ScanActivity.this.showProgress(true,getResources().getString(R.string.Search)); + } + + @Override + protected Void doInBackground(Void... params) { + + //I'm trying to login using JSON string + JSONObject data = new JSONObject(); + try { + data.put("qrcode",mQRCode); + data.put("android_id",mAndroid_id); + data.put("secret",md5(mAndroid_id+"_ASDC")); + } catch (JSONException ex) { + ex.printStackTrace(); + mErrmsg+=ex.getLocalizedMessage()+" "; + } + + //Trying to send a request to the server + try { + URL url = new URL(MySynchronizationOld.URL+"/asdc/qrcode/"); + HttpURLConnection conn = (HttpURLConnection) url.openConnection(); + conn.setReadTimeout(25000); + conn.setConnectTimeout(25000); + conn.setRequestMethod("POST"); + conn.setRequestProperty("Content-Type", "application/json; charset=utf-8"); + conn.setRequestProperty("Accept", "application/json"); + conn.setRequestProperty("Accept-Charset", "UTF-8"); + conn.setDoInput(true); + conn.setDoOutput(true); + + OutputStream os = conn.getOutputStream(); + BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os, "UTF-8")); + writer.write(data.toString()); + writer.flush(); + writer.close(); + os.close(); + + int responseCode=conn.getResponseCode(); + if (responseCode == HttpsURLConnection.HTTP_OK) { + String JSONStr=""; //Результирующий JSON + String line; + BufferedReader br=new BufferedReader(new InputStreamReader(conn.getInputStream())); + while ((line=br.readLine()) != null) { + JSONStr+=line; + } + try { + mResult = new JSONObject(JSONStr); + } catch (JSONException e) { + mErrmsg = "JSON parsing error: "+JSONStr; + } + }else{ + mErrmsg = "Failed to get data from the server."; + } + + } catch (UnsupportedEncodingException e) { + mErrmsg = e.getMessage(); + } catch (IOException e) { + mErrmsg = e.getMessage(); + } + return null; + } + + @Override + protected void onPostExecute(Void result) { + super.onPostExecute(result); + ScanActivity.this.showProgress(false,""); + + if (mResult != null) + ScanActivity.this.setJSONObject(mResult); + + + if (mErrmsg != null && !mErrmsg.equals("")) { + AlertDialog alertDialog = new AlertDialog.Builder(ScanActivity.this).create(); + alertDialog.setTitle("Error"); + alertDialog.setMessage(mErrmsg); + alertDialog.setButton("OK", new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + } + }); + //alertDialog.setIcon(R.drawable.icon); + alertDialog.show(); + } + } + + @Override + protected void onCancelled() { + ScanActivity.this.showProgress(false,""); + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/kz/istt/locust/SetupActivity.java b/app/src/main/java/kz/istt/locust/SetupActivity.java new file mode 100644 index 0000000..9ce5c4b --- /dev/null +++ b/app/src/main/java/kz/istt/locust/SetupActivity.java @@ -0,0 +1,376 @@ +package kz.istt.locust; + +import android.app.Activity; +import android.app.PendingIntent; +import android.content.Intent; +import android.content.SharedPreferences; +import android.content.res.Configuration; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.os.Bundle; +import android.view.Menu; +import android.view.View; +import android.view.View.OnClickListener; +import android.widget.Button; +import android.widget.CheckBox; +import android.widget.TextView; + +import com.google.android.gms.vision.Frame; +import com.google.android.gms.vision.barcode.Barcode; +import com.google.android.gms.vision.barcode.BarcodeDetector; + +import java.util.Locale; + + +public class SetupActivity extends Activity { + + //Для смены языка на лету + //private Locale myLocale; + private SharedPreferences preferences; + private Locale locale; + private String lang; + //private OrientationEventListener mOrientationListener=null; + + //public ProgressDialog dialog; + //public Handler myHandle; + + public Button btnSynchronization = null; //Кнопка синхронизации + public TextView tvSynchronization = null; // + public Button btnDr = null; + public Button btnAz = null; + public Button btnEn = null; + public Button btnGr = null; + public Button btnKg = null; + public Button btnKz = null; + public Button btnRu = null; + public Button btnUz = null; + public Button btnTj = null; + public Button btnTm = null; + public Button btnAr = null; + public Button btnQR = null; + public CheckBox cbIdentifyCountryRegion = null; + + public final static int TASK1_CODE = 1; + public final static int TASK2_CODE = 2; + public final static int TASK3_CODE = 3; + public final static int STATUS_START = 100; + public final static int STATUS_FINISH = 200; + //public final static String PARAM_ACTION = "ACTION"; + public final static String PARAM_PINTENT = "pendingIntent"; + public final static String PARAM_RESULT = "result"; + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_setup); + +/* + mOrientationListener = new OrientationEventListener(this, + SensorManager.SENSOR_DELAY_NORMAL) { + + @Override + public void onOrientationChanged(int orientation) + { + Log.e("CCALM", "Orientation changed to " + orientation); + } + }; + + + if (mOrientationListener.canDetectOrientation() == true) { + Log.e("CCALM", "Can detect orientation"); + mOrientationListener.enable(); + } else { + Log.e("CCALM", "Cannot detect orientation"); + mOrientationListener.disable(); + } +*/ + + //Загрузка сохранёного языка + Tools.loadLocale(this); + + tvSynchronization = (TextView)findViewById(R.id.tvSynchronization); + + //Кнопочка синхронизировать + btnSynchronization = (Button) findViewById(R.id.btnSynchronization); + OnClickListener oclBtnSynchronization = new OnClickListener() + { + @Override + public void onClick(View v) + { + startService(new Intent(SetupActivity.this, MainService.class).putExtra(MainService.PARAM_ACTION, "1")); // Чтоб вызвать событие таймера в сервисе + } + }; + btnSynchronization.setOnClickListener(oclBtnSynchronization); + + //Выбор языка + btnDr = (Button) findViewById(R.id.btnDr); + OnClickListener oclbtnDr = new OnClickListener() + { + @Override + public void onClick(View v) + { + Tools.saveLocale(SetupActivity.this, "ps"); + updateTexts(); + } + }; + btnDr.setOnClickListener(oclbtnDr); + + //Выбор языка + btnAz = (Button) findViewById(R.id.btnAz); + OnClickListener oclBtnAz = new OnClickListener() + { + @Override + public void onClick(View v) + { + Tools.saveLocale(SetupActivity.this, "az"); + updateTexts(); + } + }; + btnAz.setOnClickListener(oclBtnAz); + + //Выбор англйского языка + btnEn = (Button) findViewById(R.id.btnEn); + OnClickListener oclBtnEn = new OnClickListener() + { + @Override + public void onClick(View v) + { + Tools.saveLocale(SetupActivity.this, "en"); + updateTexts(); + } + }; + btnEn.setOnClickListener(oclBtnEn); + + //Выбор Грузинского языка + btnGr = (Button) findViewById(R.id.btnGr); + OnClickListener oclBtnGr = new OnClickListener() + { + @Override + public void onClick(View v) + { + Tools.saveLocale(SetupActivity.this, "ka"); + updateTexts(); + } + }; + btnGr.setOnClickListener(oclBtnGr); + + //Кыргыз + btnKg = (Button) findViewById(R.id.btnKg); + OnClickListener oclBtnKg = new OnClickListener() + { + @Override + public void onClick(View v) + { + Tools.saveLocale(SetupActivity.this, "kg"); + updateTexts(); + } + }; + btnKg.setOnClickListener(oclBtnKg); + + //Выбор Казахского языка + btnKz = (Button) findViewById(R.id.btnKz); + OnClickListener oclBtnKz = new OnClickListener() + { + @Override + public void onClick(View v) + { + + Tools.saveLocale(SetupActivity.this, "kk"); + updateTexts(); + } + }; + btnKz.setOnClickListener(oclBtnKz); + + + //Выбор руского языка + btnRu = (Button) findViewById(R.id.btnRu); + OnClickListener oclBtnRu = new OnClickListener() + { + @Override + public void onClick(View v) + { + Tools.saveLocale(SetupActivity.this, "ru"); + updateTexts(); + } + }; + btnRu.setOnClickListener(oclBtnRu); + + //Выбор узбекского языка + btnUz = (Button) findViewById(R.id.btnUz); + OnClickListener oclBtnUz = new OnClickListener() + { + @Override + public void onClick(View v) + { + Tools.saveLocale(SetupActivity.this, "uz"); + updateTexts(); + } + }; + btnUz.setOnClickListener(oclBtnUz); + + //Выбор Таджикского языка + btnTj = (Button) findViewById(R.id.btnTj); + OnClickListener oclBtnTj = new OnClickListener() + { + @Override + public void onClick(View v) + { + Tools.saveLocale(SetupActivity.this, "tg"); + updateTexts(); + } + }; + btnTj.setOnClickListener(oclBtnTj); + + //Выбор Туркменского языка + btnTm = (Button) findViewById(R.id.btnTm); + OnClickListener oclBtnTm = new OnClickListener() + { + @Override + public void onClick(View v) + { + Tools.saveLocale(SetupActivity.this, "tk"); + updateTexts(); + } + }; + btnTm.setOnClickListener(oclBtnTm); + + //Выбор Армянского языка + btnAr = (Button) findViewById(R.id.btnAr); + OnClickListener oclBtnAr = new OnClickListener() + { + @Override + public void onClick(View v) + { + Tools.saveLocale(SetupActivity.this, "hy"); + updateTexts(); + } + }; + btnAr.setOnClickListener(oclBtnAr); + + + cbIdentifyCountryRegion = (CheckBox) findViewById(R.id.cbIdentifyCountryRegion); + + String prefName = "Identify"; + SharedPreferences prefs = getSharedPreferences("CommonPrefs", Activity.MODE_PRIVATE); + String checked = prefs.getString(prefName, ""); + if(checked.equals("") || checked.equals("1")) + cbIdentifyCountryRegion.setChecked(true); + else + cbIdentifyCountryRegion.setChecked(false); + + OnClickListener oclBtnId = new OnClickListener() + { + @Override + public void onClick(View v) + { + String prefName = "Identify"; + SharedPreferences prefs = getSharedPreferences("CommonPrefs", Activity.MODE_PRIVATE); + SharedPreferences.Editor editor = prefs.edit(); + if(cbIdentifyCountryRegion.isChecked()) + editor.putString(prefName, "1"); //Default value + else + editor.putString(prefName, "0"); + editor.commit(); + } + }; + cbIdentifyCountryRegion.setOnClickListener(oclBtnId); + + //Кнопка для сканирования QR кода + btnQR = (Button) findViewById(R.id.btnQR); + OnClickListener oclBtnQR = new OnClickListener() + { + @Override + public void onClick(View v) + { + startActivity(new Intent(SetupActivity.this, ScanActivity.class)); + } + }; + btnQR.setOnClickListener(oclBtnQR); + + //1 диалог на всё + /*dialog = new ProgressDialog(SetupActivity.this); + dialog.setMessage("Синхронизация..."); + dialog.setIndeterminate(true); + dialog.setCancelable(true);*/ + } + + /** СМ. http://developer.android.com/reference/android/app/Activity.html + * Происходит при старте и при возврате на этот Activity + * */ + @Override + public void onStart() + { + super.onStart(); + //Для возможности синхронизации прогресс бара передаём ниточку в поток + PendingIntent pi = createPendingResult(TASK1_CODE, new Intent(this, MainService.class), 0); + Intent intent = new Intent(this, MainService.class); + intent.putExtra(MainService.PARAM_ACTION, "2"); + intent.putExtra(PARAM_PINTENT, pi); + startService(intent); + } + + @Override + protected void onStop() { + super.onStop(); +/* + //Удаляем слушателя + Intent intent = new Intent(this, MainService.class); + intent.putExtra(MainService.PARAM_ACTION, "3"); + startService(intent); +*/ + } + + @Override + protected void onDestroy() { + super.onDestroy(); + //mOrientationListener.disable(); + } + + @Override + public void onConfigurationChanged(Configuration newConfig) + { + super.onConfigurationChanged(newConfig); + + /*locale = new Locale(lang); + Locale.setDefault(locale); + Configuration config = new Configuration(); + config.locale = locale; + getBaseContext().getResources().updateConfiguration(config, null);*/ + + //updateTexts(); + } + + /*@Override + public void onOrientationChanged(int arg0) + { + + }*/ + + @Override + public boolean onCreateOptionsMenu(Menu menu) + { + getMenuInflater().inflate(R.menu.setup, menu); + return true; + } + + //Обновление UI элементов текущего окна (обновлять необходимо только окно, в котором происходит смена локали): + private void updateTexts() + { + Intent intent = getIntent(); + finish(); + startActivity(intent); + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) + { + super.onActivityResult(requestCode, resultCode, data); + //Пришли данные о статусе синхронизации + if (resultCode == STATUS_FINISH) + { + int cnt = data.getIntExtra(PARAM_RESULT, 0); + tvSynchronization.setText("Synchronization tasks: "+ String.valueOf(cnt)); + } + } +} diff --git a/app/src/main/java/kz/istt/locust/SplashScreen.java b/app/src/main/java/kz/istt/locust/SplashScreen.java new file mode 100644 index 0000000..e67a1ea --- /dev/null +++ b/app/src/main/java/kz/istt/locust/SplashScreen.java @@ -0,0 +1,73 @@ +package kz.istt.locust; + +import android.app.Activity; +import android.content.Intent; +import android.database.sqlite.SQLiteDatabase; +import android.os.Bundle; +import android.view.MotionEvent; + + +public class SplashScreen extends Activity { + + //how long until we go to the next activity + protected int _splashTime = 1500; + + private Thread splashTread; + + /** Called when the activity is first created. */ + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.splash); + + //Создаём базу + DbOpenHelper dboh=new DbOpenHelper(this); + SQLiteDatabase db = dboh.getReadableDatabase(); + db.close(); + dboh.close(); + + + final SplashScreen sPlashScreen = this; + + //Загрузка сохраненного языка + Tools.loadLocale(this); + + // thread for displaying the SplashScreen + splashTread = new Thread() { + @Override + public void run() { + try { + synchronized(this){ + + //wait 5 sec + wait(_splashTime); + } + + } catch(InterruptedException e) {} + finally { + finish(); + + //start a new activity + Intent i = new Intent(); + i.setClass(sPlashScreen, MainActivity.class); + startActivity(i); + + finish(); + } + } + }; + + splashTread.start(); + } + + //Function that will handle the touch + @Override + public boolean onTouchEvent(MotionEvent event) { + if (event.getAction() == MotionEvent.ACTION_DOWN) { + synchronized(splashTread){ + splashTread.notifyAll(); + } + } + return true; + } +} \ No newline at end of file diff --git a/app/src/main/java/kz/istt/locust/Tools.java b/app/src/main/java/kz/istt/locust/Tools.java new file mode 100644 index 0000000..75d28dc --- /dev/null +++ b/app/src/main/java/kz/istt/locust/Tools.java @@ -0,0 +1,439 @@ +package kz.istt.locust; + +import android.app.Activity; +import android.content.Context; +import android.content.SharedPreferences; +import android.database.Cursor; +import android.graphics.Bitmap; +import android.graphics.Matrix; +import android.util.Log; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; +import android.widget.ListAdapter; +import android.widget.ListView; +import android.widget.Spinner; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.Locale; +import java.util.TimeZone; + +/* +import java.util.Locale; +import android.os.Bundle; +import android.app.Activity; +import android.content.Intent; +import android.content.res.Configuration; +import android.content.res.Resources; +import android.util.DisplayMetrics; +import android.view.View; +import android.widget.AdapterView; +import android.widget.Button; +import android.widget.Spinner; +import android.widget.Toast; +import android.widget.AdapterView.OnItemSelectedListener; +*/ +public class Tools +{ + public static boolean setListViewHeightBasedOnItems(ListView listView) { + + ListAdapter listAdapter = listView.getAdapter(); + if (listAdapter != null) { + + int numberOfItems = listAdapter.getCount(); + + // Get total height of all items. + int totalItemsHeight = 0; + for (int itemPos = 0; itemPos < numberOfItems; itemPos++) { + View item = listAdapter.getView(itemPos, null, listView); + float px = 500 * (listView.getResources().getDisplayMetrics().density); + item.measure(View.MeasureSpec.makeMeasureSpec((int)px, View.MeasureSpec.AT_MOST), View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)); + totalItemsHeight += item.getMeasuredHeight(); + } + + // Get total height of all item dividers. + int totalDividersHeight = listView.getDividerHeight() * + (numberOfItems - 1); + // Get padding + int totalPadding = listView.getPaddingTop() + listView.getPaddingBottom(); + + // Set list height. + ViewGroup.LayoutParams params = listView.getLayoutParams(); + params.height = totalItemsHeight + totalDividersHeight + totalPadding; + listView.setLayoutParams(params); + listView.requestLayout(); + return true; + + } else { + return false; + } + } + + //Получить текущую временную зону в виде 00:00:00 + public static String getTimezone() + { + Calendar cal = Calendar.getInstance(); + TimeZone tz = cal.getTimeZone(); + int offset=tz.getRawOffset()/1000; + + int hours = offset / 3600; + int minutes = (offset % 3600) / 60; + int seconds = offset % 60; + + return Tools.numConvert(String.format("%02d:%02d:%02d", hours, minutes, seconds)); + } + + //Преобразовать арабские и индийские в современные цифры + public static String numConvert(String str) + { + if(str==null) return null; + String persian = "۰۱۲۳۴۵۶۷۸۹"; + String arabic = "٩٨٧٦٥٤٣٢١٠"; + String num = "0123456789"; + //Заменяю персидские + for(int i=0;isize) + break; + } + reader.close(); + return sb.toString(); + } + + public static String getStringFromFile (String filePath, int size) throws Exception { + File fl = new File(filePath); + FileInputStream fin = new FileInputStream(fl); + String ret = convertStreamToString(fin,size); + //Make sure you close all streams. + fin.close(); + return ret; + } + + public static final String md5(final String str) + { + try { + // Create MD5 Hash + MessageDigest digest = java.security.MessageDigest + .getInstance("MD5"); + digest.update(str.getBytes()); + byte messageDigest[] = digest.digest(); + + // Create Hex String + StringBuffer hexString = new StringBuffer(); + for (int i = 0; i < messageDigest.length; i++) { + String h = Integer.toHexString(0xFF & messageDigest[i]); + while (h.length() < 2) + h = "0" + h; + hexString.append(h); + } + return hexString.toString(); + + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + return ""; + } + + /** + * Получить Integer из текста + */ + public static Boolean getBoolean(String val) + { + if(val==null || val.equals("") || val.equals("null")) return null; + if(val.equals("1") || val.equals("t")) return Boolean.valueOf(true); + if(val.equals("0") || val.equals("f")) return Boolean.valueOf(false); + return null; + } + + /** + * Получить Integer из текста + */ + public static Integer getInt(String val) + { + if(val==null || val.equals("") || val.equals("null")) return null; + return Integer.parseInt(val); + } + /** + * Получить Long из текста + */ + public static Long getLong(String val, Long def) + { + if(val==null || val.equals("") || val.equals("null")) return def; + return Long.parseLong(val); + } + /** + * Получить Double из текста + */ + public static Double getDouble(String val, Double def) + { + if(val==null || val.equals("") || val.equals("null")) return def; + return Double.parseDouble(val); + } + + /** + * вывод в лог данных из курсора + * @param c - открытый курсор + */ + public static void logCursor(Cursor c) + { + Log.d("LOG_TAG", "Cursor:"); + if (c != null) + { + if (c.moveToFirst()) + { + String str; + do { + str = ""; + for (String cn : c.getColumnNames()) + { + str = str.concat(cn + " = " + c.getString(c.getColumnIndex(cn)) + "; "); + } + Log.d("LOG_TAG", str); + } while (c.moveToNext()); + } + } else + Log.d("LOG_TAG", "Cursor is null"); + } + + /** + * Выбрать в списке по названию если нет то создать элемент в конце списка + * @param item название + */ + public static void selSpinnerIC(Spinner spi, String item) + { + if(item == null) item = ""; + int pos=-1; + for(int i=0;i dataAdapter = (ArrayAdapter)spi.getAdapter(); + //SpinnerAdapter dataAdapter = spi.getAdapter(); + if(dataAdapter!=null) + { dataAdapter.add(item); + pos=spi.getCount()-1; + }//else pos=INVALID_POSITION; + } + spi.setSelection(pos); + } + + //Загрузка ранее сохраненной локали + public static void loadLocale(Context context) + { + String langPref = "Language"; + SharedPreferences prefs = context.getSharedPreferences("CommonPrefs", Activity.MODE_PRIVATE); + String language = prefs.getString(langPref, ""); + + Tools.changeLang0(context, language); + } + + //Сохранение текущей локали + public static void saveLocale(Context context, String lang) + { + String langPref = "Language"; + SharedPreferences prefs = context.getSharedPreferences("CommonPrefs", Activity.MODE_PRIVATE); + SharedPreferences.Editor editor = prefs.edit(); + editor.putString(langPref, lang); + editor.commit(); + + Tools.changeLang0(context,lang); + } + + //Смена языка в приложении + private static void changeLang0(Context context, String lang) + { + if (lang.equalsIgnoreCase("")) + return; + + Locale myLocale = new Locale(lang); + Locale.setDefault(myLocale); + android.content.res.Configuration config = new android.content.res.Configuration(); + config.locale = myLocale; + + context.getResources().updateConfiguration(config, context.getResources().getDisplayMetrics()); + + } + + /*Получить короткое имя языка*/ + public static String getLang() + { +/* android.content.res.Configuration config = new android.content.res.Configuration(); + return config.locale.getDisplayLanguage(); +*/ + return Locale.getDefault().getLanguage(); + } + + /** Дату время в виде строки "HH:mm:ss dd.MM.yyyy" в секунд с 1970 года + * */ + public static Long getUnixDateTime(String dateString) + { + SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss dd.MM.yyyy"); + Date convertedDate = new Date(); + try { + convertedDate = dateFormat.parse(dateString); + } catch (java.text.ParseException e) { + e.printStackTrace(); + return null; + } + return Long.valueOf(convertedDate.getTime()/1000L); //Секунд с 1970 года + } + + /** Время в виде строки "HH:mm:ss" в секунды + * */ + public static Integer getUnixTime(String timeString) + { + SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); + Date convertedDate = new Date(); + try { + convertedDate = dateFormat.parse(timeString); + } catch (java.text.ParseException e) + { + e.printStackTrace(); + return null; + } + return Integer.valueOf((int)(convertedDate.getTime()/1000L)); //Секунд + } + + /** Boolean из Spinner 0 - null 1 - true 2 - false + */ + public static Boolean getBooleanFromSpi(Spinner spi) + { + if(spi==null) return null; + switch(spi.getSelectedItemPosition()) + { + case 1: + return Boolean.valueOf(true); + case 2: + return Boolean.valueOf(false); + } + return null; + } + + //Направление ветра по номеру спинера (8 сторон света) + public static Integer getDirection(Spinner spi) + { + //Направление ветра по номеру + Integer dir=null; + if(spi.getSelectedItemPosition()==0) dir=null; + else if(spi.getSelectedItemPosition()==1) dir=0; + else if(spi.getSelectedItemPosition()==2) dir=180; + else if(spi.getSelectedItemPosition()==3) dir=270; + else if(spi.getSelectedItemPosition()==4) dir=90; + else if(spi.getSelectedItemPosition()==5) dir=45; + else if(spi.getSelectedItemPosition()==6) dir=315; + else if(spi.getSelectedItemPosition()==7) dir=135; + else if(spi.getSelectedItemPosition()==8) dir=225; + else + { dir= Integer.getInteger(spi.getSelectedItem().toString()); + } + return dir; + } + + //Выставить направление ветра в спинере + public static void setDirection(Spinner spi, String dir) + { + if(spi == null) return; + + if(dir == null || dir.equals("")) spi.setSelection(0); + else if(dir.equals("0")) spi.setSelection(1); + else if(dir.equals("180")) spi.setSelection(2); + else if(dir.equals("270")) spi.setSelection(3); + else if(dir.equals("90")) spi.setSelection(4); + else if(dir.equals("45")) spi.setSelection(5); + else if(dir.equals("315")) spi.setSelection(6); + else if(dir.equals("135")) spi.setSelection(7); + else if(dir.equals("225")) spi.setSelection(8); + else Tools.selSpinnerIC(spi,dir); + } + + //Получить строку заменив NULL пустой строкой + public static String getStringFromCursor(Cursor cursor, String name) + { + if(cursor==null || name==null) return ""; + String str=cursor.getString(cursor.getColumnIndex(name)); + if(str==null || str=="null") str=""; + return str; + } + + //Изменяем размер пропорционально + public static Bitmap getResizeBMP(Bitmap bm, int newSize) { + float newWidth; + float newHeight; + if(bm.getWidth()>bm.getHeight()) + { + newWidth = newSize; + newHeight = bm.getHeight() * ((float)newSize / bm.getWidth()); + }else + { + newHeight = newSize; + newWidth = bm.getWidth() * ((float)newSize / bm.getHeight()); + } + return getResizedBitmap(bm,(int)newWidth,(int)newHeight); + } + + public static Bitmap getResizedBitmap(Bitmap bm, int newWidth, int newHeight) + { + int width = bm.getWidth(); + int height = bm.getHeight(); + + float scaleWidth = ((float) newWidth) / width; + float scaleHeight = ((float) newHeight) / height; + // CREATE A MATRIX FOR THE MANIPULATION + Matrix matrix = new Matrix(); + // RESIZE THE BIT MAP + matrix.postScale(scaleWidth, scaleHeight); + matrix.postRotate(90); + + // "RECREATE" THE NEW BITMAP + Bitmap resizedBitmap = Bitmap.createBitmap( + bm, 0, 0, width, height, matrix, false); + bm.recycle(); + return resizedBitmap; + } + + +} diff --git a/app/src/main/java/kz/istt/locust/XMLTools.java b/app/src/main/java/kz/istt/locust/XMLTools.java new file mode 100644 index 0000000..56bd327 --- /dev/null +++ b/app/src/main/java/kz/istt/locust/XMLTools.java @@ -0,0 +1,67 @@ +package kz.istt.locust; + +import org.w3c.dom.NamedNodeMap; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +public class XMLTools +{ + + /** + * Вернуть значение первой попавшийся CDATA + * @return строка + */ + public static String getCDATAValue(Node node) + { + if(node==null) return ""; + NodeList items = node.getChildNodes(); + for (int i=0;i> i * 8) & 255); + return res; + } +*/ + + //Прочитать значение из потока в соответствии с типом + public void ReadValue(InputStream fileHandle) throws IOException + { + if(this.type== TCField.BD_UINT1) + { + value=new byte[1]; + fileHandle.read(value); + }else + if(this.type== TCField.BD_UINT2) + { + value=new byte[2]; + fileHandle.read(value); + }else + if(this.type== TCField.BD_UINT4) + { + value=new byte[4]; + fileHandle.read(value); + }else + if(this.type== TCField.BD_INT1) + { + value=new byte[1]; + fileHandle.read(value); + }else + if(this.type== TCField.BD_INT2) + { + value=new byte[2]; + fileHandle.read(value); + }else + if(this.type== TCField.BD_INT4) + { + value=new byte[4]; + fileHandle.read(value); + }else + if(this.type== TCField.BD_INT8) + { + value=new byte[8]; + fileHandle.read(value); + }else + if(this.type== TCField.BD_FLOAT4) + { + value=new byte[4]; + fileHandle.read(value); + }else + if(this.type== TCField.BD_FLOAT8) + { + value=new byte[8]; + fileHandle.read(value); + }else + if(this.type== TCField.BD_UTF8_1) + { + byte[] s=new byte[1]; + fileHandle.read(s); + if(s[0]==0) value=null; + else + { + value=new byte[s[0]]; + fileHandle.read(value); + } + }else + if(this.type== TCField.BD_UTF8_2) + { + int s= Tools.readUShort(fileHandle); + if(s==0) value=null; + else + { + value=new byte[s]; + fileHandle.read(value); + } + }else + if(this.type== TCField.BD_BLOB_4) + { + byte[] ss=new byte[4]; + fileHandle.read(ss); + int s=byteArrayToInt(ss, 0, 4); + if(s==0) value=null; + else + { + value=new byte[s]; + fileHandle.read(value); + } + } + } + + public String getStrVal() + { + String result=null; + try + { + if(value==null) result = ""; + if(type== TCField.BD_UINT1) result = String.valueOf(getUByteVal()); + if(type== TCField.BD_UINT4) result = String.valueOf(getUIntVal()); + if(type== TCField.BD_INT4) result = String.valueOf(getIntVal()); + if(type== TCField.BD_FLOAT4) result = String.valueOf(getFloatVal()); + if(type== TCField.BD_UTF8_1 || type== TCField.BD_UTF8_2) + { + result = new String(value, "UTF8"); + } + } catch (Exception e) {} + return result; + } + + public int getIntVal() + { + int i1 = value[0] & 0xff; + int i2 = value[1] & 0xff; + int i3 = value[2] & 0xff; + int i4 = value[3] & 0xff; + + int val = i4 << 24 | i3 << 16 | i2 << 8 | i1; + + return val; + } + + /** Пока не использую но если буду использовать протестировать с большими числами */ + public long getUIntVal() + { + long ch1, ch2, ch3, ch4, count; + ch1 = value[0] & 0xff; + ch2 = value[1] & 0xff; + ch3 = value[2] & 0xff; + ch4 = value[3] & 0xff; + count = (ch4 << 24) | (ch3 << 16) | (ch2 << 8) | ch1; + return count; + } + + public short getUByteVal() + { + return (short) (value[0] & 0xff); + } + + public float getFloatVal() + { + float f; + int ch1, ch2, ch3, ch4, count; + ch1 = value[0] & 0xFF; + ch2 = value[1] & 0xFF; + ch3 = value[2] & 0xFF; + ch4 = value[3] & 0xFF; + + count = (ch4 << 24) | (ch3 << 16) | (ch2 << 8) | ch1; + f = Float.intBitsToFloat(count); + return f; + } + + public boolean setValue(String val) + { + boolean result=true; + if(val==null) + { value=null; + }else if(type== TCField.BD_UINT1) + { + if(val.equals("f") || val.equals("false")) val="0"; + else if(val.equals("t") || val.equals("true")) val="1"; + + int v= Integer.parseInt(val); + if(v<0 || v>255) result=false; + value=new byte[1]; + value[0]=(byte)v; + }else if(type== TCField.BD_UINT2) + { + int v= Integer.parseInt(val); + if(v<0 || v>65535) result=false; + value=new byte[2]; + value[0] = (byte)((v & 0x000000ff)); + value[1] = (byte)((v & 0x0000ff00) >> 8); + }else if(type== TCField.BD_UINT4) + { + long v= Long.parseLong(val); + value=new byte[4]; + value[0] = (byte)((v & 0x000000ff)); + value[1] = (byte)((v & 0x0000ff00) >> 8); + value[2] = (byte)((v & 0x00ff0000) >> 16); + value[3] = (byte)((v & 0xff000000) >> 24); + }else if(type== TCField.BD_INT1) + { + int v= Integer.parseInt(val); + value=new byte[1]; + value[0]=(byte)v; + }else if(type== TCField.BD_INT2) + { + int v= Integer.parseInt(val); + value=new byte[2]; + value[0] = (byte)((v & 0x000000ff)); + value[1] = (byte)((v & 0x0000ff00) >> 8); + }else if(type== TCField.BD_INT4) + { + long v= Long.parseLong(val); + value=new byte[4]; + value[0] = (byte)((v & 0x000000ff)); + value[1] = (byte)((v & 0x0000ff00) >> 8); + value[2] = (byte)((v & 0x00ff0000) >> 16); + value[3] = (byte)((v & 0xff000000) >> 24); + }else if(type== TCField.BD_INT8) + { + long v= Long.parseLong(val); + value=new byte[8]; + value[0] = (byte) (v & 0x00000000000000ffl); + value[1] = (byte)((v & 0x000000000000ff00l) >> 8); + value[2] = (byte)((v & 0x0000000000ff0000l) >> 16); + value[3] = (byte)((v & 0x00000000ff000000l) >> 24); + value[4] = (byte)((v & 0x000000ff00000000l) >> 32); + value[5] = (byte)((v & 0x0000ff0000000000l) >> 40); + value[6] = (byte)((v & 0x00ff000000000000l) >> 48); + value[7] = (byte)((v & 0xff00000000000000l) >> 56); + + }else if(type== TCField.BD_FLOAT4) + { + Float v= Float.parseFloat(val); + int iv= Float.floatToIntBits(v); + + value=new byte[4]; + value[0] = (byte)((iv & 0x000000ff)); + value[1] = (byte)((iv & 0x0000ff00) >> 8); + value[2] = (byte)((iv & 0x00ff0000) >> 16); + value[3] = (byte)((iv & 0xff000000) >> 24); + }else if(type== TCField.BD_FLOAT8) + { + Double v= Double.parseDouble(val); + long iv= Double.doubleToLongBits(v); + + value=new byte[8]; + value[0] = (byte)((iv & 0x00000000000000ffl)); + value[1] = (byte)((iv & 0x000000000000ff00l) >> 8); + value[2] = (byte)((iv & 0x0000000000ff0000l) >> 16); + value[3] = (byte)((iv & 0x00000000ff000000l) >> 24); + value[4] = (byte)((iv & 0x000000ff00000000l) >> 32); + value[5] = (byte)((iv & 0x0000ff0000000000l) >> 40); + value[6] = (byte)((iv & 0x00ff000000000000l) >> 48); + value[7] = (byte)((iv & 0xff00000000000000l) >> 56); + + }else if(type== TCField.BD_UTF8_1) + { + value=null; + if(val!=null && !val.equals("")) + { + byte[] b=null; + try { + b = val.getBytes("UTF-8"); + } catch (UnsupportedEncodingException e) { + result=false; + } + if(b!=null) + { + int len=b.length; + if(len>255) len=255; + value=new byte[len+1]; + value[0]=(byte)len; + for(int i=0;i65535) len=65535; + value=new byte[len+2]; + value[0]=(byte) (len & 0x000000ff); + value[1]=(byte)((len & 0x0000ff00) >> 8); + for(int i=0;i> 8); + value[2]=(byte)((len & 0x00ff0000) >> 16); + value[3]=(byte)((len & 0xff000000) >> 24); + for(int i=0;itype==TCField::$BD_BLOB_4) + { return pack("I",strlen($value)).$value; + } +*/ + return result; + } + +} diff --git a/app/src/main/java/tctable/TCTable.java b/app/src/main/java/tctable/TCTable.java new file mode 100644 index 0000000..bfed7c1 --- /dev/null +++ b/app/src/main/java/tctable/TCTable.java @@ -0,0 +1,200 @@ +package tctable; + +import java.io.DataInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.List; + + +public class TCTable +{ + public int id=0; //Идентификатор таблицы + public String name=""; //Название таблицы + public List fields=new ArrayList(); //Список полей + + private int nc=0; //Байтов под NULL значения + private byte[] m_NULL=null; //NULL значения + private InputStream m_file; + + /** + * Конструктор + * @param Строка name Название таблицы + * @param Целое id Идентификатор таблицы (обычно уникальный) + */ + public TCTable(String name, int id) + { this.name=name; + this.id=id; + } + + //Открыть таблицу по названию файла + /*function OpenTableF(file) + { + if(file_exists(file)) + { + this.OpenTableH(fopen(file,'r')); + } + }*/ + + //Открыть таблицу из потока HANDLE + public boolean OpenTableH(InputStream handle) throws IOException + { + this.m_file=handle; + DataInputStream dis = new DataInputStream(handle); + + if(Tools.readUShort(dis)!=65500) return false; //id файла + if(Tools.readUShort(dis)!=1) return false; //Версия файла + this.id= Tools.readInt(dis); //ID таблицы или запроса (4 байта можно сделать 2) + if(dis.readByte()!=0) return false; //Только плотные таблицы + //Считываем название таблицы + this.name = Tools.readUTF8_1(dis); + + //Считываем столбцы + int count=dis.readUnsignedByte(); //Количество столбцов + for(int i=0;i> 8); + //File version: 2 bytes. + os.write((1 & 0x000000ff)); + os.write((1 & 0x0000ff00) >> 8); + //Table ID (or Request ID): 4 bytes. + os.write((this.id & 0x000000ff)); + os.write((this.id & 0x0000ff00) >> 8); + os.write((this.id & 0x00ff0000) >> 16); + os.write((this.id & 0xff000000) >> 24); + //Table type: 1 byte (0- "Dense" 1- "Loose") + os.write(0); + //UTF8_1 String + byte[] ba = this.name.getBytes("UTF-8"); + os.write(ba.length); + os.write(ba); + //Count of fields: 1 byte. + os.write(this.fields.size()); + //Write name and type id + for(int i=0;i JDK 7 + try { + return result.toString("UTF-8"); + } catch (UnsupportedEncodingException e) { + } + return ""; + } + + //Преобразовать арабские и индийские в современные цифры + public static String numConvert(String str) + { + if(str==null) return null; + String persian = "۰۱۲۳۴۵۶۷۸۹"; + String arabic = "٩٨٧٦٥٤٣٢١٠"; + String num = "0123456789"; + //Заменяю персидские + for(int i=0;i> pos)); + } + + public static String readUTF8_1(InputStream handle) throws IOException + { + byte[] tmp=new byte[handle.read()]; + handle.read(tmp); + return new String(tmp, "UTF8"); + } + + public static float readFloat(DataInputStream InStream) throws IOException + { + float f; + int ch1, ch2, ch3, ch4, count; + ch1 = InStream.readUnsignedByte(); + ch2 = InStream.readUnsignedByte(); + ch3 = InStream.readUnsignedByte(); + ch4 = InStream.readUnsignedByte(); + + count = (ch4 << 24) | (ch3 << 16) | (ch2 << 8) | ch1; + f = Float.intBitsToFloat(count); + return f; + } + + public static int readInt(DataInputStream InStream) throws IOException + { + int ch1, ch2, ch3, ch4, count; + ch1 = InStream.readUnsignedByte(); + ch2 = InStream.readUnsignedByte(); + ch3 = InStream.readUnsignedByte(); + ch4 = InStream.readUnsignedByte(); + + count = (ch4 << 24) | (ch3 << 16) | (ch2 << 8) | ch1; + return count; + } + + public static short readShort(DataInputStream InStream) throws IOException + { + int ch1, ch2, count; + ch1 = InStream.readUnsignedByte(); + ch2 = InStream.readUnsignedByte(); + + count = (ch2 << 8) | ch1; + return (short)count; + } + + public static int readUShort(InputStream InStream) throws IOException + { + int ch1, ch2; + ch1 = InStream.read(); + ch2 = InStream.read(); + return (ch2 << 8) | ch1; + } + + public static String afterLast(String str, String ch) + { + int i=str.lastIndexOf(ch); + if(i!=-1) + { + return str.substring(i+ch.length()); + } + return ""; + } + public static String beforeLast(String str, String ch) + { + int i=str.lastIndexOf(ch); + if(i!=-1) + { + return str.substring(0,i); + } + return ""; + } + public static String beforeFirst(String str, String ch) + { + int i=str.indexOf(ch); + if(i!=-1) + { + return str.substring(0,i); + } + return ""; + } + + //узнать точку пересичений 2х линай если x=0 и y=0 то не пересиклась + public static Point getCrossingLine(Point PHead0, Point PTail0, Point PHead1, Point PTail1) + { + Point rezPoint = new Point(); + + double a0, b0, c0, a1, b1, c1; + boolean bRez = true; + a0 = PTail0.y - PHead0.y; + b0 = PHead0.x - PTail0.x; + c0 = PTail0.x * PHead0.y - PHead0.x * PTail0.y; + + a1 = PTail1.y - PHead1.y; + b1 = PHead1.x - PTail1.x; + c1 = PTail1.x * PHead1.y - PHead1.x * PTail1.y; + + if (b1 == 0) rezPoint.x = PHead1.x;//если перпендикулярна oy + else rezPoint.x = (-(b0 * c1 / b1) + c0) / ((b0 * a1 / b1) - a0); + if (a1 == 0) rezPoint.y = PHead1.y;//если перпендикулярна oy + else rezPoint.y = (-(c1 * a0 / a1) + c0) / ((a0 * b1 / a1) - b0); + //проверка на вхождение в отрезоки (с погрешностью 0.0000001 (зачем понадобилась погрешность?)) + //по x + if ((rezPoint.x < Math.min(PHead0.x, PTail0.x) - 0.0000001) || (rezPoint.x > Math.max(PHead0.x, PTail0.x) + 0.0000001)) + bRez = false; + if ((rezPoint.x < Math.min(PHead1.x, PTail1.x) - 0.0000001) || (rezPoint.x > Math.max(PHead1.x, PTail1.x) + 0.0000001)) + bRez = false; + //по y + if ((rezPoint.y < Math.min(PHead0.y, PTail0.y) - 0.0000001) || (rezPoint.y > Math.max(PHead0.y, PTail0.y) + 0.0000001)) + bRez = false; + if ((rezPoint.y < Math.min(PHead1.y, PTail1.y) - 0.0000001) || (rezPoint.y > Math.max(PHead1.y, PTail1.y) + 0.0000001)) + bRez = false; + + if (!bRez) + { + rezPoint.x = 0; + rezPoint.y = 0; + } + return rezPoint; + } + + public static Point getCrossingLine2(Point PHead0,Point PTail0,Point PHead1,Point PTail1) + { + boolean bRez=true; + Point rezPoint = new Point(); + rezPoint.x=0; + rezPoint.y=0; + + double a0,b0,c0,a1,b1,c1; + a0=PTail0.y-PHead0.y; + b0=PHead0.x-PTail0.x; + c0=PTail0.x*PHead0.y-PHead0.x*PTail0.y; + + a1=PTail1.y-PHead1.y; + b1=PHead1.x-PTail1.x; + c1=PTail1.x*PHead1.y-PHead1.x*PTail1.y; + + if (b1==0) rezPoint.x=PHead1.x;//если перпендикулярна oy + else rezPoint.x=(-(b0*c1/b1)+c0)/((b0*a1/b1)-a0); + if (a1==0) rezPoint.y=PHead1.y;//если перпендикулярна ox + else rezPoint.y=(-(c1*a0/a1)+c0)/((a0*b1/a1)-b0); + //по x + if (rezPoint.xMath.max(PHead0.x,PTail0.x)) + bRez=false; + if (rezPoint.xMath.max(PHead1.x,PTail1.x)) + bRez=false; + //по y + if (rezPoint.yMath.max(PHead0.y,PTail0.y)) + bRez=false; + if (rezPoint.yMath.max(PHead1.y,PTail1.y)) + bRez=false; + if (!bRez) + { + rezPoint.x=0; + rezPoint.y=0; + } + return rezPoint; + } + + //Так как в replaceAll много заморочек с регулярными выражениями + public static String replaceAll(String txt, String val, String rep) { + if(txt==null || val==null || rep==null) return txt; + return txt.replace(val,rep); + /*while(true) + { + String tmpstr=txt.replace(val, rep); + if(tmpstr.equals(txt)) + { + txt=tmpstr; + break; + }else + { + txt=tmpstr; + } + } + return txt;*/ + } + + public static byte[] subArray(byte[] b, int offset, int length) { + byte[] sub = new byte[length]; + for (int i = offset; i < offset + length; i++) { + try { + sub[i - offset] = b[i]; + } catch (Exception e) { + + } + } + return sub; + } +} diff --git a/app/src/main/java/tools/ClusterMarker.java b/app/src/main/java/tools/ClusterMarker.java new file mode 100644 index 0000000..ad54ce0 --- /dev/null +++ b/app/src/main/java/tools/ClusterMarker.java @@ -0,0 +1,73 @@ +package tools; + +import com.google.android.gms.maps.model.LatLng; +import com.google.maps.android.clustering.ClusterItem; + +public class ClusterMarker implements ClusterItem { + + private LatLng position; + private String title; + private String snippet; + private int iconPicture; + + public ClusterMarker(LatLng position, String title, String snipped, int iconPicture) { + this.position = position; + this.title = title; + this.snippet = snippet; + this.iconPicture = iconPicture; + } + + public ClusterMarker() { + + } + + @Override + public LatLng getPosition() { + return position; + } + + public void setPosition(LatLng position) { + this.position = position; + } + + @Override + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + @Override + public String getSnippet() { + return snippet; + } + + public void setSnippet(String snippet) { + this.snippet = snippet; + } + + public int getIconPicture() { + return iconPicture; + } + + public void setIconPicture(int iconPicture) { + this.iconPicture = iconPicture; + } +/* + @Override + public LatLng getPosition() { + return null; + } + + @Override + public String getTitle() { + return null; + } + + @Override + public String getSnippet() { + return null; + }*/ +} diff --git a/app/src/main/java/tools/LatLonListener.java b/app/src/main/java/tools/LatLonListener.java new file mode 100644 index 0000000..99f8ce9 --- /dev/null +++ b/app/src/main/java/tools/LatLonListener.java @@ -0,0 +1,6 @@ +package tools; + +public interface LatLonListener { + public double getLat(); + public double getLon(); +} diff --git a/app/src/main/java/tools/MyClusterManagerRenderer.java b/app/src/main/java/tools/MyClusterManagerRenderer.java new file mode 100644 index 0000000..e909a29 --- /dev/null +++ b/app/src/main/java/tools/MyClusterManagerRenderer.java @@ -0,0 +1,54 @@ +package tools; + +import android.content.Context; +import android.graphics.Bitmap; +import android.view.ViewGroup; +import android.widget.ImageView; + +import com.google.android.gms.maps.GoogleMap; +import com.google.android.gms.maps.model.BitmapDescriptorFactory; +import com.google.android.gms.maps.model.MarkerOptions; +import com.google.maps.android.clustering.Cluster; +import com.google.maps.android.clustering.ClusterManager; +import com.google.maps.android.clustering.view.DefaultClusterRenderer; +import com.google.maps.android.ui.IconGenerator; + +public class MyClusterManagerRenderer extends DefaultClusterRenderer { + + private final IconGenerator iconGenerator; + private final ImageView imageView; + private final int markerWith; + private final int markerHeight; + + public MyClusterManagerRenderer(Context context, GoogleMap map, ClusterManager clusterManager) { + super(context, map, clusterManager); + //this.iconGenerator = iconGenerator; + //this.imageView = imageView; + //this.markerWith = markerWith; + //this.markerHeight = markerHeight; + + iconGenerator = new IconGenerator(context.getApplicationContext()); + imageView = new ImageView(context.getApplicationContext()); + markerWith = (int) 40; //TODO брать из ресурсов + markerHeight = (int) 40; //TODO брать из ресурсов + imageView.setLayoutParams(new ViewGroup.LayoutParams(markerWith, markerHeight)); + int pagging = (int) 5; + imageView.setPadding(pagging,pagging,pagging,pagging); + iconGenerator.setContentView(imageView); + } + + @Override + protected void onBeforeClusterItemRendered(ClusterMarker item, MarkerOptions markerOptions) { + //super.onBeforeClusterItemRendered(item, markerOptions); + imageView.setImageResource(item.getIconPicture()); + Bitmap icon = iconGenerator.makeIcon(); + markerOptions.icon(BitmapDescriptorFactory.fromBitmap(icon)) + .title(item.getTitle()); + } + + @Override + protected boolean shouldRenderAsCluster(Cluster cluster) { + //return super.shouldRenderAsCluster(cluster); + return false; //Не объединаять точки в одну точку если они наплывают друг на друга. + } +} diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 0000000..c7bd21d --- /dev/null +++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + diff --git a/app/src/main/res/drawable/button.xml b/app/src/main/res/drawable/button.xml new file mode 100644 index 0000000..e097017 --- /dev/null +++ b/app/src/main/res/drawable/button.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/button_focused.xml b/app/src/main/res/drawable/button_focused.xml new file mode 100644 index 0000000..9d7bd44 --- /dev/null +++ b/app/src/main/res/drawable/button_focused.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/button_normal.xml b/app/src/main/res/drawable/button_normal.xml new file mode 100644 index 0000000..ff177e6 --- /dev/null +++ b/app/src/main/res/drawable/button_normal.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/button_presed.xml b/app/src/main/res/drawable/button_presed.xml new file mode 100644 index 0000000..391f30e --- /dev/null +++ b/app/src/main/res/drawable/button_presed.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/gradient_example.xml b/app/src/main/res/drawable/gradient_example.xml new file mode 100644 index 0000000..6b3570e --- /dev/null +++ b/app/src/main/res/drawable/gradient_example.xml @@ -0,0 +1,13 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_camera.xml b/app/src/main/res/drawable/ic_camera.xml new file mode 100644 index 0000000..d9fbf32 --- /dev/null +++ b/app/src/main/res/drawable/ic_camera.xml @@ -0,0 +1,5 @@ + + + + diff --git a/app/src/main/res/drawable/ic_clock.xml b/app/src/main/res/drawable/ic_clock.xml new file mode 100644 index 0000000..4d02d2b --- /dev/null +++ b/app/src/main/res/drawable/ic_clock.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_delete.xml b/app/src/main/res/drawable/ic_delete.xml new file mode 100644 index 0000000..61102cd --- /dev/null +++ b/app/src/main/res/drawable/ic_delete.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_exit.xml b/app/src/main/res/drawable/ic_exit.xml new file mode 100644 index 0000000..05abbda --- /dev/null +++ b/app/src/main/res/drawable/ic_exit.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_inspector.xml b/app/src/main/res/drawable/ic_inspector.xml new file mode 100644 index 0000000..9e2c448 --- /dev/null +++ b/app/src/main/res/drawable/ic_inspector.xml @@ -0,0 +1,7 @@ + + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..d5fccc5 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_launcher_foreground.xml b/app/src/main/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 0000000..98bce09 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,159 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_location.xml b/app/src/main/res/drawable/ic_location.xml new file mode 100644 index 0000000..602e2c6 --- /dev/null +++ b/app/src/main/res/drawable/ic_location.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/drawable/ic_map.xml b/app/src/main/res/drawable/ic_map.xml new file mode 100644 index 0000000..6f66a6f --- /dev/null +++ b/app/src/main/res/drawable/ic_map.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_photo.xml b/app/src/main/res/drawable/ic_photo.xml new file mode 100644 index 0000000..808a361 --- /dev/null +++ b/app/src/main/res/drawable/ic_photo.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_save.xml b/app/src/main/res/drawable/ic_save.xml new file mode 100644 index 0000000..1f5ae8f --- /dev/null +++ b/app/src/main/res/drawable/ic_save.xml @@ -0,0 +1,21 @@ + + + + + + + diff --git a/app/src/main/res/drawable/ic_star.xml b/app/src/main/res/drawable/ic_star.xml new file mode 100644 index 0000000..e4c84d2 --- /dev/null +++ b/app/src/main/res/drawable/ic_star.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/spacer_medium.xml b/app/src/main/res/drawable/spacer_medium.xml new file mode 100644 index 0000000..216c253 --- /dev/null +++ b/app/src/main/res/drawable/spacer_medium.xml @@ -0,0 +1,11 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/splash.png b/app/src/main/res/drawable/splash.png new file mode 100644 index 0000000..9c41737 Binary files /dev/null and b/app/src/main/res/drawable/splash.png differ diff --git a/app/src/main/res/layout-land/activity_locust.xml b/app/src/main/res/layout-land/activity_locust.xml new file mode 100644 index 0000000..9a50d08 --- /dev/null +++ b/app/src/main/res/layout-land/activity_locust.xml @@ -0,0 +1,1887 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout-land/activity_locust_del.xml b/app/src/main/res/layout-land/activity_locust_del.xml new file mode 100644 index 0000000..d6833b9 --- /dev/null +++ b/app/src/main/res/layout-land/activity_locust_del.xml @@ -0,0 +1,2530 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout-land/list_lat_lon.xml b/app/src/main/res/layout-land/list_lat_lon.xml new file mode 100644 index 0000000..2601784 --- /dev/null +++ b/app/src/main/res/layout-land/list_lat_lon.xml @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout-large/activity_locust.xml b/app/src/main/res/layout-large/activity_locust.xml new file mode 100644 index 0000000..bdb1830 --- /dev/null +++ b/app/src/main/res/layout-large/activity_locust.xml @@ -0,0 +1,1897 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout-large/activity_locust_del.xml b/app/src/main/res/layout-large/activity_locust_del.xml new file mode 100644 index 0000000..167b876 --- /dev/null +++ b/app/src/main/res/layout-large/activity_locust_del.xml @@ -0,0 +1,2354 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout-large/list_lat_lon.xml b/app/src/main/res/layout-large/list_lat_lon.xml new file mode 100644 index 0000000..6f7300c --- /dev/null +++ b/app/src/main/res/layout-large/list_lat_lon.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_image_pick.xml b/app/src/main/res/layout/activity_image_pick.xml new file mode 100644 index 0000000..bf36632 --- /dev/null +++ b/app/src/main/res/layout/activity_image_pick.xml @@ -0,0 +1,17 @@ + + + + + diff --git a/app/src/main/res/layout/activity_locust.xml b/app/src/main/res/layout/activity_locust.xml new file mode 100644 index 0000000..b9c0fb2 --- /dev/null +++ b/app/src/main/res/layout/activity_locust.xml @@ -0,0 +1,1883 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_locust_del.xml b/app/src/main/res/layout/activity_locust_del.xml new file mode 100644 index 0000000..7c37407 --- /dev/null +++ b/app/src/main/res/layout/activity_locust_del.xml @@ -0,0 +1,2521 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_locust_del_list.xml b/app/src/main/res/layout/activity_locust_del_list.xml new file mode 100644 index 0000000..51e6ba2 --- /dev/null +++ b/app/src/main/res/layout/activity_locust_del_list.xml @@ -0,0 +1,59 @@ + + + + + + + + + + +