@ -0,0 +1,13 @@ | |||||
*.iml | |||||
.gradle | |||||
/local.properties | |||||
/.idea/caches | |||||
/.idea/libraries | |||||
/.idea/modules.xml | |||||
/.idea/workspace.xml | |||||
/.idea/navEditor.xml | |||||
/.idea/assetWizardSettings.xml | |||||
.DS_Store | |||||
/build | |||||
/captures | |||||
.externalNativeBuild |
@ -0,0 +1,3 @@ | |||||
# Default ignored files | |||||
/shelf/ | |||||
/workspace.xml |
@ -0,0 +1,6 @@ | |||||
<?xml version="1.0" encoding="UTF-8"?> | |||||
<project version="4"> | |||||
<component name="AppInsightsSettings"> | |||||
<option name="selectedTabId" value="Firebase Crashlytics" /> | |||||
</component> | |||||
</project> |
@ -0,0 +1,116 @@ | |||||
<component name="ProjectCodeStyleConfiguration"> | |||||
<code_scheme name="Project" version="173"> | |||||
<codeStyleSettings language="XML"> | |||||
<indentOptions> | |||||
<option name="CONTINUATION_INDENT_SIZE" value="4" /> | |||||
</indentOptions> | |||||
<arrangement> | |||||
<rules> | |||||
<section> | |||||
<rule> | |||||
<match> | |||||
<AND> | |||||
<NAME>xmlns:android</NAME> | |||||
<XML_ATTRIBUTE /> | |||||
<XML_NAMESPACE>^$</XML_NAMESPACE> | |||||
</AND> | |||||
</match> | |||||
</rule> | |||||
</section> | |||||
<section> | |||||
<rule> | |||||
<match> | |||||
<AND> | |||||
<NAME>xmlns:.*</NAME> | |||||
<XML_ATTRIBUTE /> | |||||
<XML_NAMESPACE>^$</XML_NAMESPACE> | |||||
</AND> | |||||
</match> | |||||
<order>BY_NAME</order> | |||||
</rule> | |||||
</section> | |||||
<section> | |||||
<rule> | |||||
<match> | |||||
<AND> | |||||
<NAME>.*:id</NAME> | |||||
<XML_ATTRIBUTE /> | |||||
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE> | |||||
</AND> | |||||
</match> | |||||
</rule> | |||||
</section> | |||||
<section> | |||||
<rule> | |||||
<match> | |||||
<AND> | |||||
<NAME>.*:name</NAME> | |||||
<XML_ATTRIBUTE /> | |||||
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE> | |||||
</AND> | |||||
</match> | |||||
</rule> | |||||
</section> | |||||
<section> | |||||
<rule> | |||||
<match> | |||||
<AND> | |||||
<NAME>name</NAME> | |||||
<XML_ATTRIBUTE /> | |||||
<XML_NAMESPACE>^$</XML_NAMESPACE> | |||||
</AND> | |||||
</match> | |||||
</rule> | |||||
</section> | |||||
<section> | |||||
<rule> | |||||
<match> | |||||
<AND> | |||||
<NAME>style</NAME> | |||||
<XML_ATTRIBUTE /> | |||||
<XML_NAMESPACE>^$</XML_NAMESPACE> | |||||
</AND> | |||||
</match> | |||||
</rule> | |||||
</section> | |||||
<section> | |||||
<rule> | |||||
<match> | |||||
<AND> | |||||
<NAME>.*</NAME> | |||||
<XML_ATTRIBUTE /> | |||||
<XML_NAMESPACE>^$</XML_NAMESPACE> | |||||
</AND> | |||||
</match> | |||||
<order>BY_NAME</order> | |||||
</rule> | |||||
</section> | |||||
<section> | |||||
<rule> | |||||
<match> | |||||
<AND> | |||||
<NAME>.*</NAME> | |||||
<XML_ATTRIBUTE /> | |||||
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE> | |||||
</AND> | |||||
</match> | |||||
<order>ANDROID_ATTRIBUTE_ORDER</order> | |||||
</rule> | |||||
</section> | |||||
<section> | |||||
<rule> | |||||
<match> | |||||
<AND> | |||||
<NAME>.*</NAME> | |||||
<XML_ATTRIBUTE /> | |||||
<XML_NAMESPACE>.*</XML_NAMESPACE> | |||||
</AND> | |||||
</match> | |||||
<order>BY_NAME</order> | |||||
</rule> | |||||
</section> | |||||
</rules> | |||||
</arrangement> | |||||
</codeStyleSettings> | |||||
</code_scheme> | |||||
</component> |
@ -0,0 +1,6 @@ | |||||
<?xml version="1.0" encoding="UTF-8"?> | |||||
<project version="4"> | |||||
<component name="CompilerConfiguration"> | |||||
<bytecodeTargetLevel target="17" /> | |||||
</component> | |||||
</project> |
@ -0,0 +1,18 @@ | |||||
<?xml version="1.0" encoding="UTF-8"?> | |||||
<project version="4"> | |||||
<component name="deploymentTargetSelector"> | |||||
<selectionStates> | |||||
<SelectionState runConfigName="app"> | |||||
<option name="selectionMode" value="DROPDOWN" /> | |||||
<DropdownSelection timestamp="2024-05-21T20:26:20.917717500Z"> | |||||
<Target type="DEFAULT_BOOT"> | |||||
<handle> | |||||
<DeviceId pluginId="LocalEmulator" identifier="path=C:\Users\dolivaresr\.android\avd\Pixel_7_API_30.avd" /> | |||||
</handle> | |||||
</Target> | |||||
</DropdownSelection> | |||||
<DialogSelection /> | |||||
</SelectionState> | |||||
</selectionStates> | |||||
</component> | |||||
</project> |
@ -0,0 +1,4 @@ | |||||
<?xml version="1.0" encoding="UTF-8"?> | |||||
<project version="4"> | |||||
<component name="Encoding" addBOMForNewFiles="with NO BOM" /> | |||||
</project> |
@ -0,0 +1,19 @@ | |||||
<?xml version="1.0" encoding="UTF-8"?> | |||||
<project version="4"> | |||||
<component name="GradleMigrationSettings" migrationVersion="1" /> | |||||
<component name="GradleSettings"> | |||||
<option name="linkedExternalProjectsSettings"> | |||||
<GradleProjectSettings> | |||||
<option name="externalProjectPath" value="$PROJECT_DIR$" /> | |||||
<option name="gradleJvm" value="#JAVA_HOME" /> | |||||
<option name="modules"> | |||||
<set> | |||||
<option value="$PROJECT_DIR$" /> | |||||
<option value="$PROJECT_DIR$/app" /> | |||||
</set> | |||||
</option> | |||||
<option name="resolveExternalAnnotations" value="false" /> | |||||
</GradleProjectSettings> | |||||
</option> | |||||
</component> | |||||
</project> |
@ -0,0 +1,35 @@ | |||||
<?xml version="1.0" encoding="UTF-8"?> | |||||
<project version="4"> | |||||
<component name="RemoteRepositoriesConfiguration"> | |||||
<remote-repository> | |||||
<option name="id" value="central" /> | |||||
<option name="name" value="Maven Central repository" /> | |||||
<option name="url" value="https://repo1.maven.org/maven2" /> | |||||
</remote-repository> | |||||
<remote-repository> | |||||
<option name="id" value="jboss.community" /> | |||||
<option name="name" value="JBoss Community repository" /> | |||||
<option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" /> | |||||
</remote-repository> | |||||
<remote-repository> | |||||
<option name="id" value="BintrayJCenter" /> | |||||
<option name="name" value="BintrayJCenter" /> | |||||
<option name="url" value="https://jcenter.bintray.com/" /> | |||||
</remote-repository> | |||||
<remote-repository> | |||||
<option name="id" value="Google" /> | |||||
<option name="name" value="Google" /> | |||||
<option name="url" value="https://dl.google.com/dl/android/maven2/" /> | |||||
</remote-repository> | |||||
<remote-repository> | |||||
<option name="id" value="MavenRepo" /> | |||||
<option name="name" value="MavenRepo" /> | |||||
<option name="url" value="https://repo.maven.apache.org/maven2/" /> | |||||
</remote-repository> | |||||
<remote-repository> | |||||
<option name="id" value="maven" /> | |||||
<option name="name" value="maven" /> | |||||
<option name="url" value="http://dl.bintray.com/journeyapps/maven" /> | |||||
</remote-repository> | |||||
</component> | |||||
</project> |
@ -0,0 +1,13 @@ | |||||
<project version="4"> | |||||
<component name="CMakeSettings"> | |||||
<configurations> | |||||
<configuration PROFILE_NAME="Debug" CONFIG_NAME="Debug" /> | |||||
</configurations> | |||||
</component> | |||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="temurin-17" project-jdk-type="JavaSDK"> | |||||
<output url="file://$PROJECT_DIR$/build/classes" /> | |||||
</component> | |||||
<component name="ProjectType"> | |||||
<option name="id" value="Android" /> | |||||
</component> | |||||
</project> |
@ -0,0 +1 @@ | |||||
/build |
@ -0,0 +1,72 @@ | |||||
apply plugin: 'com.android.application' | |||||
android { | |||||
namespace 'jumapacelaya.gob.mx.almacen' | |||||
compileSdk 34 | |||||
defaultConfig { | |||||
applicationId "jumapacelaya.gob.mx.almacen" | |||||
minSdkVersion 23 | |||||
targetSdkVersion 33 | |||||
versionCode 1 | |||||
versionName "1.0" | |||||
testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner' | |||||
} | |||||
buildTypes { | |||||
release { | |||||
minifyEnabled false | |||||
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' | |||||
signingConfig signingConfigs.debug | |||||
} | |||||
} | |||||
compileOptions { | |||||
sourceCompatibility = 11 | |||||
targetCompatibility = 11 | |||||
} | |||||
} | |||||
repositories { | |||||
mavenCentral() | |||||
maven { | |||||
url "http://dl.bintray.com/journeyapps/maven" | |||||
allowInsecureProtocol = true | |||||
} | |||||
} | |||||
dependencies { | |||||
implementation fileTree(dir: 'libs', include: ['*.jar']) | |||||
implementation 'androidx.appcompat:appcompat:1.6.1' | |||||
implementation 'com.google.android.material:material:1.12.0' | |||||
implementation 'androidx.recyclerview:recyclerview:1.3.2' | |||||
implementation 'androidx.cardview:cardview:1.0.0' | |||||
implementation 'androidx.constraintlayout:constraintlayout:2.1.4' | |||||
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0' | |||||
implementation 'com.google.code.gson:gson:2.10.1' | |||||
implementation 'com.android.volley:volley:1.2.1' | |||||
implementation 'androidx.room:room-runtime:2.6.1' | |||||
implementation 'androidx.legacy:legacy-support-v4:1.0.0' | |||||
annotationProcessor 'androidx.room:room-compiler:2.6.1' | |||||
implementation('com.journeyapps:zxing-android-embedded:3.6.0') { transitive = false } | |||||
implementation 'com.google.zxing:core:3.3.2' | |||||
testImplementation 'junit:junit:4.13.2' | |||||
androidTestImplementation 'androidx.test.ext:junit:1.1.5' | |||||
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' | |||||
implementation 'androidx.core:core:1.13.1' | |||||
implementation 'com.daimajia.easing:library:2.0@aar' | |||||
implementation 'com.daimajia.androidanimations:library:2.3@aar' | |||||
implementation "androidx.compose.material3:material3:1.2.1" | |||||
implementation 'com.squareup.retrofit2:retrofit:2.9.0' | |||||
implementation 'com.squareup.retrofit2:converter-gson:2.9.0' | |||||
implementation 'com.google.code.gson:gson:2.10.1' | |||||
} |
@ -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 |
@ -0,0 +1,73 @@ | |||||
<?xml version="1.0" encoding="utf-8"?> | |||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android" | |||||
xmlns:tools="http://schemas.android.com/tools" | |||||
> | |||||
<uses-feature | |||||
android:name="android.hardware.camera" | |||||
android:required="false" /> | |||||
<uses-permission android:name="android.permission.CAMERA" /> | |||||
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> | |||||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> | |||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> | |||||
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" /> | |||||
<uses-permission android:name="android.permission.INTERNET" /> | |||||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> | |||||
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> | |||||
<uses-permission android:name="android.permission.GET_ACCOUNTS" /> | |||||
<uses-permission android:name="android.permission.READ_PROFILE" /> | |||||
<uses-permission android:name="android.permission.READ_CONTACTS" /> | |||||
<uses-permission android:name="android.permission.RECORD_AUDIO" /> | |||||
<application | |||||
android:allowBackup="true" | |||||
android:icon="@drawable/logo_circle" | |||||
android:label="@string/app_name" | |||||
android:usesCleartextTraffic="true" | |||||
android:roundIcon="@drawable/logo_circle" | |||||
android:supportsRtl="true" | |||||
android:hardwareAccelerated="true" | |||||
android:theme="@style/AppTheme"> | |||||
<activity android:name=".ConteoActivity" /> | |||||
<activity | |||||
android:name=".splash" | |||||
android:exported="true" | |||||
android:theme="@style/Theme.Material3.Light.NoActionBar.FullScreen"> | |||||
<intent-filter> | |||||
<action android:name="android.intent.action.MAIN" /> | |||||
<category android:name="android.intent.category.LAUNCHER" /> | |||||
</intent-filter> | |||||
</activity> | |||||
<activity | |||||
android:name=".MainActivity" | |||||
android:windowSoftInputMode="adjustResize" | |||||
android:configChanges="orientation|screenSize|keyboardHidden" | |||||
android:theme="@style/Theme.Material3.Light.NoActionBar" /> | |||||
<activity | |||||
android:name="com.journeyapps.barcodescanner.CaptureActivity" | |||||
android:screenOrientation="fullSensor" | |||||
tools:replace="screenOrientation" /> | |||||
<provider | |||||
android:name="androidx.core.content.FileProvider" | |||||
android:authorities="${applicationId}.provider" | |||||
android:exported="false" | |||||
android:grantUriPermissions="true"> | |||||
<meta-data | |||||
android:name="android.support.FILE_PROVIDER_PATHS" | |||||
android:resource="@xml/file_paths" /> | |||||
</provider> | |||||
</application> | |||||
</manifest> |
@ -0,0 +1,635 @@ | |||||
package jumapacelaya.gob.mx.almacen; | |||||
import android.Manifest; | |||||
import android.app.ActivityOptions; | |||||
import android.content.Intent; | |||||
import android.content.pm.PackageManager; | |||||
import android.os.AsyncTask; | |||||
import androidx.annotation.NonNull; | |||||
import androidx.constraintlayout.widget.ConstraintLayout; | |||||
import androidx.core.app.ActivityCompat; | |||||
import androidx.appcompat.app.AppCompatActivity; | |||||
import android.os.Bundle; | |||||
import android.os.Handler; | |||||
import android.os.Looper; | |||||
import android.provider.Settings; | |||||
import android.telephony.TelephonyManager; | |||||
import android.util.Log; | |||||
import android.view.Menu; | |||||
import android.view.MenuInflater; | |||||
import android.view.MenuItem; | |||||
import android.view.View; | |||||
import android.widget.AdapterView; | |||||
import android.widget.ArrayAdapter; | |||||
import android.widget.Button; | |||||
import android.widget.Spinner; | |||||
import android.widget.TextView; | |||||
import android.widget.Toast; | |||||
import com.android.volley.AuthFailureError; | |||||
import com.android.volley.Request; | |||||
import com.android.volley.RequestQueue; | |||||
import com.android.volley.Response; | |||||
import com.android.volley.VolleyError; | |||||
import com.android.volley.toolbox.JsonObjectRequest; | |||||
import com.android.volley.toolbox.Volley; | |||||
import com.google.gson.Gson; | |||||
import com.google.gson.GsonBuilder; | |||||
import com.google.gson.reflect.TypeToken; | |||||
import org.json.JSONArray; | |||||
import org.json.JSONException; | |||||
import org.json.JSONObject; | |||||
import java.io.Serializable; | |||||
import java.lang.reflect.Type; | |||||
import java.util.ArrayList; | |||||
import java.util.List; | |||||
import java.util.concurrent.ExecutorService; | |||||
import java.util.concurrent.Executors; | |||||
import jumapacelaya.gob.mx.almacen.bean.Conteo; | |||||
import jumapacelaya.gob.mx.almacen.bean.DetalleConteo; | |||||
import jumapacelaya.gob.mx.almacen.bean.Inventario; | |||||
import jumapacelaya.gob.mx.almacen.dao.AppDatabase; | |||||
import jumapacelaya.gob.mx.almacen.dao.inventarioDao; | |||||
import jumapacelaya.gob.mx.almacen.request.DetalleRequest; | |||||
import jumapacelaya.gob.mx.almacen.ui.main.Constant; | |||||
import retrofit2.Call; | |||||
import retrofit2.Callback; | |||||
import retrofit2.Retrofit; | |||||
import retrofit2.converter.gson.GsonConverterFactory; | |||||
public class ConteoActivity extends AppCompatActivity { | |||||
ConstraintLayout root_conteo_layout; | |||||
Spinner cbxConteo; | |||||
Spinner cbxInventarios; | |||||
TextView lbtitle; | |||||
Button btniniciar; | |||||
String imei; | |||||
private final int MY_PERMISSIONS_REQUEST_STATUS = 80; | |||||
inventarioDao database; | |||||
ArrayAdapter<Conteo> dataAdapter; | |||||
ArrayAdapter<Inventario> dataAdapterinv; | |||||
@Override | |||||
protected void onCreate(Bundle savedInstanceState) { | |||||
super.onCreate(savedInstanceState); | |||||
setContentView(R.layout.activity_conteo); | |||||
root_conteo_layout = findViewById(R.id.root_conteo_layout); | |||||
cbxConteo = findViewById(R.id.cbxConteos); | |||||
cbxInventarios = findViewById(R.id.cbxInventarios); | |||||
lbtitle = findViewById(R.id.lbConteo); | |||||
btniniciar = findViewById(R.id.btnIniciar); | |||||
database = AppDatabase.getAppDatabaseDB(getApplicationContext()).inventarioDao(); | |||||
/*android.support.v7.app.ActionBar actionBar = getSupportActionBar(); | |||||
if (actionBar != null) { | |||||
actionBar.setBackgroundDrawable(new ColorDrawable(R.drawable.gradient_fondo)); | |||||
actionBar.setElevation(0); | |||||
//Activar Flecha atras | |||||
//actionBar.setDisplayHomeAsUpEnabled(true); | |||||
//actionBar.setTitle("Predio :" + predioLectura.getPredioid()); | |||||
}*/ | |||||
/*AnimationDrawable animDrawable = (AnimationDrawable) root_conteo_layout.getBackground(); | |||||
animDrawable.setEnterFadeDuration(10); | |||||
animDrawable.setExitFadeDuration(5000); | |||||
animDrawable.start();*/ | |||||
btniniciar.setOnClickListener(e -> { | |||||
if(cbxConteo.getSelectedItem() != null) | |||||
ConteoActivity.this.onClick(e); | |||||
}); | |||||
cbxInventarios.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { | |||||
@Override | |||||
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) { | |||||
Inventario inv = (Inventario) adapterView.getSelectedItem(); | |||||
mostrarConteo(inv.getInventariopk()); | |||||
} | |||||
@Override | |||||
public void onNothingSelected(AdapterView<?> adapterView) { | |||||
} | |||||
}); | |||||
cargarPreferencias(); | |||||
} | |||||
private void onClick(View view){ | |||||
//Obtenemos los articulo para el conteo desde DB | |||||
loadArticulosConteo( ((Inventario)cbxInventarios.getSelectedItem()).getInventariopk()); | |||||
Conteo c= (Conteo) cbxConteo.getSelectedItem(); | |||||
Intent intent = new Intent(ConteoActivity.this, MainActivity.class); | |||||
intent.putExtra(Constant.CONTEODET,(Serializable) c); | |||||
startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(ConteoActivity.this).toBundle()); | |||||
} | |||||
@Override | |||||
protected void onStart() { | |||||
super.onStart(); | |||||
cargarPreferencias(); | |||||
mostrarInventarios(); | |||||
} | |||||
@Override | |||||
public boolean onCreateOptionsMenu(Menu menu) { | |||||
MenuInflater inflater = getMenuInflater(); | |||||
inflater.inflate(R.menu.menu_reload, menu); | |||||
return true; | |||||
} | |||||
@Override | |||||
public boolean onOptionsItemSelected(MenuItem item) { | |||||
int id = item.getItemId(); | |||||
int idxml = R.id.action_reload; | |||||
if (id == idxml) { | |||||
mostrarInventarios(); | |||||
return true; | |||||
} | |||||
return true; | |||||
} | |||||
private void cargarPreferencias() { | |||||
imei = getIMEI(); | |||||
} | |||||
private void mostrarInventarios(){ | |||||
JSONObject jsonObject = new JSONObject(); | |||||
if (imei != null) { | |||||
try { | |||||
jsonObject.put("imei", getIMEI()); | |||||
JsonObjectRequest requestarr = new JsonObjectRequest(Request.Method.POST, restAlmacen.instance(this).URL_inventarios, jsonObject, | |||||
s -> { | |||||
try { | |||||
ExecutorService executor = Executors.newSingleThreadExecutor(); | |||||
Handler handler = new Handler(Looper.getMainLooper()); | |||||
executor.execute(() -> { | |||||
String msg; | |||||
boolean flag; | |||||
try { | |||||
if (s.has("inventarios")) { | |||||
saveInventarios(s); | |||||
} else { | |||||
throw new Exception("no se encontro información de predios en la consulta"); | |||||
} | |||||
} catch (Exception ex) { | |||||
System.out.println(ex.getMessage()); | |||||
msg = ex.getMessage(); | |||||
flag = true; | |||||
} | |||||
handler.post(() -> { | |||||
loadComboboxInv(); | |||||
}); | |||||
}); | |||||
} catch (Exception e) { | |||||
Toast.makeText(ConteoActivity.this, "Incorrect Details", Toast.LENGTH_LONG).show(); | |||||
loadComboboxInv(); | |||||
} | |||||
}, | |||||
new Response.ErrorListener() { | |||||
@Override | |||||
public void onErrorResponse(VolleyError error) { | |||||
if(error.getMessage() == null) { | |||||
if(error.networkResponse != null){ | |||||
try { | |||||
if (error.networkResponse.headers.containsKey("Content-Type") && error.networkResponse.headers.get("Content-Type").equals("application/json")) | |||||
{ | |||||
JSONObject json = new JSONObject(new String(error.networkResponse.data)); | |||||
Toast.makeText(getApplicationContext(), json.getString("message"), Toast.LENGTH_LONG).show(); | |||||
}else{ | |||||
Toast.makeText(getApplicationContext(), "Metodo no Permitido, " + error.networkResponse.headers.get("X-Android-Response-Source"), Toast.LENGTH_LONG).show(); | |||||
} | |||||
} catch (JSONException e) { | |||||
Toast.makeText(getApplicationContext(), "Unable to connect to server, try again later", Toast.LENGTH_LONG).show(); | |||||
} | |||||
}else { | |||||
Toast.makeText(getApplicationContext(), "Unable to connect to server, try again later", Toast.LENGTH_LONG).show(); | |||||
} | |||||
}else{ | |||||
Log.d("Volley Error:", "Volley Error:" + (error.getMessage() == null?"": error.getMessage()) + ", Code:" + (error.networkResponse == null? "": error.networkResponse.statusCode) ); | |||||
if(error.networkResponse != null) { | |||||
switch (error.networkResponse.statusCode) { | |||||
case 401: | |||||
Toast.makeText(getApplicationContext(), "No tiene permiso para realizar esta operación", Toast.LENGTH_LONG).show(); | |||||
break; | |||||
case 404: | |||||
Toast.makeText(getApplicationContext(), "Servicio tiene Errores para la Solicitud.", Toast.LENGTH_LONG).show(); | |||||
break; | |||||
default: | |||||
Toast.makeText(getApplicationContext(), "Unable to connect to server. codigo :" + error.networkResponse.statusCode, Toast.LENGTH_LONG).show(); | |||||
} | |||||
}else{ | |||||
Toast.makeText(getApplicationContext(), (error.getMessage() == null?"Unable to connect to server": error.getMessage()) , Toast.LENGTH_LONG).show(); | |||||
} | |||||
} | |||||
//cargar informacion db si existe en el spinner | |||||
loadComboboxInv(); | |||||
} | |||||
}); | |||||
RequestQueue rQueue = Volley.newRequestQueue(ConteoActivity.this); | |||||
rQueue.add(requestarr); | |||||
} catch (JSONException e) { | |||||
Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_LONG).show(); | |||||
loadComboboxInv(); | |||||
} | |||||
} else { | |||||
Toast.makeText(getApplicationContext(), "No se tiene permiso para obtener informacion sin IMEI", Toast.LENGTH_LONG).show(); | |||||
} | |||||
} | |||||
private void mostrarConteo(final int inventariopk){ | |||||
JSONObject jsonObject = new JSONObject(); | |||||
if (imei != null) { | |||||
try { | |||||
jsonObject.put("imei", getIMEI()); | |||||
jsonObject.put("inventariopk", inventariopk); | |||||
JsonObjectRequest requestarr = new JsonObjectRequest(Request.Method.POST, restAlmacen.instance(this).URL_conteos, jsonObject, | |||||
s -> { | |||||
try { | |||||
ExecutorService executor = Executors.newSingleThreadExecutor(); | |||||
Handler handler = new Handler(Looper.getMainLooper()); | |||||
executor.execute(() -> { | |||||
String msg; | |||||
boolean flag; | |||||
try { | |||||
if (s.has("conteos")) { | |||||
saveConteos(s); | |||||
} else { | |||||
throw new Exception("no se encontro información de predios en la consulta"); | |||||
} | |||||
} catch (Exception ex) { | |||||
System.out.println(ex.getMessage()); | |||||
msg = ex.getMessage(); | |||||
flag = true; | |||||
} | |||||
handler.post(() -> { | |||||
loadCombobox(inventariopk); | |||||
}); | |||||
}); | |||||
} catch (Exception e) { | |||||
Toast.makeText(ConteoActivity.this, "Incorrect Details", Toast.LENGTH_LONG).show(); | |||||
loadCombobox(inventariopk); | |||||
} | |||||
}, | |||||
new Response.ErrorListener() { | |||||
@Override | |||||
public void onErrorResponse(VolleyError error) { | |||||
if(error.getMessage() == null) { | |||||
if(error.networkResponse != null){ | |||||
try { | |||||
if (error.networkResponse.headers.containsKey("Content-Type") && error.networkResponse.headers.get("Content-Type").equals("application/json")) | |||||
{ | |||||
JSONObject json = new JSONObject(new String(error.networkResponse.data)); | |||||
Toast.makeText(getApplicationContext(), json.getString("message"), Toast.LENGTH_LONG).show(); | |||||
}else{ | |||||
Toast.makeText(getApplicationContext(), "Metodo no Permitido, " + error.networkResponse.headers.get("X-Android-Response-Source"), Toast.LENGTH_LONG).show(); | |||||
} | |||||
} catch (JSONException e) { | |||||
Toast.makeText(getApplicationContext(), "Unable to connect to server, try again later", Toast.LENGTH_LONG).show(); | |||||
} | |||||
}else { | |||||
Toast.makeText(getApplicationContext(), "Unable to connect to server, try again later", Toast.LENGTH_LONG).show(); | |||||
} | |||||
}else{ | |||||
Log.d("Volley Error:", "Volley Error:" + (error.getMessage() == null?"": error.getMessage()) + ", Code:" + (error.networkResponse == null? "": error.networkResponse.statusCode) ); | |||||
if(error.networkResponse != null) { | |||||
switch (error.networkResponse.statusCode) { | |||||
case 401: | |||||
Toast.makeText(getApplicationContext(), "No tiene permiso para realizar esta operación", Toast.LENGTH_LONG).show(); | |||||
break; | |||||
case 404: | |||||
Toast.makeText(getApplicationContext(), "Servicio tiene Errores para la Solicitud.", Toast.LENGTH_LONG).show(); | |||||
break; | |||||
default: | |||||
Toast.makeText(getApplicationContext(), "Unable to connect to server. codigo :" + error.networkResponse.statusCode, Toast.LENGTH_LONG).show(); | |||||
} | |||||
}else{ | |||||
Toast.makeText(getApplicationContext(), (error.getMessage() == null?"Unable to connect to server": error.getMessage()) , Toast.LENGTH_LONG).show(); | |||||
} | |||||
} | |||||
//cargar informacion db si existe en el spinner | |||||
loadCombobox(inventariopk); | |||||
} | |||||
}); | |||||
RequestQueue rQueue = Volley.newRequestQueue(ConteoActivity.this); | |||||
rQueue.add(requestarr); | |||||
} catch (JSONException e) { | |||||
Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_LONG).show(); | |||||
loadCombobox(inventariopk); | |||||
} | |||||
} else { | |||||
Toast.makeText(getApplicationContext(), "No se tiene permiso para obtener informacion sin IMEI", Toast.LENGTH_LONG).show(); | |||||
} | |||||
} | |||||
private void loadCombobox(int inventarioPk) { | |||||
ExecutorService executor = Executors.newSingleThreadExecutor(); | |||||
Handler handler = new Handler(Looper.getMainLooper()); | |||||
executor.execute(() -> { | |||||
//Background work here | |||||
String msg; | |||||
boolean flag; | |||||
List<Conteo> db = null; | |||||
//load database data | |||||
try { | |||||
//load database data | |||||
db = database.listInventariosInv(inventarioPk); | |||||
} catch (Exception ex) { | |||||
System.out.println(ex.getMessage()); | |||||
msg = ex.getMessage(); | |||||
flag = true; | |||||
} | |||||
List<Conteo> finalDb = db; | |||||
handler.post(() -> { | |||||
if(finalDb != null) { | |||||
// Creating adapter for spinner | |||||
dataAdapter = new ArrayAdapter<Conteo>(ConteoActivity.this, | |||||
android.R.layout.simple_spinner_item, finalDb); | |||||
dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); | |||||
// attaching data adapter to spinner | |||||
cbxConteo.setAdapter(dataAdapter); | |||||
} | |||||
}); | |||||
}); | |||||
} | |||||
private void loadComboboxInv() { | |||||
ExecutorService executor = Executors.newSingleThreadExecutor(); | |||||
Handler handler = new Handler(Looper.getMainLooper()); | |||||
executor.execute(() -> { | |||||
//Background work here | |||||
String msg; | |||||
boolean flag; | |||||
List<Inventario> db = null; | |||||
//load database data | |||||
try { | |||||
//load database data | |||||
db = database.listInventariosActivos(); | |||||
} catch (Exception ex) { | |||||
System.out.println(ex.getMessage()); | |||||
msg = ex.getMessage(); | |||||
flag = true; | |||||
} | |||||
List<Inventario> finalDb = db; | |||||
handler.post(() -> { | |||||
if(finalDb != null) { | |||||
// Creating adapter for spinner | |||||
dataAdapterinv = new ArrayAdapter<>(ConteoActivity.this, | |||||
android.R.layout.simple_spinner_item, finalDb); | |||||
dataAdapterinv.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); | |||||
// attaching data adapter to spinner | |||||
cbxInventarios.setAdapter(dataAdapterinv); | |||||
if(cbxInventarios.getSelectedItem() != null) | |||||
loadCombobox(((Inventario)cbxInventarios.getSelectedItem()).getInventariopk() ); | |||||
} | |||||
}); | |||||
}); | |||||
} | |||||
private void saveConteos(JSONObject s) throws JSONException { | |||||
JSONArray jsonconteos = s.getJSONArray("conteos"); | |||||
final List<Conteo> l; | |||||
Type listType = new TypeToken<List<Conteo>>() { | |||||
}.getType(); | |||||
Gson gson= new GsonBuilder().setDateFormat("yyyy-MM-dd").create(); | |||||
l = gson.fromJson(jsonconteos.toString(), listType); | |||||
//insertar en lote desde el primer registro | |||||
if (l.size() >= 1) { | |||||
//conteos.clear(); | |||||
//si existe se borra la informacion | |||||
for (Conteo c : l) { | |||||
database.upsertConteo(c); | |||||
//conteos.add(c); | |||||
} | |||||
} | |||||
} | |||||
private void saveInventarios(JSONObject s) throws JSONException { | |||||
JSONArray jsoninventario = s.getJSONArray("inventarios"); | |||||
final List<Inventario> l; | |||||
Type listType = new TypeToken<List<Inventario>>() { | |||||
}.getType(); | |||||
Gson gson= new GsonBuilder().setDateFormat("dd/MM/yyyy").create(); | |||||
l = gson.fromJson(jsoninventario.toString(), listType); | |||||
//estado a C | |||||
database.updateInventarioN(); | |||||
//insertar en lote desde el primer registro | |||||
if (l.size() >= 1) { | |||||
//conteos.clear(); | |||||
//si existe se borra la informacion | |||||
for (Inventario c : l) { | |||||
database.upsertInventario(c); | |||||
//conteos.add(c); | |||||
} | |||||
} | |||||
} | |||||
public String getIMEI() { | |||||
String ID = Settings.Secure.getString(getContentResolver(), | |||||
Settings.Secure.ANDROID_ID); | |||||
return ID; | |||||
} | |||||
// | |||||
// Carga los articulos del conteo | |||||
private void loadArticulosConteo(final int inventarioPk){ | |||||
JSONObject jsonObject = new JSONObject(); | |||||
//Obtener el conteo seleccionado | |||||
Conteo conteo = (Conteo) cbxConteo.getSelectedItem(); | |||||
if (imei != null && conteo != null) { | |||||
// try { | |||||
/*jsonObject.put("imei", getIMEI()); | |||||
jsonObject.put("invanteriopk", inventarioPk); | |||||
jsonObject.put("conteopk", conteo.getConteopk()); | |||||
jsonObject.put("foliopk", 0);*/ | |||||
//RequestQueue rQueue = Volley.newRequestQueue(this); | |||||
Retrofit retrofit = new Retrofit.Builder() | |||||
.baseUrl(restAlmacen.instance(this).BASE_URL) | |||||
.addConverterFactory(GsonConverterFactory.create()) | |||||
.build(); | |||||
InventarioService postService = retrofit.create(InventarioService.class); | |||||
Call< List<DetalleConteo> > call = postService.getDetalleConteo(new DetalleRequest(getIMEI(), inventarioPk, conteo.getConteopk(), 0)); | |||||
call.enqueue(new Callback<>() { | |||||
@Override | |||||
public void onResponse(@NonNull Call<List<DetalleConteo>> call, @NonNull retrofit2.Response<List<DetalleConteo>> response) { | |||||
ExecutorService executor = Executors.newSingleThreadExecutor(); | |||||
Handler handler = new Handler(Looper.getMainLooper()); | |||||
executor.execute(() -> { | |||||
String msg = ""; | |||||
boolean flag = false; | |||||
try { | |||||
if (response.body() != null) { | |||||
saveArticulosObj( response.body()); | |||||
} else { | |||||
throw new Exception("no se encontro información de inventario"); | |||||
} | |||||
} catch (Exception ex) { | |||||
System.out.println(ex.getMessage()); | |||||
msg = ex.getMessage(); | |||||
flag = true; | |||||
} | |||||
boolean finalFlag = flag; | |||||
String finalMsg = msg; | |||||
handler.post(() -> { | |||||
if (finalFlag) | |||||
Toast.makeText(ConteoActivity.this, finalMsg, Toast.LENGTH_LONG).show(); | |||||
}); | |||||
}); | |||||
} | |||||
@Override | |||||
public void onFailure(Call<List<DetalleConteo>> call, Throwable t) { | |||||
Toast.makeText(ConteoActivity.this, t.getMessage(), Toast.LENGTH_LONG).show(); | |||||
} | |||||
}); | |||||
} else { | |||||
Toast.makeText(getApplicationContext(), "No se tiene permiso para obtener informacion sin IMEI", Toast.LENGTH_LONG).show(); | |||||
} | |||||
} | |||||
private void saveArticulos(JSONObject s) throws JSONException { | |||||
JSONArray jsonconteos = s.getJSONArray("inventario"); | |||||
final List<DetalleConteo> l; | |||||
Type listType = new TypeToken<List<DetalleConteo>>() { | |||||
}.getType(); | |||||
Gson gson= new GsonBuilder().setDateFormat("yyyy-MM-dd").create(); | |||||
l = gson.fromJson(jsonconteos.toString(), listType); | |||||
//insertar en lote desde el primer registro | |||||
if (l.size() >= 1) { | |||||
DetalleConteo c1 = l.get(0); | |||||
database.clearConteo(c1.getAlmacenpk(), c1.getConteopk()); | |||||
//conteos.clear(); | |||||
//si existe se borra la informacion | |||||
for (DetalleConteo c : l) { | |||||
c.setEnviado(false); | |||||
if(database.exist(c.getAlmacenpk(),c.getConteopk(),c.getFolio(),c.getArticulopk(), c.getInventariopk()) != null) | |||||
database.updateCantidad(c.getCantidad(),c.getAlmacenpk(), c.getConteopk(),c.getFolio(), c.getArticulopk(), c.getInventariopk(), false, false ); | |||||
else | |||||
database.isertDetalleConteo(c); | |||||
//conteos.add(c); | |||||
} | |||||
} | |||||
} | |||||
private void saveArticulosObj(List<DetalleConteo> l) { | |||||
//insertar en lote desde el primer registro | |||||
if (!l.isEmpty()) { | |||||
DetalleConteo c1 = l.get(0); | |||||
database.clearConteo(c1.getAlmacenpk(), c1.getConteopk()); | |||||
//conteos.clear(); | |||||
//si existe se borra la informacion | |||||
for (DetalleConteo c : l) { | |||||
c.setEnviado(false); | |||||
if(database.exist(c.getAlmacenpk(),c.getConteopk(),c.getFolio(),c.getArticulopk(), c.getInventariopk()) != null){ | |||||
//revisar que si enciado es 0 entocens no realiza actualizacion | |||||
if(database.existSinenviar(c.getAlmacenpk(),c.getConteopk(),c.getFolio(),c.getArticulopk(), c.getInventariopk(), false, true) == null) { | |||||
database.updateCantidad(c.getCantidad(), c.getAlmacenpk(), c.getConteopk(), c.getFolio(), c.getArticulopk(), c.getInventariopk(), false, false); | |||||
} | |||||
}else { | |||||
database.isertDetalleConteo(c); | |||||
} | |||||
} | |||||
} | |||||
} | |||||
} |
@ -0,0 +1,24 @@ | |||||
package jumapacelaya.gob.mx.almacen; | |||||
import java.util.List; | |||||
import jumapacelaya.gob.mx.almacen.bean.DetalleConteo; | |||||
import jumapacelaya.gob.mx.almacen.bean.Inventario; | |||||
import jumapacelaya.gob.mx.almacen.request.DetalleRequest; | |||||
import retrofit2.Call; | |||||
import retrofit2.http.Body; | |||||
import retrofit2.http.GET; | |||||
import retrofit2.http.POST; | |||||
public interface InventarioService { | |||||
String API_ROUTE = "/rest/almservice/listConteoArticulo"; | |||||
String API_UPDINVENTARIO = "/rest/almservice/saveFolio"; | |||||
@POST(API_ROUTE) | |||||
Call< List<DetalleConteo> > getDetalleConteo(@Body DetalleRequest body); | |||||
@POST(API_UPDINVENTARIO) | |||||
Call<Void> updateDetalle(@Body DetalleConteo body); | |||||
} |
@ -0,0 +1,25 @@ | |||||
package jumapacelaya.gob.mx.almacen; | |||||
import android.os.Build; | |||||
import com.google.gson.JsonDeserializationContext; | |||||
import com.google.gson.JsonDeserializer; | |||||
import com.google.gson.JsonElement; | |||||
import com.google.gson.JsonParseException; | |||||
import java.lang.reflect.Type; | |||||
import java.time.LocalDate; | |||||
import java.time.format.DateTimeFormatter; | |||||
import java.util.Locale; | |||||
public class LocalDateDeserializer implements JsonDeserializer<LocalDate> { | |||||
@Override | |||||
public LocalDate deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) | |||||
throws JsonParseException { | |||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { | |||||
return LocalDate.parse(json.getAsString(), | |||||
DateTimeFormatter.ofPattern("d-MMM-yyyy").withLocale(new Locale("es","MX"))); | |||||
} | |||||
return null; | |||||
} | |||||
} |
@ -0,0 +1,356 @@ | |||||
package jumapacelaya.gob.mx.almacen; | |||||
import static android.widget.Toast.LENGTH_SHORT; | |||||
import android.Manifest; | |||||
import android.content.Intent; | |||||
import android.content.pm.PackageManager; | |||||
import android.os.AsyncTask; | |||||
import android.os.Build; | |||||
import android.os.Bundle; | |||||
import com.google.android.material.appbar.MaterialToolbar; | |||||
import com.google.android.material.badge.BadgeDrawable; | |||||
import com.google.android.material.badge.BadgeUtils; | |||||
import com.google.android.material.badge.ExperimentalBadgeUtils; | |||||
import com.google.android.material.floatingactionbutton.FloatingActionButton; | |||||
import com.google.android.material.tabs.TabLayout; | |||||
import androidx.annotation.NonNull; | |||||
import androidx.annotation.OptIn; | |||||
import androidx.viewpager.widget.ViewPager; | |||||
import androidx.appcompat.app.AppCompatActivity; | |||||
import android.os.Handler; | |||||
import android.os.Looper; | |||||
import android.view.MenuItem; | |||||
import android.view.View; | |||||
import android.view.animation.Animation; | |||||
import android.view.animation.AnimationUtils; | |||||
import android.widget.Toast; | |||||
import com.google.gson.Gson; | |||||
import com.google.gson.GsonBuilder; | |||||
import com.google.zxing.integration.android.IntentIntegrator; | |||||
import com.google.zxing.integration.android.IntentResult; | |||||
import java.lang.ref.WeakReference; | |||||
import java.util.List; | |||||
import java.util.concurrent.ExecutorService; | |||||
import java.util.concurrent.Executors; | |||||
import java.util.concurrent.atomic.AtomicReference; | |||||
import jumapacelaya.gob.mx.almacen.bean.ArticuloScan; | |||||
import jumapacelaya.gob.mx.almacen.bean.Conteo; | |||||
import jumapacelaya.gob.mx.almacen.bean.DetalleConteo; | |||||
import jumapacelaya.gob.mx.almacen.dao.AppDatabase; | |||||
import jumapacelaya.gob.mx.almacen.dao.inventarioDao; | |||||
import jumapacelaya.gob.mx.almacen.ui.main.avance.AvanceFragment; | |||||
import jumapacelaya.gob.mx.almacen.ui.main.Constant; | |||||
import jumapacelaya.gob.mx.almacen.ui.main.PendienteFragment; | |||||
import jumapacelaya.gob.mx.almacen.ui.main.PlaceholderFragment; | |||||
import jumapacelaya.gob.mx.almacen.ui.main.SectionsPagerAdapter; | |||||
import retrofit2.Call; | |||||
import retrofit2.Callback; | |||||
import retrofit2.Response; | |||||
import retrofit2.Retrofit; | |||||
import retrofit2.converter.gson.GsonConverterFactory; | |||||
public class MainActivity extends AppCompatActivity implements PendienteFragment.OnListFragmentInteractionListener, AvanceFragment.OnListAvanceFragmentInteractionListener { | |||||
private static final int REQUEST_CAMERARESULT=201; | |||||
private Conteo conteo; | |||||
TabLayout tabs; | |||||
private MaterialToolbar topAppBar; | |||||
private BadgeDrawable badge; | |||||
private Animation rotation; | |||||
private MenuItem refreshItem; | |||||
inventarioDao database; | |||||
@OptIn(markerClass = ExperimentalBadgeUtils.class) | |||||
@Override | |||||
protected void onCreate(Bundle savedInstanceState) { | |||||
super.onCreate(savedInstanceState); | |||||
Bundle bundle = getIntent().getExtras(); | |||||
conteo = (Conteo) bundle.get(Constant.CONTEODET); | |||||
setContentView(R.layout.activity_main); | |||||
SectionsPagerAdapter sectionsPagerAdapter = new SectionsPagerAdapter(this, getSupportFragmentManager()); | |||||
ViewPager viewPager = findViewById(R.id.view_pager); | |||||
viewPager.setAdapter(sectionsPagerAdapter); | |||||
viewPager.setOffscreenPageLimit(10); | |||||
tabs = findViewById(R.id.tabs); | |||||
tabs.setupWithViewPager(viewPager); | |||||
topAppBar = findViewById(R.id.topAppBar); | |||||
topAppBar.inflateMenu(R.menu.top_app_bar); | |||||
topAppBar.setOnMenuItemClickListener(item -> { | |||||
if (item.getItemId() == R.id.refresh) { | |||||
actualizarPendientes(); | |||||
return true; | |||||
} | |||||
return true; | |||||
}); | |||||
badge = BadgeDrawable.create(this); | |||||
BadgeUtils.attachBadgeDrawable(badge, topAppBar, R.id.refresh); | |||||
rotation = AnimationUtils.loadAnimation(this, R.anim.anim_rotate); | |||||
rotation.setRepeatCount(Animation.INFINITE); | |||||
if(conteo != null){ | |||||
topAppBar.setTitle("Almacen " + conteo.getNombre()); | |||||
} | |||||
FloatingActionButton fab = findViewById(R.id.fab); | |||||
fab.setOnClickListener(view -> { | |||||
IntentIntegrator scanIntegrator = new IntentIntegrator(MainActivity.this); | |||||
//IntentIntegrator scanIntegrator = IntentIntegrator.forSupportFragment(this); | |||||
//scanIntegrator.setDesiredBarcodeFormats(CustomIntegrator.PDF_417); | |||||
scanIntegrator.setPrompt("Escanear Articulo"); | |||||
//scanIntegrator.setCameraId(0); // Use a specific camera of the device | |||||
scanIntegrator.setOrientationLocked(false); | |||||
/*scanIntegrator.setOrientationLocked(true); | |||||
scanIntegrator.setBeepEnabled(true); | |||||
scanIntegrator.setCaptureActivity(CaptureActivityPortrait.class);*/ | |||||
scanIntegrator.initiateScan(); | |||||
}); | |||||
database = AppDatabase.getAppDatabaseDB(getApplicationContext()).inventarioDao(); | |||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { | |||||
if(getApplicationContext().checkSelfPermission(Manifest.permission.CAMERA)== PackageManager.PERMISSION_GRANTED){ | |||||
///method to get Images | |||||
}else{ | |||||
if(shouldShowRequestPermissionRationale(Manifest.permission.CAMERA)){ | |||||
Toast.makeText(getApplicationContext(),"Your Permission is needed to get access the camera",Toast.LENGTH_LONG).show(); | |||||
} | |||||
requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.CAMERA}, REQUEST_CAMERARESULT); | |||||
} | |||||
}else{ | |||||
} | |||||
//refreshBadge(); | |||||
} | |||||
@Override | |||||
protected void onResume() { | |||||
super.onResume(); | |||||
refreshBadge(); | |||||
} | |||||
public void refreshBadge(){ | |||||
ExecutorService executor = Executors.newSingleThreadExecutor(); | |||||
Handler handler = new Handler(Looper.getMainLooper()); | |||||
View refreshitem = findViewById(R.id.refresh); | |||||
refreshitem.startAnimation(rotation); | |||||
executor.execute(() -> { | |||||
int cantidad = 0; | |||||
try { | |||||
cantidad = database.pendienteEnviar(conteo.getConteopk(), conteo.getInventariopk(), false, true); | |||||
} catch (Exception ex) { | |||||
System.out.println(ex.getMessage()); | |||||
Toast.makeText(MainActivity.this, "Error al consultar los pendietes", Toast.LENGTH_LONG).show(); | |||||
} | |||||
int finalCantidad = cantidad; | |||||
handler.post(() -> { | |||||
badge.clearNumber(); | |||||
badge.setText(String.valueOf(finalCantidad)); | |||||
rotation.cancel(); | |||||
}); | |||||
}); | |||||
} | |||||
private void actualizarPendientes(){ | |||||
ExecutorService executor = Executors.newSingleThreadExecutor(); | |||||
Handler handler = new Handler(Looper.getMainLooper()); | |||||
View refreshitem = findViewById(R.id.refresh); | |||||
refreshitem.startAnimation(rotation); | |||||
executor.execute(() -> { | |||||
List<DetalleConteo> detalles = database.lstpendienteEnviar(conteo.getConteopk(), conteo.getInventariopk(), false, true); | |||||
GsonBuilder builder = new GsonBuilder(); | |||||
builder.excludeFieldsWithoutExposeAnnotation(); | |||||
Retrofit retrofit = new Retrofit.Builder() | |||||
.baseUrl(restAlmacen.instance(MainActivity.this).BASE_URL) | |||||
.addConverterFactory(GsonConverterFactory.create(builder.create())) | |||||
.build(); | |||||
InventarioService postService = retrofit.create(InventarioService.class); | |||||
if(detalles.size() == 0) | |||||
refreshBadge(); | |||||
for(DetalleConteo d:detalles){ | |||||
Call<Void> call = postService.updateDetalle(d); | |||||
call.enqueue(new Callback<>() { | |||||
@Override | |||||
public void onResponse(@NonNull Call<Void> call, @NonNull Response<Void> response) { | |||||
ExecutorService executor = Executors.newSingleThreadExecutor(); | |||||
Handler handler = new Handler(Looper.getMainLooper()); | |||||
executor.execute(() -> { | |||||
String msg = ""; | |||||
boolean flag = false; | |||||
if (response.code() == 200){ | |||||
d.setEnviado(true); | |||||
database.updateDetalle(d); | |||||
} | |||||
handler.post(() -> { | |||||
refreshBadge(); | |||||
}); | |||||
}); | |||||
} | |||||
@Override | |||||
public void onFailure(Call<Void> call, Throwable t) { | |||||
Toast.makeText(MainActivity.this, t.getMessage(), Toast.LENGTH_LONG).show(); | |||||
refreshBadge(); | |||||
} | |||||
}); | |||||
} | |||||
}); | |||||
} | |||||
@Override | |||||
public void onListFragmentInteraction(DetalleConteo item) { | |||||
//Toast.makeText(MainActivity.this, item.getDescFamilia() + ":" + item.getFolio() + " - " +item.getDescArticulo(), Toast.LENGTH_LONG).show(); | |||||
String tag = "android:switcher:" + R.id.view_pager + ":" + 0; | |||||
PlaceholderFragment ff = (PlaceholderFragment) getSupportFragmentManager().findFragmentByTag(tag); | |||||
ff.displayReceivedData(item); | |||||
TabLayout.Tab tab= tabs.getTabAt(0); | |||||
tab.select(); | |||||
} | |||||
@Override | |||||
public void onListAvanceFragmentInteraction(DetalleConteo item) { | |||||
//Toast.makeText(MainActivity.this, item.getDescFamilia() + ":" + item.getFolio() + " - " +item.getDescArticulo(), Toast.LENGTH_LONG).show(); | |||||
String tag = "android:switcher:" + R.id.view_pager + ":" + 0; | |||||
PlaceholderFragment f = (PlaceholderFragment) getSupportFragmentManager().findFragmentByTag(tag); | |||||
f.displayReceivedData(item); | |||||
TabLayout.Tab tab= tabs.getTabAt(0); | |||||
tab.select(); | |||||
} | |||||
public Conteo getConteo(){ | |||||
return conteo; | |||||
} | |||||
@Override | |||||
public void onActivityResult(int requestCode, int resultCode, Intent intent) { | |||||
try { | |||||
final IntentResult scanResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, intent); | |||||
if(scanResult != null) | |||||
handleResult(scanResult); | |||||
else | |||||
super.onActivityResult(requestCode, resultCode, intent); | |||||
}catch (Exception ex){ | |||||
Toast.makeText(getApplicationContext(), ex.getMessage(), LENGTH_SHORT).show(); | |||||
} | |||||
} | |||||
private void handleResult(IntentResult scanResult) { | |||||
if (scanResult != null) { | |||||
Gson gson = new Gson(); | |||||
ArticuloScan articuloScan = gson.fromJson(scanResult.getContents(), ArticuloScan.class); | |||||
if(articuloScan != null){ | |||||
final inventarioDao db = AppDatabase.getAppDatabaseDB(this).inventarioDao(); | |||||
//consultar base de datos | |||||
ExecutorService executor = Executors.newSingleThreadExecutor(); | |||||
Handler handler = new Handler(Looper.getMainLooper()); | |||||
executor.execute(() -> { | |||||
DetalleConteo detalle = null; | |||||
detalle = db.getDetalleID(conteo.getInventariopk(), conteo.getConteopk(), articuloScan.getArticuloid()); | |||||
DetalleConteo finalDetalle = detalle; | |||||
handler.post(() -> { | |||||
String tag = "android:switcher:" + R.id.view_pager + ":" + 0; | |||||
PlaceholderFragment f = (PlaceholderFragment) getSupportFragmentManager().findFragmentByTag(tag); | |||||
f.displayReceivedData(finalDetalle); | |||||
TabLayout.Tab tab= tabs.getTabAt(0); | |||||
assert tab != null; | |||||
tab.select(); | |||||
}); | |||||
}); | |||||
}else{ | |||||
Toast.makeText(this, "Información Incorrecta :(", LENGTH_SHORT).show(); | |||||
} | |||||
} else { | |||||
Toast.makeText(this, "No se ha leído nada :(", LENGTH_SHORT).show(); | |||||
} | |||||
} | |||||
private class SelectDetalleTask extends AsyncTask<Void,Void,DetalleConteo> { | |||||
private WeakReference<MainActivity> activityReference; | |||||
private Conteo conteo; | |||||
private String folio; | |||||
// only retain a weak reference to the activity | |||||
SelectDetalleTask(MainActivity context, Conteo conteo,String folio) { | |||||
activityReference = new WeakReference<>(context); | |||||
this.conteo = conteo; | |||||
this.folio = folio; | |||||
} | |||||
// doInBackground methods runs on a worker thread | |||||
@Override | |||||
protected DetalleConteo doInBackground(Void... objs) { | |||||
return AppDatabase.getAppDatabaseDB(activityReference.get()).inventarioDao().getDetalle(conteo.getInventariopk(),conteo.getConteopk(),folio); | |||||
} | |||||
// onPostExecute runs on main thread | |||||
@Override | |||||
protected void onPostExecute(DetalleConteo det) { | |||||
if (det != null){ | |||||
String tag = "android:switcher:" + R.id.view_pager + ":" + 0; | |||||
PlaceholderFragment f = (PlaceholderFragment) getSupportFragmentManager().findFragmentByTag(tag); | |||||
f.displayReceivedData(det); | |||||
TabLayout.Tab tab = tabs.getTabAt(0); | |||||
tab.select(); | |||||
} | |||||
} | |||||
} | |||||
} |
@ -0,0 +1,42 @@ | |||||
package jumapacelaya.gob.mx.almacen.bean; | |||||
import java.io.Serializable; | |||||
public class ArticuloScan implements Serializable { | |||||
private int articuloid; | |||||
private String nombre; | |||||
private int cogid; | |||||
private String unidad; | |||||
public int getArticuloid() { | |||||
return articuloid; | |||||
} | |||||
public void setArticuloid(int articuloid) { | |||||
this.articuloid = articuloid; | |||||
} | |||||
public String getNombre() { | |||||
return nombre; | |||||
} | |||||
public void setNombre(String nombre) { | |||||
this.nombre = nombre; | |||||
} | |||||
public int getCogid() { | |||||
return cogid; | |||||
} | |||||
public void setCogid(int cogid) { | |||||
this.cogid = cogid; | |||||
} | |||||
public String getUnidad() { | |||||
return unidad; | |||||
} | |||||
public void setUnidad(String unidad) { | |||||
this.unidad = unidad; | |||||
} | |||||
} |
@ -0,0 +1,48 @@ | |||||
package jumapacelaya.gob.mx.almacen.bean; | |||||
import androidx.room.Entity; | |||||
import androidx.room.PrimaryKey; | |||||
import androidx.annotation.NonNull; | |||||
import java.io.Serializable; | |||||
@Entity | |||||
public class Conteo implements Serializable { | |||||
@PrimaryKey | |||||
@NonNull | |||||
private Integer conteopk; | |||||
private String nombre; | |||||
private Integer inventariopk; | |||||
public Integer getConteopk() { | |||||
return conteopk; | |||||
} | |||||
public void setConteopk(Integer conteopk) { | |||||
this.conteopk = conteopk; | |||||
} | |||||
public String getNombre() { | |||||
return nombre; | |||||
} | |||||
public void setNombre(String nombre) { | |||||
this.nombre = nombre; | |||||
} | |||||
@Override | |||||
public String toString() { | |||||
return getNombre(); | |||||
} | |||||
public Integer getInventariopk() { | |||||
return inventariopk; | |||||
} | |||||
public void setInventariopk(Integer inventariopk) { | |||||
this.inventariopk = inventariopk; | |||||
} | |||||
} |
@ -0,0 +1,162 @@ | |||||
package jumapacelaya.gob.mx.almacen.bean; | |||||
import androidx.room.Embedded; | |||||
import androidx.room.Entity; | |||||
import androidx.annotation.NonNull; | |||||
import com.google.gson.annotations.Expose; | |||||
import java.io.Serializable; | |||||
import java.math.BigDecimal; | |||||
@Entity(primaryKeys = {"almacenpk","articulopk","conteopk"}) | |||||
public class DetalleConteo implements Serializable { | |||||
@NonNull | |||||
@Expose | |||||
private Integer folio; | |||||
@Expose | |||||
private String clave; | |||||
@Expose | |||||
private String descArticulo; | |||||
@Expose | |||||
private String descunidad; | |||||
@Expose | |||||
@NonNull | |||||
private Integer inventariopk; | |||||
@NonNull | |||||
@Expose | |||||
private Integer almacenpk; | |||||
@NonNull | |||||
@Expose | |||||
private Integer articulopk; | |||||
@Expose | |||||
private BigDecimal cantidad; | |||||
@Expose | |||||
private String descFamilia; | |||||
@Expose | |||||
private String descSubFamilia; | |||||
@NonNull | |||||
@Expose | |||||
private Integer conteopk; | |||||
@NonNull | |||||
@Expose(deserialize = false, serialize = false) | |||||
private Boolean enviado = false; | |||||
@NonNull | |||||
@Expose(deserialize = false, serialize = false) | |||||
private Boolean actualizado = false; | |||||
public Integer getAlmacenpk() { | |||||
return almacenpk; | |||||
} | |||||
public void setAlmacenpk(Integer almacenpk) { | |||||
this.almacenpk = almacenpk; | |||||
} | |||||
public Integer getArticulopk() { | |||||
return articulopk; | |||||
} | |||||
public void setArticulopk(Integer articulopk) { | |||||
this.articulopk = articulopk; | |||||
} | |||||
public Integer getConteopk() { | |||||
return conteopk; | |||||
} | |||||
public void setConteopk(Integer conteopk) { | |||||
this.conteopk = conteopk; | |||||
} | |||||
public Integer getFolio() { | |||||
return folio; | |||||
} | |||||
public void setFolio(Integer folio) { | |||||
this.folio = folio; | |||||
} | |||||
public BigDecimal getCantidad() { | |||||
return cantidad; | |||||
} | |||||
public void setCantidad(BigDecimal cantidad) { | |||||
this.cantidad = cantidad; | |||||
} | |||||
@NonNull | |||||
public Boolean getEnviado() { | |||||
return enviado; | |||||
} | |||||
public void setEnviado(@NonNull Boolean enviado) { | |||||
this.enviado = enviado; | |||||
} | |||||
public String getClave() { | |||||
return clave; | |||||
} | |||||
public void setClave(String clave) { | |||||
this.clave = clave; | |||||
} | |||||
public String getDescArticulo() { | |||||
return descArticulo; | |||||
} | |||||
public void setDescArticulo(String descArticulo) { | |||||
this.descArticulo = descArticulo; | |||||
} | |||||
public String getDescunidad() { | |||||
return descunidad; | |||||
} | |||||
public void setDescunidad(String descunidad) { | |||||
this.descunidad = descunidad; | |||||
} | |||||
public String getDescFamilia() { | |||||
return descFamilia; | |||||
} | |||||
public void setDescFamilia(String descFamilia) { | |||||
this.descFamilia = descFamilia; | |||||
} | |||||
public String getDescSubFamilia() { | |||||
return descSubFamilia; | |||||
} | |||||
public void setDescSubFamilia(String descSubFamilia) { | |||||
this.descSubFamilia = descSubFamilia; | |||||
} | |||||
@NonNull | |||||
public Integer getInventariopk() { | |||||
return inventariopk; | |||||
} | |||||
public void setInventariopk(@NonNull Integer inventariopk) { | |||||
this.inventariopk = inventariopk; | |||||
} | |||||
@NonNull | |||||
public Boolean getActualizado() { | |||||
return actualizado; | |||||
} | |||||
public void setActualizado(@NonNull Boolean actualizado) { | |||||
this.actualizado = actualizado; | |||||
} | |||||
} |
@ -0,0 +1,96 @@ | |||||
package jumapacelaya.gob.mx.almacen.bean; | |||||
import androidx.room.Entity; | |||||
import androidx.room.PrimaryKey; | |||||
import java.time.LocalDate; | |||||
import java.util.Date; | |||||
@Entity | |||||
public class Inventario { | |||||
@PrimaryKey | |||||
private int inventariopk; | |||||
private String descripcion; | |||||
private Date fecha; | |||||
private String estado; | |||||
private int polizapk; | |||||
private String usuario; | |||||
private int folio; | |||||
private int folioFResp; | |||||
public int getInventariopk() { | |||||
return inventariopk; | |||||
} | |||||
public void setInventariopk(int inventariopk) { | |||||
this.inventariopk = inventariopk; | |||||
} | |||||
public String getDescripcion() { | |||||
return descripcion; | |||||
} | |||||
public void setDescripcion(String descripcion) { | |||||
this.descripcion = descripcion; | |||||
} | |||||
public String getEstado() { | |||||
return estado; | |||||
} | |||||
public void setEstado(String estado) { | |||||
this.estado = estado; | |||||
} | |||||
public int getPolizapk() { | |||||
return polizapk; | |||||
} | |||||
public void setPolizapk(int polizapk) { | |||||
this.polizapk = polizapk; | |||||
} | |||||
public String getUsuario() { | |||||
return usuario; | |||||
} | |||||
public void setUsuario(String usuario) { | |||||
this.usuario = usuario; | |||||
} | |||||
public int getFolio() { | |||||
return folio; | |||||
} | |||||
public void setFolio(int folio) { | |||||
this.folio = folio; | |||||
} | |||||
public int getFolioFResp() { | |||||
return folioFResp; | |||||
} | |||||
public void setFolioFResp(int folioFResp) { | |||||
this.folioFResp = folioFResp; | |||||
} | |||||
public Date getFecha() { | |||||
return fecha; | |||||
} | |||||
public void setFecha(Date fecha) { | |||||
this.fecha = fecha; | |||||
} | |||||
@Override | |||||
public String toString() { | |||||
return this.descripcion; // What to display in the Spinner list. | |||||
} | |||||
} |
@ -0,0 +1,45 @@ | |||||
package jumapacelaya.gob.mx.almacen.dao; | |||||
import androidx.room.Database; | |||||
import androidx.room.Room; | |||||
import androidx.room.RoomDatabase; | |||||
import androidx.room.TypeConverters; | |||||
import android.content.Context; | |||||
import jumapacelaya.gob.mx.almacen.bean.Inventario; | |||||
import jumapacelaya.gob.mx.almacen.dao.converts.BigdecimalToLong; | |||||
import jumapacelaya.gob.mx.almacen.dao.converts.BooleanTointeger; | |||||
import jumapacelaya.gob.mx.almacen.bean.Conteo; | |||||
import jumapacelaya.gob.mx.almacen.bean.DetalleConteo; | |||||
import jumapacelaya.gob.mx.almacen.dao.converts.DateConverter; | |||||
import jumapacelaya.gob.mx.almacen.dao.converts.LocalDateConverter; | |||||
@Database(entities = {Conteo.class, DetalleConteo.class, Inventario.class}, version = 8, exportSchema = false) | |||||
@TypeConverters({BooleanTointeger.class, BigdecimalToLong.class, DateConverter.class}) | |||||
public abstract class AppDatabase extends RoomDatabase { | |||||
private static AppDatabase INSTANCE; | |||||
public abstract inventarioDao inventarioDao(); | |||||
public static AppDatabase getAppDatabaseDB(Context context){ | |||||
if(INSTANCE == null){ | |||||
INSTANCE = Room.databaseBuilder(context.getApplicationContext(), AppDatabase.class, "Inventario.DB") //.addMigrations(MIGRATION_1_2) | |||||
.fallbackToDestructiveMigration().build(); //Esta opcion incremetala version pero elimina todos los datos de la base de datos. | |||||
/*INSTANCE = Room.databaseBuilder(context.getApplicationContext(), Lecturasdb.class, consNamesDB.NAME_DATABASE).addMigrations(MIGRATION_19_20) | |||||
.build();*/ | |||||
} | |||||
return INSTANCE; | |||||
} | |||||
public static void destroyInstance(){ | |||||
INSTANCE = null; | |||||
} | |||||
} |
@ -0,0 +1,60 @@ | |||||
package jumapacelaya.gob.mx.almacen.dao; | |||||
import android.app.Application; | |||||
import androidx.lifecycle.AndroidViewModel; | |||||
import androidx.lifecycle.LiveData; | |||||
import androidx.annotation.NonNull; | |||||
import java.util.List; | |||||
import java.util.concurrent.ExecutorService; | |||||
import java.util.concurrent.Executors; | |||||
import jumapacelaya.gob.mx.almacen.bean.DetalleConteo; | |||||
public class PostViewModel extends AndroidViewModel { | |||||
public inventarioDao postDao; | |||||
private ExecutorService executorService; | |||||
private Application app; | |||||
public PostViewModel(@NonNull Application application) { | |||||
super(application); | |||||
postDao = AppDatabase.getAppDatabaseDB(application).inventarioDao(); | |||||
executorService = Executors.newSingleThreadExecutor(); | |||||
} | |||||
public LiveData<List<DetalleConteo>> getAllConteo() { | |||||
return postDao.liveDetalleConteos(); | |||||
} | |||||
public LiveData<List<DetalleConteo>> getPendientesConteo(int inventariopk, Integer conteo) { | |||||
return postDao.livePendiente_Detalles(inventariopk, conteo); | |||||
} | |||||
public LiveData<List<DetalleConteo>> getAvanceConteo(int inventariopk, Integer conteo) { | |||||
return postDao.liveAvance_Detalles(inventariopk, conteo); | |||||
} | |||||
public void saveDetalleConteo(final DetalleConteo detalleConteo) { | |||||
executorService.execute(new Runnable() { | |||||
@Override | |||||
public void run() { | |||||
postDao.insertDetalleConteos(detalleConteo); | |||||
} | |||||
}); | |||||
} | |||||
public void deleteDetalleConteo(final DetalleConteo detalleConteo) { | |||||
executorService.execute(new Runnable() { | |||||
@Override | |||||
public void run() { | |||||
postDao.deleteDetalleConteo(detalleConteo); | |||||
} | |||||
}); | |||||
} | |||||
} |
@ -0,0 +1,21 @@ | |||||
package jumapacelaya.gob.mx.almacen.dao.converts; | |||||
import androidx.room.TypeConverter; | |||||
import java.math.BigDecimal; | |||||
public class BigdecimalToLong { | |||||
@TypeConverter | |||||
public BigDecimal fromLong(Long value) { | |||||
return value == null ? null : new BigDecimal(value).divide(new BigDecimal(100)); | |||||
} | |||||
@TypeConverter | |||||
public Long toLong(BigDecimal bigDecimal) { | |||||
if (bigDecimal == null) { | |||||
return null; | |||||
} else { | |||||
return bigDecimal.multiply(new BigDecimal(100)).longValue(); | |||||
} | |||||
} | |||||
} |
@ -0,0 +1,20 @@ | |||||
package jumapacelaya.gob.mx.almacen.dao.converts; | |||||
import androidx.room.TypeConverter; | |||||
public class BooleanTointeger { | |||||
@TypeConverter | |||||
public Boolean fromTimestamp(Integer value) { | |||||
return value == null ? null : value > 0? new Boolean(true): new Boolean(false); | |||||
} | |||||
@TypeConverter | |||||
public Integer dateToTimestamp(Boolean value) { | |||||
if (value == null) { | |||||
return null; | |||||
} else { | |||||
return value? 1: 0; | |||||
} | |||||
} | |||||
} |
@ -0,0 +1,19 @@ | |||||
package jumapacelaya.gob.mx.almacen.dao.converts; | |||||
import androidx.room.TypeConverter; | |||||
import java.time.LocalDate; | |||||
import java.util.Date; | |||||
public class DateConverter { | |||||
@TypeConverter | |||||
public static Date toDate(Long dateLong){ | |||||
return dateLong == null ? null: new Date(dateLong); | |||||
} | |||||
@TypeConverter | |||||
public static Long fromDate(Date date){ | |||||
return date == null ? null : date.getTime(); | |||||
} | |||||
} |
@ -0,0 +1,27 @@ | |||||
package jumapacelaya.gob.mx.almacen.dao.converts; | |||||
import androidx.room.TypeConverter; | |||||
import java.time.LocalDate; | |||||
public class LocalDateConverter { | |||||
@TypeConverter | |||||
public static LocalDate toDate(String dateString) { | |||||
if (dateString == null) { | |||||
return null; | |||||
} else { | |||||
return LocalDate.parse(dateString); | |||||
} | |||||
} | |||||
@TypeConverter | |||||
public static String toDateString(LocalDate date) { | |||||
if (date == null) { | |||||
return null; | |||||
} else { | |||||
return date.toString(); | |||||
} | |||||
} | |||||
} |
@ -0,0 +1,156 @@ | |||||
package jumapacelaya.gob.mx.almacen.dao; | |||||
import android.database.sqlite.SQLiteConstraintException; | |||||
import androidx.lifecycle.LiveData; | |||||
import androidx.room.Dao; | |||||
import androidx.room.Delete; | |||||
import androidx.room.Insert; | |||||
import androidx.room.Query; | |||||
import androidx.room.Transaction; | |||||
import androidx.room.Update; | |||||
import java.math.BigDecimal; | |||||
import java.util.List; | |||||
import jumapacelaya.gob.mx.almacen.bean.Conteo; | |||||
import jumapacelaya.gob.mx.almacen.bean.DetalleConteo; | |||||
import jumapacelaya.gob.mx.almacen.bean.Inventario; | |||||
@Dao | |||||
public abstract class inventarioDao { | |||||
@Query("Select * from Conteo") | |||||
public abstract List<Conteo> listConteos(); | |||||
@Query("Select * from Inventario") | |||||
public abstract List<Inventario> listInventarios(); | |||||
@Query("Select * from Inventario Where estado = 'A' ") | |||||
public abstract List<Inventario> listInventariosActivos(); | |||||
@Query("Select * from Conteo Where inventariopk = :pinventariopk ") | |||||
public abstract List<Conteo> listInventariosInv(int pinventariopk); | |||||
@Query("Select * from Conteo Where conteopk= :conteopk ") | |||||
public abstract Conteo listConteos(Integer conteopk); | |||||
@Insert | |||||
public abstract void insertConteos(Conteo... conteos); | |||||
@Insert | |||||
public abstract void insertConteo(Conteo conteo); | |||||
@Update | |||||
public abstract void updateConteo(Conteo conteo); | |||||
public void upsertConteo(Conteo conteo) { | |||||
try { | |||||
insertConteo(conteo); | |||||
} | |||||
catch (SQLiteConstraintException e) { | |||||
updateConteo(conteo); | |||||
} | |||||
} | |||||
//@Insert(onConflict = OnConflictStrategy.REPLACE) | |||||
@Insert | |||||
public abstract void insertInventarios(Inventario... inventarios); | |||||
@Insert | |||||
public abstract void insertInventario(Inventario inventario); | |||||
@Update | |||||
public abstract void updateInventario(Inventario inventario); | |||||
public void upsertInventario(Inventario inventario) { | |||||
try { | |||||
insertInventario(inventario); | |||||
} | |||||
catch (SQLiteConstraintException e) { | |||||
updateInventario(inventario); | |||||
} | |||||
} | |||||
@Insert | |||||
public abstract void isertConteo(Conteo conteo); | |||||
@Delete | |||||
public abstract void deleteConteo(Conteo conteo); | |||||
@Query("Select * from DetalleConteo") | |||||
public abstract List<DetalleConteo> listDetalleConteos(); | |||||
@Query("Select * from DetalleConteo ") | |||||
public abstract LiveData<List<DetalleConteo>> liveDetalleConteos(); | |||||
@Query("Select * from DetalleConteo Where inventariopk = :inventariopk And conteopk= :conteopk and folio = :folio") | |||||
public abstract DetalleConteo getDetalle(Integer inventariopk, Integer conteopk, String folio); | |||||
@Query("Select * from DetalleConteo Where inventariopk = :inventariopk And conteopk= :conteopk and articulopk = :articulo") | |||||
public abstract DetalleConteo getDetalleID(Integer inventariopk, Integer conteopk, Integer articulo); | |||||
@Query("Select * from DetalleConteo Where almacenpk = :almacenpk And conteopk= :conteopk ") | |||||
public abstract List<DetalleConteo> listDetalles(Integer almacenpk, Integer conteopk); | |||||
@Query("Select * from DetalleConteo Where almacenpk = :almacenpk And conteopk= :conteopk ") | |||||
public abstract LiveData<List<DetalleConteo>> liveDetalles(Integer almacenpk, Integer conteopk); | |||||
@Query("Select * from DetalleConteo Where inventariopk = :inventariopk And conteopk= :conteopk and (cantidad == null or cantidad <> 0) ") | |||||
public abstract List<DetalleConteo> listPendiente_Detalles(Integer inventariopk, Integer conteopk); | |||||
@Query("Select * from DetalleConteo Where inventariopk = :inventariopk And conteopk= :conteopk and (cantidad is null or cantidad = 0) Order by folio") | |||||
public abstract LiveData<List<DetalleConteo>> livePendiente_Detalles(Integer inventariopk, Integer conteopk); | |||||
@Query("Select * from DetalleConteo Where inventariopk = :inventariopk And conteopk= :conteopk ") | |||||
public abstract List<DetalleConteo> listContados_Detalles(Integer inventariopk, Integer conteopk); | |||||
@Query("Select * from DetalleConteo Where inventariopk = :inventariopk And conteopk= :conteopk and (CASE WHEN Cantidad IS NULL THEN 0 ELSE Cantidad END) <> 0 Order by folio") | |||||
public abstract LiveData<List<DetalleConteo>> liveAvance_Detalles(Integer inventariopk, Integer conteopk ); | |||||
@Insert | |||||
public abstract void insertDetalleConteos(DetalleConteo... detalleConteos); | |||||
@Insert | |||||
public abstract void isertDetalleConteo(DetalleConteo detalleConteo); | |||||
@Query("Update detalleconteo Set cantidad= :cantidad, enviado = :enviado, actualizado = :actualizado Where almacenpk = :almacen And conteopk = :conteo And folio = :folio And articulopk= :articulo And inventariopk = :inventariopk ") | |||||
public abstract void updateCantidad(BigDecimal cantidad,Integer almacen, Integer conteo, Integer folio,Integer articulo, int inventariopk, boolean actualizado, boolean enviado); | |||||
@Query("Select * From detalleconteo Where almacenpk = :almacen And conteopk = :conteo And folio = :folio And articulopk= :articulo And inventariopk = :inventariopk ") | |||||
public abstract Conteo exist(Integer almacen, Integer conteo, Integer folio,Integer articulo, Integer inventariopk); | |||||
@Query("Select * From detalleconteo Where almacenpk = :almacen And conteopk = :conteo And folio = :folio And articulopk= :articulo And inventariopk = :inventariopk And enviado = :enviado And actualizado = :actualizado") | |||||
public abstract Conteo existSinenviar(Integer almacen, Integer conteo, Integer folio,Integer articulo, Integer inventariopk, boolean enviado, boolean actualizado); | |||||
@Query("Select count(*) From detalleconteo Where conteopk = :conteo And inventariopk = :inventariopk And enviado = :enviado And actualizado = :actualizado") | |||||
public abstract int pendienteEnviar(Integer conteo, Integer inventariopk, boolean enviado, boolean actualizado); | |||||
@Query("Select * From detalleconteo Where conteopk = :conteo And inventariopk = :inventariopk And enviado = :enviado And actualizado = :actualizado") | |||||
public abstract List<DetalleConteo> lstpendienteEnviar(Integer conteo, Integer inventariopk, boolean enviado, boolean actualizado); | |||||
@Query("Update inventario Set estado= 'C'") | |||||
public abstract void updateInventarioN(); | |||||
@Delete | |||||
public abstract void deleteDetalleConteo(DetalleConteo detalleConteo); | |||||
@Query("Delete from detalleconteo where almacenpk = :almacen And conteopk = :conteo") | |||||
public abstract void clearConteo(Integer almacen, Integer conteo); | |||||
@Update | |||||
public abstract void updateDetalle(DetalleConteo detalleConteo); | |||||
@Transaction | |||||
public void setLoggedInUser(DetalleConteo detalleConteo, Conteo conteo ) { | |||||
deleteDetalleConteo(detalleConteo); | |||||
deleteConteo(conteo); | |||||
} | |||||
} |
@ -0,0 +1,20 @@ | |||||
package jumapacelaya.gob.mx.almacen.request; | |||||
public class DetalleRequest { | |||||
String imei; | |||||
Integer inventariopk; | |||||
Integer conteopk; | |||||
Integer foliopk; | |||||
public DetalleRequest(String imei, Integer inventariopk, Integer conteopk, Integer foliopk){ | |||||
this.imei = imei; | |||||
this.inventariopk = inventariopk; | |||||
this.conteopk = conteopk; | |||||
this.foliopk = foliopk; | |||||
} | |||||
} |
@ -0,0 +1,42 @@ | |||||
package jumapacelaya.gob.mx.almacen; | |||||
import android.content.Context; | |||||
import android.content.SharedPreferences; | |||||
import android.preference.PreferenceManager; | |||||
public class restAlmacen { | |||||
public String URL_conteos = ""; | |||||
public String URL_inventarios = ""; | |||||
public String URL_Articulos = ""; | |||||
public String URL_updateDetalle = ""; | |||||
public String BASE_URL = ""; | |||||
String server; | |||||
String port; | |||||
String servicio; | |||||
SharedPreferences pref; | |||||
public static restAlmacen instance(Context context){ | |||||
restAlmacen rest = new restAlmacen(); | |||||
SharedPreferences pref;// = PreferenceManager.getDefaultSharedPreferences(context); | |||||
pref = PreferenceManager.getDefaultSharedPreferences(context); | |||||
rest.server = pref.getString("server_text", "172.16.0.9"); | |||||
rest.port = pref.getString("port_text", "85"); | |||||
rest.servicio = pref.getString("servicio_text",""); | |||||
rest.BASE_URL = "http://"+rest.server+":"+rest.port+ (rest.servicio.equals("")?"" : "/" + rest.servicio); | |||||
rest.URL_inventarios = rest.BASE_URL + "/rest/almservice/listInventarios"; // Muestra los invnetarios activos de un almacen | |||||
rest.URL_conteos = rest.BASE_URL + "/rest/almservice/listConteos"; // Muestra la lista de conteos | |||||
rest.URL_Articulos = rest.BASE_URL + "/rest/almservice/listConteoArticulo"; //muestra los articulos del conteo | |||||
rest.URL_updateDetalle = rest.BASE_URL + "/rest/almservice/saveFolio"; //Actualiza el inventario con los conteos realizados. | |||||
rest.BASE_URL = "http://"+rest.server+":"+rest.port+ (rest.servicio.equals("")?"" : "/" + rest.servicio); | |||||
return rest; | |||||
} | |||||
} |
@ -0,0 +1,28 @@ | |||||
package jumapacelaya.gob.mx.almacen; | |||||
import android.app.Activity; | |||||
import android.content.Intent; | |||||
import android.os.Handler; | |||||
import androidx.appcompat.app.AppCompatActivity; | |||||
import android.os.Bundle; | |||||
public class splash extends Activity { | |||||
private final int SPLASH_DISPLAY_LENGHT = 3000; | |||||
@Override | |||||
protected void onCreate(Bundle savedInstanceState) { | |||||
super.onCreate(savedInstanceState); | |||||
setContentView(R.layout.activity_splash); | |||||
new Handler().postDelayed(new Runnable(){ | |||||
@Override | |||||
public void run() { | |||||
/* Create an Intent that will start the Menu-Activity. */ | |||||
Intent mainIntent = new Intent(splash.this,ConteoActivity.class); | |||||
splash.this.startActivity(mainIntent); | |||||
splash.this.finish(); | |||||
} | |||||
}, SPLASH_DISPLAY_LENGHT); | |||||
} | |||||
} |
@ -0,0 +1,10 @@ | |||||
package jumapacelaya.gob.mx.almacen.ui.main; | |||||
import com.journeyapps.barcodescanner.CaptureActivity; | |||||
public class CaptureActivityPortrait extends CaptureActivity { | |||||
//Nothing in side. | |||||
} |
@ -0,0 +1,8 @@ | |||||
package jumapacelaya.gob.mx.almacen.ui.main; | |||||
public class Constant { | |||||
public static String CONTEODET = "conteodet"; | |||||
} | |||||
@ -0,0 +1,18 @@ | |||||
package jumapacelaya.gob.mx.almacen.ui.main; | |||||
import androidx.lifecycle.MutableLiveData; | |||||
import androidx.lifecycle.ViewModel; | |||||
public class PageViewModel extends ViewModel { | |||||
private MutableLiveData<Integer> mIndex = new MutableLiveData<>(); | |||||
//private LiveData<String> mText = Transformations.map(mIndex, (Function<Integer, String>) input -> "Hello world from section: " + input); | |||||
public void setIndex(int index) { | |||||
mIndex.setValue(index); | |||||
} | |||||
/*public LiveData<String> getText() { | |||||
return mText; | |||||
}*/ | |||||
} |
@ -0,0 +1,124 @@ | |||||
package jumapacelaya.gob.mx.almacen.ui.main; | |||||
import androidx.annotation.NonNull; | |||||
import androidx.lifecycle.ViewModelProviders; | |||||
import android.content.Context; | |||||
import android.os.Bundle; | |||||
import androidx.fragment.app.Fragment; | |||||
import androidx.recyclerview.widget.LinearLayoutManager; | |||||
import androidx.recyclerview.widget.RecyclerView; | |||||
import android.view.LayoutInflater; | |||||
import android.view.View; | |||||
import android.view.ViewGroup; | |||||
import jumapacelaya.gob.mx.almacen.MainActivity; | |||||
import jumapacelaya.gob.mx.almacen.R; | |||||
import jumapacelaya.gob.mx.almacen.bean.Conteo; | |||||
import jumapacelaya.gob.mx.almacen.bean.DetalleConteo; | |||||
import jumapacelaya.gob.mx.almacen.dao.PostViewModel; | |||||
/** | |||||
* A fragment representing a list of Items. | |||||
* <p/> | |||||
* Activities containing this fragment MUST implement the {@link OnListFragmentInteractionListener} | |||||
* interface. | |||||
*/ | |||||
public class PendienteFragment extends Fragment { | |||||
// TODO: Customize parameter argument names | |||||
private static final String ARG_COLUMN_COUNT = "column-count"; | |||||
// TODO: Customize parameters | |||||
private int mColumnCount = 1; | |||||
PostViewModel postViewModel; | |||||
PendienteViewAdapter adapter; | |||||
Conteo conteo; | |||||
MainActivity activity; | |||||
private OnListFragmentInteractionListener mListener; | |||||
/** | |||||
* Mandatory empty constructor for the fragment manager to instantiate the | |||||
* fragment (e.g. upon screen orientation changes). | |||||
*/ | |||||
public PendienteFragment() { | |||||
} | |||||
// TODO: Customize parameter initialization | |||||
@SuppressWarnings("unused") | |||||
public static PendienteFragment newInstance(int columnCount, Conteo conteo, MainActivity activity) { | |||||
PendienteFragment fragment = new PendienteFragment(); | |||||
Bundle args = new Bundle(); | |||||
args.putInt(ARG_COLUMN_COUNT, columnCount); | |||||
fragment.setArguments(args); | |||||
fragment.conteo = conteo; | |||||
fragment.activity = activity; | |||||
return fragment; | |||||
} | |||||
@Override | |||||
public void onCreate(Bundle savedInstanceState) { | |||||
super.onCreate(savedInstanceState); | |||||
postViewModel = ViewModelProviders.of(this).get(PostViewModel.class); | |||||
if (getArguments() != null) { | |||||
mColumnCount = getArguments().getInt(ARG_COLUMN_COUNT); | |||||
} | |||||
} | |||||
@Override | |||||
public View onCreateView(LayoutInflater inflater, ViewGroup container, | |||||
Bundle savedInstanceState) { | |||||
View view = inflater.inflate(R.layout.fragment_item_list, container, false); | |||||
// Set the adapter | |||||
if (view instanceof RecyclerView) { | |||||
Context context = view.getContext(); | |||||
RecyclerView recyclerView = (RecyclerView) view; | |||||
//if (mColumnCount <= 1) { | |||||
recyclerView.setLayoutManager(new LinearLayoutManager(context)); | |||||
//} else { | |||||
// recyclerView.setLayoutManager(new GridLayoutManager(context, mColumnCount)); | |||||
//} | |||||
adapter = new PendienteViewAdapter( mListener); | |||||
postViewModel.getPendientesConteo(conteo.getInventariopk(),conteo.getConteopk()).observe(getViewLifecycleOwner(), detalleConteos -> adapter.setData(detalleConteos)); | |||||
recyclerView.setAdapter(adapter); | |||||
} | |||||
return view; | |||||
} | |||||
@Override | |||||
public void onAttach(@NonNull Context context) { | |||||
super.onAttach(context); | |||||
if (context instanceof OnListFragmentInteractionListener) { | |||||
mListener = (OnListFragmentInteractionListener) context; | |||||
} else { | |||||
throw new RuntimeException(context.toString() | |||||
+ " must implement OnListFragmentInteractionListener"); | |||||
} | |||||
} | |||||
@Override | |||||
public void onDetach() { | |||||
super.onDetach(); | |||||
mListener = null; | |||||
} | |||||
/** | |||||
* This interface must be implemented by activities that contain this | |||||
* fragment to allow an interaction in this fragment to be communicated | |||||
* to the activity and potentially other fragments contained in that | |||||
* activity. | |||||
* <p/> | |||||
* See the Android Training lesson <a href= | |||||
* "http://developer.android.com/training/basics/fragments/communicating.html" | |||||
* >Communicating with Other Fragments</a> for more information. | |||||
*/ | |||||
public interface OnListFragmentInteractionListener { | |||||
// TODO: Update argument type and name | |||||
void onListFragmentInteraction(DetalleConteo item); | |||||
} | |||||
} |
@ -0,0 +1,88 @@ | |||||
package jumapacelaya.gob.mx.almacen.ui.main; | |||||
import androidx.recyclerview.widget.RecyclerView; | |||||
import android.view.LayoutInflater; | |||||
import android.view.View; | |||||
import android.view.ViewGroup; | |||||
import android.widget.TextView; | |||||
import jumapacelaya.gob.mx.almacen.R; | |||||
import jumapacelaya.gob.mx.almacen.bean.DetalleConteo; | |||||
import jumapacelaya.gob.mx.almacen.ui.main.PendienteFragment.OnListFragmentInteractionListener; | |||||
import java.util.ArrayList; | |||||
import java.util.List; | |||||
/** | |||||
* {@link RecyclerView.Adapter} that can display a {@link DetalleConteo} and makes a call to the | |||||
* specified {@link OnListFragmentInteractionListener}. | |||||
* TODO: Replace the implementation with code for your data type. | |||||
*/ | |||||
public class PendienteViewAdapter extends RecyclerView.Adapter<PendienteViewAdapter.ViewHolder> { | |||||
private List<DetalleConteo> mValues; | |||||
private final OnListFragmentInteractionListener mListener; | |||||
public PendienteViewAdapter(OnListFragmentInteractionListener listener) { | |||||
mValues = new ArrayList<>(); | |||||
mListener = listener; | |||||
} | |||||
@Override | |||||
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { | |||||
View view = LayoutInflater.from(parent.getContext()) | |||||
.inflate(R.layout.fragment_item, parent, false); | |||||
return new ViewHolder(view); | |||||
} | |||||
@Override | |||||
public void onBindViewHolder(final ViewHolder holder, int position) { | |||||
holder.mItem = mValues.get(position); | |||||
holder.mIdView.setText(mValues.get(position).getFolio().toString()); | |||||
holder.mContentView.setText(mValues.get(position).getDescArticulo()); | |||||
holder.mclave.setText(mValues.get(position).getClave()); | |||||
holder.mcantidad.setText(mValues.get(position).getCantidad().toString()); | |||||
holder.mView.setOnClickListener(v -> { | |||||
if (null != mListener) { | |||||
// Notify the active callbacks interface (the activity, if the | |||||
// fragment is attached to one) that an item has been selected. | |||||
mListener.onListFragmentInteraction(holder.mItem); | |||||
} | |||||
}); | |||||
} | |||||
@Override | |||||
public int getItemCount() { | |||||
return mValues.size(); | |||||
} | |||||
public void setData(List<DetalleConteo> newData) { | |||||
this.mValues = newData; | |||||
notifyDataSetChanged(); | |||||
} | |||||
public class ViewHolder extends RecyclerView.ViewHolder { | |||||
public final View mView; | |||||
public final TextView mIdView; | |||||
public final TextView mContentView; | |||||
public final TextView mclave; | |||||
public final TextView mcantidad; | |||||
public DetalleConteo mItem; | |||||
public ViewHolder(View view) { | |||||
super(view); | |||||
mView = view; | |||||
mIdView = view.findViewById(R.id.item_number); | |||||
mContentView = view.findViewById(R.id.content); | |||||
mclave = view.findViewById(R.id.item_clave); | |||||
mcantidad = view.findViewById(R.id.item_cantidad); | |||||
} | |||||
@Override | |||||
public String toString() { | |||||
return super.toString() + " '" + mContentView.getText() + "'"; | |||||
} | |||||
} | |||||
} |
@ -0,0 +1,363 @@ | |||||
package jumapacelaya.gob.mx.almacen.ui.main; | |||||
import android.app.Activity; | |||||
import android.app.Dialog; | |||||
import androidx.lifecycle.ViewModelProviders; | |||||
import android.content.ActivityNotFoundException; | |||||
import android.content.Context; | |||||
import android.content.DialogInterface; | |||||
import android.content.Intent; | |||||
import android.graphics.Color; | |||||
import android.net.Uri; | |||||
import android.os.AsyncTask; | |||||
import android.os.Bundle; | |||||
import androidx.annotation.NonNull; | |||||
import androidx.fragment.app.Fragment; | |||||
import androidx.appcompat.app.AlertDialog; | |||||
import android.os.Handler; | |||||
import android.os.Looper; | |||||
import android.text.util.Linkify; | |||||
import android.util.Log; | |||||
import android.view.LayoutInflater; | |||||
import android.view.View; | |||||
import android.view.ViewGroup; | |||||
import android.view.inputmethod.InputMethodManager; | |||||
import android.widget.Button; | |||||
import android.widget.EditText; | |||||
import android.widget.TextView; | |||||
import android.widget.Toast; | |||||
import com.android.volley.Request; | |||||
import com.android.volley.RequestQueue; | |||||
import com.android.volley.toolbox.JsonObjectRequest; | |||||
import com.android.volley.toolbox.Volley; | |||||
import com.google.android.material.snackbar.Snackbar; | |||||
import com.google.gson.Gson; | |||||
import com.google.gson.GsonBuilder; | |||||
import com.google.zxing.integration.android.IntentIntegrator; | |||||
import com.google.zxing.integration.android.IntentResult; | |||||
import org.json.JSONException; | |||||
import org.json.JSONObject; | |||||
import java.math.BigDecimal; | |||||
import java.util.List; | |||||
import java.util.concurrent.ExecutorService; | |||||
import java.util.concurrent.Executors; | |||||
import jumapacelaya.gob.mx.almacen.ConteoActivity; | |||||
import jumapacelaya.gob.mx.almacen.InventarioService; | |||||
import jumapacelaya.gob.mx.almacen.MainActivity; | |||||
import jumapacelaya.gob.mx.almacen.R; | |||||
import jumapacelaya.gob.mx.almacen.bean.ArticuloScan; | |||||
import jumapacelaya.gob.mx.almacen.bean.Conteo; | |||||
import jumapacelaya.gob.mx.almacen.bean.DetalleConteo; | |||||
import jumapacelaya.gob.mx.almacen.dao.AppDatabase; | |||||
import jumapacelaya.gob.mx.almacen.dao.inventarioDao; | |||||
import jumapacelaya.gob.mx.almacen.restAlmacen; | |||||
import retrofit2.Call; | |||||
import retrofit2.Callback; | |||||
import retrofit2.Response; | |||||
import retrofit2.Retrofit; | |||||
import retrofit2.converter.gson.GsonConverterFactory; | |||||
import static android.app.ProgressDialog.show; | |||||
import static android.widget.Toast.LENGTH_SHORT; | |||||
import static androidx.core.content.ContextCompat.getSystemService; | |||||
/** | |||||
* A placeholder fragment containing a simple view. | |||||
*/ | |||||
public class PlaceholderFragment extends Fragment { | |||||
private static final String ARG_SECTION_NUMBER = "section_number"; | |||||
static final String SCAN = "com.google.zxing.client.android"; | |||||
private PageViewModel pageViewModel; | |||||
TextView txtfolio; | |||||
TextView txtclave; | |||||
TextView txtarticulo; | |||||
TextView txtfamilia; | |||||
TextView txtsubfamilia; | |||||
EditText txtCantidad; | |||||
Button btnAceptar; | |||||
DetalleConteo detalle; | |||||
MainActivity activity; | |||||
Conteo conteo; | |||||
//ImageView code; | |||||
public PlaceholderFragment() { | |||||
} | |||||
public static PlaceholderFragment newInstance(int index, Conteo conteo, MainActivity activity) { | |||||
PlaceholderFragment fragment = new PlaceholderFragment(); | |||||
Bundle bundle = new Bundle(); | |||||
bundle.putInt(ARG_SECTION_NUMBER, index); | |||||
fragment.setArguments(bundle); | |||||
fragment.conteo = conteo; | |||||
fragment.activity = activity; | |||||
return fragment; | |||||
} | |||||
@Override | |||||
public void onCreate(Bundle savedInstanceState) { | |||||
super.onCreate(savedInstanceState); | |||||
pageViewModel = ViewModelProviders.of(this).get(PageViewModel.class); | |||||
int index = 1; | |||||
if (getArguments() != null) { | |||||
index = getArguments().getInt(ARG_SECTION_NUMBER); | |||||
} | |||||
pageViewModel.setIndex(index); | |||||
} | |||||
@Override | |||||
public View onCreateView( | |||||
@NonNull LayoutInflater inflater, ViewGroup container, | |||||
Bundle savedInstanceState) { | |||||
View root = inflater.inflate(R.layout.fragment_main, container, false); | |||||
//controles | |||||
txtfolio = root.findViewById(R.id.txtcap_folio); | |||||
txtclave = root.findViewById(R.id.txtcap_clave); | |||||
txtarticulo = root.findViewById(R.id.txtcap_articulo); | |||||
//code = root.findViewById(R.id.imageView); | |||||
txtfamilia = root.findViewById(R.id.txtcap_descfamilia); | |||||
txtsubfamilia= root.findViewById(R.id.txtcap_subfamilia); | |||||
txtCantidad= root.findViewById(R.id.txtcap_Cantidad); | |||||
btnAceptar = root.findViewById(R.id.btncap_aceptar); | |||||
btnAceptar.setOnClickListener(event -> { | |||||
//guardar y enviar los datos | |||||
if(txtCantidad.getText().toString().trim().equals("")){ | |||||
Toast.makeText(getContext(), "El valor de cantidad no es valido", LENGTH_SHORT).show(); | |||||
return; | |||||
} | |||||
saveconteo(); | |||||
}); | |||||
/*pageViewModel.getText().observe(this, new Observer<String>() { | |||||
@Override | |||||
public void onChanged(@Nullable String s) { | |||||
//textView.setText(s); | |||||
} | |||||
});*/ | |||||
return root; | |||||
} | |||||
/*@Override | |||||
public void onActivityResult(int requestCode, int resultCode, Intent intent) { | |||||
try { | |||||
final IntentResult scanResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, intent); | |||||
if(scanResult != null) | |||||
handleResult(scanResult); | |||||
else | |||||
super.onActivityResult(requestCode, resultCode, intent); | |||||
}catch (Exception ex){ | |||||
Toast.makeText(getContext(), ex.getMessage(), LENGTH_SHORT).show(); | |||||
} | |||||
} | |||||
private void handleResult(IntentResult scanResult) { | |||||
if (scanResult != null) { | |||||
Gson gson = new Gson(); | |||||
ArticuloScan articuloScan = gson.fromJson(scanResult.getContents(), ArticuloScan.class); | |||||
if(articuloScan != null){ | |||||
final inventarioDao db = AppDatabase.getAppDatabaseDB(getContext()).inventarioDao(); | |||||
//consultar bae de datos | |||||
ExecutorService executor = Executors.newSingleThreadExecutor(); | |||||
Handler handler = new Handler(Looper.getMainLooper()); | |||||
executor.execute(() -> { | |||||
detalle = db.getDetalleID(conteo.getInventariopk(), conteo.getConteopk(), articuloScan.getArticuloID()); | |||||
handler.post(() -> { | |||||
updateUITextViews(detalle); | |||||
}); | |||||
}); | |||||
}else{ | |||||
Toast.makeText(getContext(), "Información Incorrecta :(", LENGTH_SHORT).show(); | |||||
} | |||||
} else { | |||||
Toast.makeText(getContext(), "No se ha leído nada :(", LENGTH_SHORT).show(); | |||||
} | |||||
}*/ | |||||
private void updateUITextViews(DetalleConteo d) { | |||||
txtfolio.setText(d.getFolio()); | |||||
txtclave.setText(d.getClave()); | |||||
txtarticulo.setText(d.getArticulopk()); | |||||
Linkify.addLinks(txtfolio, Linkify.ALL); | |||||
} | |||||
private Dialog showDialog (final Activity act, CharSequence title, CharSequence message, CharSequence yes, CharSequence no ) { | |||||
// a subclass of dialog that can display buttons and message | |||||
AlertDialog.Builder download = new AlertDialog.Builder( act ); | |||||
download.setTitle( title ); | |||||
download.setMessage ( message ); | |||||
download.setPositiveButton ( yes, new DialogInterface.OnClickListener ( ) { | |||||
@Override | |||||
public void onClick( DialogInterface dialog, int i ) { | |||||
// TODO Auto-generated method stub | |||||
//uri to download barcode scanner | |||||
Uri uri = Uri.parse( "market://search?q=pname:" + "com.google.zxing.client.android" ); | |||||
Intent in = new Intent ( Intent.ACTION_VIEW, uri ); | |||||
try { | |||||
act.startActivity ( in ); | |||||
} catch ( ActivityNotFoundException e) { | |||||
} | |||||
} | |||||
}); | |||||
download.setNegativeButton ( no, new DialogInterface.OnClickListener() { | |||||
@Override | |||||
public void onClick ( DialogInterface dialog, int i ) { | |||||
// TODO Auto-generated method stub | |||||
} | |||||
}); | |||||
return download.show(); | |||||
} | |||||
//recibir datos | |||||
public void displayReceivedData(DetalleConteo detalle) | |||||
{ | |||||
this.detalle = detalle; | |||||
txtfolio.setText(detalle.getFolio().toString()); | |||||
txtclave.setText(detalle.getClave()); | |||||
txtarticulo.setText(detalle.getDescArticulo()); | |||||
txtfamilia.setText(detalle.getDescFamilia()); | |||||
txtsubfamilia.setText(detalle.getDescSubFamilia()); | |||||
txtCantidad.setText(detalle.getCantidad() == null ? "0.0": detalle.getCantidad().toString()); | |||||
//txtCantidad.requestFocus(); | |||||
txtCantidad.selectAll(); | |||||
InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE); | |||||
imm.showSoftInput(txtCantidad, InputMethodManager.SHOW_IMPLICIT); | |||||
Toast.makeText(getContext(),detalle.getDescArticulo(), LENGTH_SHORT).show(); | |||||
} | |||||
private void saveconteo(){ | |||||
if(detalle != null) { | |||||
detalle.setCantidad(new BigDecimal(txtCantidad.getText().toString())); | |||||
detalle.setEnviado(false); | |||||
new UpdateTask().execute(detalle); | |||||
} | |||||
} | |||||
private void updateServerDetalle(inventarioDao db, DetalleConteo d){ | |||||
final Activity thisactivity = getActivity(); | |||||
GsonBuilder builder = new GsonBuilder(); | |||||
builder.excludeFieldsWithoutExposeAnnotation(); | |||||
Retrofit retrofit = new Retrofit.Builder() | |||||
.baseUrl(restAlmacen.instance(activity).BASE_URL) | |||||
.addConverterFactory(GsonConverterFactory.create(builder.create())) | |||||
.build(); | |||||
InventarioService postService = retrofit.create(InventarioService.class); | |||||
Call<Void> call = postService.updateDetalle(d); | |||||
call.enqueue(new Callback<>() { | |||||
@Override | |||||
public void onResponse(@NonNull Call<Void> call, @NonNull Response<Void> response) { | |||||
ExecutorService executor = Executors.newSingleThreadExecutor(); | |||||
Handler handler = new Handler(Looper.getMainLooper()); | |||||
executor.execute(() -> { | |||||
String msg = ""; | |||||
boolean flag = false; | |||||
if (response.code() == 200){ | |||||
flag = true; | |||||
d.setEnviado(true); | |||||
db.updateDetalle(d); | |||||
} | |||||
boolean finalFlag = flag; | |||||
String finalMsg = msg; | |||||
handler.post(() -> { | |||||
//if (finalFlag) | |||||
//Toast.makeText(thisactivity, "Articulo enviado", Toast.LENGTH_LONG).show(); | |||||
activity.refreshBadge(); | |||||
}); | |||||
}); | |||||
} | |||||
@Override | |||||
public void onFailure(Call<Void> call, Throwable t) { | |||||
//Toast.makeText(thisactivity, t.getMessage(), Toast.LENGTH_LONG).show(); | |||||
activity.refreshBadge(); | |||||
} | |||||
}); | |||||
} | |||||
private class UpdateTask extends AsyncTask<DetalleConteo, Void, Integer> { | |||||
Boolean tag = false; | |||||
/* | |||||
Ejecución del ordenamiento y transmision de progreso | |||||
*/ | |||||
@Override | |||||
protected Integer doInBackground(DetalleConteo... params) { | |||||
final inventarioDao db = AppDatabase.getAppDatabaseDB(getContext()).inventarioDao(); | |||||
int i = 0; | |||||
for (DetalleConteo d:params) { | |||||
d.setActualizado(true); | |||||
d.setEnviado(false); | |||||
db.updateCantidad(d.getCantidad(), d.getAlmacenpk(), d.getConteopk(), d.getFolio(), d.getArticulopk(), d.getInventariopk(), d.getActualizado(), d.getEnviado()); | |||||
tag = true; | |||||
i++; | |||||
} | |||||
for (DetalleConteo d:params) { | |||||
//update server | |||||
updateServerDetalle(db, d); | |||||
} | |||||
//si ho hay error | |||||
activity.refreshBadge(); | |||||
return i; | |||||
} | |||||
@Override | |||||
protected void onPostExecute(Integer integer) { | |||||
if(tag) | |||||
Snackbar.make(activity.getCurrentFocus(), "Guardado", Snackbar.LENGTH_LONG) | |||||
.setBackgroundTint(Color.parseColor("#008000")) | |||||
.setActionTextColor(Color.parseColor("#000000")) | |||||
.show(); | |||||
} | |||||
} | |||||
} |
@ -0,0 +1,65 @@ | |||||
package jumapacelaya.gob.mx.almacen.ui.main; | |||||
import android.content.Context; | |||||
import androidx.annotation.Nullable; | |||||
import androidx.annotation.StringRes; | |||||
import androidx.fragment.app.Fragment; | |||||
import androidx.fragment.app.FragmentManager; | |||||
import androidx.fragment.app.FragmentPagerAdapter; | |||||
import jumapacelaya.gob.mx.almacen.MainActivity; | |||||
import jumapacelaya.gob.mx.almacen.R; | |||||
import jumapacelaya.gob.mx.almacen.ui.main.avance.AvanceFragment; | |||||
/** | |||||
* A [FragmentPagerAdapter] that returns a fragment corresponding to | |||||
* one of the sections/tabs/pages. | |||||
*/ | |||||
public class SectionsPagerAdapter extends FragmentPagerAdapter { | |||||
@StringRes | |||||
private static final int[] TAB_TITLES = new int[]{R.string.tab_captura,R.string.tab_Avance, R.string.tab_Pendietnes}; | |||||
private final Context mContext; | |||||
public SectionsPagerAdapter(Context context, FragmentManager fm) { | |||||
super(fm); | |||||
mContext = context; | |||||
} | |||||
@Override | |||||
public Fragment getItem(int position) { | |||||
// getItem is called to instantiate the fragment for the given page. | |||||
// Return a PlaceholderFragment (defined as a static inner class below). | |||||
Fragment fragment; | |||||
switch (position){ | |||||
case 0: | |||||
fragment = PlaceholderFragment.newInstance(position + 1, ((MainActivity)mContext).getConteo(), (MainActivity)mContext); | |||||
break; | |||||
case 2: | |||||
fragment = PendienteFragment.newInstance(position , ((MainActivity)mContext).getConteo(), (MainActivity)mContext); | |||||
break; | |||||
case 1: | |||||
fragment = AvanceFragment.newInstance(position , ((MainActivity)mContext).getConteo(), (MainActivity)mContext); | |||||
break; | |||||
default: | |||||
throw new IllegalStateException("Unexpected value: " + position); | |||||
} | |||||
return fragment; | |||||
} | |||||
@Nullable | |||||
@Override | |||||
public CharSequence getPageTitle(int position) { | |||||
return mContext.getResources().getString(TAB_TITLES[position]); | |||||
} | |||||
@Override | |||||
public int getCount() { | |||||
// Show 2 total pages. | |||||
return 3; | |||||
} | |||||
} |
@ -0,0 +1,124 @@ | |||||
package jumapacelaya.gob.mx.almacen.ui.main.avance; | |||||
import androidx.lifecycle.ViewModelProviders; | |||||
import android.content.Context; | |||||
import android.os.Bundle; | |||||
import androidx.fragment.app.Fragment; | |||||
import androidx.recyclerview.widget.LinearLayoutManager; | |||||
import androidx.recyclerview.widget.RecyclerView; | |||||
import android.view.LayoutInflater; | |||||
import android.view.View; | |||||
import android.view.ViewGroup; | |||||
import jumapacelaya.gob.mx.almacen.MainActivity; | |||||
import jumapacelaya.gob.mx.almacen.R; | |||||
import jumapacelaya.gob.mx.almacen.bean.Conteo; | |||||
import jumapacelaya.gob.mx.almacen.bean.DetalleConteo; | |||||
import jumapacelaya.gob.mx.almacen.dao.PostViewModel; | |||||
/** | |||||
* A fragment representing a list of Items. | |||||
* <p/> | |||||
* Activities containing this fragment MUST implement the {@link OnListAvanceFragmentInteractionListener} | |||||
* interface. | |||||
*/ | |||||
public class AvanceFragment extends Fragment { | |||||
// TODO: Customize parameter argument names | |||||
private static final String ARG_COLUMN_COUNT = "column-count"; | |||||
// TODO: Customize parameters | |||||
private int mColumnCount = 1; | |||||
PostViewModel postViewModel; | |||||
AvanceViewAdapter adapter; | |||||
Conteo conteo; | |||||
MainActivity activity; | |||||
private OnListAvanceFragmentInteractionListener mListener; | |||||
/** | |||||
* Mandatory empty constructor for the fragment manager to instantiate the | |||||
* fragment (e.g. upon screen orientation changes). | |||||
*/ | |||||
public AvanceFragment() { | |||||
} | |||||
// TODO: Customize parameter initialization | |||||
@SuppressWarnings("unused") | |||||
public static AvanceFragment newInstance(int columnCount, Conteo conteo, MainActivity activity) { | |||||
AvanceFragment fragment = new AvanceFragment(); | |||||
Bundle args = new Bundle(); | |||||
args.putInt(ARG_COLUMN_COUNT, columnCount); | |||||
fragment.setArguments(args); | |||||
fragment.conteo = conteo; | |||||
fragment.activity = activity; | |||||
return fragment; | |||||
} | |||||
@Override | |||||
public void onCreate(Bundle savedInstanceState) { | |||||
super.onCreate(savedInstanceState); | |||||
postViewModel = ViewModelProviders.of(this).get(PostViewModel.class); | |||||
if (getArguments() != null) { | |||||
mColumnCount = getArguments().getInt(ARG_COLUMN_COUNT); | |||||
} | |||||
} | |||||
@Override | |||||
public View onCreateView(LayoutInflater inflater, ViewGroup container, | |||||
Bundle savedInstanceState) { | |||||
View view = inflater.inflate(R.layout.fragment_item_avance_list, container, false); | |||||
// Set the adapter | |||||
if (view instanceof RecyclerView) { | |||||
Context context = view.getContext(); | |||||
RecyclerView recyclerView = (RecyclerView) view; | |||||
//if (mColumnCount <= 1) { | |||||
recyclerView.setLayoutManager(new LinearLayoutManager(context)); | |||||
//} else { | |||||
// recyclerView.setLayoutManager(new GridLayoutManager(context, mColumnCount)); | |||||
//} | |||||
adapter = new AvanceViewAdapter(mListener); | |||||
postViewModel.getAvanceConteo(conteo.getInventariopk(),conteo.getConteopk()).observe(getViewLifecycleOwner(), detalleConteos -> adapter.setData(detalleConteos)); | |||||
recyclerView.setAdapter(adapter); | |||||
} | |||||
return view; | |||||
} | |||||
@Override | |||||
public void onAttach(Context context) { | |||||
super.onAttach(context); | |||||
if (context instanceof OnListAvanceFragmentInteractionListener) { | |||||
mListener = (OnListAvanceFragmentInteractionListener) context; | |||||
} else { | |||||
throw new RuntimeException(context.toString() | |||||
+ " must implement OnListFragmentInteractionListener"); | |||||
} | |||||
} | |||||
@Override | |||||
public void onDetach() { | |||||
super.onDetach(); | |||||
mListener = null; | |||||
} | |||||
/** | |||||
* This interface must be implemented by activities that contain this | |||||
* fragment to allow an interaction in this fragment to be communicated | |||||
* to the activity and potentially other fragments contained in that | |||||
* activity. | |||||
* <p/> | |||||
* See the Android Training lesson <a href= | |||||
* "http://developer.android.com/training/basics/fragments/communicating.html" | |||||
* >Communicating with Other Fragments</a> for more information. | |||||
*/ | |||||
public interface OnListAvanceFragmentInteractionListener { | |||||
// TODO: Update argument type and name | |||||
void onListAvanceFragmentInteraction(DetalleConteo item); | |||||
} | |||||
} |
@ -0,0 +1,95 @@ | |||||
package jumapacelaya.gob.mx.almacen.ui.main.avance; | |||||
import androidx.recyclerview.widget.RecyclerView; | |||||
import android.graphics.Color; | |||||
import android.view.LayoutInflater; | |||||
import android.view.View; | |||||
import android.view.ViewGroup; | |||||
import android.widget.TextView; | |||||
import java.util.ArrayList; | |||||
import java.util.List; | |||||
import jumapacelaya.gob.mx.almacen.R; | |||||
import jumapacelaya.gob.mx.almacen.bean.DetalleConteo; | |||||
/** | |||||
* {@link RecyclerView.Adapter} that can display a {@link DetalleConteo} and makes a call to the | |||||
* specified {@link AvanceFragment.OnListAvanceFragmentInteractionListener}. | |||||
* TODO: Replace the implementation with code for your data type. | |||||
*/ | |||||
public class AvanceViewAdapter extends RecyclerView.Adapter<AvanceViewAdapter.ViewHolder> { | |||||
private List<DetalleConteo> mValues; | |||||
private final AvanceFragment.OnListAvanceFragmentInteractionListener mListener; | |||||
public AvanceViewAdapter(AvanceFragment.OnListAvanceFragmentInteractionListener listener) { | |||||
mValues = new ArrayList<>(); | |||||
mListener = listener; | |||||
} | |||||
@Override | |||||
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { | |||||
View view = LayoutInflater.from(parent.getContext()) | |||||
.inflate(R.layout.fragment_avance_item, parent, false); | |||||
return new ViewHolder(view); | |||||
} | |||||
@Override | |||||
public void onBindViewHolder(final ViewHolder holder, int position) { | |||||
holder.mItem = mValues.get(position); | |||||
holder.mIdView.setText(mValues.get(position).getFolio().toString()); | |||||
holder.mContentView.setText(mValues.get(position).getDescArticulo()); | |||||
holder.mclave.setText(mValues.get(position).getClave()); | |||||
holder.mCantidad.setText(mValues.get(position).getCantidad().toString()); | |||||
if(!mValues.get(position).getEnviado() && mValues.get(position).getActualizado()) { | |||||
holder.mclave.setBackgroundColor(Color.parseColor("#9b2226")); | |||||
}else{ | |||||
holder.mclave.setBackgroundColor(Color.parseColor("#FFFFFF")); | |||||
} | |||||
holder.mView.setOnClickListener(v -> { | |||||
if (null != mListener) { | |||||
// Notify the active callbacks interface (the activity, if the | |||||
// fragment is attached to one) that an item has been selected. | |||||
mListener.onListAvanceFragmentInteraction(holder.mItem); | |||||
} | |||||
}); | |||||
} | |||||
@Override | |||||
public int getItemCount() { | |||||
return mValues.size(); | |||||
} | |||||
public void setData(List<DetalleConteo> newData) { | |||||
this.mValues = newData; | |||||
notifyDataSetChanged(); | |||||
} | |||||
public class ViewHolder extends RecyclerView.ViewHolder { | |||||
public final View mView; | |||||
public final TextView mIdView; | |||||
public final TextView mContentView; | |||||
public final TextView mclave; | |||||
public final TextView mCantidad; | |||||
public DetalleConteo mItem; | |||||
public ViewHolder(View view) { | |||||
super(view); | |||||
mView = view; | |||||
mIdView = view.findViewById(R.id.item_number); | |||||
mContentView = view.findViewById(R.id.content); | |||||
mclave = view.findViewById(R.id.item_clave); | |||||
mCantidad = view.findViewById(R.id.item_cantidad); | |||||
} | |||||
@Override | |||||
public String toString() { | |||||
return super.toString() + " '" + mContentView.getText() + "'"; | |||||
} | |||||
} | |||||
} |
@ -0,0 +1,229 @@ | |||||
package jumapacelaya.gob.mx.almacen.updatepp; | |||||
import android.content.Intent; | |||||
import android.net.Uri; | |||||
import android.os.Build; | |||||
import android.os.Bundle; | |||||
import android.os.Environment; | |||||
import android.os.Handler; | |||||
import androidx.core.content.FileProvider; | |||||
import androidx.appcompat.app.AppCompatActivity; | |||||
import android.view.View; | |||||
import android.widget.Button; | |||||
import android.widget.TextView; | |||||
import android.widget.Toast; | |||||
import com.google.zxing.client.android.BuildConfig; | |||||
import java.io.File; | |||||
import jumapacelaya.gob.mx.almacen.R; | |||||
public class AutoUpdateActivity extends AppCompatActivity { | |||||
// Handler para la actualización de la interfaz desde el hilo en segundo | |||||
// plano | |||||
private Handler handler = new Handler(); | |||||
// Objeto de nuestra clase de utilidad | |||||
private VersionCheck mVC = new VersionCheck(); | |||||
// Elementos de la interfaz | |||||
private View mActualizada, mActualizacion, mProgressBar; | |||||
private TextView mVersionActual, mVersionNueva; | |||||
private Button mObtenerDatos, mDescargar; | |||||
// Runnable que se ejecutará desde el hilo principal cuando termina la | |||||
// obtención de datos en segundo plano. Equivalente al onPostExecute() de AsyncTask | |||||
private Runnable finishBackgroundDownload = new Runnable() { | |||||
@Override | |||||
public void run() { | |||||
mProgressBar.setVisibility(View.GONE); | |||||
if(mVC.isNewVersionAvailable()){ | |||||
// Hay una nueva versión disponible | |||||
mActualizacion.setVisibility(View.VISIBLE); | |||||
mActualizada.setVisibility(View.GONE); | |||||
// Mostramos los datos | |||||
mVersionActual.setText("Versión actual: " + mVC.getCurrentVersionName()); | |||||
mVersionNueva.setText("Versión disponible: " + mVC.getLatestVersionName()); | |||||
}else{ | |||||
// La aplicación está actualizada | |||||
mActualizacion.setVisibility(View.GONE); | |||||
mActualizada.setVisibility(View.VISIBLE); | |||||
} | |||||
} | |||||
}; | |||||
// Runnable encargado de descargar los datos en un hilo en segundo plano. | |||||
// Equivalente al doInBackground() de AsyncTask | |||||
private Runnable backgroundDownload = new Runnable() { | |||||
@Override | |||||
public void run() { | |||||
mVC.getData(AutoUpdateActivity.this); | |||||
// Cuando acabe la descarga actualiza la interfaz | |||||
handler.post(finishBackgroundDownload); | |||||
} | |||||
}; | |||||
// Runnable encargado de descargar los datos en un hilo en segundo plano. | |||||
// Equivalente al doInBackground() de AsyncTask | |||||
private Runnable backgroundDownloadAPK = new Runnable() { | |||||
@Override | |||||
public void run() { | |||||
try { | |||||
File storageDir = getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS); | |||||
String pathapk = storageDir.getAbsolutePath() + "/almacen.apk"; //AutoUpdateActivity.this.getFilesDir() + "/lectura.apk"; | |||||
mVC.getDownloadURL(pathapk); | |||||
//final Uri uri = Uri.parse(pathapk); | |||||
//File toInstall = new File(pathapk); | |||||
File toInstall = new File(pathapk); | |||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { | |||||
Uri apkUri = FileProvider.getUriForFile(AutoUpdateActivity.this, BuildConfig.APPLICATION_ID + ".provider", toInstall); | |||||
Intent intent = new Intent(Intent.ACTION_INSTALL_PACKAGE); | |||||
intent.setData(apkUri); | |||||
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); | |||||
AutoUpdateActivity.this.startActivity(intent); | |||||
finish(); | |||||
} else { | |||||
Uri apkUri = Uri.fromFile(toInstall); | |||||
Intent intent = new Intent(Intent.ACTION_VIEW); | |||||
intent.setDataAndType(apkUri, "application/vnd.android.package-archive"); | |||||
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); | |||||
AutoUpdateActivity.this.startActivity(intent); | |||||
finish(); | |||||
} | |||||
///data/user/0/mx.gob.jumapacelaya.lecturas/files/lectura.apk | |||||
/*if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { | |||||
Uri contentUri = FileProvider.getUriForFile(getBaseContext(), BuildConfig.APPLICATION_ID + ".provider", new File(finalDestination)); | |||||
Intent openFileIntent = new Intent(Intent.ACTION_VIEW); | |||||
openFileIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); | |||||
openFileIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); | |||||
openFileIntent.setData(contentUri); | |||||
startActivity(openFileIntent); | |||||
finish(); | |||||
} else { | |||||
/*Uri apkUri = Uri.fromFile(new File(pathapk)); | |||||
Intent intent = new Intent(Intent.ACTION_VIEW); | |||||
intent.setDataAndType(apkUri, "application/vnd.android.package-archive"); | |||||
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK); | |||||
startActivity(intent); | |||||
finish(); | |||||
Uri apkUri = Uri.fromFile(new File(pathapk)); | |||||
Intent install = new Intent(Intent.ACTION_VIEW); | |||||
install.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); | |||||
install.setDataAndType(apkUri, | |||||
"application/vnd.android.package-archive"); | |||||
startActivity(install); | |||||
finish(); | |||||
}*/ | |||||
}catch (Exception ex){ | |||||
ex.printStackTrace(); | |||||
Toast t = Toast.makeText(getApplicationContext(), ex.getMessage(), Toast.LENGTH_LONG); | |||||
t.show(); | |||||
} | |||||
} | |||||
}; | |||||
@Override | |||||
public void onCreate(Bundle savedInstanceState) { | |||||
super.onCreate(savedInstanceState); | |||||
// Inicializa la interfaz | |||||
setContentView(R.layout.activity_auto_update); | |||||
mActualizada = findViewById(R.id.actualizada); | |||||
mActualizacion = findViewById(R.id.actualizacion); | |||||
mProgressBar = findViewById(R.id.progress_datos); | |||||
mDescargar = (Button)findViewById(R.id.bt_descarga); | |||||
mObtenerDatos = (Button)findViewById(R.id.bt_obtener_datos); | |||||
mVersionActual = (TextView)findViewById(R.id.actualizacion_version_actual); | |||||
mVersionNueva = (TextView)findViewById(R.id.actualizacion_version_nueva); | |||||
// Coloca listeners en los dos botones | |||||
mObtenerDatos.setOnClickListener(new View.OnClickListener() { | |||||
@Override | |||||
public void onClick(View v) { | |||||
// Crea un nuevo hilo para descargar los datos | |||||
mProgressBar.setVisibility(View.VISIBLE); | |||||
Thread downloadThread = new Thread(backgroundDownload, "VersionChecker"); | |||||
downloadThread.start(); | |||||
} | |||||
}); | |||||
mDescargar.setOnClickListener(new View.OnClickListener() { | |||||
@Override | |||||
public void onClick(View v) { | |||||
Thread downloadThread = new Thread(backgroundDownloadAPK, "APK Donwload"); | |||||
downloadThread.start(); | |||||
// Lanza un Intent con el enlace de la descarga, Android se | |||||
// encargará del resto | |||||
//startActivity(new Intent("android.intent.action.VIEW", Uri.parse(mVC.getDownloadURL()))); | |||||
/*String uri = "googlechrome://navigate?url=" + mVC.getDownloadURL(); | |||||
Intent i = new Intent(Intent.ACTION_VIEW); | |||||
i.setData(Uri.parse(uri)); | |||||
//i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); | |||||
//i.setPackage("com.android.chrome"); | |||||
startActivity(i); | |||||
*/ | |||||
/*Intent intent = new Intent(); | |||||
intent.setAction(Intent.ACTION_VIEW); | |||||
intent.setData(Uri.parse("ftp://172.16.0.9:21")); | |||||
//You can add FTP credentials: | |||||
intent.putExtra("ftp_username", "lecturas"); | |||||
intent.putExtra("ftp_password", "lec134med"); | |||||
//intent.putExtra("ftp_keyfile", "/sdcard/rsakey.txt"); | |||||
//intent.putExtra("ftp_keypass", "optionalkeypassword"); | |||||
//If credentials are not provided but required then AndFTP will prompt for login and password. | |||||
//Setup optional FTP preferences: | |||||
intent.putExtra("ftp_pasv", "true"); | |||||
//intent.putExtra("ftps_mode", "implicit"); | |||||
//intent.putExtra("ftp_encoding", "UTF-8"); | |||||
//Finally start the Activity: | |||||
//startActivityForResult(intent, BROWSE_REQUEST); | |||||
startActivity(intent);*/ | |||||
/*Intent i = new Intent(Intent.ACTION_VIEW); | |||||
i.setData(Uri.parse(mVC.getDownloadURL())); | |||||
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); | |||||
i.setPackage("com.android.chrome");*/ | |||||
/*PackageManager packageManager = AutoUpdateActivity.this.getPackageManager(); | |||||
File file = new File(AutoUpdateActivity.this.getFilesDir(),"lecturas.apk"); | |||||
String mimeType = "application/vnd.android.package-archive"; | |||||
String target= mVC.getDownloadURL(); | |||||
Intent intent = new Intent(android.content.Intent.ACTION_SENDTO); | |||||
intent.setDataAndType(android.net.Uri.parse(target),mimeType); | |||||
//intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file)); | |||||
startActivity(intent); | |||||
if (packageManager.queryIntentActivities(intent,0).size() == 0) { | |||||
Toast.makeText(getBaseContext(), | |||||
"", Toast.LENGTH_LONG) | |||||
.show(); | |||||
} else { | |||||
startActivity(intent); | |||||
}*/ | |||||
} | |||||
}); | |||||
} | |||||
} |
@ -0,0 +1,41 @@ | |||||
package jumapacelaya.gob.mx.almacen.updatepp; | |||||
import com.google.gson.Gson; | |||||
public class Version { | |||||
private double versionCode; | |||||
private String versionName; | |||||
private String downloadURL; | |||||
public static Version fromJson(String s){ | |||||
return new Gson().fromJson(s, Version.class); | |||||
} | |||||
public String toString(){ | |||||
return new Gson().toJson(this); | |||||
} | |||||
public double getVersionCode() { | |||||
return versionCode; | |||||
} | |||||
public void setVersionCode(double versionCode) { | |||||
this.versionCode = versionCode; | |||||
} | |||||
public String getVersionName() { | |||||
return versionName; | |||||
} | |||||
public void setVersionName(String versionName) { | |||||
this.versionName = versionName; | |||||
} | |||||
public String getDownloadURL() { | |||||
return downloadURL; | |||||
} | |||||
public void setDownloadURL(String downloadURL) { | |||||
this.downloadURL = downloadURL; | |||||
} | |||||
} |
@ -0,0 +1,294 @@ | |||||
package jumapacelaya.gob.mx.almacen.updatepp; | |||||
import android.content.Context; | |||||
import android.content.pm.PackageInfo; | |||||
import android.content.pm.PackageManager; | |||||
import android.util.Log; | |||||
import org.json.JSONException; | |||||
import org.json.JSONObject; | |||||
import java.io.BufferedOutputStream; | |||||
import java.io.BufferedReader; | |||||
import java.io.File; | |||||
import java.io.FileOutputStream; | |||||
import java.io.IOException; | |||||
import java.io.InputStream; | |||||
import java.io.InputStreamReader; | |||||
import java.io.OutputStream; | |||||
import java.net.HttpURLConnection; | |||||
import java.net.URL; | |||||
import java.net.URLConnection; | |||||
public class VersionCheck { | |||||
/** | |||||
* Enlace al archivo publico de la version | |||||
*/ | |||||
public static final String INFO_FILE = "https://www.dropbox.com/s/8xp3jss13vfpvd3/versionApp.txt?dl=0"; | |||||
public static final String SERVER = "172.16.0.9"; | |||||
public static final String FTP_INFO_FILE = "versionApp.txt"; | |||||
public static final String FTP_USER = "almacen"; | |||||
public static final String FTP_PWD = "alm134jumapa"; | |||||
/** | |||||
* El código de versión establecido en el AndroidManifest.xml de la versión | |||||
* instalada de la aplicación. Es el valor numérico que usa Android para | |||||
* diferenciar las versiones. | |||||
*/ | |||||
private int currentVersionCode; | |||||
/** | |||||
* El nombre de versión establecido en el AndroidManifest.xml de la versión | |||||
* instalada. Es la cadena de texto que se usa para identificar al versión | |||||
* de cara al usuario. | |||||
*/ | |||||
private String currentVersionName; | |||||
/** | |||||
* El código de versión establecido en el AndroidManifest.xml de la última | |||||
* versión disponible de la aplicación. | |||||
*/ | |||||
private int latestVersionCode; | |||||
/** | |||||
* El nombre de versión establecido en el AndroidManifest.xml de la última | |||||
* versión disponible. | |||||
*/ | |||||
private String latestVersionName; | |||||
/** | |||||
* Enlace de descarga directa de la última versión disponible. | |||||
*/ | |||||
private String downloadURL; | |||||
/** | |||||
* Método para inicializar el objeto. Se debe llamar antes que a cualquie | |||||
* otro, y en un hilo propio (o un AsyncTask) para no bloquear al interfaz | |||||
* ya que hace uso de Internet. | |||||
* | |||||
* @param context | |||||
* El contexto de la aplicación, para obtener la información de | |||||
* la versión actual. | |||||
*/ | |||||
public void getData(Context context) { | |||||
try{ | |||||
// Datos locales | |||||
PackageInfo pckginfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0); | |||||
currentVersionCode = pckginfo.versionCode; | |||||
currentVersionName = pckginfo.versionName; | |||||
// Datos remotos | |||||
//String data = downloadHttp(new URL(INFO_FILE)); | |||||
//Por FTP | |||||
String data = downloadFtp2(); | |||||
JSONObject json = new JSONObject(data); | |||||
if(json.has("lecturas")){ | |||||
json = json.getJSONObject("lecturas"); | |||||
latestVersionCode = json.getInt("versionCode"); | |||||
latestVersionName = json.getString("versionName"); | |||||
downloadURL = json.getString("downloadURL"); | |||||
Log.d("AutoUpdate", "Datos obtenidos con éxito"); | |||||
} | |||||
}catch(JSONException e){ | |||||
Log.e("AutoUpdate", "Ha habido un error con el JSON", e); | |||||
}catch(PackageManager.NameNotFoundException e){ | |||||
Log.e("AutoUpdate", "Ha habido un error con el packete :S", e); | |||||
}catch(IOException e){ | |||||
Log.e("AutoUpdate", "Ha habido un error con la descarga", e); | |||||
} | |||||
} | |||||
/** | |||||
* Método para comparar la versión actual con la última . | |||||
* | |||||
* @return true si hay una versión más nueva disponible que la actual. | |||||
*/ | |||||
public boolean isNewVersionAvailable() { | |||||
if(getLatestVersionCode() > getCurrentVersionCode()) | |||||
return true; | |||||
else if(getLatestVersionCode() == getCurrentVersionCode()) | |||||
return !getLatestVersionName().equals(getCurrentVersionName()); | |||||
else | |||||
return false; | |||||
} | |||||
/** | |||||
* Devuelve el código de versión actual. | |||||
* | |||||
* @return | |||||
*/ | |||||
public int getCurrentVersionCode() { | |||||
return currentVersionCode; | |||||
} | |||||
/** | |||||
* Devuelve el nombre de versión actual. | |||||
* | |||||
* @return | |||||
*/ | |||||
public String getCurrentVersionName() { | |||||
return currentVersionName; | |||||
} | |||||
/** | |||||
* Devuelve el código de la última versión disponible. | |||||
* | |||||
* @return | |||||
*/ | |||||
public int getLatestVersionCode() { | |||||
return latestVersionCode; | |||||
} | |||||
/** | |||||
* Devuelve el nombre de la última versión disponible. | |||||
* | |||||
* @return | |||||
*/ | |||||
public String getLatestVersionName() { | |||||
return latestVersionName; | |||||
} | |||||
/** | |||||
* Devuelve el enlace de descarga de la última versión disponible | |||||
* | |||||
* @return | |||||
*/ | |||||
public boolean getDownloadURL(String path) throws IOException { | |||||
String ftpUrl = String.format( | |||||
"ftp://"+FTP_USER+":"+FTP_PWD+"@"+SERVER+":%d/" + downloadURL, 21); | |||||
URLConnection urlConnection = new URL(ftpUrl).openConnection(); | |||||
InputStream inputStream = urlConnection.getInputStream(); | |||||
File file = new File(path); | |||||
if (file.exists()) | |||||
file.delete(); | |||||
//write file | |||||
OutputStream out = new BufferedOutputStream(new FileOutputStream(path)); | |||||
byte[] buffer = new byte[1024]; | |||||
int lengthRead; | |||||
while((lengthRead = inputStream.read(buffer))>0) | |||||
{ | |||||
out.write(buffer, 0, lengthRead); | |||||
out.flush(); | |||||
} | |||||
out.close(); | |||||
inputStream.close(); | |||||
return true; | |||||
} | |||||
/** | |||||
* Método auxiliar usado por getData() para leer el archivo de información. | |||||
* Encargado de conectarse a la red, descargar el archivo y convertirlo a | |||||
* String. | |||||
* | |||||
* @param url | |||||
* La URL del archivo que se quiere descargar. | |||||
* @return Cadena de texto con el contenido del archivo | |||||
* @throws IOException | |||||
* Si hay algún problema en la conexión | |||||
*/ | |||||
private static String downloadHttp(URL url) throws IOException { | |||||
HttpURLConnection c = (HttpURLConnection)url.openConnection(); | |||||
c.setRequestMethod("GET"); | |||||
c.setReadTimeout(15 * 1000); | |||||
c.setUseCaches(false); | |||||
c.connect(); | |||||
BufferedReader reader = new BufferedReader(new InputStreamReader(c.getInputStream())); | |||||
StringBuilder stringBuilder = new StringBuilder(); | |||||
String line = null; | |||||
while((line = reader.readLine()) != null){ | |||||
stringBuilder.append(line + "n"); | |||||
} | |||||
return stringBuilder.toString(); | |||||
} | |||||
/** | |||||
* Método auxiliar usado por getData() para leer el archivo de información. | |||||
* Encargado de conectarse a la red, descargar el archivo y convertirlo a | |||||
* String. | |||||
* | |||||
* @return Cadena de texto con el contenido del archivo | |||||
* @throws IOException | |||||
* Si hay algún problema en la conexión | |||||
*/ | |||||
private static String downloadFtp2() throws IOException { | |||||
String ftpUrl = String.format( | |||||
"ftp://"+FTP_USER+":"+FTP_PWD+"@"+SERVER+":%d/" + FTP_INFO_FILE, 21); | |||||
URLConnection urlConnection = new URL(ftpUrl).openConnection(); | |||||
InputStream inputStream = urlConnection.getInputStream(); | |||||
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); | |||||
StringBuilder stringBuilder = new StringBuilder(); | |||||
String line = null; | |||||
while((line = reader.readLine()) != null){ | |||||
stringBuilder.append(line + "\n"); | |||||
} | |||||
return stringBuilder.toString(); | |||||
} | |||||
/** | |||||
* Método auxiliar usado por getData() para leer el archivo de información. | |||||
* Encargado de conectarse a la red, descargar el archivo y convertirlo a | |||||
* String. | |||||
* | |||||
* @param server | |||||
* La URL del archivo que se quiere descargar. | |||||
* @return Cadena de texto con el contenido del archivo | |||||
* @throws IOException | |||||
* Si hay algún problema en la conexión | |||||
*/ | |||||
/*private static String downloadFtp(String server, String fileversion) throws IOException { | |||||
boolean status = false; | |||||
StringBuilder stringBuilder = new StringBuilder(); | |||||
try { | |||||
FTPClient ftpClient = new FTPClient(); | |||||
ftpClient.setConnectTimeout(10 * 1000); | |||||
ftpClient.connect(InetAddress.getByName(server)); | |||||
status = ftpClient.login(FTP_USER, FTP_PWD); | |||||
Log.e("isFTPConnect", String.valueOf(status)); | |||||
if(FTPReply.isPositiveCompletion(ftpClient.getReplyCode())){ | |||||
ftpClient.setFileType(FTP.ASCII_FILE_TYPE); | |||||
ftpClient.enterLocalActiveMode(); | |||||
String workingDir = ftpClient.printWorkingDirectory(); | |||||
ftpClient.changeWorkingDirectory("apps"); | |||||
FileOutputStream desFileStream = new FileOutputStream(desFilePath); | |||||
status = ftpClient.retrieveFile(srcFilePath, desFileStream); | |||||
desFileStream.close(); | |||||
BufferedReader reader = new BufferedReader(new InputStreamReader(c.getInputStream())); | |||||
String line = null; | |||||
while ((line = reader.readLine()) != null) { | |||||
stringBuilder.append(line + "n"); | |||||
} | |||||
} | |||||
ftpClient.logout(); | |||||
ftpClient.disconnect(); | |||||
}catch (SocketException e){ | |||||
}catch (UnknownHostException e){ | |||||
}catch (IOException e){ | |||||
} | |||||
return stringBuilder.toString(); | |||||
}*/ | |||||
} |
@ -0,0 +1,17 @@ | |||||
package jumapacelaya.gob.mx.almacen.utils; | |||||
public class StringUitils { | |||||
public static String jsonescape(String raw){ | |||||
String escaped = raw; | |||||
escaped = escaped.replace("\\", "\\\\"); | |||||
escaped = escaped.replace("\"", "\\\""); | |||||
escaped = escaped.replace("\b", "\\b"); | |||||
escaped = escaped.replace("\f", "\\f"); | |||||
escaped = escaped.replace("\n", "\\n"); | |||||
escaped = escaped.replace("\r", "\\r"); | |||||
escaped = escaped.replace("\t", "\\t"); | |||||
// TODO: escape other non-printing characters using uXXXX notation | |||||
return escaped; | |||||
} | |||||
} |
@ -0,0 +1,12 @@ | |||||
<?xml version="1.0" encoding="utf-8"?> | |||||
<rotate | |||||
xmlns:android="http://schemas.android.com/apk/res/android" | |||||
android:fromDegrees="0" | |||||
android:interpolator="@android:anim/linear_interpolator" | |||||
android:toDegrees="360" | |||||
android:pivotX="50%" | |||||
android:pivotY="50%" | |||||
android:duration="500" | |||||
android:startOffset="0" | |||||
android:repeatCount="infinite" | |||||
/> |
@ -0,0 +1,34 @@ | |||||
<vector xmlns:android="http://schemas.android.com/apk/res/android" | |||||
xmlns:aapt="http://schemas.android.com/aapt" | |||||
android:width="108dp" | |||||
android:height="108dp" | |||||
android:viewportWidth="108" | |||||
android:viewportHeight="108"> | |||||
<path | |||||
android:fillType="evenOdd" | |||||
android:pathData="M32,64C32,64 38.39,52.99 44.13,50.95C51.37,48.37 70.14,49.57 70.14,49.57L108.26,87.69L108,109.01L75.97,107.97L32,64Z" | |||||
android:strokeWidth="1" | |||||
android:strokeColor="#00000000"> | |||||
<aapt:attr name="android:fillColor"> | |||||
<gradient | |||||
android:endX="78.5885" | |||||
android:endY="90.9159" | |||||
android:startX="48.7653" | |||||
android:startY="61.0927" | |||||
android:type="linear"> | |||||
<item | |||||
android:color="#44000000" | |||||
android:offset="0.0" /> | |||||
<item | |||||
android:color="#00000000" | |||||
android:offset="1.0" /> | |||||
</gradient> | |||||
</aapt:attr> | |||||
</path> | |||||
<path | |||||
android:fillColor="#FFFFFF" | |||||
android:fillType="nonZero" | |||||
android:pathData="M66.94,46.02L66.94,46.02C72.44,50.07 76,56.61 76,64L32,64C32,56.61 35.56,50.11 40.98,46.06L36.18,41.19C35.45,40.45 35.45,39.3 36.18,38.56C36.91,37.81 38.05,37.81 38.78,38.56L44.25,44.05C47.18,42.57 50.48,41.71 54,41.71C57.48,41.71 60.78,42.57 63.68,44.05L69.11,38.56C69.84,37.81 70.98,37.81 71.71,38.56C72.44,39.3 72.44,40.45 71.71,41.19L66.94,46.02ZM62.94,56.92C64.08,56.92 65,56.01 65,54.88C65,53.76 64.08,52.85 62.94,52.85C61.8,52.85 60.88,53.76 60.88,54.88C60.88,56.01 61.8,56.92 62.94,56.92ZM45.06,56.92C46.2,56.92 47.13,56.01 47.13,54.88C47.13,53.76 46.2,52.85 45.06,52.85C43.92,52.85 43,53.76 43,54.88C43,56.01 43.92,56.92 45.06,56.92Z" | |||||
android:strokeWidth="1" | |||||
android:strokeColor="#00000000" /> | |||||
</vector> |
@ -0,0 +1,9 @@ | |||||
<shape xmlns:android="http://schemas.android.com/apk/res/android"> | |||||
<solid | |||||
android:color="#00ac73"/> | |||||
<corners | |||||
android:bottomLeftRadius="48dp" | |||||
android:topLeftRadius="48dp" | |||||
android:bottomRightRadius="48dp" | |||||
android:topRightRadius="48dp"/> | |||||
</shape> |
@ -0,0 +1,11 @@ | |||||
<?xml version="1.0" encoding="utf-8"?> | |||||
<ripple xmlns:android="http://schemas.android.com/apk/res/android" | |||||
android:color="?android:attr/colorControlHighlight"> | |||||
<item android:id="@android:id/mask"> | |||||
<shape android:shape="rectangle"> | |||||
<solid android:color="#FFF" /> | |||||
<corners android:radius="15dp" /> | |||||
</shape> | |||||
</item> | |||||
<item android:drawable="@drawable/bg" /> | |||||
</ripple> |
@ -0,0 +1,9 @@ | |||||
<?xml version="1.0" encoding="utf-8"?> | |||||
<ripple xmlns:android="http://schemas.android.com/apk/res/android" | |||||
android:color="@color/white"> | |||||
<item> | |||||
<shape android:shape="rectangle"> | |||||
<solid android:color="@color/colorSecondary" /> | |||||
</shape> | |||||
</item> | |||||
</ripple> |
@ -0,0 +1,13 @@ | |||||
<?xml version="1.0" encoding="utf-8"?> | |||||
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"> | |||||
<item android:duration="5000" | |||||
android:drawable="@drawable/gradient_start"/> | |||||
<item android:duration="5000" | |||||
android:drawable="@drawable/gradient_center"/> | |||||
<item android:duration="5000" | |||||
android:drawable="@drawable/gradient_end"/> | |||||
</animation-list> |
@ -0,0 +1,10 @@ | |||||
<?xml version="1.0" encoding="utf-8"?> | |||||
<shape xmlns:android="http://schemas.android.com/apk/res/android" | |||||
android:shape="rectangle"> | |||||
<gradient | |||||
android:type="linear" | |||||
android:angle="315" | |||||
android:startColor="@color/colorGradientCenter" | |||||
android:centerColor="@color/colorGradientEnd" | |||||
android:endColor="@color/colorGradientStart"/> | |||||
</shape> |
@ -0,0 +1,10 @@ | |||||
<?xml version="1.0" encoding="utf-8"?> | |||||
<shape xmlns:android="http://schemas.android.com/apk/res/android" | |||||
android:shape="rectangle"> | |||||
<gradient | |||||
android:type="linear" | |||||
android:angle="315" | |||||
android:startColor="@color/colorGradientEnd" | |||||
android:centerColor="@color/colorGradientStart" | |||||
android:endColor="@color/colorGradientCenter"/> | |||||
</shape> |
@ -0,0 +1,9 @@ | |||||
<?xml version="1.0" encoding="utf-8"?> | |||||
<shape xmlns:android="http://schemas.android.com/apk/res/android" | |||||
android:shape="rectangle"> | |||||
<gradient | |||||
android:type="linear" | |||||
android:angle="270" | |||||
android:startColor="@color/fondopantalla" | |||||
android:endColor="@color/fondopantalla2"/> | |||||
</shape> |
@ -0,0 +1,10 @@ | |||||
<?xml version="1.0" encoding="utf-8"?> | |||||
<shape xmlns:android="http://schemas.android.com/apk/res/android" | |||||
android:shape="rectangle"> | |||||
<gradient | |||||
android:type="linear" | |||||
android:angle="315" | |||||
android:startColor="@color/colorGradientStart" | |||||
android:centerColor="@color/colorGradientCenter" | |||||
android:endColor="@color/colorGradientEnd"/> | |||||
</shape> |
@ -0,0 +1,16 @@ | |||||
<vector android:height="24dp" android:viewportHeight="480" | |||||
android:viewportWidth="480" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android"> | |||||
<path android:fillColor="#2196F3" android:pathData="M80,48H16C7.168,48 0,55.168 0,64v64c0,8.832 7.168,16 16,16s16,-7.168 16,-16V80h48c8.832,0 16,-7.168 16,-16S88.832,48 80,48z"/> | |||||
<path android:fillColor="#2196F3" android:pathData="M464,336c-8.832,0 -16,7.168 -16,16v48h-48c-8.832,0 -16,7.168 -16,16s7.168,16 16,16h64c8.832,0 16,-7.168 16,-16v-64C480,343.168 472.832,336 464,336z"/> | |||||
<path android:fillColor="#2196F3" android:pathData="M464,48h-64c-8.832,0 -16,7.168 -16,16s7.168,16 16,16h48v48c0,8.832 7.168,16 16,16s16,-7.168 16,-16V64C480,55.168 472.832,48 464,48z"/> | |||||
<path android:fillColor="#2196F3" android:pathData="M80,400H32v-48c0,-8.832 -7.168,-16 -16,-16s-16,7.168 -16,16v64c0,8.832 7.168,16 16,16h64c8.832,0 16,-7.168 16,-16S88.832,400 80,400z"/> | |||||
<path android:fillColor="#455A64" android:pathData="M64,112h32v256h-32z"/> | |||||
<path android:fillColor="#455A64" android:pathData="M128,112h32v192h-32z"/> | |||||
<path android:fillColor="#455A64" android:pathData="M192,112h32v192h-32z"/> | |||||
<path android:fillColor="#455A64" android:pathData="M256,112h32v256h-32z"/> | |||||
<path android:fillColor="#455A64" android:pathData="M320,112h32v192h-32z"/> | |||||
<path android:fillColor="#455A64" android:pathData="M384,112h32v256h-32z"/> | |||||
<path android:fillColor="#455A64" android:pathData="M128,336h32v32h-32z"/> | |||||
<path android:fillColor="#455A64" android:pathData="M192,336h32v32h-32z"/> | |||||
<path android:fillColor="#455A64" android:pathData="M320,336h32v32h-32z"/> | |||||
</vector> |
@ -0,0 +1,170 @@ | |||||
<?xml version="1.0" encoding="utf-8"?> | |||||
<vector xmlns:android="http://schemas.android.com/apk/res/android" | |||||
android:width="108dp" | |||||
android:height="108dp" | |||||
android:viewportWidth="108" | |||||
android:viewportHeight="108"> | |||||
<path | |||||
android:fillColor="#008577" | |||||
android:pathData="M0,0h108v108h-108z" /> | |||||
<path | |||||
android:fillColor="#00000000" | |||||
android:pathData="M9,0L9,108" | |||||
android:strokeWidth="0.8" | |||||
android:strokeColor="#33FFFFFF" /> | |||||
<path | |||||
android:fillColor="#00000000" | |||||
android:pathData="M19,0L19,108" | |||||
android:strokeWidth="0.8" | |||||
android:strokeColor="#33FFFFFF" /> | |||||
<path | |||||
android:fillColor="#00000000" | |||||
android:pathData="M29,0L29,108" | |||||
android:strokeWidth="0.8" | |||||
android:strokeColor="#33FFFFFF" /> | |||||
<path | |||||
android:fillColor="#00000000" | |||||
android:pathData="M39,0L39,108" | |||||
android:strokeWidth="0.8" | |||||
android:strokeColor="#33FFFFFF" /> | |||||
<path | |||||
android:fillColor="#00000000" | |||||
android:pathData="M49,0L49,108" | |||||
android:strokeWidth="0.8" | |||||
android:strokeColor="#33FFFFFF" /> | |||||
<path | |||||
android:fillColor="#00000000" | |||||
android:pathData="M59,0L59,108" | |||||
android:strokeWidth="0.8" | |||||
android:strokeColor="#33FFFFFF" /> | |||||
<path | |||||
android:fillColor="#00000000" | |||||
android:pathData="M69,0L69,108" | |||||
android:strokeWidth="0.8" | |||||
android:strokeColor="#33FFFFFF" /> | |||||
<path | |||||
android:fillColor="#00000000" | |||||
android:pathData="M79,0L79,108" | |||||
android:strokeWidth="0.8" | |||||
android:strokeColor="#33FFFFFF" /> | |||||
<path | |||||
android:fillColor="#00000000" | |||||
android:pathData="M89,0L89,108" | |||||
android:strokeWidth="0.8" | |||||
android:strokeColor="#33FFFFFF" /> | |||||
<path | |||||
android:fillColor="#00000000" | |||||
android:pathData="M99,0L99,108" | |||||
android:strokeWidth="0.8" | |||||
android:strokeColor="#33FFFFFF" /> | |||||
<path | |||||
android:fillColor="#00000000" | |||||
android:pathData="M0,9L108,9" | |||||
android:strokeWidth="0.8" | |||||
android:strokeColor="#33FFFFFF" /> | |||||
<path | |||||
android:fillColor="#00000000" | |||||
android:pathData="M0,19L108,19" | |||||
android:strokeWidth="0.8" | |||||
android:strokeColor="#33FFFFFF" /> | |||||
<path | |||||
android:fillColor="#00000000" | |||||
android:pathData="M0,29L108,29" | |||||
android:strokeWidth="0.8" | |||||
android:strokeColor="#33FFFFFF" /> | |||||
<path | |||||
android:fillColor="#00000000" | |||||
android:pathData="M0,39L108,39" | |||||
android:strokeWidth="0.8" | |||||
android:strokeColor="#33FFFFFF" /> | |||||
<path | |||||
android:fillColor="#00000000" | |||||
android:pathData="M0,49L108,49" | |||||
android:strokeWidth="0.8" | |||||
android:strokeColor="#33FFFFFF" /> | |||||
<path | |||||
android:fillColor="#00000000" | |||||
android:pathData="M0,59L108,59" | |||||
android:strokeWidth="0.8" | |||||
android:strokeColor="#33FFFFFF" /> | |||||
<path | |||||
android:fillColor="#00000000" | |||||
android:pathData="M0,69L108,69" | |||||
android:strokeWidth="0.8" | |||||
android:strokeColor="#33FFFFFF" /> | |||||
<path | |||||
android:fillColor="#00000000" | |||||
android:pathData="M0,79L108,79" | |||||
android:strokeWidth="0.8" | |||||
android:strokeColor="#33FFFFFF" /> | |||||
<path | |||||
android:fillColor="#00000000" | |||||
android:pathData="M0,89L108,89" | |||||
android:strokeWidth="0.8" | |||||
android:strokeColor="#33FFFFFF" /> | |||||
<path | |||||
android:fillColor="#00000000" | |||||
android:pathData="M0,99L108,99" | |||||
android:strokeWidth="0.8" | |||||
android:strokeColor="#33FFFFFF" /> | |||||
<path | |||||
android:fillColor="#00000000" | |||||
android:pathData="M19,29L89,29" | |||||
android:strokeWidth="0.8" | |||||
android:strokeColor="#33FFFFFF" /> | |||||
<path | |||||
android:fillColor="#00000000" | |||||
android:pathData="M19,39L89,39" | |||||
android:strokeWidth="0.8" | |||||
android:strokeColor="#33FFFFFF" /> | |||||
<path | |||||
android:fillColor="#00000000" | |||||
android:pathData="M19,49L89,49" | |||||
android:strokeWidth="0.8" | |||||
android:strokeColor="#33FFFFFF" /> | |||||
<path | |||||
android:fillColor="#00000000" | |||||
android:pathData="M19,59L89,59" | |||||
android:strokeWidth="0.8" | |||||
android:strokeColor="#33FFFFFF" /> | |||||
<path | |||||
android:fillColor="#00000000" | |||||
android:pathData="M19,69L89,69" | |||||
android:strokeWidth="0.8" | |||||
android:strokeColor="#33FFFFFF" /> | |||||
<path | |||||
android:fillColor="#00000000" | |||||
android:pathData="M19,79L89,79" | |||||
android:strokeWidth="0.8" | |||||
android:strokeColor="#33FFFFFF" /> | |||||
<path | |||||
android:fillColor="#00000000" | |||||
android:pathData="M29,19L29,89" | |||||
android:strokeWidth="0.8" | |||||
android:strokeColor="#33FFFFFF" /> | |||||
<path | |||||
android:fillColor="#00000000" | |||||
android:pathData="M39,19L39,89" | |||||
android:strokeWidth="0.8" | |||||
android:strokeColor="#33FFFFFF" /> | |||||
<path | |||||
android:fillColor="#00000000" | |||||
android:pathData="M49,19L49,89" | |||||
android:strokeWidth="0.8" | |||||
android:strokeColor="#33FFFFFF" /> | |||||
<path | |||||
android:fillColor="#00000000" | |||||
android:pathData="M59,19L59,89" | |||||
android:strokeWidth="0.8" | |||||
android:strokeColor="#33FFFFFF" /> | |||||
<path | |||||
android:fillColor="#00000000" | |||||
android:pathData="M69,19L69,89" | |||||
android:strokeWidth="0.8" | |||||
android:strokeColor="#33FFFFFF" /> | |||||
<path | |||||
android:fillColor="#00000000" | |||||
android:pathData="M79,19L79,89" | |||||
android:strokeWidth="0.8" | |||||
android:strokeColor="#33FFFFFF" /> | |||||
</vector> |
@ -0,0 +1,10 @@ | |||||
<vector android:height="25dp" android:viewportHeight="51" | |||||
android:viewportWidth="51" android:width="25dp" xmlns:android="http://schemas.android.com/apk/res/android"> | |||||
<path android:fillColor="#00000000" android:pathData="M25,13L25,38" | |||||
android:strokeColor="#43A047" android:strokeLineCap="round" | |||||
android:strokeLineJoin="round" android:strokeWidth="2"/> | |||||
<path android:fillColor="#00000000" | |||||
android:pathData="M37.5,25L12.5,25" | |||||
android:strokeColor="#43A047" android:strokeLineCap="round" | |||||
android:strokeLineJoin="round" android:strokeWidth="2"/> | |||||
</vector> |
@ -0,0 +1,94 @@ | |||||
<?xml version="1.0" encoding="utf-8"?> | |||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | |||||
android:layout_width="fill_parent" | |||||
android:layout_height="fill_parent" | |||||
android:orientation="vertical" > | |||||
<LinearLayout | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:layout_gravity="center_horizontal" | |||||
android:orientation="vertical" > | |||||
<TextView | |||||
android:id="@+id/textView1" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="Lecturas.jumapacelaya AutoUpdater" | |||||
android:gravity="center" | |||||
android:textAppearance="?android:attr/textAppearanceLarge" /> | |||||
</LinearLayout> | |||||
<TextView | |||||
android:id="@+id/textView3" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:layout_gravity="center_horizontal" | |||||
android:text="@string/version_name" | |||||
android:paddingBottom="10dp" | |||||
android:textAppearance="?android:attr/textAppearanceMedium" /> | |||||
<Button | |||||
android:id="@+id/bt_obtener_datos" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:layout_gravity="center_horizontal" | |||||
android:text="Verificar Versión" /> | |||||
<ProgressBar | |||||
android:id="@+id/progress_datos" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:layout_gravity="center_horizontal" | |||||
android:visibility="gone" /> | |||||
<TextView | |||||
android:id="@+id/actualizada" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:layout_gravity="center_horizontal" | |||||
android:visibility="gone" | |||||
android:text="La aplicación está actualiza :)" | |||||
android:textAppearance="?android:attr/textAppearanceLarge" /> | |||||
<LinearLayout | |||||
android:id="@+id/actualizacion" | |||||
android:layout_width="fill_parent" | |||||
android:layout_height="fill_parent" | |||||
android:layout_gravity="center_horizontal" | |||||
android:orientation="vertical" | |||||
android:gravity="center" | |||||
android:padding="15dp" | |||||
android:visibility="gone" > | |||||
<TextView | |||||
android:id="@+id/textView2" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:gravity="center_horizontal" | |||||
android:text="Hay una actualización disponible!" | |||||
android:textAppearance="?android:attr/textAppearanceLarge" /> | |||||
<TextView | |||||
android:id="@+id/actualizacion_version_actual" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="Versión actual: " | |||||
android:textAppearance="?android:attr/textAppearanceMedium" /> | |||||
<TextView | |||||
android:id="@+id/actualizacion_version_nueva" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="Versión disponible: " | |||||
android:textAppearance="?android:attr/textAppearanceMedium" /> | |||||
<Button | |||||
android:id="@+id/bt_descarga" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:layout_gravity="center_horizontal" | |||||
android:text="Descargar" /> | |||||
</LinearLayout> | |||||
</LinearLayout> |
@ -0,0 +1,58 @@ | |||||
<?xml version="1.0" encoding="utf-8"?> | |||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" | |||||
xmlns:app="http://schemas.android.com/apk/res-auto" | |||||
xmlns:tools="http://schemas.android.com/tools" | |||||
android:id="@+id/root_conteo_layout" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="match_parent" | |||||
android:padding="0dp" | |||||
tools:context=".ConteoActivity"> | |||||
<TextView | |||||
android:id="@+id/lbConteo" | |||||
android:layout_width="200dp" | |||||
android:layout_height="35dp" | |||||
android:text="@string/selecciona_conteo" | |||||
android:textAlignment="center" | |||||
android:textSize="24sp" | |||||
app:layout_constraintBottom_toTopOf="@+id/btnIniciar" | |||||
app:layout_constraintEnd_toEndOf="parent" | |||||
app:layout_constraintHorizontal_bias="0.497" | |||||
app:layout_constraintStart_toStartOf="parent" | |||||
app:layout_constraintTop_toTopOf="parent" | |||||
app:layout_constraintVertical_bias="0.217" /> | |||||
<Spinner | |||||
android:id="@+id/cbxInventarios" | |||||
android:layout_width="242dp" | |||||
android:layout_height="38dp" | |||||
android:layout_marginTop="40dp" | |||||
app:layout_constraintEnd_toEndOf="parent" | |||||
app:layout_constraintHorizontal_bias="0.497" | |||||
app:layout_constraintStart_toStartOf="parent" | |||||
app:layout_constraintTop_toBottomOf="@+id/lbConteo" /> | |||||
<Spinner | |||||
android:id="@+id/cbxConteos" | |||||
android:layout_width="242dp" | |||||
android:layout_height="38dp" | |||||
android:layout_marginTop="44dp" | |||||
app:layout_constraintEnd_toEndOf="parent" | |||||
app:layout_constraintHorizontal_bias="0.497" | |||||
app:layout_constraintStart_toStartOf="parent" | |||||
app:layout_constraintTop_toBottomOf="@+id/cbxInventarios" /> | |||||
<Button | |||||
android:id="@+id/btnIniciar" | |||||
android:layout_width="0dp" | |||||
android:layout_height="85dip" | |||||
android:text="@string/iniciar" | |||||
android:background="@drawable/custom_ripple2" | |||||
android:textColor="@color/white" | |||||
android:textSize="30sp" | |||||
app:layout_constraintBottom_toBottomOf="parent" | |||||
app:layout_constraintEnd_toEndOf="parent" | |||||
app:layout_constraintHorizontal_bias="1.0" | |||||
app:layout_constraintStart_toStartOf="parent" /> | |||||
</androidx.constraintlayout.widget.ConstraintLayout> |
@ -0,0 +1,44 @@ | |||||
<?xml version="1.0" encoding="utf-8"?> | |||||
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" | |||||
xmlns:app="http://schemas.android.com/apk/res-auto" | |||||
xmlns:tools="http://schemas.android.com/tools" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="match_parent" | |||||
tools:context=".MainActivity"> | |||||
<com.google.android.material.appbar.AppBarLayout | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
> | |||||
<com.google.android.material.appbar.MaterialToolbar | |||||
android:id="@+id/topAppBar" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="?attr/actionBarSize" | |||||
app:title="@string/splash_title" | |||||
style="@style/Widget.MaterialComponents.Toolbar.Primary" | |||||
/> | |||||
<com.google.android.material.tabs.TabLayout | |||||
android:id="@+id/tabs" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
/> | |||||
</com.google.android.material.appbar.AppBarLayout> | |||||
<androidx.viewpager.widget.ViewPager | |||||
android:id="@+id/view_pager" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="match_parent" | |||||
app:layout_behavior="@string/appbar_scrolling_view_behavior" /> | |||||
<com.google.android.material.floatingactionbutton.FloatingActionButton | |||||
android:id="@+id/fab" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:layout_gravity="bottom|end" | |||||
android:layout_margin="@dimen/fab_margin" | |||||
android:contentDescription="@string/escanar_codigo" | |||||
app:backgroundTint="@color/colorPrimaryLight" | |||||
app:srcCompat="@drawable/ic_barcode" /> | |||||
</androidx.coordinatorlayout.widget.CoordinatorLayout> |
@ -0,0 +1,37 @@ | |||||
<?xml version="1.0" encoding="utf-8"?> | |||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" | |||||
xmlns:app="http://schemas.android.com/apk/res-auto" | |||||
xmlns:tools="http://schemas.android.com/tools" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="match_parent" | |||||
android:background="@color/design_default_color_on_secondary" | |||||
tools:context=".splash"> | |||||
<ImageView | |||||
android:id="@+id/img_logo_splash" | |||||
android:layout_width="257dp" | |||||
android:layout_height="253dp" | |||||
android:contentDescription="@string/splash_logo" | |||||
android:src="@drawable/logojumcel" | |||||
app:layout_constraintBottom_toBottomOf="parent" | |||||
app:layout_constraintEnd_toEndOf="parent" | |||||
app:layout_constraintStart_toStartOf="parent" | |||||
app:layout_constraintTop_toTopOf="parent" /> | |||||
<TextView | |||||
android:id="@+id/editText" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:layout_marginTop="16dp" | |||||
android:ems="12" | |||||
android:fontFamily="casual" | |||||
android:text="@string/splash_title" | |||||
android:textAlignment="center" | |||||
android:textColor="#FFFFFF" | |||||
android:textSize="24sp" | |||||
android:textStyle="bold" | |||||
app:layout_constraintEnd_toEndOf="parent" | |||||
app:layout_constraintStart_toStartOf="parent" | |||||
app:layout_constraintTop_toBottomOf="@+id/img_logo_splash" /> | |||||
</androidx.constraintlayout.widget.ConstraintLayout> |
@ -0,0 +1,93 @@ | |||||
<?xml version="1.0" encoding="utf-8"?> | |||||
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" | |||||
xmlns:app="http://schemas.android.com/apk/res-auto" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
xmlns:tools="http://schemas.android.com/tools" | |||||
> | |||||
<!--app:cardCornerRadius="4dp" app:cardElevation="4dp" android:layout_margin="5dp"--> | |||||
<LinearLayout | |||||
android:layout_width="match_parent" | |||||
android:layout_height="100dp" | |||||
android:orientation="vertical"> | |||||
<RelativeLayout | |||||
android:layout_width="match_parent" | |||||
android:layout_height="98dp" | |||||
android:background="?android:attr/selectableItemBackground" | |||||
android:padding="5dp"> | |||||
<TextView | |||||
android:id="@+id/item_number" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:layout_alignParentTop="true" | |||||
android:textAppearance="?attr/textAppearanceListItem" | |||||
android:textSize="28sp" | |||||
tools:text="10001" /> | |||||
<TextView | |||||
android:id="@+id/item_clave" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:layout_alignParentTop="true" | |||||
android:layout_alignParentEnd="true" | |||||
android:textAppearance="?attr/textAppearanceListItem" | |||||
android:textSize="28sp" | |||||
tools:text="VF001" /> | |||||
<LinearLayout | |||||
android:id="@+id/layer_cantidad" | |||||
android:layout_width="146dp" | |||||
android:layout_height="29dp" | |||||
android:layout_below="@+id/item_clave" | |||||
android:layout_alignParentEnd="true" | |||||
android:layout_marginTop="3dp" | |||||
android:orientation="horizontal"> | |||||
<TextView | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="match_parent" | |||||
android:gravity="center" | |||||
android:text="Cantidad" /> | |||||
<TextView | |||||
android:id="@+id/item_cantidad" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="match_parent" | |||||
android:layout_below="@+id/item_clave" | |||||
android:layout_alignParentEnd="true" | |||||
android:layout_marginStart="10dp" | |||||
android:hint="Cantidad" | |||||
android:textAppearance="?attr/textAppearanceListItem" | |||||
android:textSize="18sp" | |||||
tools:text="25" /> | |||||
</LinearLayout> | |||||
<TextView | |||||
android:id="@+id/content" | |||||
android:layout_width="252dp" | |||||
android:layout_height="44dp" | |||||
android:layout_below="@+id/item_number" | |||||
android:layout_alignParentStart="true" | |||||
android:layout_marginTop="1dp" | |||||
android:layout_marginEnd="4dp" | |||||
android:layout_toStartOf="@+id/layer_cantidad" | |||||
android:textAlignment="viewStart" | |||||
android:textSize="18sp" | |||||
tools:text="Almabre de Cobre 1/2'" /> | |||||
</RelativeLayout> | |||||
<View | |||||
android:id="@+id/border" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="1dp" | |||||
android:background="#2196F3" /> | |||||
</LinearLayout> | |||||
</androidx.cardview.widget.CardView> |
@ -0,0 +1,93 @@ | |||||
<?xml version="1.0" encoding="utf-8"?> | |||||
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" | |||||
xmlns:app="http://schemas.android.com/apk/res-auto" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
xmlns:tools="http://schemas.android.com/tools" | |||||
> | |||||
<!--app:cardCornerRadius="4dp" app:cardElevation="4dp" android:layout_margin="5dp"--> | |||||
<LinearLayout | |||||
android:layout_width="match_parent" | |||||
android:layout_height="100dp" | |||||
android:orientation="vertical"> | |||||
<RelativeLayout | |||||
android:layout_width="match_parent" | |||||
android:layout_height="98dp" | |||||
android:background="?android:attr/selectableItemBackground" | |||||
android:padding="5dp"> | |||||
<TextView | |||||
android:id="@+id/item_number" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:layout_alignParentTop="true" | |||||
android:textAppearance="?attr/textAppearanceListItem" | |||||
android:textSize="28sp" | |||||
tools:text="10001" /> | |||||
<TextView | |||||
android:id="@+id/item_clave" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:layout_alignParentTop="true" | |||||
android:layout_alignParentEnd="true" | |||||
android:textAppearance="?attr/textAppearanceListItem" | |||||
android:textSize="28sp" | |||||
tools:text="VF001" /> | |||||
<LinearLayout | |||||
android:id="@+id/layer_cantidad" | |||||
android:layout_width="146dp" | |||||
android:layout_height="29dp" | |||||
android:layout_below="@+id/item_clave" | |||||
android:layout_alignParentEnd="true" | |||||
android:layout_marginTop="3dp" | |||||
android:orientation="horizontal"> | |||||
<TextView | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="match_parent" | |||||
android:gravity="center" | |||||
android:text="Cantidad" /> | |||||
<TextView | |||||
android:id="@+id/item_cantidad" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="match_parent" | |||||
android:layout_below="@+id/item_clave" | |||||
android:layout_alignParentEnd="true" | |||||
android:layout_marginStart="10dp" | |||||
android:hint="Cantidad" | |||||
android:textAppearance="?attr/textAppearanceListItem" | |||||
android:textSize="18sp" | |||||
tools:text="25" /> | |||||
</LinearLayout> | |||||
<TextView | |||||
android:id="@+id/content" | |||||
android:layout_width="252dp" | |||||
android:layout_height="44dp" | |||||
android:layout_below="@+id/item_number" | |||||
android:layout_alignParentStart="true" | |||||
android:layout_marginTop="1dp" | |||||
android:layout_marginEnd="4dp" | |||||
android:layout_toStartOf="@+id/layer_cantidad" | |||||
android:textAlignment="viewStart" | |||||
android:textSize="18sp" | |||||
tools:text="Almabre de Cobre 1/2'" /> | |||||
</RelativeLayout> | |||||
<View | |||||
android:id="@+id/border" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="1dp" | |||||
android:background="#2196F3" /> | |||||
</LinearLayout> | |||||
</androidx.cardview.widget.CardView> |
@ -0,0 +1,14 @@ | |||||
<?xml version="1.0" encoding="utf-8"?> | |||||
<androidx.recyclerview.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android" | |||||
xmlns:app="http://schemas.android.com/apk/res-auto" | |||||
xmlns:tools="http://schemas.android.com/tools" | |||||
android:id="@+id/list" | |||||
android:name="jumapacelaya.gob.mx.almacen.ui.main.AvanceFragment" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="match_parent" | |||||
android:layout_marginLeft="16dp" | |||||
android:layout_marginRight="16dp" | |||||
app:layoutManager="LinearLayoutManager" | |||||
tools:context=".ui.main.avance.AvanceFragment" | |||||
tools:listitem="@layout/fragment_item" | |||||
/> |
@ -0,0 +1,14 @@ | |||||
<?xml version="1.0" encoding="utf-8"?> | |||||
<androidx.recyclerview.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android" | |||||
xmlns:app="http://schemas.android.com/apk/res-auto" | |||||
xmlns:tools="http://schemas.android.com/tools" | |||||
android:id="@+id/list" | |||||
android:name="jumapacelaya.gob.mx.almacen.ui.main.PendienteFragment" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="match_parent" | |||||
android:layout_marginLeft="16dp" | |||||
android:layout_marginRight="16dp" | |||||
app:layoutManager="LinearLayoutManager" | |||||
tools:context=".ui.main.PendienteFragment" | |||||
tools:listitem="@layout/fragment_item" | |||||
/> |
@ -0,0 +1,183 @@ | |||||
<?xml version="1.0" encoding="utf-8"?> | |||||
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" | |||||
xmlns:app="http://schemas.android.com/apk/res-auto" | |||||
xmlns:tools="http://schemas.android.com/tools" | |||||
android:id="@+id/constraintLayout" | |||||
tools:context=".ui.main.PlaceholderFragment" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:isScrollContainer="true" | |||||
android:orientation="vertical"> | |||||
<LinearLayout | |||||
android:id="@+id/linearLayout" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:orientation="vertical"> | |||||
<androidx.cardview.widget.CardView | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:layout_margin="10dp" | |||||
android:elevation="5dp" | |||||
app:cardCornerRadius="8dp"> | |||||
<LinearLayout | |||||
android:layout_width="match_parent" | |||||
android:layout_height="match_parent" | |||||
android:background="@color/md_theme_primaryContainer" | |||||
android:orientation="vertical"> | |||||
<RelativeLayout | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:layout_marginTop="16dp"> | |||||
<TextView | |||||
android:id="@+id/txtcap_folio2" | |||||
android:layout_width="152dp" | |||||
android:layout_height="wrap_content" | |||||
android:layout_alignParentTop="true" | |||||
android:layout_marginStart="8dp" | |||||
android:layout_marginTop="4dp" | |||||
android:text="@string/folio" | |||||
android:textColor="@color/md_theme_onPrimary" | |||||
android:textSize="14sp" | |||||
android:textStyle="bold" /> | |||||
<TextView | |||||
android:id="@+id/txtcap_clave" | |||||
android:textColor="@color/colorTextPrimary" | |||||
android:layout_width="191dp" | |||||
android:layout_height="25dp" | |||||
android:layout_below="@+id/txtcap_clave2" | |||||
android:layout_alignParentEnd="true" | |||||
android:layout_marginTop="3dp" | |||||
android:layout_marginEnd="6dp" | |||||
android:textSize="14sp" | |||||
android:textStyle="bold" /> | |||||
<TextView | |||||
android:id="@+id/txtcap_clave2" | |||||
android:textColor="@color/colorTextPrimary" | |||||
android:layout_width="191dp" | |||||
android:layout_height="wrap_content" | |||||
android:layout_alignParentTop="true" | |||||
android:layout_alignParentEnd="true" | |||||
android:layout_marginTop="4dp" | |||||
android:layout_marginEnd="6dp" | |||||
android:text="@string/clave" | |||||
android:textSize="14sp" | |||||
android:textStyle="bold" /> | |||||
<TextView | |||||
android:id="@+id/txtcap_folio" | |||||
android:textColor="@color/colorTextPrimary" | |||||
android:layout_width="152dp" | |||||
android:layout_height="25dp" | |||||
android:layout_below="@+id/txtcap_folio2" | |||||
android:layout_marginStart="8dp" | |||||
android:layout_marginTop="3dp" | |||||
android:textSize="14sp" | |||||
android:textStyle="bold" /> | |||||
</RelativeLayout> | |||||
<RelativeLayout | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:layout_marginTop="5dp"> | |||||
<TextView | |||||
android:id="@+id/txtcap_descfamilia2" | |||||
android:layout_width="152dp" | |||||
android:textColor="@color/colorTextPrimary" | |||||
android:layout_height="wrap_content" | |||||
android:layout_alignParentTop="true" | |||||
android:layout_marginStart="8dp" | |||||
android:layout_marginTop="4dp" | |||||
android:text="@string/familia" | |||||
android:textSize="14sp" | |||||
android:textStyle="bold" /> | |||||
<TextView | |||||
android:id="@+id/txtcap_descfamilia" | |||||
android:layout_width="186dp" | |||||
android:textColor="@color/colorTextPrimary" | |||||
android:layout_height="32dp" | |||||
android:layout_below="@+id/txtcap_descfamilia2" | |||||
android:layout_alignParentEnd="true" | |||||
android:layout_marginTop="0dp" | |||||
android:layout_marginEnd="10dp" | |||||
android:textSize="14sp" | |||||
android:textStyle="bold" /> | |||||
<TextView | |||||
android:id="@+id/txtcap_subfamilia2" | |||||
android:layout_width="187dp" | |||||
android:textColor="@color/colorTextPrimary" | |||||
android:layout_height="wrap_content" | |||||
android:layout_alignParentTop="true" | |||||
android:layout_alignParentEnd="true" | |||||
android:layout_marginTop="1dp" | |||||
android:layout_marginEnd="8dp" | |||||
android:text="@string/sub_familia" | |||||
android:textSize="14sp" | |||||
android:textStyle="bold" /> | |||||
<TextView | |||||
android:id="@+id/txtcap_subfamilia" | |||||
android:layout_width="152dp" | |||||
android:textColor="@color/colorTextPrimary" | |||||
android:layout_height="32dp" | |||||
android:layout_below="@+id/txtcap_subfamilia2" | |||||
android:layout_marginStart="8dp" | |||||
android:layout_marginTop="3dp" | |||||
android:textSize="14sp" | |||||
android:textStyle="bold" /> | |||||
</RelativeLayout> | |||||
<TextView | |||||
android:id="@+id/txtcap_articulo" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:textColor="@color/colorTextPrimary" | |||||
android:layout_marginBottom="10dp" | |||||
android:layout_marginEnd="5dp" | |||||
android:layout_marginStart="5dp" | |||||
android:text="@string/articulo" | |||||
android:textAlignment="center" | |||||
android:textSize="18sp" | |||||
android:textStyle="bold" /> | |||||
</LinearLayout> | |||||
</androidx.cardview.widget.CardView> | |||||
<LinearLayout | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:orientation="horizontal" | |||||
android:layout_gravity="center"> | |||||
<EditText | |||||
android:id="@+id/txtcap_Cantidad" | |||||
android:layout_width="162dp" | |||||
android:layout_height="wrap_content" | |||||
android:layout_marginTop="5dp" | |||||
android:autofillHints="" | |||||
android:selectAllOnFocus="true" | |||||
android:ems="10" | |||||
android:inputType="number" | |||||
android:textAlignment="center" | |||||
android:textAllCaps="false" /> | |||||
<Button | |||||
android:id="@+id/btncap_aceptar" | |||||
android:layout_width="0dp" | |||||
android:layout_height="wrap_content" | |||||
android:layout_weight="1" | |||||
android:text="@string/btnaceptar" /> | |||||
</LinearLayout> | |||||
</LinearLayout> | |||||
</ScrollView> |
@ -0,0 +1,12 @@ | |||||
<?xml version="1.0" encoding="utf-8"?> | |||||
<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android" | |||||
android:id="@android:id/text1" | |||||
style="?android:attr/spinnerDropDownItemStyle" | |||||
android:singleLine="true" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="35dp" | |||||
android:ellipsize="marquee" | |||||
android:textSize="15dp" | |||||
android:maxLines="3" | |||||
/> |
@ -0,0 +1,12 @@ | |||||
<?xml version="1.0" encoding="utf-8"?> | |||||
<TextView xmlns:android="http://schemas.android.com/apk/res/android" | |||||
android:id="@android:id/text1" | |||||
style="?android:attr/spinnerItemStyle" | |||||
android:singleLine="false" | |||||
android:maxLines="3" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:ellipsize="marquee" | |||||
android:textSize="12dp" | |||||
android:textAlignment="inherit"/> |
@ -0,0 +1,10 @@ | |||||
<menu xmlns:android="http://schemas.android.com/apk/res/android" | |||||
xmlns:app="http://schemas.android.com/apk/res-auto"> | |||||
<item android:id="@+id/action_reload" | |||||
android:title="@string/realod" | |||||
android:icon="@drawable/ic_plus" | |||||
app:showAsAction="always"/> | |||||
</menu> |
@ -0,0 +1,13 @@ | |||||
<?xml version="1.0" encoding="utf-8"?> | |||||
<menu xmlns:android="http://schemas.android.com/apk/res/android" | |||||
xmlns:app="http://schemas.android.com/apk/res-auto"> | |||||
<item | |||||
android:id="@+id/refresh" | |||||
android:icon="@drawable/ic_launcher" | |||||
android:title="@string/refreshitems" | |||||
android:contentDescription="@string/desrefreshitems" | |||||
app:showAsAction="ifRoom" /> | |||||
</menu> |
@ -0,0 +1,5 @@ | |||||
<?xml version="1.0" encoding="utf-8"?> | |||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> | |||||
<background android:drawable="@color/ic_launcher_background"/> | |||||
<foreground android:drawable="@mipmap/ly_codebar_icon"/> | |||||
</adaptive-icon> |
@ -0,0 +1,5 @@ | |||||
<?xml version="1.0" encoding="utf-8"?> | |||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> | |||||
<background android:drawable="@color/ic_launcher_background"/> | |||||
<foreground android:drawable="@mipmap/ly_codebar_icon"/> | |||||
</adaptive-icon> |
@ -0,0 +1,5 @@ | |||||
<?xml version="1.0" encoding="utf-8"?> | |||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> | |||||
<background android:drawable="@drawable/ic_launcher_background" /> | |||||
<foreground android:drawable="@drawable/ic_launcher_foreground" /> | |||||
</adaptive-icon> |
@ -0,0 +1,5 @@ | |||||
<?xml version="1.0" encoding="utf-8"?> | |||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> | |||||
<background android:drawable="@drawable/ic_launcher_background" /> | |||||
<foreground android:drawable="@drawable/ic_launcher_foreground" /> | |||||
</adaptive-icon> |