diff --git a/app/build.gradle.kts b/app/build.gradle.kts index e3e76aa..bf2dc03 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -7,14 +7,13 @@ plugins { android { namespace = "com.arr.simple" compileSdk = 34 - buildToolsVersion = "34.0.0" defaultConfig { applicationId = "com.arr.simple" minSdk = 23 - targetSdk = 33 - versionCode = 45 - versionName = "4.0.5" + targetSdk = 34 + versionCode = 47 + versionName = "4.0.7-beta" vectorDrawables { useSupportLibrary = true @@ -25,21 +24,12 @@ android { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 } - /* - signingConfigs { - release { - storeFile(file("signing-key.jks")) - storePassword("") - keyAlias ("") - keyPassword ("") - } - } -*/ + buildTypes { release { isMinifyEnabled = false proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") - /*signingConfig(signingConfigs("release"))*/ + } } @@ -77,7 +67,7 @@ dependencies { implementation("com.github.suitetecsa:suitetecsa-sdk-kotlin:0.1.9") implementation("com.airbnb.android:lottie:6.1.0") implementation("com.github.applifycu:bugsend:1.0.4-alpha3") - implementation("com.github.applifycu:nautaclear:1.0.0") + implementation("com.github.applifycu:nautaclear:1.0.0-alpha2") implementation("de.hdodenhof:circleimageview:3.1.0") /* local projects */ diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index d5897b0..f643714 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -18,4 +18,8 @@ # If you keep the line number information, uncomment this to # hide the original source file name. -#-renamesourcefileattribute SourceFile \ No newline at end of file +#-renamesourcefileattribute SourceFile + +-keep class com.github.applifycu.** { +*; +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6740525..25aaab6 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,6 +1,6 @@ @@ -35,8 +35,7 @@ - - + - - - - - + @@ -86,10 +78,25 @@ android:scheme="package" /> - + + + + + + - + android:name=".services.TrafficFloatingWindow" /> + + + + + + = 30 && dayOfMonth <= 31){ - Menu menu = railView.getMenu(); - MenuItem i1 = menu.findItem(R.id.nav_rail_home); - MenuItem i2 = menu.findItem(R.id.nav_rail_servicios); - MenuItem i3 = menu.findItem(R.id.nav_rail_correo); - MenuItem i4 = menu.findItem(R.id.nav_rail_telepuntos); - MenuItem i5 = menu.findItem(R.id.nav_rail_settings); - MenuItem i6 = menu.findItem(R.id.nav_rail_about); - + Menu menu = railView.getMenu(); + MenuItem i1 = menu.findItem(R.id.nav_rail_home); + MenuItem i2 = menu.findItem(R.id.nav_rail_servicios); + MenuItem i3 = menu.findItem(R.id.nav_rail_correo); + MenuItem i4 = menu.findItem(R.id.nav_rail_telepuntos); + MenuItem i5 = menu.findItem(R.id.nav_rail_settings); + + if (month == Calendar.OCTOBER && dayOfMonth >= 30 && dayOfMonth <= 31) { i1.setIcon(R.drawable.halloween_home); i2.setIcon(R.drawable.skull_24); i3.setIcon(R.drawable.halloween_pumpkin); i4.setIcon(R.drawable.halloween_ghost); i5.setIcon(R.drawable.halloween_spider); - i6.setIcon(R.drawable.halloween_about); } - - //OnItemSelected railView - railView.setOnItemSelectedListener( + + // * del 25 al 31 se agregan iconos de navidad + if (month == Calendar.DECEMBER && dayOfMonth >= 25 && dayOfMonth <= 31) { + i1.setIcon(R.drawable.navidad_home); + i2.setIcon(R.drawable.navidad_services); + i3.setIcon(R.drawable.navidad_correo); + i4.setIcon(R.drawable.navidad_telepuntos); + i5.setIcon(R.drawable.navidad_settings); + } + + // OnItemSelected railView + railView.setOnItemSelectedListener( menuItem -> { int id = menuItem.getItemId(); if (id == R.id.nav_rail_servicios) { @@ -115,16 +129,13 @@ protected void onCreate(Bundle savedInstanceState) { navController.navigate(id, null); } if (id == R.id.nav_rail_telepuntos) { - openGoogleMap(); - // startActivity(new Intent(this, Test.class)); + openGoogleMap(); + // startActivity(new Intent(this, Test.class)); } if (id == R.id.nav_rail_settings) { navController.navigate(id, null); } - if (id == R.id.nav_rail_about) { - navController.navigate(id, null); - } - + return false; }); @@ -157,11 +168,11 @@ protected void onCreate(Bundle savedInstanceState) { // TODO: menu should be considered as top level destinations. mAppBarConfiguration = new AppBarConfiguration.Builder( - R.id.nav_home, - R.id.nav_balance, - R.id.nav_compras, - R.id.nav_llamadas, - R.id.nav_nauta) + R.id.nav_home, + R.id.nav_balance, + R.id.nav_compras, + R.id.nav_llamadas, + R.id.nav_nauta) .setOpenableLayout(drawer) .build(); @@ -186,7 +197,8 @@ protected void onCreate(Bundle savedInstanceState) { || id == R.id.nav_info_nauta || id == R.id.nav_conectado || id == R.id.nav_rail_about - || id == R.id.nav_mails) { + || id == R.id.nav_mails + || id == R.id.nav_help) { binding.appBarMain.contentToolbar.setVisibility(View.GONE); getWindow().setNavigationBarColor(SurfaceColors.SURFACE_0.getColor(this)); binding.appBarMain.bottomNavigation.setVisibility(View.GONE); @@ -294,20 +306,20 @@ protected void onResume() { Intent intent = new Intent(this, TrafficFloatingWindow.class); startService(intent); } - - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - /* - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { ->>>>>>> 46ba879976366f0f3ccee8c77ffebe88a9b18b6f - boolean isNotifi = spFloating.getBoolean("balance_notif", true); - if (isNotifi) { - Intent broadcast = new Intent(this, NotificationBalances.class); - sendBroadcast(broadcast); - } - - */ - } } + private void initNotificationNewYear() { + AlarmManager alarm = (AlarmManager) getSystemService(Context.ALARM_SERVICE); + Intent intent = new Intent(this, NotificationNewYear.class); + intent.setAction("com.arr.simple.NOTIFICATION"); + PendingIntent pIntent = + PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_IMMUTABLE); + Calendar calendar = Calendar.getInstance(); + calendar.set(Calendar.MONTH, Calendar.JANUARY); + calendar.set(Calendar.DAY_OF_MONTH, 1); + calendar.set(Calendar.HOUR_OF_DAY, 0); + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.SECOND, 0); + alarm.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pIntent); + } } diff --git a/app/src/main/java/com/arr/simple/broadcast/NotificationNewYear.java b/app/src/main/java/com/arr/simple/broadcast/NotificationNewYear.java new file mode 100644 index 0000000..a13c490 --- /dev/null +++ b/app/src/main/java/com/arr/simple/broadcast/NotificationNewYear.java @@ -0,0 +1,63 @@ +package com.arr.simple.broadcast; + +import android.app.NotificationChannel; +import android.app.NotificationManager; +import android.content.BroadcastReceiver; +import android.content.Intent; +import android.content.Context; +import android.os.Build; +import androidx.core.app.NotificationManagerCompat; +import com.arr.simple.R; +import androidx.core.app.NotificationCompat; +import java.util.Calendar; + +public class NotificationNewYear extends BroadcastReceiver { + + private String CHANNEL_ID = "SIMple"; + private String CHANNEL_NAME = "New Year"; + private String CHANNEL_DESCRIPTION = "Notificación por nuevo año"; + + @Override + public void onReceive(Context context, Intent intent) { + Calendar calendar = Calendar.getInstance(); + int currentDay = calendar.get(Calendar.DAY_OF_MONTH); + int currentMonth = calendar.get(Calendar.MONTH); + if (currentDay == 1 && currentMonth == Calendar.JANUARY) { + + if (intent.getAction().equals("com.arr.simple.NOTIFICATION")) { + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + NotificationChannel channel = + new NotificationChannel( + CHANNEL_ID, + CHANNEL_NAME, + NotificationManager.IMPORTANCE_DEFAULT); + channel.setDescription(CHANNEL_DESCRIPTION); + channel.enableVibration(true); + channel.setShowBadge(true); + channel.setSound(null, null); + NotificationManager notiManager = + context.getSystemService(NotificationManager.class); + notiManager.createNotificationChannel(channel); + } + + NotificationCompat.Builder builder = + new NotificationCompat.Builder(context, CHANNEL_ID) + .setSmallIcon(R.drawable.ic_logo_simple) + .setContentTitle("¡Feliz año nuevo!") + .setStyle( + new NotificationCompat.BigTextStyle() + .bigText( + context.getString(R.string.happy_new_year))) + .setContentText(context.getString(R.string.happy_new_year)) + .setShowWhen(false) + .setSound(null) + .setPriority(NotificationCompat.PRIORITY_DEFAULT); + + NotificationManagerCompat notificationManager = + NotificationManagerCompat.from(context); + notificationManager.notify(23, builder.build()); + } + } + } +} diff --git a/app/src/main/java/com/arr/simple/nauta/LoginNauta.java b/app/src/main/java/com/arr/simple/nauta/LoginNauta.java index 87c913f..1deae99 100644 --- a/app/src/main/java/com/arr/simple/nauta/LoginNauta.java +++ b/app/src/main/java/com/arr/simple/nauta/LoginNauta.java @@ -4,6 +4,7 @@ import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.util.Log; +import android.widget.Toast; import androidx.navigation.NavController; import androidx.navigation.Navigation; import com.arr.simple.App; @@ -35,8 +36,7 @@ public LoginNauta(Activity activity) { public long time() { return mTime; } - - + // hacer coneccion con el login nauta public void connect(String usuario, String password, LoginCallback callback) { Executor executor = Executors.newSingleThreadExecutor(); @@ -103,7 +103,7 @@ public void captcha(CaptchaCallback callback) { mActivity.runOnUiThread(() -> callback.loadCaptcha(bitmap)); } catch (Exception e) { e.printStackTrace(); - mActivity.runOnUiThread(() -> callback.handlerException(e)); + showToast("Error: " + e); } }); } @@ -126,4 +126,8 @@ public void desconectar(ExceptionCallback callback) { private NavController navigation() { return Navigation.findNavController(mActivity, R.id.nav_host_fragment_content_main); } + + private void showToast(String message) { + mActivity.runOnUiThread(() -> Toast.makeText(mActivity, message, Toast.LENGTH_LONG).show()); + } } diff --git a/app/src/main/java/com/arr/simple/services/FloatingWindow.java b/app/src/main/java/com/arr/simple/services/FloatingWindow.java new file mode 100644 index 0000000..e8c6c24 --- /dev/null +++ b/app/src/main/java/com/arr/simple/services/FloatingWindow.java @@ -0,0 +1,256 @@ +package com.arr.simple.services; + +import android.app.NotificationChannel; +import android.app.NotificationManager; +import android.app.Service; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.IntentFilter; +import android.graphics.PixelFormat; +import android.net.ConnectivityManager; +import android.net.TrafficStats; +import android.os.Build; +import android.os.Handler; +import android.os.IBinder; +import android.content.Intent; +import android.os.Looper; +import android.provider.Settings; +import android.util.DisplayMetrics; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.MotionEvent; +import android.view.View; +import com.arr.simple.R; +import android.view.WindowManager; +import androidx.core.app.NotificationCompat; +import com.arr.simple.databinding.LayoutFloatingWindowBinding; + +public class FloatingWindow extends Service { + + private WindowManager windowManager; + private LayoutFloatingWindowBinding binding; + private WindowManager.LayoutParams layoutParams; + + private static final String CHANNEL = "traffic"; + private boolean isVisible = false; + + @Override + public IBinder onBind(Intent intent) { + return null; + } + + + private Handler handler = new Handler(Looper.getMainLooper()); + + private long lastRxBytes = 0; + private long lastTxBytes = 0; + private long lastTime = 0; + + private final Runnable runnable = + new Runnable() { + public void run() { + long currentRxBytes = TrafficStats.getTotalRxBytes(); + long currentTxBytes = TrafficStats.getTotalTxBytes(); + long usedRxBytes = currentRxBytes - lastRxBytes; + long usedTxBytes = currentTxBytes - lastTxBytes; + long currentTime = System.currentTimeMillis(); + long usedTime = currentTime - lastTime; + + lastRxBytes = currentRxBytes; + lastTxBytes = currentTxBytes; + lastTime = currentTime; + binding.textSpeed.setText(calculateSpeed(usedTime, usedRxBytes, usedTxBytes)); + + handler.postDelayed(runnable, 1000); + } + + public String calculateSpeed(long timeTaken, long downBytes, long upBytes) { + long downSpeed = 0; + long upSpeed = 0; + + if (timeTaken > 0) { + downSpeed = downBytes * 1000 / timeTaken; + upSpeed = upBytes * 1000 / timeTaken; + } + final long mDownSpeed = downSpeed; + final long mUpSpeed = upSpeed; + + String down = setSpeed(mDownSpeed); + String up = setSpeed(mUpSpeed); + + StringBuilder sb = new StringBuilder(); + sb.append("↓ ").append(down).append(" ↑ ").append(up); + + binding.textSpeed.setText(sb.toString()); + return sb.toString(); + } + + private String setSpeed(long speed) { + if (speed < 1000000) { + return String.format("%.1f KB", (speed / 1000.0)); + } else if (speed >= 1000000) { + if (speed < 10000000) { + return String.format("%.1f MB", (speed / 1000000.0)); + } else if (speed < 100000000) { + return String.format("%.1f MB", (speed / 1000000.0)); + } else { + return "+99 MB"; + } + } else { + return ""; + } + } + }; + + @Override + public void onCreate() { + super.onCreate(); + lastRxBytes = TrafficStats.getTotalRxBytes(); + lastTxBytes = TrafficStats.getTotalTxBytes(); + lastTime = System.currentTimeMillis(); + + + + registerReceiver(network, new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE")); + + } + + private BroadcastReceiver network = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + if (activeNetwork()) { + if (windowManager == null) + initFloating(); + showFloatWidget(); + } else { + hideFloatWidget(); + } + } + }; + + private boolean activeNetwork() { + ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); + if (cm != null) { + return cm.getActiveNetworkInfo() != null; + } + return false; + } + + // permiso de superposición + private boolean permission(){ + if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){ + return Settings.canDrawOverlays(this); + } + return true; + } + + private void hideFloatWidget() { + if (isVisible && windowManager != null) { + windowManager.removeView(binding.getRoot()); + isVisible = false; + } + } + + private void showFloatWidget() { + if (!isVisible && windowManager != null) { + if (binding.getRoot().isAttachedToWindow()) { + return; + } + int fx = 0; + int fy = 0; + + layoutParams.x = fx; + layoutParams.y = fy; + + windowManager.addView(binding.getRoot(), layoutParams); + isVisible = true; + } + } + + // iniciar superposicion + private void initFloating(){ + if(permission()){ + windowManager = (WindowManager) getSystemService(WINDOW_SERVICE); + binding = LayoutFloatingWindowBinding.inflate(LayoutInflater.from(this)); + + // inflating window + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + layoutParams = + new WindowManager.LayoutParams( + WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY, + WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE + | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED, + PixelFormat.TRANSLUCENT); + } else { + layoutParams = + new WindowManager.LayoutParams( + WindowManager.LayoutParams.TYPE_PHONE, + WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE + | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED, + PixelFormat.TRANSLUCENT); + } + layoutParams.gravity = Gravity.TOP | Gravity.LEFT; + layoutParams.x = 0; + layoutParams.y = 0; + layoutParams.horizontalMargin = 0.1f; + layoutParams.verticalMargin = 0.1f; + layoutParams.width = WindowManager.LayoutParams.WRAP_CONTENT; + layoutParams.height = WindowManager.LayoutParams.WRAP_CONTENT; + + // touch floating + binding.floating.setOnTouchListener( + new View.OnTouchListener() { + int x = 0; + int y = 0; + + float touchX; + float touchY; + + @Override + public boolean onTouch(View view, MotionEvent event) { + switch (event.getAction()) { + case MotionEvent.ACTION_DOWN: + x = layoutParams.x; + y = layoutParams.y; + touchX = event.getRawX(); + touchY = event.getRawY(); + break; + case MotionEvent.ACTION_MOVE: + layoutParams.x = x + (int) (event.getRawX() - touchX); + layoutParams.y = y + (int) (event.getRawY() - touchY); + windowManager.updateViewLayout(binding.getRoot(), layoutParams); + break; + } + return true; + } + }); + + windowManager.addView(binding.getRoot(), layoutParams); + + // crear notofocacion + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + NotificationChannel channel = + new NotificationChannel( + CHANNEL, "servicios", NotificationManager.IMPORTANCE_DEFAULT); + channel.setDescription("description"); + NotificationManager notificationManager = getSystemService(NotificationManager.class); + notificationManager.createNotificationChannel(channel); + } + NotificationCompat.Builder builder = + new NotificationCompat.Builder(this, CHANNEL) + .setContentTitle(getString(R.string.app_name)) + .setContentText( + getString(R.string.app_name) + + " se está ejecutando en segundo plano") + .setSmallIcon(R.drawable.ic_logo_simple); + int NOTIFICATION_ID = 1; + startForeground(NOTIFICATION_ID, builder.build()); + handler.post(runnable); + } + } + @Override + public void onDestroy() { + super.onDestroy(); + unregisterReceiver(network); + } +} diff --git a/app/src/main/java/com/arr/simple/services/TrafficFloatingWindow.java b/app/src/main/java/com/arr/simple/services/TrafficFloatingWindow.java index 1323128..52bd30b 100644 --- a/app/src/main/java/com/arr/simple/services/TrafficFloatingWindow.java +++ b/app/src/main/java/com/arr/simple/services/TrafficFloatingWindow.java @@ -3,8 +3,10 @@ import android.app.NotificationChannel; import android.app.NotificationManager; import android.app.Service; +import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; +import android.content.IntentFilter; import android.content.SharedPreferences; import android.graphics.PixelFormat; import android.graphics.drawable.GradientDrawable; @@ -16,6 +18,7 @@ import android.os.Handler; import android.os.IBinder; import android.os.Looper; +import android.provider.Settings; import android.view.Gravity; import android.view.LayoutInflater; import android.view.MotionEvent; @@ -35,7 +38,8 @@ public class TrafficFloatingWindow extends Service { private View view; private static final String CHANNEL = "traffic"; private LayoutFloatingWindowBinding binding; - + private BroadcastReceiver broadcastNetwork; + @Override public IBinder onBind(Intent intent) { return null; @@ -64,8 +68,9 @@ public void run() { handler.postDelayed(runnable, 1000); } - - public String calculateSpeed(long timeTaken, long downBytes, long upBytes) { + + + public String calculateSpeed(long timeTaken, long downBytes, long upBytes) { long downSpeed = 0; long upSpeed = 0; @@ -109,6 +114,7 @@ public void onCreate() { lastRxBytes = TrafficStats.getTotalRxBytes(); lastTxBytes = TrafficStats.getTotalTxBytes(); lastTime = System.currentTimeMillis(); + windowManager = (WindowManager) getSystemService(WINDOW_SERVICE); binding = LayoutFloatingWindowBinding.inflate(LayoutInflater.from(this)); @@ -195,12 +201,6 @@ public boolean onTouch(View view, MotionEvent event) { } } - if(connected()){ - startService(new Intent(this, TrafficFloatingWindow.class)); - }else{ - stopService(new Intent(this, TrafficFloatingWindow.class)); - } - // crear notofocacion if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { NotificationChannel channel = @@ -238,4 +238,18 @@ private boolean connected(){ return false; } } + + private void startFloating(){ + if(permissions()){ + + } + } + + private boolean permissions(){ + if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){ + return Settings.canDrawOverlays(this); + + } + return true; + } } diff --git a/app/src/main/java/com/arr/simple/ui/balances/BalanceFragment.java b/app/src/main/java/com/arr/simple/ui/balances/BalanceFragment.java index 8d2238f..bfe738c 100644 --- a/app/src/main/java/com/arr/simple/ui/balances/BalanceFragment.java +++ b/app/src/main/java/com/arr/simple/ui/balances/BalanceFragment.java @@ -13,6 +13,7 @@ import androidx.fragment.app.Fragment; import androidx.preference.PreferenceManager; import com.arr.services.ResponseUssd; +import com.arr.services.UssdResponse; import com.arr.services.utils.ussd.SendUssdUtils; import com.arr.simple.databinding.FragmentBalanceBinding; import java.text.SimpleDateFormat; @@ -30,6 +31,8 @@ public class BalanceFragment extends Fragment { private SendUssdUtils utils; private ResponseUssd response; + private UssdResponse response2; + private final String[] ussdCodes = { "*222#", "*222*328#", "*222*266#", "*222*767#", "*222*869#", }; @@ -38,7 +41,7 @@ public class BalanceFragment extends Fragment { private SharedPreferences sp; private SharedPreferences.Editor edit; private String sim; - + @Override public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle arg2) { binding = FragmentBalanceBinding.inflate(inflater, parent, false); @@ -46,13 +49,14 @@ public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle arg2) sp = PreferenceManager.getDefaultSharedPreferences(requireContext()); edit = sp.edit(); sim = sp.getString("sim", "0"); - + // services sendUssd utils = new SendUssdUtils(getContext()); response = new ResponseUssd(utils); + response2 = new UssdResponse(utils); // mostrar contenido - viewContectBalances(); + // viewContectBalances(); binding.updateTime.setText(sp.getString("update", "sin actualizar")); // sincronizar balances @@ -63,15 +67,43 @@ public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle arg2) showToast("Actualizando balances, espere..."); }); + // balances datos + response2.balancesDatos( + binding.textTarifa, + binding.textDatos, + binding.textDatosLte, + binding.textMensajeria, + binding.textDiaria, + binding.textDatosCu); + + // expire datos + response2.balanceVencimiento( + binding.textVenceDatos, binding.textVenceMensajeria, binding.textVenceDiaria); + int progress = response2.expireDaysProgress(); + progress(progress); + + // balances saldo + response2.balancesSaldo( + binding.saldo, + binding.textVenceSaldo, + binding.min, + binding.sms, + binding.venceMinSms); + + // bonos en promoción + response2.balanceBonos(binding.bonoIlimitado, binding.bonoSaldoo, binding.bonoDatos); + return binding.getRoot(); } private void viewContectBalances() { // bonos - if((response.ilimitado() != null && !response.ilimitado().isBlank()) || (response.bonosDatos() != null && !response.bonosDatos().isBlank()) || (response.bonosSaldo() != null && !response.bonosSaldo().isBlank())){ + if ((response.ilimitado() != null && !response.ilimitado().isBlank()) + || (response.bonosDatos() != null && !response.bonosDatos().isBlank()) + || (response.bonosSaldo() != null && !response.bonosSaldo().isBlank())) { binding.cardBonos.setVisibility(View.VISIBLE); } - + if (!response.ilimitado().isEmpty()) { binding.ilimitados.setVisibility(View.VISIBLE); binding.ilimitados.setText(response.ilimitado()); @@ -88,29 +120,33 @@ private void viewContectBalances() { // balances datos binding.textTarifa.setText(response.tarifa()); binding.textDatos.setText(response.allData()); + + Log.w("ALLLL ", response.allData()); + binding.textDatosLte.setText(response.dataLte()); binding.textDatosCu.setText(response.nacionales()); - binding.textVenceDatos.setText(response.venceAllData()); - + binding.textVenceDatos.setText(response.venceAllData().replace(" dias", " días")); + // update progress bar if (response.venceAllData() != null) { - Matcher matcher = Pattern.compile("\\d+").matcher(response.venceAllData()); - while(matcher.find()) { - String strDays = matcher.group(); - if(strDays != null){ + Matcher matcher = + Pattern.compile("\\d+").matcher(response.venceAllData().replace(" dias", "")); + while (matcher.find()) { + String strDays = matcher.group(); + if (strDays != null) { int days = Integer.parseInt(strDays); - progress(days); + progress(days); } } } else { progress(0); } - - // bolsa diaria + + // bolsa diaria binding.textDiaria.setText(response.diaria()); binding.textVenceDiaria.setText(response.venceDiaria()); - - // bolsa de mensajeria + + // bolsa de mensajeria binding.textMensajeria.setText(response.mensajeria()); binding.textVenceMensajeria.setText(response.venceMensajeria()); @@ -119,13 +155,14 @@ private void viewContectBalances() { binding.textVenceSaldo.setText("Expira: " + response.venceSaldo()); binding.min.setText(response.minutos()); binding.sms.setText(response.mensajes()); - binding.venceMinSms.setText(response.venceMensajes()); + binding.venceMinSms.setText(response.venceMensajes().replace(" dias", " días")); } - + // execute code ussd private void executeUssdRequest(Handler handler, int index) { if (index >= ussdCodes.length) { if (isVisible()) { + binding.swipeRefresh.setRefreshing(false); showToast("Balances actualizados"); viewContectBalances(); @@ -155,8 +192,8 @@ private void progress(int days) { binding.progressDatos.setMax(100); binding.progressDatos.setProgress(progress); } - - private void updateTime(){ + + private void updateTime() { Calendar calendar = Calendar.getInstance(); Date dat = calendar.getTime(); SimpleDateFormat datFormat = new SimpleDateFormat("hh:mm a", Locale.getDefault()); @@ -165,8 +202,8 @@ private void updateTime(){ edit.apply(); String hor = sp.getString("update", "sin actualizar"); binding.updateTime.setText(hor); + } -} @Override public void onDestroyView() { super.onDestroyView(); diff --git a/app/src/main/java/com/arr/simple/ui/home/AboutFragment.java b/app/src/main/java/com/arr/simple/ui/home/AboutFragment.java index 7a5e351..1dee6aa 100644 --- a/app/src/main/java/com/arr/simple/ui/home/AboutFragment.java +++ b/app/src/main/java/com/arr/simple/ui/home/AboutFragment.java @@ -66,6 +66,7 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle ar list.add(new About(R.drawable.ic_favorite_24px, "Donar", "Apoyar nuestro proyecto")); list.add(new About(R.drawable.ic_translate_24px,"Traducir","Ayudar a traducir la aplicación")); + // app version try { String version = diff --git a/app/src/main/java/com/arr/simple/ui/nauta/correo/ClearFragments.java b/app/src/main/java/com/arr/simple/ui/nauta/correo/ClearFragments.java index 41c74b9..407cffb 100644 --- a/app/src/main/java/com/arr/simple/ui/nauta/correo/ClearFragments.java +++ b/app/src/main/java/com/arr/simple/ui/nauta/correo/ClearFragments.java @@ -133,7 +133,7 @@ public void handleException(Exception e) { } private void showToast(String message) { - Toast.makeText(getActivity(), message, Toast.LENGTH_LONG).show(); + Toast.makeText(requireContext(), message, Toast.LENGTH_LONG).show(); } private boolean isVpnActive() { diff --git a/app/src/main/java/com/arr/simple/ui/nauta/login/LoginFragment.java b/app/src/main/java/com/arr/simple/ui/nauta/login/LoginFragment.java index 2a2f521..432fb6c 100644 --- a/app/src/main/java/com/arr/simple/ui/nauta/login/LoginFragment.java +++ b/app/src/main/java/com/arr/simple/ui/nauta/login/LoginFragment.java @@ -51,14 +51,14 @@ public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle arg2) // rellenado SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(requireActivity()); boolean isActive = sp.getBoolean("autocomplete", false); - if(isActive){ + if (isActive) { binding.editUser.setText(sp.getString("internet", "")); - binding.editPassword.setText(sp.getString("passInternet","")); - }else{ + binding.editPassword.setText(sp.getString("passInternet", "")); + } else { binding.editUser.getText().clear(); binding.editPassword.getText().clear(); } - + // VPN Activo if (isVpnActive()) { Toast.makeText(getActivity(), "Desactive su VPN para poder acceder ", Toast.LENGTH_LONG) @@ -106,9 +106,10 @@ public void navController( map.put("estado", info.getAccountInfo().getAccountStatus()); map.put("account", usuario); new Data(getActivity()).save("login", map); + + // next to info + navigation.navigate(R.id.nav_conectado, null, options()); } - // next to info - navigation.navigate(R.id.nav_conectado, null, options()); } @Override diff --git a/app/src/main/java/com/arr/simple/ui/nauta/portal/PortalFragment.java b/app/src/main/java/com/arr/simple/ui/nauta/portal/PortalFragment.java index e1f3853..ae90603 100644 --- a/app/src/main/java/com/arr/simple/ui/nauta/portal/PortalFragment.java +++ b/app/src/main/java/com/arr/simple/ui/nauta/portal/PortalFragment.java @@ -57,14 +57,14 @@ public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle arg2) // rellenado SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(requireActivity()); boolean isActive = sp.getBoolean("autocomplete", false); - if(isActive){ + if (isActive) { binding.editUser.setText(sp.getString("internet", "")); - binding.editPassword.setText(sp.getString("passInternet","")); - }else{ + binding.editPassword.setText(sp.getString("passInternet", "")); + } else { binding.editUser.getText().clear(); binding.editPassword.getText().clear(); } - + // load captcha if (isVpnActive()) { binding.imageCaptcha.setImageDrawable( @@ -150,8 +150,9 @@ public void loadCaptcha(Bitmap bitmap) { @Override public void handlerException(Exception e) { - Toast.makeText(requireContext(), "" + e, Toast.LENGTH_LONG).show(); - image.setImageDrawable(requireActivity().getDrawable(R.drawable.ic_about_24px)); + // Toast.makeText(getActivity(), "" + e, Toast.LENGTH_LONG).show(); + image.setImageDrawable( + requireActivity().getDrawable(R.drawable.ic_about_24px)); } }); } diff --git a/app/src/main/java/com/arr/simple/ui/settings/AboutPreference.java b/app/src/main/java/com/arr/simple/ui/settings/AboutPreference.java new file mode 100644 index 0000000..ad8873d --- /dev/null +++ b/app/src/main/java/com/arr/simple/ui/settings/AboutPreference.java @@ -0,0 +1,96 @@ +package com.arr.simple.ui.settings; + +import android.content.Intent; +import android.net.Uri; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import androidx.navigation.NavController; +import androidx.navigation.NavOptions; +import androidx.navigation.Navigation; +import androidx.preference.PreferenceFragmentCompat; +import com.arr.preference.M3Preference; +import com.arr.simple.R; +import android.view.ViewGroup; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import com.arr.simple.databinding.FragmentSettingsBinding; + +public class AboutPreference extends Fragment { + + private FragmentSettingsBinding binding; + + public View onCreateView( + @NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + binding = FragmentSettingsBinding.inflate(inflater, container, false); + View root = binding.getRoot(); + if (root != null) { + requireActivity() + .getSupportFragmentManager() + .beginTransaction() + .replace(R.id.frame, new About()) + .commit(); + } + return root; + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + binding = null; + } + + public static class About extends PreferenceFragmentCompat { + + private NavController nav; + + @Override + public void onViewCreated(View view, Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + + // navigation controller + nav = + Navigation.findNavController( + requireActivity(), R.id.nav_host_fragment_content_main); + } + + @Override + public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { + setPreferencesFromResource(R.xml.preferences_about, rootKey); + + // soporte + M3Preference support = findPreference("support"); + support.setOnPreferenceClickListener( + (preference) -> { + startActivity( + new Intent( + Intent.ACTION_VIEW, + Uri.parse("https://t.me/soporteapplifybot?start=reporte"))); + return true; + }); + + // legal + M3Preference legal = findPreference("legal"); + legal.setOnPreferenceClickListener( + (preference) -> { + startActivity( + new Intent( + Intent.ACTION_VIEW, + Uri.parse( + "https://applifycu.github.io/website/politicas.html"))); + return true; + }); + + // about + M3Preference about = findPreference("about"); + about.setOnPreferenceClickListener( + (preference) -> { + nav.navigate( + R.id.nav_rail_about, + null, + new NavOptions.Builder().setLaunchSingleTop(true).build()); + return true; + }); + } + } +} diff --git a/app/src/main/java/com/arr/simple/ui/settings/SettingsFragment.java b/app/src/main/java/com/arr/simple/ui/settings/SettingsFragment.java index ab59aee..81d757a 100644 --- a/app/src/main/java/com/arr/simple/ui/settings/SettingsFragment.java +++ b/app/src/main/java/com/arr/simple/ui/settings/SettingsFragment.java @@ -173,7 +173,10 @@ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { M3Preference info = findPreference("help"); info.setOnPreferenceClickListener( v -> { - Toast.makeText(getActivity(), "Próximamente...", Toast.LENGTH_LONG).show(); + nav.navigate( + R.id.nav_help, + null, + new NavOptions.Builder().setLaunchSingleTop(true).build()); return true; }); } diff --git a/app/src/main/java/com/arr/simple/ui/settings/SimFragment.java b/app/src/main/java/com/arr/simple/ui/settings/SimFragment.java index 80f05be..42e0c8b 100644 --- a/app/src/main/java/com/arr/simple/ui/settings/SimFragment.java +++ b/app/src/main/java/com/arr/simple/ui/settings/SimFragment.java @@ -100,6 +100,7 @@ public boolean onPreferenceChange(Preference preference, Object newValue) { }); // comprobar si el dispositivo es dualSIM + /* M3ListPreference dualSim = findPreference("sim"); if (hasReadPhoneStatePermission()) { boolean isDualSIM = sim.isDualSIM(); @@ -111,7 +112,7 @@ public boolean onPreferenceChange(Preference preference, Object newValue) { } } else { requestReadPhoneStatePermission(); - } + }*/ } private boolean hasReadPhoneStatePermission() { diff --git a/app/src/main/java/com/arr/simple/ui/settings/UiFragment.java b/app/src/main/java/com/arr/simple/ui/settings/UiFragment.java index 6dcf43f..f012116 100644 --- a/app/src/main/java/com/arr/simple/ui/settings/UiFragment.java +++ b/app/src/main/java/com/arr/simple/ui/settings/UiFragment.java @@ -23,6 +23,7 @@ import com.arr.simple.R; import com.arr.simple.databinding.FragmentSettingsBinding; +import com.arr.simple.services.FloatingWindow; import com.arr.simple.services.TrafficFloatingWindow; import com.arr.simple.utils.ThemeManager; import com.google.android.material.dialog.MaterialAlertDialogBuilder; diff --git a/app/src/main/res/drawable/ic_data_ilimitado_24px.xml b/app/src/main/res/drawable/ic_data_ilimitado_24px.xml index be30bbf..481aa63 100644 --- a/app/src/main/res/drawable/ic_data_ilimitado_24px.xml +++ b/app/src/main/res/drawable/ic_data_ilimitado_24px.xml @@ -1,7 +1,7 @@ diff --git a/app/src/main/res/drawable/ic_file_24px.xml b/app/src/main/res/drawable/ic_file_24px.xml new file mode 100644 index 0000000..fe1bcd1 --- /dev/null +++ b/app/src/main/res/drawable/ic_file_24px.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_support_24px.xml b/app/src/main/res/drawable/ic_support_24px.xml new file mode 100644 index 0000000..bc442e3 --- /dev/null +++ b/app/src/main/res/drawable/ic_support_24px.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/navidad_about.xml b/app/src/main/res/drawable/navidad_about.xml new file mode 100644 index 0000000..085a0ca --- /dev/null +++ b/app/src/main/res/drawable/navidad_about.xml @@ -0,0 +1,12 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/navidad_correo.xml b/app/src/main/res/drawable/navidad_correo.xml new file mode 100644 index 0000000..034d437 --- /dev/null +++ b/app/src/main/res/drawable/navidad_correo.xml @@ -0,0 +1,12 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/navidad_home.xml b/app/src/main/res/drawable/navidad_home.xml new file mode 100644 index 0000000..b89341b --- /dev/null +++ b/app/src/main/res/drawable/navidad_home.xml @@ -0,0 +1,12 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/navidad_services.xml b/app/src/main/res/drawable/navidad_services.xml new file mode 100644 index 0000000..ffcc280 --- /dev/null +++ b/app/src/main/res/drawable/navidad_services.xml @@ -0,0 +1,12 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/navidad_settings.xml b/app/src/main/res/drawable/navidad_settings.xml new file mode 100644 index 0000000..7c49f62 --- /dev/null +++ b/app/src/main/res/drawable/navidad_settings.xml @@ -0,0 +1,12 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/navidad_telepuntos.xml b/app/src/main/res/drawable/navidad_telepuntos.xml new file mode 100644 index 0000000..e994dde --- /dev/null +++ b/app/src/main/res/drawable/navidad_telepuntos.xml @@ -0,0 +1,12 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/content_card_consultas.xml b/app/src/main/res/layout/content_card_consultas.xml index 1c89057..eb578fe 100644 --- a/app/src/main/res/layout/content_card_consultas.xml +++ b/app/src/main/res/layout/content_card_consultas.xml @@ -12,7 +12,7 @@ android:orientation="horizontal"> + xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + android:layout_height="match_parent" + android:layout_width="match_parent" + android:id="@+id/swipe_refresh"> + android:layout_height="match_parent" + android:layout_width="match_parent" + android:orientation="vertical"> + android:layout_height="wrap_content" + android:layout_width="match_parent" + android:layout_marginBottom="5dp" + android:layout_marginRight="16dp" + android:layout_marginLeft="16dp" + style="@style/MaterialCardView" + android:layout_marginTop="10dp"> + android:layout_height="match_parent" + android:layout_width="match_parent" + android:gravity="center" + android:layout_margin="10dp" + android:orientation="vertical"> + + + + + + + android:layout_height="wrap_content" + android:layout_width="wrap_content" + android:textAppearance="?textAppearanceTitleLarge" + android:id="@+id/saldo" + android:textStyle="bold" + android:text="0.00 CUP" /> + android:layout_height="wrap_content" + android:layout_width="wrap_content" + android:textAppearance="?textAppearanceBodySmall" + android:layout_margin="4dp" + android:id="@+id/text_vence_saldo" + android:text="00/00/00" /> + android:layout_height="wrap_content" + android:layout_width="match_parent" + android:orientation="horizontal" + android:layout_marginTop="10dp"> + android:layout_height="wrap_content" + android:layout_width="match_parent" + android:drawablePadding="6dp" + android:gravity="center_horizontal" + android:layout_weight="1.0" + android:id="@+id/min" + android:drawableTop="@drawable/ic_voz_20px" /> + android:layout_height="wrap_content" + android:layout_width="match_parent" + android:drawablePadding="6dp" + android:gravity="center_horizontal" + android:layout_weight="1.0" + android:id="@+id/sms" + android:drawableTop="@drawable/ic_sms_20px" /> + android:layout_height="wrap_content" + android:layout_width="match_parent" + android:drawablePadding="6dp" + android:gravity="center_horizontal" + android:layout_weight="1.0" + android:id="@+id/vence_min_sms" + android:drawableTop="@drawable/ic_calendar_20px" /> @@ -82,119 +102,145 @@ + android:layout_height="wrap_content" + android:layout_width="match_parent" + android:orientation="horizontal" + android:layout_marginTop="5dp"> + android:layout_height="190dp" + android:layout_width="match_parent" + android:layout_marginBottom="5dp" + android:layout_alignParentLeft="true" + android:layout_marginLeft="16dp" + android:layout_marginRight="5dp" + style="@style/MaterialCardView" + android:layout_weight="1.0"> + android:layout_height="match_parent" + android:layout_width="match_parent" + android:layout_margin="10dp"> + android:layout_height="wrap_content" + android:layout_width="wrap_content" + app:indicatorSize="120dp" + android:layout_centerVertical="true" + app:trackColor="@color/colorSecondaryContainer" + android:layout_centerHorizontal="true" + app:trackCornerRadius="10dp" + app:indicatorInset="10dp" + app:trackThickness="10dp" + android:id="@+id/progress_datos" + app:indicatorColor="@color/colorPrimary" /> + android:layout_height="wrap_content" + android:layout_width="wrap_content" + android:textAppearance="?textAppearanceBodyMedium" + android:layout_centerVertical="true" + android:layout_centerHorizontal="true" + android:id="@+id/text_vence_datos" + android:text="0 días" /> + android:layout_height="190dp" + android:layout_width="130dp" + android:layout_marginBottom="5dp" + android:layout_marginRight="16dp" + android:layout_marginLeft="5dp" + style="@style/MaterialCardView" + android:layout_alignParentRight="true"> + android:layout_height="match_parent" + android:layout_width="match_parent" + android:orientation="vertical"> + android:layout_height="match_parent" + android:layout_width="match_parent" + android:gravity="center_vertical" + android:layout_margin="10dp" + android:orientation="vertical" + android:layout_weight="1.0"> + android:layout_height="wrap_content" + android:layout_width="wrap_content" + android:drawablePadding="10dp" + android:drawableLeft="@drawable/ic_all_data_20px" + android:textAppearance="?textAppearanceBodyMedium" + android:layout_margin="4dp" + android:layout_gravity="center_vertical" + android:id="@+id/text_datos" + android:text="1000 GB" /> + android:layout_height="wrap_content" + android:layout_width="wrap_content" + android:drawablePadding="10dp" + android:drawableLeft="@drawable/ic_data_lte_20px" + android:textAppearance="?textAppearanceBodyMedium" + android:layout_margin="4dp" + android:layout_gravity="center_vertical" + android:id="@+id/text_datos_lte" + android:text="0 GB" /> + android:layout_height="wrap_content" + android:layout_width="wrap_content" + android:drawablePadding="10dp" + android:drawableLeft="@drawable/ic_nacional_20px" + android:textAppearance="?textAppearanceBodyMedium" + android:layout_margin="4dp" + android:layout_gravity="center_vertical" + android:id="@+id/text_datos_cu" + android:text="0 MB" /> + + + + + android:layout_height="wrap_content" + android:layout_width="match_parent" + android:background="@drawable/background_text" + android:gravity="center_horizontal" + android:textAppearance="?textAppearanceLabelSmall" + android:padding="5dp" + android:layout_gravity="center_horizontal" + android:id="@+id/text_tarifa" + android:text="Desactivada" /> @@ -203,161 +249,164 @@ + android:layout_height="wrap_content" + android:layout_width="match_parent" + android:orientation="horizontal"> + android:layout_height="wrap_content" + android:layout_width="match_parent" + android:layout_marginBottom="5dp" + android:layout_marginRight="5dp" + android:layout_marginLeft="16dp" + style="@style/MaterialCardView" + android:layout_marginTop="5dp" + android:layout_alignParentRight="true" + android:layout_weight="1.0"> + android:layout_height="match_parent" + android:layout_width="match_parent" + android:gravity="center" + android:layout_margin="10dp" + android:orientation="vertical"> + android:layout_height="wrap_content" + android:layout_width="wrap_content" + android:drawablePadding="4dp" + android:textAppearance="?textAppearanceBodyMedium" + android:layout_margin="4dp" + android:drawableTop="@drawable/ic_message_20px" + android:id="@+id/text_mensajeria" + android:text="000 MB" /> + android:layout_height="wrap_content" + android:layout_width="wrap_content" + android:textAppearance="?textAppearanceBodySmall" + android:layout_margin="4dp" + android:id="@+id/text_vence_mensajeria" + android:text="0 días" /> + android:layout_height="wrap_content" + android:layout_width="match_parent" + android:layout_marginBottom="5dp" + android:layout_marginRight="16dp" + android:layout_marginLeft="5dp" + style="@style/MaterialCardView" + android:layout_marginTop="5dp" + android:layout_alignParentRight="true" + android:layout_weight="1.0"> + android:layout_height="match_parent" + android:layout_width="match_parent" + android:gravity="center" + android:layout_margin="10dp" + android:orientation="vertical"> + android:layout_height="wrap_content" + android:layout_width="wrap_content" + android:drawablePadding="4dp" + android:textAppearance="?textAppearanceBodyMedium" + android:layout_margin="4dp" + android:drawableTop="@drawable/ic_diaria_20px" + android:id="@+id/text_diaria" + android:text="000 MB" /> + android:layout_height="wrap_content" + android:layout_width="wrap_content" + android:textAppearance="?textAppearanceBodySmall" + android:layout_margin="4dp" + android:id="@+id/text_vence_diaria" + android:text="0 días" /> + + android:layout_height="wrap_content" + android:layout_width="match_parent" + android:visibility="gone" + android:layout_marginBottom="5dp" + android:layout_marginRight="16dp" + android:layout_marginLeft="16dp" + style="@style/MaterialCardView" + android:layout_marginTop="10dp" + android:id="@+id/card_bonos"> + android:layout_height="match_parent" + android:layout_width="match_parent" + android:gravity="center" + android:layout_margin="10dp" + android:orientation="horizontal"> + android:layout_height="wrap_content" + android:layout_width="match_parent" + android:visibility="gone" + android:drawablePadding="4dp" + android:gravity="center_horizontal" + android:textAppearance="?textAppearanceBodyMedium" + android:layout_margin="4dp" + android:layout_weight="1.0" + android:drawableTop="@drawable/ic_data_ilimitado_24px" + android:id="@+id/ilimitados" + android:text="" /> + android:layout_height="wrap_content" + android:layout_width="match_parent" + android:visibility="gone" + android:drawablePadding="4dp" + android:gravity="center_horizontal" + android:textAppearance="?textAppearanceBodyMedium" + android:layout_margin="4dp" + android:layout_weight="1.0" + android:drawableTop="@drawable/ic_all_data_20px" + android:id="@+id/bonos_datos" + android:text="" /> + android:layout_height="wrap_content" + android:layout_width="match_parent" + android:visibility="gone" + android:drawablePadding="4dp" + android:gravity="center_horizontal" + android:textAppearance="?textAppearanceBodyMedium" + android:layout_margin="4dp" + android:layout_weight="1.0" + android:drawableTop="@drawable/ic_saldo_movil_20px" + android:id="@+id/bono_saldo" + android:text="" /> + + android:layout_height="wrap_content" + android:layout_width="wrap_content" + android:background="@drawable/background_text" + android:textAppearance="?textAppearanceBodySmall" + android:padding="6dp" + android:layout_marginTop="10dp" + android:layout_gravity="center_horizontal" + android:id="@+id/update_time" + android:text="" /> + - + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_llamar.xml b/app/src/main/res/layout/fragment_llamar.xml index 1b5275a..930be52 100644 --- a/app/src/main/res/layout/fragment_llamar.xml +++ b/app/src/main/res/layout/fragment_llamar.xml @@ -1,94 +1,102 @@ + xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + android:layout_height="match_parent" + android:layout_width="match_parent" + android:id="@+id/coordinator"> - + - + - + - + - + - + - + -