Created
April 9, 2016 10:09
-
-
Save AraujoJordan/c076f404116308d0c870e60f6e6d6b3a to your computer and use it in GitHub Desktop.
[Nova Cursos] Aula7 - NovaTodo
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | |
xmlns:tools="http://schemas.android.com/tools" | |
android:layout_width="match_parent" | |
android:layout_height="match_parent" | |
android:gravity="center_horizontal" | |
android:orientation="vertical" | |
android:paddingBottom="@dimen/activity_vertical_margin" | |
android:paddingLeft="@dimen/activity_horizontal_margin" | |
android:paddingRight="@dimen/activity_horizontal_margin" | |
android:paddingTop="@dimen/activity_vertical_margin" | |
tools:context="araujo.jordan.novatodo.LoginActivity"> | |
<!-- Login progress --> | |
<ProgressBar | |
android:id="@+id/login_progress" | |
style="?android:attr/progressBarStyleLarge" | |
android:layout_width="wrap_content" | |
android:layout_height="wrap_content" | |
android:layout_marginBottom="8dp" | |
android:visibility="gone" /> | |
<ScrollView | |
android:id="@+id/login_form" | |
android:layout_width="match_parent" | |
android:layout_height="match_parent"> | |
<LinearLayout | |
android:id="@+id/email_login_form" | |
android:layout_width="match_parent" | |
android:layout_height="wrap_content" | |
android:orientation="vertical"> | |
<android.support.design.widget.TextInputLayout | |
android:layout_width="match_parent" | |
android:layout_height="wrap_content"> | |
<AutoCompleteTextView | |
android:id="@+id/email" | |
android:layout_width="match_parent" | |
android:layout_height="wrap_content" | |
android:hint="@string/prompt_email" | |
android:inputType="textEmailAddress" | |
android:maxLines="1" | |
android:singleLine="true" /> | |
</android.support.design.widget.TextInputLayout> | |
<android.support.design.widget.TextInputLayout | |
android:layout_width="match_parent" | |
android:layout_height="wrap_content"> | |
<EditText | |
android:id="@+id/password" | |
android:layout_width="match_parent" | |
android:layout_height="wrap_content" | |
android:hint="@string/prompt_password" | |
android:imeActionId="@+id/login" | |
android:imeActionLabel="@string/action_sign_in_short" | |
android:imeOptions="actionUnspecified" | |
android:inputType="textPassword" | |
android:maxLines="1" | |
android:singleLine="true" /> | |
</android.support.design.widget.TextInputLayout> | |
<Button | |
android:id="@+id/email_sign_in_button" | |
style="?android:textAppearanceSmall" | |
android:layout_width="match_parent" | |
android:layout_height="wrap_content" | |
android:layout_marginTop="16dp" | |
android:text="@string/action_sign_in" | |
android:textStyle="bold" /> | |
</LinearLayout> | |
</ScrollView> | |
</LinearLayout> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?xml version="1.0" encoding="utf-8"?> | |
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" | |
xmlns:tools="http://schemas.android.com/tools" | |
android:layout_width="match_parent" | |
android:layout_height="match_parent" | |
android:paddingBottom="@dimen/activity_vertical_margin" | |
android:paddingLeft="@dimen/activity_horizontal_margin" | |
android:paddingRight="@dimen/activity_horizontal_margin" | |
android:paddingTop="@dimen/activity_vertical_margin" | |
tools:context="araujo.jordan.novatodo.TodoActivity"> | |
<LinearLayout | |
android:orientation="vertical" | |
android:layout_width="match_parent" | |
android:layout_height="match_parent"> | |
<ImageView | |
android:layout_width="fill_parent" | |
android:layout_height="wrap_content" | |
android:id="@+id/imageView" | |
android:maxHeight="300dp" /> | |
<LinearLayout | |
android:orientation="horizontal" | |
android:layout_width="fill_parent" | |
android:layout_height="wrap_content"> | |
<EditText | |
android:layout_width="fill_parent" | |
android:layout_height="wrap_content" | |
android:id="@+id/editText" | |
android:layout_weight="3" /> | |
<ImageButton | |
android:layout_width="fill_parent" | |
android:layout_height="wrap_content" | |
android:id="@+id/btnFoto" | |
android:src="@android:drawable/ic_menu_gallery" | |
android:layout_weight="5" /> | |
<ImageButton | |
android:layout_width="fill_parent" | |
android:layout_height="wrap_content" | |
android:id="@+id/btnEnviar" | |
android:src="@android:drawable/ic_menu_send" | |
android:layout_weight="5" /> | |
</LinearLayout> | |
<ListView | |
android:layout_width="wrap_content" | |
android:layout_height="wrap_content" | |
android:id="@+id/listView" /> | |
</LinearLayout> | |
</RelativeLayout> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?xml version="1.0" encoding="utf-8"?> | |
<manifest xmlns:android="http://schemas.android.com/apk/res/android" | |
package="araujo.jordan.novatodo"> | |
<!-- To auto-complete the email text field in the login form with the user's emails --> | |
<uses-permission android:name="android.permission.GET_ACCOUNTS" /> | |
<uses-permission android:name="android.permission.READ_PROFILE" /> | |
<uses-permission android:name="android.permission.READ_CONTACTS" /> | |
<uses-permission android:name="android.permission.INTERNET" /> | |
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> | |
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> | |
<application | |
android:name=".ParseApplication" | |
android:allowBackup="true" | |
android:icon="@mipmap/ic_launcher" | |
android:label="@string/app_name" | |
android:supportsRtl="true" | |
android:theme="@style/AppTheme"> | |
<activity | |
android:name=".LoginActivity" | |
android:label="@string/app_name"> | |
<intent-filter> | |
<action android:name="android.intent.action.MAIN" /> | |
<category android:name="android.intent.category.LAUNCHER" /> | |
</intent-filter> | |
</activity> | |
<activity android:name=".TodoActivity"></activity> | |
</application> | |
</manifest> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?xml version="1.0" encoding="utf-8"?> | |
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" | |
android:layout_width="match_parent" | |
android:layout_height="match_parent"> | |
<LinearLayout | |
android:layout_width="match_parent" | |
android:layout_height="match_parent" | |
android:orientation="vertical"> | |
<ImageView | |
android:layout_width="fill_parent" | |
android:layout_height="wrap_content" | |
android:id="@+id/imageTodo" | |
android:layout_gravity="center_horizontal" /> | |
<TextView | |
android:layout_width="wrap_content" | |
android:layout_height="wrap_content" | |
android:text="New Text" | |
android:id="@+id/textoTodo" | |
android:layout_gravity="center_horizontal" /> | |
</LinearLayout> | |
<Button | |
android:layout_width="40dp" | |
android:layout_height="40dp" | |
android:text="X" | |
android:id="@+id/btnDeletar" | |
android:textColor="#ff0000" | |
android:layout_alignParentTop="true" | |
android:layout_alignParentRight="true" /> | |
</RelativeLayout> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package araujo.jordan.novatodo; | |
import android.animation.Animator; | |
import android.animation.AnimatorListenerAdapter; | |
import android.annotation.TargetApi; | |
import android.app.LoaderManager.LoaderCallbacks; | |
import android.content.CursorLoader; | |
import android.content.Intent; | |
import android.content.Loader; | |
import android.content.pm.PackageManager; | |
import android.database.Cursor; | |
import android.net.Uri; | |
import android.os.AsyncTask; | |
import android.os.Build; | |
import android.os.Bundle; | |
import android.provider.ContactsContract; | |
import android.support.annotation.NonNull; | |
import android.support.design.widget.Snackbar; | |
import android.support.v7.app.AppCompatActivity; | |
import android.text.TextUtils; | |
import android.util.Log; | |
import android.view.KeyEvent; | |
import android.view.View; | |
import android.view.View.OnClickListener; | |
import android.view.inputmethod.EditorInfo; | |
import android.widget.ArrayAdapter; | |
import android.widget.AutoCompleteTextView; | |
import android.widget.Button; | |
import android.widget.EditText; | |
import android.widget.TextView; | |
import com.parse.ParseException; | |
import com.parse.ParseUser; | |
import java.util.ArrayList; | |
import java.util.List; | |
import static android.Manifest.permission.READ_CONTACTS; | |
/** | |
* A login screen that offers login via email/password. | |
*/ | |
public class LoginActivity extends AppCompatActivity implements LoaderCallbacks<Cursor> { | |
/** | |
* Id to identity READ_CONTACTS permission request. | |
*/ | |
private static final int REQUEST_READ_CONTACTS = 0; | |
/** | |
* A dummy authentication store containing known user names and passwords. | |
* TODO: remove after connecting to a real authentication system. | |
*/ | |
private static final String[] DUMMY_CREDENTIALS = new String[]{ | |
"foo@example.com:hello", "bar@example.com:world" | |
}; | |
/** | |
* Keep track of the login task to ensure we can cancel it if requested. | |
*/ | |
private UserLoginTask mAuthTask = null; | |
// UI references. | |
private AutoCompleteTextView mEmailView; | |
private EditText mPasswordView; | |
private View mProgressView; | |
private View mLoginFormView; | |
@Override | |
protected void onCreate(Bundle savedInstanceState) { | |
super.onCreate(savedInstanceState); | |
if(ParseUser.getCurrentUser() != null) { | |
startActivity(new Intent(LoginActivity.this, TodoActivity.class)); | |
finish(); | |
} | |
setContentView(R.layout.activity_login); | |
// Set up the login form. | |
mEmailView = (AutoCompleteTextView) findViewById(R.id.email); | |
populateAutoComplete(); | |
mPasswordView = (EditText) findViewById(R.id.password); | |
mPasswordView.setOnEditorActionListener(new TextView.OnEditorActionListener() { | |
@Override | |
public boolean onEditorAction(TextView textView, int id, KeyEvent keyEvent) { | |
if (id == R.id.login || id == EditorInfo.IME_NULL) { | |
attemptLogin(); | |
return true; | |
} | |
return false; | |
} | |
}); | |
Button mEmailSignInButton = (Button) findViewById(R.id.email_sign_in_button); | |
mEmailSignInButton.setOnClickListener(new OnClickListener() { | |
@Override | |
public void onClick(View view) { | |
attemptLogin(); | |
} | |
}); | |
mLoginFormView = findViewById(R.id.login_form); | |
mProgressView = findViewById(R.id.login_progress); | |
} | |
private void populateAutoComplete() { | |
if (!mayRequestContacts()) { | |
return; | |
} | |
getLoaderManager().initLoader(0, null, this); | |
} | |
private boolean mayRequestContacts() { | |
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { | |
return true; | |
} | |
if (checkSelfPermission(READ_CONTACTS) == PackageManager.PERMISSION_GRANTED) { | |
return true; | |
} | |
if (shouldShowRequestPermissionRationale(READ_CONTACTS)) { | |
Snackbar.make(mEmailView, R.string.permission_rationale, Snackbar.LENGTH_INDEFINITE) | |
.setAction(android.R.string.ok, new View.OnClickListener() { | |
@Override | |
@TargetApi(Build.VERSION_CODES.M) | |
public void onClick(View v) { | |
requestPermissions(new String[]{READ_CONTACTS}, REQUEST_READ_CONTACTS); | |
} | |
}); | |
} else { | |
requestPermissions(new String[]{READ_CONTACTS}, REQUEST_READ_CONTACTS); | |
} | |
return false; | |
} | |
/** | |
* Callback received when a permissions request has been completed. | |
*/ | |
@Override | |
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, | |
@NonNull int[] grantResults) { | |
if (requestCode == REQUEST_READ_CONTACTS) { | |
if (grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { | |
populateAutoComplete(); | |
} | |
} | |
} | |
/** | |
* Attempts to sign in or register the account specified by the login form. | |
* If there are form errors (invalid email, missing fields, etc.), the | |
* errors are presented and no actual login attempt is made. | |
*/ | |
private void attemptLogin() { | |
if (mAuthTask != null) { | |
return; | |
} | |
// Reset errors. | |
mEmailView.setError(null); | |
mPasswordView.setError(null); | |
// Store values at the time of the login attempt. | |
String email = mEmailView.getText().toString(); | |
String password = mPasswordView.getText().toString(); | |
boolean cancel = false; | |
View focusView = null; | |
// Check for a valid password, if the user entered one. | |
if (!TextUtils.isEmpty(password) && !isPasswordValid(password)) { | |
mPasswordView.setError(getString(R.string.error_invalid_password)); | |
focusView = mPasswordView; | |
cancel = true; | |
} | |
// Check for a valid email address. | |
if (TextUtils.isEmpty(email)) { | |
mEmailView.setError(getString(R.string.error_field_required)); | |
focusView = mEmailView; | |
cancel = true; | |
} else if (!isEmailValid(email)) { | |
mEmailView.setError(getString(R.string.error_invalid_email)); | |
focusView = mEmailView; | |
cancel = true; | |
} | |
if (cancel) { | |
// There was an error; don't attempt login and focus the first | |
// form field with an error. | |
focusView.requestFocus(); | |
} else { | |
// Show a progress spinner, and kick off a background task to | |
// perform the user login attempt. | |
showProgress(true); | |
mAuthTask = new UserLoginTask(email, password); | |
mAuthTask.execute((Void) null); | |
} | |
} | |
private boolean isEmailValid(String email) { | |
//TODO: Replace this with your own logic | |
return email.contains("@"); | |
} | |
private boolean isPasswordValid(String password) { | |
//TODO: Replace this with your own logic | |
return password.length() > 4; | |
} | |
/** | |
* Shows the progress UI and hides the login form. | |
*/ | |
@TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2) | |
private void showProgress(final boolean show) { | |
// On Honeycomb MR2 we have the ViewPropertyAnimator APIs, which allow | |
// for very easy animations. If available, use these APIs to fade-in | |
// the progress spinner. | |
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) { | |
int shortAnimTime = getResources().getInteger(android.R.integer.config_shortAnimTime); | |
mLoginFormView.setVisibility(show ? View.GONE : View.VISIBLE); | |
mLoginFormView.animate().setDuration(shortAnimTime).alpha( | |
show ? 0 : 1).setListener(new AnimatorListenerAdapter() { | |
@Override | |
public void onAnimationEnd(Animator animation) { | |
mLoginFormView.setVisibility(show ? View.GONE : View.VISIBLE); | |
} | |
}); | |
mProgressView.setVisibility(show ? View.VISIBLE : View.GONE); | |
mProgressView.animate().setDuration(shortAnimTime).alpha( | |
show ? 1 : 0).setListener(new AnimatorListenerAdapter() { | |
@Override | |
public void onAnimationEnd(Animator animation) { | |
mProgressView.setVisibility(show ? View.VISIBLE : View.GONE); | |
} | |
}); | |
} else { | |
// The ViewPropertyAnimator APIs are not available, so simply show | |
// and hide the relevant UI components. | |
mProgressView.setVisibility(show ? View.VISIBLE : View.GONE); | |
mLoginFormView.setVisibility(show ? View.GONE : View.VISIBLE); | |
} | |
} | |
@Override | |
public Loader<Cursor> onCreateLoader(int i, Bundle bundle) { | |
return new CursorLoader(this, | |
// Retrieve data rows for the device user's 'profile' contact. | |
Uri.withAppendedPath(ContactsContract.Profile.CONTENT_URI, | |
ContactsContract.Contacts.Data.CONTENT_DIRECTORY), ProfileQuery.PROJECTION, | |
// Select only email addresses. | |
ContactsContract.Contacts.Data.MIMETYPE + | |
" = ?", new String[]{ContactsContract.CommonDataKinds.Email | |
.CONTENT_ITEM_TYPE}, | |
// Show primary email addresses first. Note that there won't be | |
// a primary email address if the user hasn't specified one. | |
ContactsContract.Contacts.Data.IS_PRIMARY + " DESC"); | |
} | |
@Override | |
public void onLoadFinished(Loader<Cursor> cursorLoader, Cursor cursor) { | |
List<String> emails = new ArrayList<>(); | |
cursor.moveToFirst(); | |
while (!cursor.isAfterLast()) { | |
emails.add(cursor.getString(ProfileQuery.ADDRESS)); | |
cursor.moveToNext(); | |
} | |
addEmailsToAutoComplete(emails); | |
} | |
@Override | |
public void onLoaderReset(Loader<Cursor> cursorLoader) { | |
} | |
private void addEmailsToAutoComplete(List<String> emailAddressCollection) { | |
//Create adapter to tell the AutoCompleteTextView what to show in its dropdown list. | |
ArrayAdapter<String> adapter = | |
new ArrayAdapter<>(LoginActivity.this, | |
android.R.layout.simple_dropdown_item_1line, emailAddressCollection); | |
mEmailView.setAdapter(adapter); | |
} | |
private interface ProfileQuery { | |
String[] PROJECTION = { | |
ContactsContract.CommonDataKinds.Email.ADDRESS, | |
ContactsContract.CommonDataKinds.Email.IS_PRIMARY, | |
}; | |
int ADDRESS = 0; | |
int IS_PRIMARY = 1; | |
} | |
/** | |
* Represents an asynchronous login/registration task used to authenticate | |
* the user. | |
*/ | |
public class UserLoginTask extends AsyncTask<Void, Void, Boolean> { | |
private final String mEmail; | |
private final String mPassword; | |
UserLoginTask(String email, String password) { | |
mEmail = email; | |
mPassword = password; | |
} | |
@Override | |
protected Boolean doInBackground(Void... params) { | |
Log.v("Login", "Login iniciado"); | |
if (!mEmail.equals("")) { | |
ParseUser user = new ParseUser(); | |
user.setEmail(mEmail); | |
user.setPassword(mPassword); | |
user.setUsername(mEmail); | |
try { | |
user.signUp(); | |
return true; | |
} catch (ParseException e) { | |
try { | |
ParseUser.logIn(mEmail,mPassword); | |
return true; | |
} catch (ParseException e1) { | |
return false; | |
} | |
} | |
} | |
return true; | |
} | |
@Override | |
protected void onPostExecute(final Boolean success) { | |
mAuthTask = null; | |
showProgress(false); | |
if (success) { | |
startActivity(new Intent(LoginActivity.this, TodoActivity.class)); | |
finish(); | |
} else { | |
mPasswordView.setError(getString(R.string.error_incorrect_password)); | |
mPasswordView.requestFocus(); | |
} | |
} | |
@Override | |
protected void onCancelled() { | |
mAuthTask = null; | |
showProgress(false); | |
} | |
} | |
} | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package araujo.jordan.novatodo; | |
import android.app.Application; | |
import com.parse.Parse; | |
/** | |
* Created by Jordan on 09/04/2016. | |
*/ | |
public class ParseApplication extends Application { | |
@Override | |
public void onCreate() { | |
super.onCreate(); | |
Parse.initialize(this, "mJdFcm1evWqbaWvqBQRjAn0K1EMuXpeV9oo0VtyX", "KAcvSKZJKxu0bc93EccUSLlkDXT9UCnjyz5IpWaH"); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package araujo.jordan.novatodo; | |
import android.content.Intent; | |
import android.graphics.Bitmap; | |
import android.graphics.BitmapFactory; | |
import android.net.Uri; | |
import android.os.Bundle; | |
import android.support.v7.app.AppCompatActivity; | |
import android.util.Base64; | |
import android.view.View; | |
import android.widget.EditText; | |
import android.widget.ImageButton; | |
import android.widget.ImageView; | |
import android.widget.ListView; | |
import android.widget.Toast; | |
import com.parse.ParseException; | |
import com.parse.ParseObject; | |
import com.parse.ParseQuery; | |
import com.parse.SaveCallback; | |
import java.io.ByteArrayOutputStream; | |
import java.io.File; | |
public class TodoActivity extends AppCompatActivity { | |
private static final int GALLARY_IMAGE = 123; | |
private ListView listView; | |
private ImageButton btnFoto, btnEnviar; | |
private EditText editText; | |
TodoAdapter adapter; | |
private String image64 = ""; | |
private String mCurrentPhotoPath; | |
private ImageView imageView; | |
private Bitmap mImageBitmap; | |
@Override | |
protected void onCreate(Bundle savedInstanceState) { | |
super.onCreate(savedInstanceState); | |
setContentView(R.layout.activity_todo); | |
listView = (ListView) findViewById(R.id.listView); | |
btnFoto = (ImageButton) findViewById(R.id.btnFoto); | |
btnEnviar = (ImageButton) findViewById(R.id.btnEnviar); | |
editText = (EditText) findViewById(R.id.editText); | |
ParseQuery<ParseObject> todoQuery = new ParseQuery<>("todoItem"); | |
todoQuery.setCachePolicy(ParseQuery.CachePolicy.NETWORK_ELSE_CACHE); | |
adapter = new TodoAdapter(this, todoQuery); | |
listView.setAdapter(adapter); | |
btnEnviar.setOnClickListener(new View.OnClickListener() { | |
@Override | |
public void onClick(View v) { | |
if (editText.getText().toString().equals("")) { | |
Toast.makeText(TodoActivity.this, "Adicione um texto", Toast.LENGTH_SHORT).show(); | |
return; | |
} | |
if(mImageBitmap!=null) | |
image64 = BitmapToString(mImageBitmap); | |
ParseObject todoItem = new ParseObject("todoItem"); | |
todoItem.put("desc", editText.getText().toString()); | |
todoItem.put("img", image64); | |
todoItem.saveInBackground(new SaveCallback() { | |
@Override | |
public void done(ParseException e) { | |
startActivity(new Intent(TodoActivity.this,TodoActivity.class)); | |
finish(); | |
if (e != null) | |
e.printStackTrace(); | |
} | |
}); | |
image64 = ""; | |
mImageBitmap = null; | |
imageView.setImageBitmap(null); | |
editText.setText(""); | |
} | |
}); | |
btnFoto.setOnClickListener(new View.OnClickListener() { | |
@Override | |
public void onClick(View v) { | |
Intent intent = new Intent().setType("image/*").setAction(Intent.ACTION_GET_CONTENT); | |
startActivityForResult(Intent.createChooser(intent, "Selecione uma foto"), GALLARY_IMAGE); | |
} | |
} | |
); | |
imageView = (ImageView) findViewById(R.id.imageView); | |
} | |
public String BitmapToString(Bitmap fotoBitmap) { | |
ByteArrayOutputStream byteArrayOS = new ByteArrayOutputStream(); | |
fotoBitmap.compress(Bitmap.CompressFormat.WEBP, 60, byteArrayOS); | |
return Base64.encodeToString(byteArrayOS.toByteArray(), Base64.DEFAULT); | |
} | |
@Override | |
protected void onActivityResult(int requestCode, int resultCode, Intent data) { | |
super.onActivityResult(requestCode, resultCode, data); | |
if (requestCode == GALLARY_IMAGE && resultCode == RESULT_OK && null != data) { | |
Uri selectedImageUri = data.getData(); | |
mCurrentPhotoPath = selectedImageUri.getPath(); | |
handlePhoto(); | |
} | |
} | |
private void handlePhoto() { | |
if (mCurrentPhotoPath != null) { | |
setPic(); | |
galleryAddPic(); | |
mCurrentPhotoPath = null; | |
} | |
} | |
private void galleryAddPic() { | |
Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); | |
File f = new File(mCurrentPhotoPath); | |
Uri contentUri = Uri.fromFile(f); | |
mediaScanIntent.setData(contentUri); | |
this.sendBroadcast(mediaScanIntent); | |
} | |
private void setPic() { | |
// Get the dimensions of the View | |
int targetW = 500; | |
int targetH = 500; | |
// Get the dimensions of the bitmap | |
BitmapFactory.Options bmOptions = new BitmapFactory.Options(); | |
bmOptions.inJustDecodeBounds = true; | |
BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions); | |
int photoW = bmOptions.outWidth; | |
int photoH = bmOptions.outHeight; | |
// Determine how much to scale down the image | |
int scaleFactor = 1; | |
if ((targetW > 0) || (targetH > 0)) { | |
scaleFactor = Math.min(photoW / targetW, photoH / targetH); | |
} | |
// Decode the image file into a Bitmap sized to fill the View | |
bmOptions.inJustDecodeBounds = false; | |
bmOptions.inSampleSize = scaleFactor; | |
bmOptions.inPurgeable = true; | |
mImageBitmap = BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions); | |
imageView.setImageBitmap(mImageBitmap); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package araujo.jordan.novatodo; | |
import android.content.Context; | |
import android.graphics.Bitmap; | |
import android.graphics.BitmapFactory; | |
import android.support.v7.widget.RecyclerView; | |
import android.util.Base64; | |
import android.view.LayoutInflater; | |
import android.view.View; | |
import android.view.ViewGroup; | |
import android.widget.ImageView; | |
import android.widget.TextView; | |
import com.parse.ParseObject; | |
import com.parse.ParseQuery; | |
import com.parse.ParseQueryAdapter; | |
/** | |
* Created by Jordan on 09/04/2016. | |
*/ | |
public class TodoAdapter extends ParseQueryAdapter<ParseObject> { | |
public TodoAdapter(Context context, final ParseQuery<ParseObject> query) { | |
super(context, new ParseQueryAdapter.QueryFactory<ParseObject>() { | |
public ParseQuery<ParseObject> create() { | |
return query; | |
} | |
}); | |
} | |
@Override | |
public View getItemView(final ParseObject post, View convertView, ViewGroup parent) { | |
if (convertView == null) | |
convertView = LayoutInflater.from(getContext()) | |
.inflate(R.layout.listview_item_todo, parent, false); | |
ImageView imageTodo = (ImageView) convertView.findViewById(R.id.imageTodo); | |
if (post.getString("img") != null && !post.getString("img").equals("")) | |
imageTodo.setImageBitmap(StringToBitmap(post.getString("img"))); | |
TextView textTodo = (TextView) convertView.findViewById(R.id.textoTodo); | |
if (post.getString("desc") != null && !post.getString("desc").equals("")) | |
textTodo.setText(post.getString("desc")); | |
return convertView; | |
} | |
public Bitmap StringToBitmap(String fotoBASE64) { | |
byte[] decodedString = Base64.decode(fotoBASE64, Base64.DEFAULT); | |
return BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment