ph.devcon.android.profile.EditUserProfileActivity.java Source code

Java tutorial

Introduction

Here is the source code for ph.devcon.android.profile.EditUserProfileActivity.java

Source

/*
 * Copyright (C) 2014 Philippine Android Developers Community
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package ph.devcon.android.profile;

import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.provider.MediaStore;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.google.common.base.Optional;
import com.j256.ormlite.dao.ForeignCollection;
import com.squareup.picasso.Picasso;

import java.io.ByteArrayOutputStream;
import java.sql.SQLException;

import javax.inject.Inject;

import butterknife.ButterKnife;
import butterknife.InjectView;
import butterknife.OnClick;
import de.greenrobot.event.EventBus;
import ph.devcon.android.DevConApplication;
import ph.devcon.android.R;
import ph.devcon.android.auth.AuthService;
import ph.devcon.android.base.event.NetworkUnavailableEvent;
import ph.devcon.android.login.LoginActivity;
import ph.devcon.android.profile.db.Profile;
import ph.devcon.android.profile.event.FetchedProfileEvent;
import ph.devcon.android.profile.event.UpdatedProfileEvent;
import ph.devcon.android.profile.event.UpdatedProfileFailedEvent;
import ph.devcon.android.profile.service.ProfileService;
import ph.devcon.android.technology.db.Technology;
import ph.devcon.android.user.db.User;
import ph.devcon.android.user.db.UserDao;
import ph.devcon.android.util.Util;

/**
 * Created by lope on 9/13/14.
 */
public class EditUserProfileActivity extends ActionBarActivity implements SwipeRefreshLayout.OnRefreshListener {

    static final int REQUEST_IMAGE_CAPTURE = 1;
    @Inject
    EventBus eventBus;
    @Inject
    ProfileService profileService;
    @InjectView(R.id.img_user)
    ImageView imgUser;
    @InjectView(R.id.txt_full_name)
    TextView txtFullName;
    @InjectView(R.id.edt_company_position)
    EditText edtCompanyPosition;
    @InjectView(R.id.edt_company_name)
    EditText edtCompanyName;
    @InjectView(R.id.edt_location)
    EditText edtLocation;
    @InjectView(R.id.edt_email_address)
    EditText edtEmailAddress;
    @InjectView(R.id.edt_about_me)
    EditText edtAboutMe;
    @InjectView(R.id.edt_tech_1)
    EditText edtTech1;
    @InjectView(R.id.edt_tech_2)
    EditText edtTech2;
    @InjectView(R.id.edt_tech_3)
    EditText edtTech3;
    @InjectView(R.id.edt_domain_name)
    EditText edtDomainName;
    @InjectView(R.id.edt_twitter)
    EditText edtTwitter;
    @InjectView(R.id.edt_facebook)
    EditText edtFacebook;
    @InjectView(R.id.cont_edit_profile)
    SwipeRefreshLayout swipeLayout;

