Repository: codepath/intro_android_demo Branch: master Commit: 0ddcdf083ba0 Files: 103 Total size: 93.6 KB Directory structure: gitextract_5d8jesy6/ ├── .gitignore ├── .travis.yml ├── README.md ├── app/ │ ├── build.gradle │ └── src/ │ └── main/ │ ├── AndroidManifest.xml │ ├── java/ │ │ └── codepath/ │ │ └── apps/ │ │ └── demointroandroid/ │ │ ├── ActionBarMenuActivity.java │ │ ├── AsyncTaskPerformActivity.java │ │ ├── BasicClickHandlersActivity.java │ │ ├── BasicImageDownloadActivity.java │ │ ├── BasicTextViewActivity.java │ │ ├── BasicViewsActivity.java │ │ ├── ContactListActivity.java │ │ ├── DemoSelector.java │ │ ├── ExerciseActivityMapper.java │ │ ├── ExplicitIntentActivity.java │ │ ├── GridViewDemoActivity.java │ │ ├── ImplicitIntentsActivity.java │ │ ├── IntentWithResultActivity.java │ │ ├── LayoutGravityActivity.java │ │ ├── LinearLayoutDemoActivity.java │ │ ├── ListViewClicksActivity.java │ │ ├── PersistSettingsActivity.java │ │ ├── ProgressBarActivity.java │ │ ├── PublishingInstructionsActivity.java │ │ ├── SimpleAlertDialog.java │ │ ├── SimpleBundleDemoActivity.java │ │ ├── SimpleListViewActivity.java │ │ ├── SimpleReturnResultActivity.java │ │ ├── SmartImageDownloadActivity.java │ │ ├── SpinnerWithToastActivity.java │ │ ├── TimePickerDemoActivity.java │ │ ├── ToastFormInputsActivity.java │ │ └── ViewAttributesActivity.java │ └── res/ │ ├── drawable/ │ │ └── simple_list_selector.xml │ ├── layout/ │ │ ├── activity_action_bar_menu.xml │ │ ├── activity_async_task_perform.xml │ │ ├── activity_basic_click_handlers.xml │ │ ├── activity_basic_image_download.xml │ │ ├── activity_basic_text_view.xml │ │ ├── activity_basic_views.xml │ │ ├── activity_button_toast.xml │ │ ├── activity_contact_list.xml │ │ ├── activity_demo_selector.xml │ │ ├── activity_explicit_intent.xml │ │ ├── activity_grid_view_demo.xml │ │ ├── activity_implicit_intents.xml │ │ ├── activity_intent_with_result.xml │ │ ├── activity_layout_gravity.xml │ │ ├── activity_linear_layout_demo.xml │ │ ├── activity_list_view_clicks.xml │ │ ├── activity_persist_settings.xml │ │ ├── activity_progress_bar.xml │ │ ├── activity_publishing_instructions.xml │ │ ├── activity_simple_bundle_demo.xml │ │ ├── activity_simple_list_view.xml │ │ ├── activity_simple_return_result.xml │ │ ├── activity_smart_image_download.xml │ │ ├── activity_spinner_with_toast.xml │ │ ├── activity_time_picker_demo.xml │ │ ├── activity_toast_form_inputs.xml │ │ ├── activity_view_attributes.xml │ │ └── simple_list_view_item.xml │ ├── menu/ │ │ ├── activity_action_bar_menu.xml │ │ ├── activity_async_task_perform.xml │ │ ├── activity_basic_click_handlers.xml │ │ ├── activity_basic_image_download.xml │ │ ├── activity_basic_text_view.xml │ │ ├── activity_basic_views.xml │ │ ├── activity_button_toast.xml │ │ ├── activity_contact_list.xml │ │ ├── activity_demo_selector.xml │ │ ├── activity_explicit_intent.xml │ │ ├── activity_grid_view_demo.xml │ │ ├── activity_implicit_intents.xml │ │ ├── activity_intent_with_result.xml │ │ ├── activity_layout_gravity.xml │ │ ├── activity_linear_layout_demo.xml │ │ ├── activity_list_view_clicks.xml │ │ ├── activity_persist_settings.xml │ │ ├── activity_progress_bar.xml │ │ ├── activity_publishing_instructions.xml │ │ ├── activity_simple_bundle_demo.xml │ │ ├── activity_simple_list_view.xml │ │ ├── activity_simple_return_result.xml │ │ ├── activity_smart_image_download.xml │ │ ├── activity_spinner_with_toast.xml │ │ ├── activity_time_picker_demo.xml │ │ ├── activity_toast_form_inputs.xml │ │ └── activity_view_attributes.xml │ ├── values/ │ │ ├── colors.xml │ │ ├── exercises_list.xml │ │ ├── spinner_values.xml │ │ ├── strings.xml │ │ └── styles.xml │ ├── values-v11/ │ │ └── styles.xml │ └── values-v14/ │ └── styles.xml ├── build.gradle ├── gradle/ │ └── wrapper/ │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradle.properties ├── gradlew ├── gradlew.bat └── settings.gradle ================================================ FILE CONTENTS ================================================ ================================================ FILE: .gitignore ================================================ # built application files *.apk *.ap_ # files for the dex VM *.dex # Java class files *.class # generated files bin/ gen/ # Local configuration file (sdk path, etc) local.properties # Eclipse project files .classpath .project # Proguard folder generated by Eclipse proguard/ proguard-project.txt # Intellij project files *.iml *.ipr *.iws .idea/ *.pydevproject .project .metadata .gradle build/** bin/** tmp/** tmp/**/* *.tmp *.bak *.swp *~.nib local.properties .classpath .settings/ .loadpath # External tool builders .externalToolBuilders/ # Locally stored "Eclipse launch configurations" *.launch # CDT-specific .cproject # PDT-specific .buildpath # Android Studio project files *.iml .gradle .idea build import-summary.txt ================================================ FILE: .travis.yml ================================================ language: android jdk: - oraclejdk8 sudo: false android: components: - tools - platform-tools - build-tools-28.0.3 - android-28 licenses: - android-sdk-license-.+ script: - "./gradlew build check --daemon" after_failure: "cat $TRAVIS_BUILD_DIR/app/build/outputs/lint-results-debug.xml" ================================================ FILE: README.md ================================================ intro_android_demo ================== Demo of app exercises for Intro to Android App Development   Sample Listing: - Chapter 1: App Fundamentals - Basic TextViews Example - Chapter 2: User Interface - Linear Layout Demo - Chapter 3: View Controls - Layout Gravity - Basic Views - View Attributes - Simple ListView - Chapter 4: User Interactions - Basic Click Handlers - Handling ListView Clicks - Action Bar Demo - Chapter 5: User Flows - Explicit Intents - Implicit Intents - Intent with Results - Chapter 6: Networking - Basic Image Download - AsyncTask Example - Smart Image Download - Chapter 7: Advanced Views - Toast Inputs - Spinner Toast - TimePicker - ProgressBar - GridView - Chapter 8: Preferences - Persist Settings - Chapter 9: Content Providers - Contact List - Chapter 10: Publishing - APK Instructions ================================================ FILE: app/build.gradle ================================================ apply plugin: 'com.android.application' android { compileSdkVersion 28 defaultConfig { applicationId "codepath.apps.demointroandroid" minSdkVersion 21 targetSdkVersion 28 } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' } } } dependencies { implementation 'androidx.legacy:legacy-support-v4:1.0.0' implementation 'com.codepath.libraries:asynchttpclient:0.1.0' } ================================================ FILE: app/src/main/AndroidManifest.xml ================================================ ================================================ FILE: app/src/main/java/codepath/apps/demointroandroid/ActionBarMenuActivity.java ================================================ package codepath.apps.demointroandroid; import android.os.Bundle; import android.annotation.SuppressLint; import android.app.Activity; import android.content.Intent; import android.view.Menu; import android.view.MenuItem; import android.widget.Toast; public class ActionBarMenuActivity extends Activity { @SuppressLint("NewApi") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_action_bar_menu); getActionBar().setTitle("Click an Icon"); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_action_bar_menu, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.menu_toast: Toast.makeText(this, "Toasted", Toast.LENGTH_SHORT).show(); break; case R.id.menu_launch: Intent i = new Intent(this, SimpleBundleDemoActivity.class); startActivity(i); break; default: break; } return true; } } ================================================ FILE: app/src/main/java/codepath/apps/demointroandroid/AsyncTaskPerformActivity.java ================================================ package codepath.apps.demointroandroid; import android.os.AsyncTask; import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.widget.Toast; public class AsyncTaskPerformActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_async_task_perform); new MyAsyncTask().execute(); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_async_task_perform, menu); return true; } public void doneCounting() { Toast.makeText(this, "Done Counting to 100000", Toast.LENGTH_SHORT).show(); } private class MyAsyncTask extends AsyncTask { public Void doInBackground(Void... params) { for (long i=0; i < 100000; i++) { System.out.println(i); } return null; } protected void onPostExecute(Void result) { doneCounting(); } } } ================================================ FILE: app/src/main/java/codepath/apps/demointroandroid/BasicClickHandlersActivity.java ================================================ package codepath.apps.demointroandroid; import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.view.View; import android.widget.Button; public class BasicClickHandlersActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_basic_click_handlers); Button secondButton = (Button) findViewById(R.id.btnClick2); secondButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { secondButtonClicked(v); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_basic_click_handlers, menu); return true; } public void firstButtonClicked(View v) { SimpleAlertDialog.displayWithOK(this, "firstButton clicked via XML handler"); } private void secondButtonClicked(View v) { SimpleAlertDialog.displayWithOK(this, "secondButton clicked via Java handler in onCreate"); } } ================================================ FILE: app/src/main/java/codepath/apps/demointroandroid/BasicImageDownloadActivity.java ================================================ package codepath.apps.demointroandroid; import android.annotation.SuppressLint; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Bundle; import android.os.StrictMode; import android.view.Menu; import android.widget.ImageView; import java.io.IOException; import java.io.InputStream; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; public class BasicImageDownloadActivity extends Activity { @SuppressLint("NewApi") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_basic_image_download); StrictMode.setThreadPolicy( new StrictMode.ThreadPolicy.Builder().permitNetwork().build()); downloadImageFromUri("https://2.gravatar.com/avatar/858dfac47ab8176458c005414d3f0c36?s=128&d=&r=G"); } private void downloadImageFromUri(String address) { URL url; try { url = new URL(address); } catch (MalformedURLException e1) { url = null; } URLConnection conn; InputStream in; Bitmap bitmap; try { conn = url.openConnection(); conn.connect(); in = conn.getInputStream(); bitmap = BitmapFactory.decodeStream(in); in.close(); } catch (IOException e) { bitmap = null; } if (bitmap != null) { ImageView img = (ImageView) findViewById(R.id.ivBasicImage); img.setImageBitmap(bitmap); } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_basic_image_download, menu); return true; } } ================================================ FILE: app/src/main/java/codepath/apps/demointroandroid/BasicTextViewActivity.java ================================================ package codepath.apps.demointroandroid; import android.os.Bundle; import android.app.Activity; import android.util.Log; import android.view.Menu; public class BasicTextViewActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_basic_text_view); Log.d("DEBUG", "onCreate was just called!"); } protected void onResume() { super.onResume(); Log.d("DEBUG", "onResume was just called!"); } protected void onPause() { super.onPause(); Log.d("DEBUG", "onPause was just called!"); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_basic_text_view, menu); return true; } } ================================================ FILE: app/src/main/java/codepath/apps/demointroandroid/BasicViewsActivity.java ================================================ package codepath.apps.demointroandroid; import android.os.Bundle; import android.app.Activity; import android.view.Menu; public class BasicViewsActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_basic_views); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_basic_views, menu); return true; } } ================================================ FILE: app/src/main/java/codepath/apps/demointroandroid/ContactListActivity.java ================================================ package codepath.apps.demointroandroid; import android.annotation.SuppressLint; import android.app.Activity; import android.content.CursorLoader; import android.content.pm.PackageManager; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.provider.ContactsContract; import androidx.core.app.ActivityCompat; import android.util.Log; import android.view.Menu; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.Toast; import java.util.ArrayList; public class ContactListActivity extends Activity { private static final int REQUEST_READ_CONTACTS = 1; ArrayList names = new ArrayList(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_contact_list); if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_GRANTED) { loadContacts(); } else { ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.READ_CONTACTS}, REQUEST_READ_CONTACTS); } populateListView(); } private void populateListView() { ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, names); ListView listView = (ListView) findViewById(R.id.lvContacts); listView.setAdapter(adapter); listView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView parent, View view, int position, long id) { Toast.makeText(ContactListActivity.this, names.get(position), Toast.LENGTH_SHORT).show(); } }); } @Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { if (requestCode == REQUEST_READ_CONTACTS) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { loadContacts(); } else { Toast.makeText(this, "Permission Denied, Not able to load contact", Toast.LENGTH_SHORT).show(); } } } @SuppressLint("NewApi") private void loadContacts() { Uri allContacts = Uri.parse("content://contacts/people"); CursorLoader cursorLoader = new CursorLoader(this, allContacts, null, // the columns to retrive null, // the selection criteria null, // the selection args null // the sort order ); Cursor c = cursorLoader.loadInBackground(); if (c.moveToFirst()) { do { // Get Contact ID int idIndex = c.getColumnIndex(ContactsContract.Contacts._ID); String contactID = c.getString(idIndex); // Get Contact Name int nameIndex = c.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME); String contactDisplayName = c.getString(nameIndex); names.add(contactDisplayName); Log.d("debug", contactID + ", " + contactDisplayName); } while (c.moveToNext()); } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_contact_list, menu); return true; } } ================================================ FILE: app/src/main/java/codepath/apps/demointroandroid/DemoSelector.java ================================================ package codepath.apps.demointroandroid; import android.os.Bundle; import android.annotation.SuppressLint; import android.app.Activity; import android.content.Intent; import android.view.Gravity; import android.view.Menu; import android.view.View; import android.view.ViewGroup; import android.widget.AbsListView; import android.widget.BaseExpandableListAdapter; import android.widget.ExpandableListView; import android.widget.TextView; import android.widget.Toast; public class DemoSelector extends Activity { ExpandableListView elvChapters; ChaptersListAdapter elaAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_demo_selector); setupChaptersListView(); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_demo_selector, menu); return true; } private void setupChaptersListView() { elvChapters = (ExpandableListView)findViewById(R.id.elvChapters); elaAdapter = new ChaptersListAdapter(); elvChapters.setAdapter(elaAdapter); elvChapters.setOnChildClickListener(new ExpandableListView.OnChildClickListener() { public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) { String exerciseTitle = (String)elaAdapter.getChild(groupPosition, childPosition); Class exerciseClass = elaAdapter.getExerciseClass(groupPosition, childPosition, id); if (exerciseClass != null) { Toast.makeText(DemoSelector.this, exerciseTitle, Toast.LENGTH_LONG).show(); startActivity(new Intent(DemoSelector.this, exerciseClass)); } else { Toast.makeText(DemoSelector.this, "Exercise Not Available", Toast.LENGTH_SHORT).show(); } return false; } }); } private class ChaptersListAdapter extends BaseExpandableListAdapter { private String[] chapters = getResources().getStringArray(R.array.chapters); private String[][] exercises; public ChaptersListAdapter() { super(); exercises = new String[chapters.length][]; for (int i=0; i < exercises.length; i++) { int resId = getResources().getIdentifier("chap" + (i+1), "array", getPackageName()); exercises[i] = getResources().getStringArray(resId); } } public Object getChild(int groupPosition, int childPosition) { return exercises[groupPosition][childPosition]; } public long getChildId(int groupPosition, int childPosition) { return childPosition; } public int getChildrenCount(int groupPosition) { return exercises[groupPosition].length; } public TextView getGenericView() { // Layout parameters for the ExpandableListView AbsListView.LayoutParams lp = new AbsListView.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); TextView textView = new TextView(DemoSelector.this); textView.setLayoutParams(lp); // Center the text vertically textView.setTextSize(20); textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT); // Set the text starting position textView.setPadding(60, 20, 20, 20); return textView; } public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { TextView textView = getGenericView(); textView.setPadding(80, 20, 20, 20); textView.setText(getChild(groupPosition, childPosition).toString()); return textView; } public Object getGroup(int groupPosition) { return "Chapter " + (groupPosition + 1) + ": " + chapters[groupPosition]; } public int getGroupCount() { return chapters.length; } public long getGroupId(int groupPosition) { return groupPosition; } public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { TextView textView = getGenericView(); textView.setText(getGroup(groupPosition).toString()); return textView; } public boolean isChildSelectable(int groupPosition, int childPosition) { return true; } public boolean hasStableIds() { return true; } public Class getExerciseClass(int groupPosition, int childPosition, long id) { String exerciseId = "chap" + (groupPosition + 1) + "ex" + (childPosition + 1); return ExerciseActivityMapper.getExerciseClass(exerciseId); } } } ================================================ FILE: app/src/main/java/codepath/apps/demointroandroid/ExerciseActivityMapper.java ================================================ package codepath.apps.demointroandroid; import java.util.HashMap; import android.app.Activity; public class ExerciseActivityMapper { private static ExerciseActivityMapper singleton; private HashMap> exerciseClassMap; public ExerciseActivityMapper() { defineExerciseMappings(); } // ExerciseActivityMapper.getExerciseClass("chap1ex1"); public static Class getExerciseClass(String exerciseId) { return getSingleton().exerciseClassMap.get(exerciseId); } private static ExerciseActivityMapper getSingleton() { if (singleton == null) { singleton = new ExerciseActivityMapper(); } return singleton; } private void defineExerciseMappings() { exerciseClassMap = new HashMap>(); // Chapter 1: App Fundamentals exerciseClassMap.put("chap1ex1", BasicTextViewActivity.class); // Chapter 2: User Interface exerciseClassMap.put("chap2ex1", LinearLayoutDemoActivity.class); // Chapter 3: View Controls exerciseClassMap.put("chap3ex1", LayoutGravityActivity.class); exerciseClassMap.put("chap3ex2", BasicViewsActivity.class); exerciseClassMap.put("chap3ex3", ViewAttributesActivity.class); exerciseClassMap.put("chap3ex4", SimpleListViewActivity.class); // Chapter 4: User Interactions exerciseClassMap.put("chap4ex1", BasicClickHandlersActivity.class); exerciseClassMap.put("chap4ex2", ListViewClicksActivity.class); // Chapter 5: User Flows exerciseClassMap.put("chap5ex1", ExplicitIntentActivity.class); // Explicit Intents exerciseClassMap.put("chap5ex2", ImplicitIntentsActivity.class); // Implicit Intents exerciseClassMap.put("chap5ex3", IntentWithResultActivity.class); // Intent with Results exerciseClassMap.put("chap5ex4", ActionBarMenuActivity.class); // Action Bar // Chapter 6: Networking exerciseClassMap.put("chap6ex1", BasicImageDownloadActivity.class); // Basic Image Download exerciseClassMap.put("chap6ex2", AsyncTaskPerformActivity.class); // AsyncTask exerciseClassMap.put("chap6ex3", SmartImageDownloadActivity.class); // Smart Image Download // Chapter 7: Advanced Views exerciseClassMap.put("chap7ex1", ToastFormInputsActivity.class); // Toast Inputs exerciseClassMap.put("chap7ex2", SpinnerWithToastActivity.class); // Spinner Toast exerciseClassMap.put("chap7ex3", TimePickerDemoActivity.class); // TimePicker exerciseClassMap.put("chap7ex4", ProgressBarActivity.class); // ProgressBar exerciseClassMap.put("chap7ex5", GridViewDemoActivity.class); // GridView // Chapter 8: Preferences exerciseClassMap.put("chap8ex1", PersistSettingsActivity.class); // Persist Settings // Chapter 9: ContentProviders exerciseClassMap.put("chap9ex1", ContactListActivity.class); // Contact List // Chapter 10: Publishing exerciseClassMap.put("chap10ex1", PublishingInstructionsActivity.class); // APK Generation } } ================================================ FILE: app/src/main/java/codepath/apps/demointroandroid/ExplicitIntentActivity.java ================================================ package codepath.apps.demointroandroid; import android.os.Bundle; import android.app.Activity; import android.content.Intent; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class ExplicitIntentActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_explicit_intent); Button btnLaunchSecond = (Button) findViewById(R.id.btnLaunchSecond); btnLaunchSecond.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent i = new Intent(ExplicitIntentActivity.this, SimpleBundleDemoActivity.class); i.putExtra("text", "Passed String Extra!"); startActivity(i); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_explicit_intent, menu); return true; } } ================================================ FILE: app/src/main/java/codepath/apps/demointroandroid/GridViewDemoActivity.java ================================================ package codepath.apps.demointroandroid; import android.os.Bundle; import android.app.Activity; import android.content.Context; import android.view.Menu; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.GridView; import android.widget.ImageView; public class GridViewDemoActivity extends Activity { GridView gvImages; GridImageAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_grid_view_demo); populateGridViewImages(); } private void populateGridViewImages() { gvImages = (GridView) findViewById(R.id.gvImages); String[] numbers = new String[] { "ad", "ae", "af", "ag", "ai", "al"}; adapter = new GridImageAdapter(this, android.R.layout.simple_list_item_1, numbers); gvImages.setAdapter(adapter); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_grid_view_demo, menu); return true; } class GridImageAdapter extends ArrayAdapter { public GridImageAdapter(Context context, int textViewResourceId, String[] numbers) { super(context, textViewResourceId, numbers); } public View getView(int position, View convertView, ViewGroup parent) { ImageView v = new ImageView(GridViewDemoActivity.this); int resId = getResources().getIdentifier(getItem(position), "drawable", getPackageName()); v.setImageDrawable(getResources().getDrawable(resId)); return v; } } } ================================================ FILE: app/src/main/java/codepath/apps/demointroandroid/ImplicitIntentsActivity.java ================================================ package codepath.apps.demointroandroid; import android.net.Uri; import android.os.Bundle; import android.app.Activity; import android.content.Intent; import android.view.Menu; import android.view.View; import android.widget.TextView; public class ImplicitIntentsActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_implicit_intents); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_implicit_intents, menu); return true; } public void visitUrlAddress(View v) { Uri url = getUriToVisit(); if (url != null) { Intent i = new Intent(Intent.ACTION_VIEW); i.setData(url); startActivity(i); } } public Uri getUriToVisit() { String urlAddress = ((TextView) findViewById(R.id.txtUrlAddress)).getText().toString(); if (urlAddress != null) { if (!urlAddress.startsWith("http://")) urlAddress = "http://" + urlAddress; return Uri.parse(urlAddress); } else { return null; } } } ================================================ FILE: app/src/main/java/codepath/apps/demointroandroid/IntentWithResultActivity.java ================================================ package codepath.apps.demointroandroid; import android.os.Bundle; import android.provider.ContactsContract; import android.app.Activity; import android.content.Intent; import android.util.Log; import android.view.Menu; import android.view.View; import android.widget.TextView; import android.widget.Toast; public class IntentWithResultActivity extends Activity { final static int GET_RESULT_TEXT = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_intent_with_result); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_intent_with_result, menu); return true; } public void enterText(View v) { startActivityForResult( new Intent(IntentWithResultActivity.this, SimpleReturnResultActivity.class), GET_RESULT_TEXT); } // Handle the result once the activity returns a result, display contact protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == 0) { if (resultCode == RESULT_OK) { TextView tvResult = (TextView)findViewById(R.id.txtDisplayResult); tvResult.setText(data.getStringExtra("result")); Toast.makeText(this, data.getStringExtra("result"), Toast.LENGTH_SHORT).show(); } } } } ================================================ FILE: app/src/main/java/codepath/apps/demointroandroid/LayoutGravityActivity.java ================================================ package codepath.apps.demointroandroid; import android.os.Bundle; import android.app.Activity; import android.view.Menu; public class LayoutGravityActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_layout_gravity); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_layout_gravity, menu); return true; } } ================================================ FILE: app/src/main/java/codepath/apps/demointroandroid/LinearLayoutDemoActivity.java ================================================ package codepath.apps.demointroandroid; import android.os.Bundle; import android.app.Activity; import android.view.Menu; public class LinearLayoutDemoActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_linear_layout_demo); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_linear_layout_demo, menu); return true; } } ================================================ FILE: app/src/main/java/codepath/apps/demointroandroid/ListViewClicksActivity.java ================================================ package codepath.apps.demointroandroid; import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.view.View; import android.widget.AdapterView; import android.widget.Toast; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.ListView; public class ListViewClicksActivity extends Activity { ArrayAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_list_view_clicks); String[] myCountries = { "United States", "Canada", "Mexico", "Japan" }; adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, myCountries); ListView listView = (ListView) findViewById(R.id.lvDemo); listView.setAdapter(adapter); listView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView parent, View view, int position, long id) { String country = adapter.getItem(position); SimpleAlertDialog.displayWithOK(ListViewClicksActivity.this, country); Toast.makeText(ListViewClicksActivity.this, country, Toast.LENGTH_SHORT).show(); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_list_view_clicks, menu); return true; } } ================================================ FILE: app/src/main/java/codepath/apps/demointroandroid/PersistSettingsActivity.java ================================================ package codepath.apps.demointroandroid; import android.os.Bundle; import android.app.Activity; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.view.Menu; import android.view.View; import android.widget.CheckBox; import android.widget.TextView; import android.widget.Toast; public class PersistSettingsActivity extends Activity { SharedPreferences prefs; Editor edits; TextView txtPersist; CheckBox chkPersist; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_persist_settings); txtPersist = (TextView) findViewById(R.id.txtPersistText); chkPersist = (CheckBox) findViewById(R.id.chkPersistState); prefs = getSharedPreferences("view", 0); edits = prefs.edit(); populateValues(); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_persist_settings, menu); return true; } public void populateValues() { String persistedText = prefs.getString("txtVal", "None Stored Yet"); boolean isChecked = prefs.getBoolean("chkState", false); txtPersist.setText(persistedText); chkPersist.setChecked(isChecked); } public void persistValues(View v) { edits.putString("txtVal", txtPersist.getText().toString()); edits.putBoolean("chkState", chkPersist.isChecked()); edits.commit(); Toast.makeText(this, "Persisted!", Toast.LENGTH_SHORT).show(); } } ================================================ FILE: app/src/main/java/codepath/apps/demointroandroid/ProgressBarActivity.java ================================================ package codepath.apps.demointroandroid; import android.app.Activity; import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; import android.view.Menu; import android.view.View; import android.widget.ProgressBar; import android.widget.TextView; import android.widget.Toast; import com.facebook.stetho.server.http.HttpStatus; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.ArrayList; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; public class ProgressBarActivity extends Activity { ProgressBar pb; TextView tvResult; ArrayList lines = new ArrayList(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_progress_bar); pb = (ProgressBar) findViewById(R.id.pgDownloading); tvResult = (TextView) findViewById(R.id.txtUrlOutput); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_progress_bar, menu); return true; } public void startFourUrlAsync(View v) { new DelayTask().execute(); } public class DelayTask extends AsyncTask { int count = 0; @Override protected void onPreExecute() { pb.setVisibility(ProgressBar.VISIBLE); } @Override protected String doInBackground(Void... params) { String res = loadUrlBody("https://google.com"); lines.add(res.split("\n")[0]); publishProgress(25); res = loadUrlBody("https://yahoo.com"); lines.add(res.split("\n")[0]); publishProgress(50); res = loadUrlBody("https://twitter.com"); lines.add(res.split("\n")[0]); publishProgress(75); res = loadUrlBody("https://facebook.com"); lines.add(res.split("\n")[0]); publishProgress(100); return "complete"; } @Override protected void onProgressUpdate(Integer... values) { pb.setProgress(values[0]); } @Override protected void onPostExecute(String result) { Toast.makeText(ProgressBarActivity.this, "Completed!", Toast.LENGTH_SHORT).show(); tvResult.setText(lines.toString()); } protected String loadUrlBody(String address) { OkHttpClient httpclient = new OkHttpClient(); Response response; String responseString = null; try { response = httpclient.newCall(new Request.Builder().url(address).build()).execute(); int statusCode = response.code(); if (statusCode == HttpStatus.HTTP_OK) { ByteArrayOutputStream out = new ByteArrayOutputStream(); out.write(response.body().bytes()); responseString = out.toString(); out.close(); } else { response.body().byteStream().close(); throw new IOException(response.message()); } } catch (IOException e) { Log.e(ProgressBarActivity.class.getSimpleName(), "Error retrieving data from: " + address, e); } return responseString; } } } ================================================ FILE: app/src/main/java/codepath/apps/demointroandroid/PublishingInstructionsActivity.java ================================================ package codepath.apps.demointroandroid; import android.os.Bundle; import android.app.Activity; import android.view.Menu; public class PublishingInstructionsActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_publishing_instructions); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater() .inflate(R.menu.activity_publishing_instructions, menu); return true; } } ================================================ FILE: app/src/main/java/codepath/apps/demointroandroid/SimpleAlertDialog.java ================================================ package codepath.apps.demointroandroid; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; // SimpleAlertDialog.displayWithOK(this, "Hello", "Title"); public class SimpleAlertDialog { public static void displayWithOK(Context c, String message) { displayWithOK(c, message, "CodePath Demo Intro Android"); } public static void displayWithOK(Context c, String message, String title) { final AlertDialog alertDialog = new AlertDialog.Builder(c).create(); // Setting Dialog Title alertDialog.setTitle(title); // Setting Dialog Message alertDialog.setMessage(message); // Setting OK Button alertDialog.setButton(AlertDialog.BUTTON_POSITIVE, "OK", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { alertDialog.hide(); } }); // Showing Alert Message alertDialog.show(); } } ================================================ FILE: app/src/main/java/codepath/apps/demointroandroid/SimpleBundleDemoActivity.java ================================================ package codepath.apps.demointroandroid; import android.os.Bundle; import android.annotation.SuppressLint; import android.app.Activity; import android.content.Intent; import android.view.Menu; import android.view.MenuItem; import android.widget.TextView; public class SimpleBundleDemoActivity extends Activity { @SuppressLint("NewApi") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_simple_bundle_demo); String initialText = getIntent().getStringExtra("text"); TextView tvDisplayText = (TextView) findViewById(R.id.tvDisplayText); if (initialText != null) tvDisplayText.setText(initialText); getActionBar().setHomeButtonEnabled(true); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_simple_bundle_demo, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: Intent i = new Intent(this, ActionBarMenuActivity.class); startActivity(i); break; default: break; } return true; } } ================================================ FILE: app/src/main/java/codepath/apps/demointroandroid/SimpleListViewActivity.java ================================================ package codepath.apps.demointroandroid; import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.widget.ArrayAdapter; import android.widget.ListView; public class SimpleListViewActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_simple_list_view); String[] myStringArray = { "Bruce", "Wayne", "Bill" }; ArrayAdapter adapter = new ArrayAdapter(this, R.layout.simple_list_view_item, myStringArray); ListView listView = (ListView) findViewById(R.id.lvDemo); listView.setAdapter(adapter); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_simple_list_view, menu); return true; } } ================================================ FILE: app/src/main/java/codepath/apps/demointroandroid/SimpleReturnResultActivity.java ================================================ package codepath.apps.demointroandroid; import android.os.Bundle; import android.app.Activity; import android.content.Intent; import android.view.Menu; import android.view.View; import android.widget.EditText; public class SimpleReturnResultActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_simple_return_result); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_simple_return_result, menu); return true; } public void sendResult(View v) { String result = ((EditText) findViewById(R.id.txtRandomResultText)).getText().toString(); Intent i = new Intent(); i.putExtra("result", result); setResult(RESULT_OK, i); finish(); } } ================================================ FILE: app/src/main/java/codepath/apps/demointroandroid/SmartImageDownloadActivity.java ================================================ package codepath.apps.demointroandroid; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Bundle; import android.view.Menu; import android.widget.ImageView; import androidx.annotation.Nullable; import com.codepath.asynchttpclient.AsyncHttpClient; import com.codepath.asynchttpclient.callback.BinaryHttpResponseHandler; import java.io.IOException; import okhttp3.Headers; import okhttp3.Response; public class SmartImageDownloadActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_smart_image_download); downloadSmartImageFromUrl("https://2.gravatar.com/avatar/858dfac47ab8176458c005414d3f0c36?s=128&d=&r=G"); } private void downloadSmartImageFromUrl(String address) { AsyncHttpClient client = new AsyncHttpClient(); client.get(address, new BinaryHttpResponseHandler() { @Override public void onSuccess(int statusCode, Headers headers, Response response) { try { byte[] image = response.body().bytes(); Bitmap bitmap = BitmapFactory.decodeByteArray(image, 0, image.length); ImageView img = findViewById(R.id.ivSmartImage); img.setImageBitmap(bitmap); } catch (IOException e) { e.printStackTrace(); } } @Override public void onFailure(int statusCode, @Nullable Headers headers, String errorResponse, @Nullable Throwable throwable) { } } ); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_smart_image_download, menu); return true; } } ================================================ FILE: app/src/main/java/codepath/apps/demointroandroid/SpinnerWithToastActivity.java ================================================ package codepath.apps.demointroandroid; import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.view.View; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.Spinner; import android.widget.Toast; public class SpinnerWithToastActivity extends Activity { Spinner spinner; Button btnSpinnerVal; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_spinner_with_toast); spinner = (Spinner) findViewById(R.id.spnOptions); btnSpinnerVal = (Button) findViewById(R.id.btnSpinnerValue); loadSpinner(); } private void loadSpinner() { ArrayAdapter adapter = ArrayAdapter.createFromResource(this, R.array.spinner_options, android.R.layout.simple_spinner_item); // Set layout style during dropdown adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); // Load data from adapter spinner.setAdapter(adapter); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_spinner_with_toast, menu); return true; } public void displayVal(View v) { Toast.makeText(this, spinner.getSelectedItem().toString(), Toast.LENGTH_SHORT).show(); } } ================================================ FILE: app/src/main/java/codepath/apps/demointroandroid/TimePickerDemoActivity.java ================================================ package codepath.apps.demointroandroid; import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.view.View; import android.widget.TimePicker; import android.widget.Toast; public class TimePickerDemoActivity extends Activity { TimePicker tpTime; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_time_picker_demo); tpTime = (TimePicker) findViewById(R.id.tpTime); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_time_picker_demo, menu); return true; } public void displayTime(View v) { String time = tpTime.getCurrentHour() + ":" + tpTime.getCurrentMinute(); Toast.makeText(this, time, Toast.LENGTH_SHORT).show(); } } ================================================ FILE: app/src/main/java/codepath/apps/demointroandroid/ToastFormInputsActivity.java ================================================ package codepath.apps.demointroandroid; import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.view.View; import android.widget.CheckBox; import android.widget.EditText; import android.widget.RadioButton; import android.widget.RadioGroup; import android.widget.Toast; public class ToastFormInputsActivity extends Activity { EditText etVal; CheckBox chkVal; RadioGroup rdgVal; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_toast_form_inputs); etVal = (EditText) findViewById(R.id.etVal); chkVal = (CheckBox) findViewById(R.id.chkVal); rdgVal = (RadioGroup) findViewById(R.id.rdgVal); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_toast_form_inputs, menu); return true; } public void toastInputs(View v) { int selected = rdgVal.getCheckedRadioButtonId(); RadioButton b = (RadioButton) findViewById(selected); String text = etVal.getText() + " | " + chkVal.isChecked() + " | " + b.getText(); Toast.makeText(this, text, Toast.LENGTH_SHORT).show(); } } ================================================ FILE: app/src/main/java/codepath/apps/demointroandroid/ViewAttributesActivity.java ================================================ package codepath.apps.demointroandroid; import android.os.Bundle; import android.app.Activity; import android.util.Log; import android.view.Menu; import android.widget.TextView; import android.widget.Toast; public class ViewAttributesActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_view_attributes); TextView tvMain = (TextView) findViewById(R.id.tvMain); Log.d("DEBUG", tvMain.getText().toString()); Toast.makeText(this, tvMain.getText().toString(), Toast.LENGTH_SHORT).show(); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_view_attributes, menu); return true; } } ================================================ FILE: app/src/main/res/drawable/simple_list_selector.xml ================================================ ================================================ FILE: app/src/main/res/layout/activity_action_bar_menu.xml ================================================ ================================================ FILE: app/src/main/res/layout/activity_async_task_perform.xml ================================================ ================================================ FILE: app/src/main/res/layout/activity_basic_click_handlers.xml ================================================