com.getchute.android.photopickerplus.ui.activity.ServicesActivity.java Source code

Java tutorial

Introduction

Here is the source code for com.getchute.android.photopickerplus.ui.activity.ServicesActivity.java

Source

/**
 * The MIT License (MIT)
 * <p/>
 * Copyright (c) 2013 Chute
 * <p/>
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 * <p/>
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 * <p/>
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */
package com.getchute.android.photopickerplus.ui.activity;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.res.Configuration;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;

import com.chute.sdk.v2.api.accounts.CurrentUserAccountsRequest;
import com.chute.sdk.v2.api.accounts.GCAccounts;
import com.chute.sdk.v2.api.authentication.AuthenticationActivity;
import com.chute.sdk.v2.api.authentication.AuthenticationFactory;
import com.chute.sdk.v2.api.authentication.AuthenticationOptions;
import com.chute.sdk.v2.api.authentication.TokenAuthenticationProvider;
import com.chute.sdk.v2.model.AccountModel;
import com.chute.sdk.v2.model.AssetModel;
import com.chute.sdk.v2.model.enums.AccountType;
import com.chute.sdk.v2.model.response.ListResponseModel;
import com.chute.sdk.v2.utils.PreferenceUtil;
import com.dg.libs.rest.callbacks.HttpCallback;
import com.dg.libs.rest.domain.ResponseStatus;
import com.getchute.android.photopickerplus.R;
import com.getchute.android.photopickerplus.callback.CustomAuthenticationProvider;
import com.getchute.android.photopickerplus.config.PhotoPicker;
import com.getchute.android.photopickerplus.dao.MediaDAO;
import com.getchute.android.photopickerplus.models.DeliverMediaModel;
import com.getchute.android.photopickerplus.models.enums.MediaType;
import com.getchute.android.photopickerplus.models.enums.PhotoFilterType;
import com.getchute.android.photopickerplus.ui.components.MediaScannerWrapper;
import com.getchute.android.photopickerplus.ui.fragment.FragmentRoot;
import com.getchute.android.photopickerplus.ui.fragment.FragmentServices;
import com.getchute.android.photopickerplus.ui.fragment.FragmentSingle;
import com.getchute.android.photopickerplus.ui.listener.ListenerAccountAssetsSelection;
import com.getchute.android.photopickerplus.ui.listener.ListenerFilesAccount;
import com.getchute.android.photopickerplus.ui.listener.ListenerFilesCursor;
import com.getchute.android.photopickerplus.ui.listener.ListenerFragmentRoot;
import com.getchute.android.photopickerplus.ui.listener.ListenerFragmentSingle;
import com.getchute.android.photopickerplus.ui.listener.ListenerImageSelection;
import com.getchute.android.photopickerplus.ui.listener.ListenerVideoSelection;
import com.getchute.android.photopickerplus.util.AppUtil;
import com.getchute.android.photopickerplus.util.AssetUtil;
import com.getchute.android.photopickerplus.util.Constants;
import com.getchute.android.photopickerplus.util.FragmentUtil;
import com.getchute.android.photopickerplus.util.NotificationUtil;
import com.getchute.android.photopickerplus.util.PhotoPickerPreferenceUtil;
import com.getchute.android.photopickerplus.util.intent.IntentUtil;
import com.getchute.android.photopickerplus.util.intent.PhotosIntentWrapper;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

/**
 * Activity for displaying the services.
 * <p/>
 * This activity is used to display both local and remote services in a
 * GridView.
 */