    // submission
    @InjectView(R.id.cont_submit)
    ViewGroup contSubmit;
    @InjectView(R.id.img_save_changes)
    ImageView imgSaveChanges;
    @InjectView(R.id.txt_save_changes)
    TextView txtSaveChanges;
    Profile profile;
    @Inject
    UserDao userDao;
    @Inject
    AuthService authService;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.fragment_edit_profile);
        setTitle(getString(R.string.edit_profile));
        DevConApplication.injectMembers(this);
        ButterKnife.inject(this);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setHomeButtonEnabled(true);
        initSwipeLayout();
        if (!eventBus.isRegistered(this)) {
            eventBus.register(this);
        }
        if (profileService.isCacheValid()) {
            profileService.populateFromCache(getLoaderManager(), savedInstanceState);
        } else {
            profileService.populateFromAPI();
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);
        // Only show items in the action bar relevant to this screen
        // if the drawer is not showing. Otherwise, let the drawer
        // decide what to show in the action bar.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        switch (item.getItemId()) {
        // Respond to the action bar's Up/Home button
        case R.id.action_signout:
            authService.logout();
            Intent intent = new Intent(this, LoginActivity.class);
            startActivity(intent);
            finish();
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    protected void initSwipeLayout() {
        swipeLayout.setOnRefreshListener(this);
        swipeLayout.setColorSchemeResources(R.color.yellow, R.color.orange, R.color.purple, R.color.blue);
        swipeLayout.setRefreshing(true);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        eventBus.removeStickyEvent(LaunchCameraEvent.class);
        eventBus.unregister(this);
    }

    public void setProfile(Profile profile) {
        Optional<Profile> profileOptional = Optional.of(profile);
        if (profileOptional.isPresent()) {
            if (Optional.of(profile.getUser()).isPresent()) {
                this.profile = profile;
                User user = profile.getUser();
                if (!Util.isNullOrEmpty(user.getPhotoUrl()))
                    Picasso.with(this).load(user.getPhotoUrl()).placeholder(R.drawable.ic_summit_logo)
                            .into(imgUser);
                txtFullName.setText(user.getFullName());
                edtCompanyPosition.setText(user.getPosition());
                edtCompanyName.setText(user.getCompany());
                edtLocation.setText(user.getLocation());
                edtEmailAddress.setText(user.getEmail());
                edtAboutMe.setText(user.getDescription());
                edtTech1.setText(user.getMainTechnologyTitle());
                int counter = 0;
                for (String title : user.getOtherTechnologiesTitleList()) {
                    if (counter == 0)
                        edtTech2.setText(title);
                    else if (counter == 1)
                        edtTech3.setText(title);
                    counter++;
                }
                edtDomainName.setText(user.getWebsiteDomain());
                edtTwitter.setText(user.getTwitterHandle());
                edtFacebook.setText(user.getFacebookHandle());
            }
        }
    }

    @OnClick(R.id.cont_submit)
    public void onClickSaveChanges(View view) {
        Optional<Profile> profileOptional = Optional.of(profile);
        if (profileOptional.isPresent()) {
            User user = profile.getUser();
            user.setPosition(edtCompanyPosition.getText().toString());
            user.setCompany(edtCompanyName.getText().toString());
            user.setLocation(edtLocation.getText().toString());
            user.setEmail(edtEmailAddress.getText().toString());
            user.setDescription(edtAboutMe.getText().toString());
            user.setWebsite(edtDomainName.getText().toString());
            user.setFacebookUrl(edtFacebook.getText().toString());
            user.setTwitterHandle(edtTwitter.getText().toString());
            String primaryTech = edtTech1.getText().toString();
            user.setPrimaryTechnology(Technology.toTechnology(user, primaryTech));
            try {
                ForeignCollection<Technology> technologies = userDao.getEmptyForeignCollection("technologies");
                String tech2 = edtTech2.getText().toString();
                technologies.add(Technology.toTechnology(user, tech2));
                String tech3 = edtTech3.getText().toString();
                technologies.add(Technology.toTechnology(user, tech3));
                user.setTechnologies(technologies);
            } catch (SQLException e) {
                e.printStackTrace();
            }
            profileService.updateAPI(profile);
            disableSubmitButton();
        }
    }

    protected void enableSubmitButton() {
        txtSaveChanges.setText(getString(R.string.save_changes));
        swipeLayout.setRefreshing(false);
        contSubmit.setEnabled(true);
        contSubmit.setBackgroundResource(R.drawable.selectable_green);
        imgSaveChanges.setVisibility(View.VISIBLE);

    }

    protected void disableSubmitButton() {
        txtSaveChanges.setText(getString(R.string.save_changes));
        swipeLayout.setRefreshing(true);
        contSubmit.setEnabled(false);
        contSubmit.setBackgroundResource(R.drawable.selectable_green_inverse);
        txtSaveChanges.setText(getString(R.string.updating));
        imgSaveChanges.setVisibility(View.GONE);
    }

    public void onEventMainThread(FetchedProfileEvent event) {
        setProfile(event.profile);
        enableSubmitButton();
    }

    public void onEventMainThread(UpdatedProfileEvent event) {
        profileService.populateFromAPI();
        Toast.makeText(this, "Profile updated successfully..", Toast.LENGTH_SHORT).show();
        enableSubmitButton();
    }

    public void onEventMainThread(UpdatedProfileFailedEvent event) {
        Toast.makeText(this, "An error occurred: " + event.message, Toast.LENGTH_SHORT).show();
        enableSubmitButton();
    }

    public void onEventMainThread(NetworkUnavailableEvent event) {
        Toast.makeText(this, getString(R.string.update_when_available), Toast.LENGTH_LONG).show();
        enableSubmitButton();
    }

    public void onClickUserProfile(View view) {
        Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
            EventBus.getDefault().postSticky(new LaunchCameraEvent(profile));
            startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
            Bundle extras = data.getExtras();
            Bitmap imageBitmap = (Bitmap) extras.get("data");
            imgUser.setImageBitmap(imageBitmap);
            ByteArrayOutputStream stream = new ByteArrayOutputStream();
            imageBitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
            byte[] imageByteArray = stream.toByteArray();
            profile = eventBus.getStickyEvent(LaunchCameraEvent.class).profile;
            eventBus.removeStickyEvent(LaunchCameraEvent.class);
            profile.getUser().setPhotoImage(imageByteArray);
        }
    }

    @Override
    public void onRefresh() {
        profileService.populateFromAPI();
    }

    public static class LaunchCameraEvent {
        public Profile profile;

        public LaunchCameraEvent(Profile profile) {
            this.profile = profile;
        }
    }
}