package com.kenny.openimgur.activities; import android.app.Fragment; import android.app.FragmentManager; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v7.app.AlertDialog; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; import android.widget.Button; import android.widget.CheckBox; import com.kenny.openimgur.R; import com.kenny.openimgur.classes.ImgurTopic; import com.kenny.openimgur.classes.UploadListener; import com.kenny.openimgur.fragments.UploadFragment; import com.kenny.openimgur.fragments.UploadInfoFragment; import com.kenny.openimgur.services.UploadService; import com.kenny.openimgur.ui.FragmentPagerAdapter; import com.kenny.openimgur.ui.ViewPager; import com.kenny.openimgur.util.LogUtil; import com.pixelcan.inkpageindicator.InkPageIndicator; import java.io.File; import java.util.ArrayList; import butterknife.BindView; import butterknife.OnClick; /** * Created by Kenny-PC on 6/20/2015. */ public class UploadActivity extends BaseActivity implements UploadListener, ViewPager.OnPageChangeListener { private static final int PAGE_PHOTOS = 0; private static final int PAGE_INFO = 1; private static final String KEY_PASSED_FILE = "passed_file"; private static final String PREF_NOTIFY_NO_USER = "notify_no_user"; @BindView(R.id.pager) ViewPager mPager; @BindView(R.id.indicator) InkPageIndicator mIndicator; @BindView(R.id.indicatorContainer) View mIndicatorContainer; @BindView(R.id.back) Button mBackButton; @BindView(R.id.next) Button mNextButton; private UploadPagerAdapter mAdapter; public static Intent createIntent(Context context) { return new Intent(context, UploadActivity.class); } public static Intent createIntent(Context context, @NonNull File file) { return createIntent(context).putExtra(KEY_PASSED_FILE, file.getAbsolutePath()); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_upload); getSupportActionBar().setTitle(R.string.upload); checkForNag(); checkIntent(getIntent()); mIndicator.setViewPager(mPager); mPager.addOnPageChangeListener(this); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: UploadFragment fragment = (UploadFragment) mAdapter.getFragmentForPosition(mPager, getFragmentManager(), 0); if (fragment != null && fragment.hasPhotosForUpload()) { showCancelDialog(); return true; } break; } return super.onOptionsItemSelected(item); } private void checkIntent(@Nullable Intent intent) { if (intent != null) { String path = null; boolean isLink = false; ArrayList<Uri> photoUris = null; if (intent.hasExtra(KEY_PASSED_FILE)) { LogUtil.v(TAG, "Received file from intent"); path = intent.getStringExtra(KEY_PASSED_FILE); } else if (Intent.ACTION_SEND.equals(intent.getAction())) { String type = intent.getType(); LogUtil.v(TAG, "Received an image via Share intent, type " + type); if ("text/plain".equals(type)) { path = intent.getStringExtra(Intent.EXTRA_TEXT); isLink = true; } else { Uri uri = intent.getParcelableExtra(Intent.EXTRA_STREAM); photoUris = new ArrayList<>(1); photoUris.add(uri); } } else if (Intent.ACTION_SEND_MULTIPLE.equals(intent.getAction())) { photoUris = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM); if (photoUris != null && !photoUris.isEmpty()) { LogUtil.v(TAG, "Received " + photoUris.size() + " images via Share intent"); } } mPager.setAdapter(mAdapter = new UploadPagerAdapter(getFragmentManager(), path, isLink, photoUris)); } else { mPager.setAdapter(mAdapter = new UploadPagerAdapter(getFragmentManager())); } } private boolean showCancelDialog() { new AlertDialog.Builder(this, theme.getAlertDialogTheme()) .setTitle(R.string.upload_cancel_title) .setMessage(R.string.upload_cancel_msg) .setNegativeButton(R.string.cancel, null) .setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { finish(); } }).show(); return true; } /** * Checks if the user is not logged in and if we should nag about it */ private boolean checkForNag() { boolean nag = app.getPreferences().getBoolean(PREF_NOTIFY_NO_USER, true); if (nag && user == null) { View nagView = LayoutInflater.from(this).inflate(R.layout.no_user_nag, null); final CheckBox cb = (CheckBox) nagView.findViewById(R.id.dontNotify); new AlertDialog.Builder(this, theme.getAlertDialogTheme()) .setTitle(R.string.not_logged_in) .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { finish(); } }) .setOnDismissListener(new DialogInterface.OnDismissListener() { @Override public void onDismiss(DialogInterface dialog) { if (cb.isChecked()) { app.getPreferences().edit().putBoolean(PREF_NOTIFY_NO_USER, false).apply(); } } }) .setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { startActivity(ProfileActivity.createIntent(getApplicationContext(), null, true)); } }) .setView(nagView) .show(); return true; } return false; } @Override public void onPhotoAdded() { mPager.setSwiping(true); if (mIndicatorContainer.getVisibility() == View.GONE) { mIndicatorContainer.setVisibility(View.VISIBLE); mBackButton.setEnabled(false); mBackButton.setAlpha(0); mNextButton.setEnabled(true); mNextButton.setAlpha(1); } } @Override public void onPhotoRemoved(int remaining) { if (remaining <= 0) { mPager.setCurrentItem(0, true); mPager.setSwiping(false); mIndicatorContainer.setVisibility(View.GONE); } } @Override public void onUpload(boolean submitToGallery, String title, String description, ImgurTopic topic) { UploadFragment fragment = (UploadFragment) mAdapter.getFragmentForPosition(mPager, getFragmentManager(), 0); if (fragment != null && fragment.hasPhotosForUpload()) { Intent service = UploadService.createIntent(getApplicationContext(), fragment.getPhotosForUpload(), submitToGallery, title, description, topic); startService(service); finish(); } } @OnClick({R.id.back, R.id.next}) public void onClick(View v) { switch (v.getId()) { case R.id.back: mPager.setCurrentItem(PAGE_PHOTOS); break; case R.id.next: mPager.setCurrentItem(PAGE_INFO); break; } } @Override public void onBackPressed() { UploadFragment fragment = (UploadFragment) mAdapter.getFragmentForPosition(mPager, getFragmentManager(), 0); if (fragment != null && fragment.hasPhotosForUpload()) { showCancelDialog(); return; } super.onBackPressed(); } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { mNextButton.setAlpha(position == PAGE_PHOTOS ? 1.0f - positionOffset : 0.0f); mBackButton.setAlpha(position == PAGE_PHOTOS ? positionOffset : 1.0f); } @Override public void onPageSelected(int position) { mBackButton.setEnabled(position == PAGE_INFO); mNextButton.setEnabled(position == PAGE_PHOTOS); } @Override public void onPageScrollStateChanged(int state) { // NOOP } @Override protected int getStyleRes() { return theme.isDarkTheme ? R.style.Theme_Opengur_Dark_Upload : R.style.Theme_Opengur_Light_DarkActionBar_Upload; } private static class UploadPagerAdapter extends FragmentPagerAdapter { Bundle mUploadArgs = null; public UploadPagerAdapter(FragmentManager manager) { super(manager); } public UploadPagerAdapter(FragmentManager manager, String path, boolean isLink, ArrayList<Uri> photoUris) { this(manager); mUploadArgs = UploadFragment.createArguments(path, isLink, photoUris); } @Override public Fragment getItem(int position) { switch (position) { case PAGE_PHOTOS: return UploadFragment.newInstance(mUploadArgs); case PAGE_INFO: return UploadInfoFragment.newInstance(); default: throw new IndexOutOfBoundsException(); } } @Override public int getCount() { return 2; } } }