public class ServicesActivity extends BaseActivity implements ListenerFilesAccount, ListenerFilesCursor,
        FragmentServices.ServiceClickedListener, ListenerFragmentRoot, ListenerFragmentSingle {

    public static final int LOGOUT_ITEM = 1;
    private static final String TAG = ServicesActivity.class.getSimpleName();

    private static FragmentManager fragmentManager;
    private AccountType accountType;
    private boolean dualPanes;
    private List<Integer> accountItemPositions;
    private List<Integer> imageItemPositions;
    private List<Integer> videoItemPositions;
    private String folderId;
    private AccountModel account;
    private ListenerAccountAssetsSelection listenerAssetsSelection;
    private ListenerImageSelection listenerImagesSelection;
    private ListenerVideoSelection listenerVideosSelection;
    private FragmentSingle fragmentSingle;
    private FragmentRoot fragmentRoot;
    private int photoFilterType;
    private Toolbar toolbar;
    private Uri mediaPath = null;
    File photoFile = null;

    public void setAssetsSelectListener(ListenerAccountAssetsSelection adapterListener) {
        this.listenerAssetsSelection = adapterListener;
    }

    public void setImagesSelectListener(ListenerImageSelection adapterListener) {
        this.listenerImagesSelection = adapterListener;
    }

    public void setVideosSelectListener(ListenerVideoSelection adapterListener) {
        this.listenerVideosSelection = adapterListener;
    }

    @Override
    protected void setToolBar(Toolbar toolbar) {
        this.toolbar = toolbar;
    }

    public Toolbar getToolbar() {
        return toolbar;
    }

    @Override
    protected int getLayoutResource() {
        return R.layout.main_layout;
    }

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

        fragmentManager = getSupportFragmentManager();

        dualPanes = getResources().getBoolean(R.bool.has_two_panes);

        retrieveValuesFromBundle(savedInstanceState);

        if (dualPanes && savedInstanceState == null
                && getResources().getConfiguration().orientation != Configuration.ORIENTATION_PORTRAIT) {
            FragmentUtil.replaceContentWithEmptyFragment(ServicesActivity.this);
        }

    }

    @SuppressLint("NewApi")
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);
        if (PhotoPicker.getInstance().hasLogoutOption()) {
            MenuItem item = menu.add(0, LOGOUT_ITEM, 0, R.string.button_navigation_services_logout);
            item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
        }
        return true;

    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if (item.getItemId() == LOGOUT_ITEM) {
            if (getResources().getBoolean(R.bool.has_two_panes)) {
                FragmentUtil.replaceContentWithEmptyFragment(ServicesActivity.this);
            }
            NotificationUtil.makeToast(getApplicationContext(), R.string.toast_signed_out);
            TokenAuthenticationProvider.getInstance().clearAuth();
            PhotoPickerPreferenceUtil.get().clearAll();
        }
        if (item.getItemId() == android.R.id.home) {
            ServicesActivity.this.finish();
        }
        return super.onOptionsItemSelected(item);
    }

    @Override
    public void lastVideo() {
        Uri videoUrl = MediaDAO.getLastVideoFromCurosr(getApplicationContext());

        if (videoUrl == null || videoUrl.toString().equals("")) {
            NotificationUtil.makeToast(getApplicationContext(),
                    getResources().getString(R.string.no_camera_videos));
        } else {
            String videoThumbnail = MediaDAO.getLastVideoThumbnail(getApplicationContext());
            final AssetModel model = new AssetModel();
            model.setThumbnail(Uri.fromFile(new File(videoThumbnail)).toString());
            model.setUrl(Uri.fromFile(new File(videoThumbnail)).toString());
            model.setVideoUrl(videoUrl.toString());
            model.setType(MediaType.VIDEO.name().toLowerCase());
            IntentUtil.deliverDataToInitialActivity(ServicesActivity.this, model, null);
        }
    }

    @Override
    public void recordVideo() {
        Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
        mediaPath = AppUtil.getOutputMediaFileUri(MediaType.VIDEO);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, mediaPath);
        intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);
        startTheCamera(intent, Constants.CAMERA_VIDEO_REQUEST);

    }

    @Override
    public void takePhoto() {
        if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)) {
            NotificationUtil.makeToast(getApplicationContext(), R.string.toast_feature_camera);
            return;
        }
        Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        // Ensure that there's a camera activity to handle the intent
        if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
            photoFile = AppUtil.getOutputMediaFile(MediaType.IMAGE);
            if (photoFile != null) {
                if (AppUtil.hasImageCaptureBug() == false) {
                    takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile));
                } else {
                    takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT,
                            MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                }
                startTheCamera(takePictureIntent, Constants.CAMERA_PIC_REQUEST);
            }
        }
    }

    @Override
    public void lastPhoto() {
        Uri uri = MediaDAO.getLastPhotoFromAllPhotos(getApplicationContext());
        if (uri.toString().equals("")) {
            NotificationUtil.makeToast(getApplicationContext(),
                    getResources().getString(R.string.no_camera_photos));
        } else {
            final AssetModel model = new AssetModel();
            //model.setId(MediaDAO.getLastPhotoContentUri(getApplicationContext()).toString());
            model.setThumbnail(uri.toString());
            model.setUrl(uri.toString());
            model.setType(MediaType.IMAGE.name().toLowerCase());
            IntentUtil.deliverDataToInitialActivity(ServicesActivity.this, model, null);
        }

    }

    @Override
    public void photoStream() {
        photoFilterType = PhotoFilterType.ALL_MEDIA.ordinal();
        accountItemPositions = null;
        imageItemPositions = null;
        videoItemPositions = null;
        if (!dualPanes) {
            final PhotosIntentWrapper wrapper = new PhotosIntentWrapper(ServicesActivity.this);
            wrapper.setFilterType(PhotoFilterType.ALL_MEDIA);
            wrapper.startActivityForResult(ServicesActivity.this,
                    PhotosIntentWrapper.ACTIVITY_FOR_RESULT_STREAM_KEY);
        } else {
            FragmentUtil.replaceContentWithRootFragment(ServicesActivity.this, null, PhotoFilterType.ALL_MEDIA,
                    accountItemPositions, imageItemPositions, videoItemPositions);
        }

    }

    @Override
    public void cameraRoll() {
        photoFilterType = PhotoFilterType.CAMERA_ROLL.ordinal();
        accountItemPositions = null;
        imageItemPositions = null;
        videoItemPositions = null;
        if (!dualPanes) {
            final PhotosIntentWrapper wrapper = new PhotosIntentWrapper(ServicesActivity.this);
            wrapper.setFilterType(PhotoFilterType.CAMERA_ROLL);
            wrapper.startActivityForResult(ServicesActivity.this,
                    PhotosIntentWrapper.ACTIVITY_FOR_RESULT_STREAM_KEY);
        } else {
            FragmentUtil.replaceContentWithRootFragment(ServicesActivity.this, null, PhotoFilterType.CAMERA_ROLL,
                    accountItemPositions, imageItemPositions, videoItemPositions);
        }

    }

    public void accountClicked(AccountModel account, AccountType accountType) {
        PhotoPickerPreferenceUtil.get().setAccountType(accountType);
        photoFilterType = PhotoFilterType.SOCIAL_MEDIA.ordinal();
        accountItemPositions = null;
        imageItemPositions = null;
        videoItemPositions = null;
        this.account = account;
        if (!dualPanes) {
            final PhotosIntentWrapper wrapper = new PhotosIntentWrapper(ServicesActivity.this);
            wrapper.setFilterType(PhotoFilterType.SOCIAL_MEDIA);
            wrapper.setAccount(account);
            wrapper.startActivityForResult(ServicesActivity.this,
                    PhotosIntentWrapper.ACTIVITY_FOR_RESULT_STREAM_KEY);
        } else {
            FragmentUtil.replaceContentWithRootFragment(ServicesActivity.this, account,
                    PhotoFilterType.SOCIAL_MEDIA, accountItemPositions, imageItemPositions, videoItemPositions);
        }

    }

    @Override
    public void accountLogin(AccountType type) {
        accountType = type;
        PhotoPickerPreferenceUtil.get().setAccountType(accountType);
        if (PreferenceUtil.get().hasAccount(type.getLoginMethod())) {
            AccountModel account = PreferenceUtil.get().getAccount(type.getLoginMethod());
            accountClicked(account, accountType);
        } else {
            AuthenticationFactory.getInstance().startAuthenticationActivity(ServicesActivity.this, accountType,
                    new AuthenticationOptions.Builder().setClearCookiesForAccount(false)
                            .setShouldRetainSession(false).build());
        }

    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, final Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode != RESULT_OK
                && resultCode != AuthenticationActivity.RESULT_DIFFERENT_CHUTE_USER_AUTHENTICATED) {
            return;
        }
        if (requestCode == AuthenticationFactory.AUTHENTICATION_REQUEST_CODE) {
            if (data != null) {
                String newSessionToken = data.getExtras()
                        .getString(AuthenticationActivity.INTENT_DIFFERENT_CHUTE_USER_TOKEN);
                String previousSessionToken = TokenAuthenticationProvider.getInstance().getToken();
                if (!newSessionToken.equals(previousSessionToken)) {
                    CurrentUserAccountsRequest request = new CurrentUserAccountsRequest(new AccountsCallback());
                    request.setAuthenticationProvider(new CustomAuthenticationProvider(newSessionToken));
                    request.executeAsync();
                }
            } else {
                GCAccounts.allUserAccounts(new AccountsCallback()).executeAsync();
            }
            return;
        }

        if (requestCode == PhotosIntentWrapper.ACTIVITY_FOR_RESULT_STREAM_KEY) {
            finish();
            return;
        }
        if (requestCode == Constants.CAMERA_PIC_REQUEST) {
            startMediaScanner(photoFile.getAbsolutePath(), MediaType.IMAGE, data);
        }

        if (requestCode == Constants.CAMERA_VIDEO_REQUEST) {
            String path = "";
            Uri uriVideo = null;
            if (data != null) {
                uriVideo = data.getData();
            }
            path = (uriVideo != null) ? uriVideo.getPath()
                    : AppUtil.getOutputMediaFileUri(MediaType.VIDEO).getPath();

            startMediaScanner(path, MediaType.VIDEO, data);
        }

    }

    private void startMediaScanner(String path, final MediaType mediaType, final Intent intent) {
        MediaScannerWrapper mediaScannerWrapper = new MediaScannerWrapper(ServicesActivity.this, path, mediaType,
                intent);
        mediaScannerWrapper.scan();
    }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        setResult(Activity.RESULT_OK, new Intent().putExtras(intent.getExtras()));
        ServicesActivity.this.finish();
    }

    @Override
    public void onDeliverAccountFiles(ArrayList<AssetModel> assetList, AccountModel accountModel) {
        IntentUtil.deliverDataToInitialActivity(ServicesActivity.this, assetList, accountModel);

    }

    @Override
    public void onDeliverCursorAssets(List<DeliverMediaModel> deliverList) {
        IntentUtil.deliverDataToInitialActivity(ServicesActivity.this, AssetUtil.getPhotoCollection(deliverList),
                null);

    }

    @Override
    public void onAccountFilesSelect(AssetModel assetModel, AccountModel accountModel) {
        IntentUtil.deliverDataToInitialActivity(ServicesActivity.this, assetModel, accountModel);
    }

    @Override
    public void onCursorAssetsSelect(AssetModel assetModel) {
        IntentUtil.deliverDataToInitialActivity(ServicesActivity.this, assetModel, null);
    }

    @Override
    public void onAccountFolderSelect(AccountModel account, String folderId) {
        accountItemPositions = null;
        imageItemPositions = null;
        videoItemPositions = null;
        photoFilterType = PhotoFilterType.SOCIAL_MEDIA.ordinal();
        this.folderId = folderId;
        this.account = account;
        FragmentUtil.replaceContentWithSingleFragment(ServicesActivity.this, account, folderId,
                accountItemPositions);
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putString(Constants.KEY_FOLDER_ID, folderId);
        outState.putParcelable(Constants.KEY_ACCOUNT, account);
        outState.putInt(Constants.KEY_PHOTO_FILTER_TYPE, photoFilterType);
        List<Integer> accountPositions = new ArrayList<Integer>();
        List<Integer> imagePaths = new ArrayList<Integer>();
        List<Integer> videoPaths = new ArrayList<Integer>();
        if (listenerAssetsSelection != null && listenerAssetsSelection.getSocialPhotosSelection() != null) {
            accountPositions.addAll(listenerAssetsSelection.getSocialPhotosSelection());
            outState.putIntegerArrayList(Constants.KEY_SELECTED_ACCOUNTS_ITEMS,
                    (ArrayList<Integer>) accountPositions);
        }
        if (listenerImagesSelection != null && listenerImagesSelection.getCursorImagesSelection() != null) {
            imagePaths.addAll(listenerImagesSelection.getCursorImagesSelection());
            outState.putIntegerArrayList(Constants.KEY_SELECTED_IMAGES_ITEMS, (ArrayList<Integer>) imagePaths);
        }
        if (listenerVideosSelection != null && listenerVideosSelection.getCursorVideosSelection() != null) {
            videoPaths.addAll(listenerVideosSelection.getCursorVideosSelection());
            outState.putIntegerArrayList(Constants.KEY_SELECTED_VIDEOS_ITEMS, (ArrayList<Integer>) videoPaths);
        }

    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        fragmentSingle = (FragmentSingle) getSupportFragmentManager()
                .findFragmentByTag(FragmentUtil.TAG_FRAGMENT_FILES);
        fragmentRoot = (FragmentRoot) getSupportFragmentManager()
                .findFragmentByTag(FragmentUtil.TAG_FRAGMENT_FOLDER);
        if (fragmentSingle != null && photoFilterType == PhotoFilterType.SOCIAL_MEDIA.ordinal()) {
            fragmentSingle.updateFragment(account, folderId, accountItemPositions);
        }
        if (fragmentRoot != null) {
            fragmentRoot.updateFragment(account, PhotoFilterType.values()[photoFilterType], accountItemPositions,
                    imageItemPositions, videoItemPositions);
        }
    }

    private void retrieveValuesFromBundle(Bundle savedInstanceState) {
        accountItemPositions = savedInstanceState != null
                ? savedInstanceState.getIntegerArrayList(Constants.KEY_SELECTED_ACCOUNTS_ITEMS)
                : null;

        imageItemPositions = savedInstanceState != null
                ? savedInstanceState.getIntegerArrayList(Constants.KEY_SELECTED_IMAGES_ITEMS)
                : null;

        videoItemPositions = savedInstanceState != null
                ? savedInstanceState.getIntegerArrayList(Constants.KEY_SELECTED_VIDEOS_ITEMS)
                : null;

        folderId = savedInstanceState != null ? savedInstanceState.getString(Constants.KEY_FOLDER_ID) : null;

        account = (AccountModel) (savedInstanceState != null
                ? savedInstanceState.getParcelable(Constants.KEY_ACCOUNT)
                : null);

        photoFilterType = savedInstanceState != null ? savedInstanceState.getInt(Constants.KEY_PHOTO_FILTER_TYPE)
                : 0;

    }

    @Override
    public void onDestroy() {
        Fragment fragmentFolder = fragmentManager.findFragmentByTag(FragmentUtil.TAG_FRAGMENT_FOLDER);
        Fragment fragmentFiles = fragmentManager.findFragmentByTag(FragmentUtil.TAG_FRAGMENT_FILES);
        if (fragmentFolder != null && fragmentFolder.isResumed()) {
            fragmentManager.beginTransaction().remove(fragmentFolder).commit();
        }
        if (fragmentFiles != null && fragmentFiles.isResumed()) {
            fragmentManager.beginTransaction().remove(fragmentFiles).commit();
        }
        super.onDestroy();
    }

    @Override
    public void onSessionExpired(AccountType accountType) {
        PhotoPickerPreferenceUtil.get().setAccountType(accountType);
        AuthenticationFactory.getInstance().startAuthenticationActivity(ServicesActivity.this, accountType,
                new AuthenticationOptions.Builder().setShouldRetainSession(true).build());
    }

    @Override
    public void onBackPressed() {
        fragmentRoot = (FragmentRoot) getSupportFragmentManager()
                .findFragmentByTag(FragmentUtil.TAG_FRAGMENT_FOLDER);
        fragmentSingle = (FragmentSingle) getSupportFragmentManager()
                .findFragmentByTag(FragmentUtil.TAG_FRAGMENT_FILES);
        if (fragmentRoot != null && fragmentRoot.isVisible()) {
            this.finish();
        } else {
            super.onBackPressed();
        }

    }

    private final class AccountsCallback implements HttpCallback<ListResponseModel<AccountModel>> {

        @Override
        public void onSuccess(ListResponseModel<AccountModel> responseData, ResponseStatus status) {
            if (accountType == null) {
                accountType = PhotoPickerPreferenceUtil.get().getAccountType();
            }
            if (responseData.getData().size() == 0) {
                NotificationUtil.makeToast(getApplicationContext(), R.string.no_albums_found);
                return;
            }
            for (AccountModel accountModel : responseData.getData()) {
                if (accountModel.getType().equals(accountType.getLoginMethod())) {
                    PreferenceUtil.get().saveAccount(accountModel);
                    accountClicked(accountModel, accountType);
                }
            }

        }

        @Override
        public void onHttpError(ResponseStatus responseStatus) {
            Log.d(TAG, "Http Error: " + responseStatus.getStatusCode() + " " + responseStatus.getStatusMessage());
        }

    }

    private void startTheCamera(Intent intent, int requestCode) {
        try {
            startActivityForResult(intent, requestCode);
        } catch (Exception e) {
            Log.w(TAG, "Could not start the camera. Memory is full.");
            NotificationUtil.makeToast(getApplicationContext(), R.string.toast_memory_full);
        }
    }

    @Override
    public void onFragmentRootNavigationBack() {
        FragmentUtil.replaceContentWithEmptyFragment(ServicesActivity.this);
    }

    @Override
    public void onFragmentSingleNavigationBack() {
        FragmentUtil.replaceContentWithRootFragment(ServicesActivity.this, account, PhotoFilterType.SOCIAL_MEDIA,
                accountItemPositions, imageItemPositions, videoItemPositions);

    }

}