├── .gitignore ├── .idea ├── .name ├── compiler.xml ├── copyright │ └── profiles_settings.xml ├── dictionaries │ └── Alejandro.xml ├── encodings.xml ├── gradle.xml ├── misc.xml ├── modules.xml └── runConfigurations.xml ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── alejandrolora │ │ └── seccion_01 │ │ └── ApplicationTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── ic_myicon-web.png │ ├── java │ │ └── com │ │ │ └── alejandrolora │ │ │ └── seccion_01 │ │ │ ├── MainActivity.java │ │ │ ├── SecondActivity.java │ │ │ └── ThirdActivity.java │ └── res │ │ ├── layout │ │ ├── activity_main.xml │ │ ├── activity_second.xml │ │ └── activity_third.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.png │ │ └── ic_myicon.png │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.png │ │ └── ic_myicon.png │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.png │ │ └── ic_myicon.png │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.png │ │ └── ic_myicon.png │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.png │ │ └── ic_myicon.png │ │ ├── values-w820dp │ │ └── dimens.xml │ │ └── values │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── com │ └── alejandrolora │ └── seccion_01 │ └── ExampleUnitTest.java ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/workspace.xml 5 | /.idea/libraries 6 | .DS_Store 7 | /build 8 | /captures 9 | -------------------------------------------------------------------------------- /.idea/.name: -------------------------------------------------------------------------------- 1 | Seccion_01 -------------------------------------------------------------------------------- /.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /.idea/copyright/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /.idea/dictionaries/Alejandro.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 23 | 24 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 19 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 46 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /.idea/runConfigurations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 12 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 24 5 | buildToolsVersion "23.0.2" 6 | 7 | defaultConfig { 8 | applicationId "com.alejandrolora.seccion_01" 9 | minSdkVersion 15 10 | targetSdkVersion 24 11 | versionCode 1 12 | versionName "1.0" 13 | } 14 | buildTypes { 15 | release { 16 | minifyEnabled false 17 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 18 | } 19 | } 20 | } 21 | 22 | dependencies { 23 | compile fileTree(dir: 'libs', include: ['*.jar']) 24 | testCompile 'junit:junit:4.12' 25 | compile 'com.android.support:appcompat-v7:24.1.1' 26 | } 27 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in /Users/Alejandro Lora/Library/Android/sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /app/src/androidTest/java/com/alejandrolora/seccion_01/ApplicationTest.java: -------------------------------------------------------------------------------- 1 | package com.alejandrolora.seccion_01; 2 | 3 | import android.app.Application; 4 | import android.test.ApplicationTestCase; 5 | 6 | /** 7 | * Testing Fundamentals 8 | */ 9 | public class ApplicationTest extends ApplicationTestCase { 10 | public ApplicationTest() { 11 | super(Application.class); 12 | } 13 | } -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /app/src/main/ic_myicon-web.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AL-Android-Course/Seccion_01/52f00aa63e7640f10baa2681d0ca683e95b794ac/app/src/main/ic_myicon-web.png -------------------------------------------------------------------------------- /app/src/main/java/com/alejandrolora/seccion_01/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.alejandrolora.seccion_01; 2 | 3 | import android.content.Intent; 4 | import android.support.v7.app.AppCompatActivity; 5 | import android.os.Bundle; 6 | import android.view.View; 7 | import android.widget.Button; 8 | 9 | public class MainActivity extends AppCompatActivity { 10 | 11 | private Button btn; 12 | private final String GREETER = "Hello from the other side!"; 13 | 14 | @Override 15 | protected void onCreate(Bundle savedInstanceState) { 16 | super.onCreate(savedInstanceState); 17 | setContentView(R.layout.activity_main); 18 | 19 | // Forzar y cargar icono en el Action Bar 20 | getSupportActionBar().setDisplayShowHomeEnabled(true); 21 | getSupportActionBar().setIcon(R.mipmap.ic_myicon); 22 | 23 | btn = (Button) findViewById(R.id.buttonMain); 24 | 25 | btn.setOnClickListener(new View.OnClickListener() { 26 | @Override 27 | public void onClick(View view) { 28 | // Acceder al segundo activity y mandarle un string 29 | Intent intent = new Intent(MainActivity.this, SecondActivity.class); 30 | intent.putExtra("greeter", GREETER); 31 | startActivity(intent); 32 | } 33 | }); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /app/src/main/java/com/alejandrolora/seccion_01/SecondActivity.java: -------------------------------------------------------------------------------- 1 | package com.alejandrolora.seccion_01; 2 | 3 | import android.content.Intent; 4 | import android.support.v7.app.AppCompatActivity; 5 | import android.os.Bundle; 6 | import android.view.View; 7 | import android.widget.Button; 8 | import android.widget.TextView; 9 | import android.widget.Toast; 10 | 11 | public class SecondActivity extends AppCompatActivity { 12 | 13 | private TextView textView; 14 | private Button btnNext; 15 | 16 | @Override 17 | protected void onCreate(Bundle savedInstanceState) { 18 | super.onCreate(savedInstanceState); 19 | setContentView(R.layout.activity_second); 20 | 21 | // Activar flecha ir atrás 22 | getSupportActionBar().setDisplayHomeAsUpEnabled(true); 23 | 24 | textView = (TextView) findViewById(R.id.textViewMain); 25 | btnNext = (Button) findViewById(R.id.buttonGoSharing); 26 | 27 | // Tomar los datos del intent 28 | Bundle bundle = getIntent().getExtras(); 29 | if (bundle != null && bundle.getString("greeter") != null) { 30 | String greeter = bundle.getString("greeter"); 31 | Toast.makeText(SecondActivity.this, greeter, Toast.LENGTH_LONG).show(); 32 | textView.setText(greeter); 33 | } else { 34 | Toast.makeText(SecondActivity.this, "It is empty!", Toast.LENGTH_LONG).show(); 35 | } 36 | 37 | btnNext.setOnClickListener(new View.OnClickListener() { 38 | @Override 39 | public void onClick(View view) { 40 | Intent intent = new Intent(SecondActivity.this, ThirdActivity.class); 41 | startActivity(intent); 42 | } 43 | }); 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /app/src/main/java/com/alejandrolora/seccion_01/ThirdActivity.java: -------------------------------------------------------------------------------- 1 | package com.alejandrolora.seccion_01; 2 | 3 | import android.Manifest; 4 | import android.app.Activity; 5 | import android.content.Intent; 6 | import android.content.pm.PackageManager; 7 | import android.net.Uri; 8 | import android.os.Build; 9 | import android.provider.Settings; 10 | import android.support.annotation.NonNull; 11 | import android.support.v4.app.ActivityCompat; 12 | import android.support.v7.app.AppCompatActivity; 13 | import android.os.Bundle; 14 | import android.view.View; 15 | import android.widget.EditText; 16 | import android.widget.ImageButton; 17 | import android.widget.Toast; 18 | 19 | public class ThirdActivity extends AppCompatActivity { 20 | 21 | private EditText editTextPhone; 22 | private EditText editTextWeb; 23 | private ImageButton imgBtnPhone; 24 | private ImageButton imgBtnWeb; 25 | private ImageButton imgBtnCamera; 26 | 27 | private final int PHONE_CALL_CODE = 100; 28 | private final int PICTURE_FROM_CAMERA = 50; 29 | 30 | @Override 31 | protected void onCreate(Bundle savedInstanceState) { 32 | super.onCreate(savedInstanceState); 33 | setContentView(R.layout.activity_third); 34 | 35 | // Activar flecha ir atrás 36 | getSupportActionBar().setDisplayHomeAsUpEnabled(true); 37 | 38 | editTextPhone = (EditText) findViewById(R.id.editTextPhone); 39 | editTextWeb = (EditText) findViewById(R.id.editTextWeb); 40 | imgBtnPhone = (ImageButton) findViewById(R.id.imageButtonPhone); 41 | imgBtnWeb = (ImageButton) findViewById(R.id.imageButtonWeb); 42 | imgBtnCamera = (ImageButton) findViewById(R.id.imageButtonCamera); 43 | 44 | // Botón para la llamada 45 | imgBtnPhone.setOnClickListener(new View.OnClickListener() { 46 | @Override 47 | public void onClick(View view) { 48 | String phoneNumber = editTextPhone.getText().toString(); 49 | if (phoneNumber != null && !phoneNumber.isEmpty()) { 50 | // comprobar version actual de android que estamos corriendo 51 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 52 | 53 | // Comprobar si ha aceptado, no ha aceptado, o nunca se le ha preguntado 54 | if(CheckPermission(Manifest.permission.CALL_PHONE)) { 55 | // Ha aceptado 56 | Intent i = new Intent(Intent.ACTION_CALL, Uri.parse("tel:"+phoneNumber)); 57 | if (ActivityCompat.checkSelfPermission(ThirdActivity.this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) return; 58 | startActivity(i); 59 | } 60 | else { 61 | // Ha denegado o es la primera vez que se le pregunta 62 | if (!shouldShowRequestPermissionRationale(Manifest.permission.CALL_PHONE)) { 63 | // No se le ha preguntado aún 64 | requestPermissions(new String[]{Manifest.permission.CALL_PHONE}, PHONE_CALL_CODE); 65 | }else { 66 | // Ha denegado 67 | Toast.makeText(ThirdActivity.this, "Please, enable the request permission", Toast.LENGTH_SHORT).show(); 68 | Intent i = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); 69 | i.addCategory(Intent.CATEGORY_DEFAULT); 70 | i.setData(Uri.parse("package:" + getPackageName())); 71 | i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 72 | i.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); 73 | i.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); 74 | startActivity(i); 75 | } 76 | } 77 | } else { 78 | OlderVersions(phoneNumber); 79 | } 80 | } 81 | else { 82 | Toast.makeText(ThirdActivity.this, "Insert a phone number", Toast.LENGTH_SHORT).show(); 83 | } 84 | } 85 | 86 | private void OlderVersions(String phoneNumber) { 87 | Intent intentCall = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + phoneNumber)); 88 | if (CheckPermission(Manifest.permission.CALL_PHONE)) { 89 | startActivity(intentCall); 90 | } else { 91 | Toast.makeText(ThirdActivity.this, "You declined the access", Toast.LENGTH_SHORT).show(); 92 | } 93 | } 94 | }); 95 | 96 | // Botón para la dirección web 97 | imgBtnWeb.setOnClickListener(new View.OnClickListener() { 98 | @Override 99 | public void onClick(View view) { 100 | String url = editTextWeb.getText().toString(); 101 | String email = "alejandrofpo@gmail.com"; 102 | 103 | if (url != null && !url.isEmpty()) { 104 | Intent intentWeb = new Intent(); 105 | intentWeb.setAction(Intent.ACTION_VIEW); 106 | intentWeb.setData(Uri.parse("http://"+url)); 107 | 108 | // Contactos 109 | Intent intentContacts = new Intent(Intent.ACTION_VIEW, Uri.parse("content://contacts/people")); 110 | // Email rápido 111 | Intent intentMailTo = new Intent(Intent.ACTION_SENDTO, Uri.parse("mailto:"+email)); 112 | // Email completo 113 | Intent intentMail = new Intent(Intent.ACTION_SEND, Uri.parse(email)); 114 | intentMail.setType("plain/text"); 115 | intentMail.putExtra(Intent.EXTRA_SUBJECT, "Mail's title"); 116 | intentMail.putExtra(Intent.EXTRA_TEXT, "Hi there, I love MyForm app, but... "); 117 | intentMail.putExtra(Intent.EXTRA_EMAIL, new String[] {"fernando@gmail.com", "antonio@gmail.com"}); 118 | //startActivity(Intent.createChooser(intentMail, "Elige cliente de correo")); 119 | 120 | // Teléfono 2, sin permisos requeridos 121 | Intent intentPhone = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:666111222")); 122 | 123 | 124 | startActivity(intentMail); 125 | } 126 | } 127 | }); 128 | 129 | imgBtnCamera.setOnClickListener(new View.OnClickListener() { 130 | @Override 131 | public void onClick(View view) { 132 | // Abrir cámara 133 | Intent intentCamera = new Intent("android.media.action.IMAGE_CAPTURE"); 134 | startActivityForResult(intentCamera, PICTURE_FROM_CAMERA); 135 | } 136 | }); 137 | } 138 | 139 | @Override 140 | protected void onActivityResult(int requestCode, int resultCode, Intent data) { 141 | 142 | switch (requestCode) { 143 | case PICTURE_FROM_CAMERA: 144 | 145 | if (resultCode == Activity.RESULT_OK) { 146 | String result = data.toUri(0); 147 | Toast.makeText(this, "Result: "+result, Toast.LENGTH_LONG).show(); 148 | } else { 149 | Toast.makeText(this, "There was an error with the picture, try again.", Toast.LENGTH_LONG).show(); 150 | } 151 | break; 152 | default: 153 | super.onActivityResult(requestCode, resultCode, data); 154 | } 155 | } 156 | 157 | @Override 158 | public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 159 | // Estamos en el caso del teléfono 160 | switch (requestCode) { 161 | case PHONE_CALL_CODE: 162 | 163 | String permission = permissions[0]; 164 | int result = grantResults[0]; 165 | 166 | if (permission.equals(Manifest.permission.CALL_PHONE)) { 167 | // Comprobar si ha sido aceptado o denegado la petición de permiso 168 | if (result == PackageManager.PERMISSION_GRANTED) { 169 | // Concedió su permiso 170 | String phoneNumber = editTextPhone.getText().toString(); 171 | Intent intentCall = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + phoneNumber)); 172 | if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) return; 173 | startActivity(intentCall); 174 | } 175 | else { 176 | // No concendió su permiso 177 | Toast.makeText(ThirdActivity.this, "You declined the access", Toast.LENGTH_SHORT).show(); 178 | } 179 | }break; 180 | default: 181 | super.onRequestPermissionsResult(requestCode, permissions, grantResults); 182 | break; 183 | } 184 | } 185 | 186 | private boolean CheckPermission(String permission) { 187 | int result = this.checkCallingOrSelfPermission(permission); 188 | return result == PackageManager.PERMISSION_GRANTED; 189 | } 190 | } 191 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 |