uk.ac.horizon.artcodes.activity.ExperienceEditActivity.java Source code

Java tutorial

Introduction

Here is the source code for uk.ac.horizon.artcodes.activity.ExperienceEditActivity.java

Source

/*
 * Artcodes recognises a different marker scheme that allows the
 * creation of aesthetically pleasing, even beautiful, codes.
 * Copyright (C) 2013-2016  The University of Nottingham
 *
 *     This program is free software: you can redistribute it and/or modify
 *     it under the terms of the GNU Affero General Public License as published
 *     by the Free Software Foundation, either version 3 of the License, or
 *     (at your option) any later version.
 *
 *     This program is distributed in the hope that it will be useful,
 *     but WITHOUT ANY WARRANTY; without even the implied warranty of
 *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *     GNU Affero General Public License for more details.
 *
 *     You should have received a copy of the GNU Affero General Public License
 *     along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package uk.ac.horizon.artcodes.activity;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.databinding.DataBindingUtil;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.app.NavUtils;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AlertDialog;
import android.view.MenuItem;
import android.view.View;

import com.google.gson.Gson;

import java.util.ArrayList;
import java.util.List;

import uk.ac.horizon.artcodes.Feature;
import uk.ac.horizon.artcodes.GoogleAnalytics;
import uk.ac.horizon.artcodes.R;
import uk.ac.horizon.artcodes.account.Account;
import uk.ac.horizon.artcodes.databinding.ExperienceEditBinding;
import uk.ac.horizon.artcodes.fragment.ActionEditListFragment;
import uk.ac.horizon.artcodes.fragment.AvailabilityEditListFragment;
import uk.ac.horizon.artcodes.fragment.ExperienceEditColourFragment;
import uk.ac.horizon.artcodes.fragment.ExperienceEditFragment;
import uk.ac.horizon.artcodes.fragment.ExperienceEditInfoFragment;
import uk.ac.horizon.artcodes.model.Experience;

public class ExperienceEditActivity extends ExperienceActivityBase {
    private class ExperienceEditPagerAdapter extends FragmentPagerAdapter {
        private final List<ExperienceEditFragment> fragments = new ArrayList<>();

        private ExperienceEditPagerAdapter(FragmentManager fm) {
            super(fm);

            fragments.add(new ExperienceEditInfoFragment());
            fragments.add(new ActionEditListFragment());
            fragments.add(new AvailabilityEditListFragment());
            if (Feature.get(getApplicationContext(), R.bool.feature_edit_colour).isEnabled()) {
                fragments.add(new ExperienceEditColourFragment());
            }
        }

        @Override
        public int getCount() {
            return fragments.size();
        }

        @Override
        public Fragment getItem(int position) {
            return fragments.get(position);
        }

        @Override
        public CharSequence getPageTitle(int position) {
            // Generate title based on item position
            return getString(fragments.get(position).getTitleResource());
        }
    }

    private static final int IMAGE_PICKER_REQUEST = 121;
    private static final int ICON_PICKER_REQUEST = 123;
    private ExperienceEditBinding binding;
    private Account account;
    private ExperienceEditPagerAdapter adapter;

    public static void start(Context context, Experience experience, Account account) {
        Intent intent = new Intent(context, ExperienceEditActivity.class);
        intent.putExtra("experience", new Gson().toJson(experience));
        intent.putExtra("account", account.getId());
        context.startActivity(intent);
    }

    public void nextPage(View view) {
        binding.viewpager.setCurrentItem(binding.viewpager.getCurrentItem() + 1);
    }

    public void prevPage(View view) {
        binding.viewpager.setCurrentItem(Math.max(0, binding.viewpager.getCurrentItem() - 1));
    }

    public void saveExperience(View view) {
        final Experience experience = getExperience();
        final boolean isNew = experience.getId() == null;
        final Activity activity = this;
        final ProgressDialog dialog = ProgressDialog.show(activity,
                getResources().getString(R.string.saving_progress_dialog_title),
                getResources().getString(R.string.saving_progress_dialog_message), true);
        getAccount().saveExperience(experience, new Account.AccountProcessCallback() {
            @Override
            public void accountProcessCallback(boolean success, Experience savedExperience) {
                dialog.dismiss();
                if (success) {
                    if (isNew) {
                        Intent intent = ExperienceActivity.intent(activity, savedExperience);
                        startActivity(intent);
                        activity.finish();
                    } else {
                        NavUtils.navigateUpTo(activity, ExperienceActivity.intent(activity, experience));
                    }
                } else {
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            new AlertDialog.Builder(activity).setTitle(R.string.saving_error_title)
                                    .setMessage(R.string.saving_error_message).setPositiveButton(
                                            R.string.saving_error_button, new DialogInterface.OnClickListener() {
                                                public void onClick(DialogInterface dialog, int which) {
                                                    dialog.dismiss();
                                                }
                                            })
                                    .show();
                        }
                    });
                }
            }
        });
    }

    public void editIcon(View view) {
        selectImage(ICON_PICKER_REQUEST);
    }

    public void editImage(View view) {
        selectImage(IMAGE_PICKER_REQUEST);
    }

    public Account getAccount() {
        if (account == null) {
            if (getIntent().hasExtra("account")) {
                String accountID = getIntent().getStringExtra("account");
                Account account = getServer().getAccount(accountID);
                if (account != null) {
                    this.account = account;
                    return account;
                }
            }

            SharedPreferences preferences = getSharedPreferences(Account.class.getName(), MODE_PRIVATE);
            String accountID = preferences.getString(getUri(), null);
            if (accountID != null) {
                Account account = getServer().getAccount(accountID);
                if (account != null) {
                    this.account = account;
                    return account;
                }
            }

            account = getServer().getAccounts().get(0);
        }

        return account;
    }

    public void setAccount(Account account) {
        this.account = account;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case android.R.id.home:
            NavUtils.navigateUpTo(this, createCancelIntent());
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    @Override
    public void loaded(Experience experience) {
        super.loaded(experience);

        if (experience.getId() == null) {
            binding.deleteButton.setVisibility(View.GONE);
            binding.tabs.setVisibility(View.GONE);
            binding.saveButton.setVisibility(View.GONE);
            binding.prevButton.setVisibility(View.GONE);
            binding.nextButton.setVisibility(View.VISIBLE);
        } else {
            binding.deleteButton.setVisibility(View.VISIBLE);
            binding.tabs.setVisibility(View.VISIBLE);
            binding.saveButton.setVisibility(View.VISIBLE);
            binding.prevButton.setVisibility(View.GONE);
            binding.nextButton.setVisibility(View.GONE);
        }

        GoogleAnalytics.trackScreen("Edit Experience", experience.getId());
    }

    public View getRoot() {
        return binding.getRoot();
    }

    public void deleteExperience(View view) {
        final Activity activity = this;
        new AlertDialog.Builder(this)
                .setMessage(getString(R.string.experienceDeleteConfirm, getExperience().getName()))
                .setPositiveButton(R.string.delete, new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {
                        final ProgressDialog progressDialog = ProgressDialog.show(activity,
                                getResources().getString(R.string.delete_progress_dialog_title),
                                getResources().getString(R.string.delete_progress_dialog_message), true);

                        getAccount().deleteExperience(getExperience(), new Account.AccountProcessCallback() {
                            @Override
                            public void accountProcessCallback(boolean success, Experience experience) {
                                progressDialog.dismiss();
                                if (success) {
                                    NavUtils.navigateUpTo(ExperienceEditActivity.this,
                                            new Intent(ExperienceEditActivity.this, NavigationActivity.class));
                                } else {
                                    runOnUiThread(new Runnable() {
                                        @Override
                                        public void run() {
                                            new AlertDialog.Builder(activity).setTitle(R.string.delete_error_title)
                                                    .setMessage(R.string.delete_error_message)
                                                    .setPositiveButton(R.string.delete_error_button,
                                                            new DialogInterface.OnClickListener() {
                                                                public void onClick(DialogInterface dialog,
                                                                        int which) {
                                                                    dialog.dismiss();
                                                                }
                                                            })
                                                    .show();
                                        }
                                    });
                                }
                            }
                        });
                    }
                }).setNegativeButton(android.R.string.cancel, null).show();
    }

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode == RESULT_OK) {
            if (requestCode == IMAGE_PICKER_REQUEST) {
                Uri fullPhotoUri = data.getData();
                getExperience().setImage(fullPhotoUri.toString());
            } else if (requestCode == ICON_PICKER_REQUEST) {
                Uri fullPhotoUri = data.getData();
                getExperience().setIcon(fullPhotoUri.toString());
            }
        }
        super.onActivityResult(requestCode, resultCode, data);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        binding = DataBindingUtil.setContentView(this, R.layout.experience_edit);
        adapter = new ExperienceEditPagerAdapter(getSupportFragmentManager());
        binding.viewpager.setAdapter(adapter);
        binding.viewpager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageSelected(int position) {
                Fragment fragment = adapter.getItem(position);
                if (fragment instanceof ExperienceEditFragment) {
                    ExperienceEditFragment experienceEditFragment = (ExperienceEditFragment) fragment;
                    if (experienceEditFragment.displayAddFAB()) {
                        binding.add.show();
                    } else {
                        binding.add.hide();
                    }
                } else {
                    binding.add.hide();
                }

                Experience experience = getExperience();
                if (experience == null || experience.getId() == null) {

                    if (position == 0) {
                        binding.saveButton.setVisibility(View.GONE);
                        binding.prevButton.setVisibility(View.GONE);
                        binding.nextButton.setVisibility(View.VISIBLE);
                    } else if (position == adapter.getCount() - 1) {
                        binding.saveButton.setVisibility(View.VISIBLE);
                        binding.prevButton.setVisibility(View.VISIBLE);
                        binding.nextButton.setVisibility(View.GONE);
                    } else {
                        binding.saveButton.setVisibility(View.GONE);
                        binding.prevButton.setVisibility(View.VISIBLE);
                        binding.nextButton.setVisibility(View.VISIBLE);
                    }
                }
            }

            @Override
            public void onPageScrollStateChanged(int state) {
            }

            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
            }
        });
        binding.add.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int position = binding.viewpager.getCurrentItem();
                Fragment fragment = adapter.getItem(position);
                if (fragment instanceof ExperienceEditFragment) {
                    ExperienceEditFragment experienceEditFragment = (ExperienceEditFragment) fragment;
                    if (experienceEditFragment.displayAddFAB()) {
                        experienceEditFragment.add();
                    }
                }
            }
        });
        binding.tabs.setupWithViewPager(binding.viewpager);

        if (savedInstanceState != null) {
            binding.viewpager.setCurrentItem(savedInstanceState.getInt("tab", 0));
        }

        setSupportActionBar(binding.toolbar);
        if (getSupportActionBar() != null) {
            getSupportActionBar().setDisplayShowTitleEnabled(false);
        }

        binding.toolbar.setNavigationIcon(R.drawable.ic_close_white_24dp);
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);

        outState.putInt("tab", binding.viewpager.getCurrentItem());
        outState.putString("experience", new Gson().toJson(getExperience()));
    }

    private Intent createCancelIntent() {
        Intent intent = (Intent) getIntent().clone();
        intent.setClass(this, ExperienceActivity.class);
        return intent;
    }

    //   private void updateFragment()
    //   {
    //      int position = binding.viewpager.getCurrentItem();
    //      Fragment fragment = adapter.getItem(position);
    //      if (fragment instanceof ExperienceEditFragment)
    //      {
    //         ExperienceEditFragment experienceEditFragment = (ExperienceEditFragment) fragment;
    //         experienceEditFragment.update();
    //      }
    //   }

    private void selectImage(int request_id) {
        Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
        intent.setType("image/*");
        if (intent.resolveActivity(getPackageManager()) != null) {
            startActivityForResult(intent, request_id);
        }
    }
}