package moe.kurumi.moegallery.activity;
import android.Manifest;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.content.res.Configuration;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.annotation.UiThread;
import android.support.v4.app.ActivityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.util.DisplayMetrics;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.view.animation.AccelerateInterpolator;
import android.view.animation.DecelerateInterpolator;
import android.view.inputmethod.InputMethodManager;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.afollestad.materialdialogs.MaterialDialog;
import com.afollestad.materialdialogs.Theme;
import com.bumptech.glide.RequestManager;
import com.bumptech.glide.load.model.GlideUrl;
import com.bumptech.glide.request.animation.GlideAnimation;
import com.bumptech.glide.request.target.SimpleTarget;
import com.gc.materialdesign.views.ButtonFloat;
import com.gc.materialdesign.views.ButtonRectangle;
import com.nineoldandroids.animation.ObjectAnimator;
import com.nineoldandroids.animation.ValueAnimator;
import com.raizlabs.android.dbflow.sql.builder.Condition;
import com.raizlabs.android.dbflow.sql.language.Select;
import org.apmem.tools.layouts.FlowLayout;
import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.TimeZone;
import javax.inject.Inject;
import moe.kurumi.moegallery.R;
import moe.kurumi.moegallery.application.Application;
import moe.kurumi.moegallery.data.ImageDataSource;
import moe.kurumi.moegallery.data.Providers;
import moe.kurumi.moegallery.di.DaggerMainComponent;
import moe.kurumi.moegallery.di.modules.AppModule;
import moe.kurumi.moegallery.di.modules.MainModule;
import moe.kurumi.moegallery.model.AnimePictures;
import moe.kurumi.moegallery.model.AnimePicturesList;
import moe.kurumi.moegallery.model.AnimePicturesUser;
import moe.kurumi.moegallery.model.GithubRelease;
import moe.kurumi.moegallery.model.Image;
import moe.kurumi.moegallery.model.Tag;
import moe.kurumi.moegallery.model.database.FavoriteImage;
import moe.kurumi.moegallery.model.database.FavoriteImage$Table;
import moe.kurumi.moegallery.model.database.HistoryTag;
import moe.kurumi.moegallery.model.database.HistoryTag$Table;
import moe.kurumi.moegallery.model.setting.Setting;
import moe.kurumi.moegallery.utils.Utils;
import moe.kurumi.moegallery.view.ViewPager;
import moe.kurumi.moegallery.view.adapter.GalleryAdapter;
import moe.kurumi.moegallery.view.adapter.PagerAdapter;
import okhttp3.Headers;
import okhttp3.MediaType;
import okhttp3.RequestBody;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import rx.functions.Action1;
public class MainActivity extends AppCompatActivity
implements android.support.v4.view.ViewPager.OnPageChangeListener,
GalleryAdapter.OnRecyclerListener {
public final static String TAG = MainActivity.class.getSimpleName();
private static final int WRITE_STORAGE = 0x1;
private static final int READ_STORAGE = 0x2;
private final static int ANIMATION_INT = 100;
private final static int ANIMATION_DURATION = 300;
DrawerLayout drawerLayout;
ListView leftDrawerList;
LinearLayout rightDrawer;
ListView rightDrawerList;
Toolbar toolbar;
RecyclerView recyclerView;
ViewPager viewPager;
FrameLayout imageContainer;
ImageButton home;
TextView history;
TextView favorite;
ButtonFloat floatSearch;
ButtonFloat floatFavorite;
String[] providerNames;
String[] providerValues;
GalleryAdapter mGalleryAdapter;
@Inject
Setting mSetting;
@Inject
ImageDataSource mDataSource;
MenuItem menuSearch;
MenuItem menuInfo;
MenuItem menuWallpaper;
MenuItem menuDownload;
MenuItem menuFavorite;
MenuItem menuShare;
AlertDialog dialog;
int transparent;
int black;
File downloadDir;
File updateDir;
ReloadImageCallback reloadImageCallback;
float favoriteShowPosition;
float favoriteHidePosition;
int favoriteRightMargin;
@Inject
Retrofit.Builder mBuilder;
@Inject
RequestManager mRequestManager;
private ArrayAdapter providerAdapter;
private ArrayAdapter historyTagsAdapter;
private String providerUri;
private Handler handler = new Handler();
private Runnable hideSystemUIRunnable;
private String tags = "";
private String title = "";
private ArrayList<String> historyTags = new ArrayList<>();
private int lastAnimatedValue = -1;
private boolean turn = false;
private float turnProgress;
private Image currentImage;
private Uri currentImageUri;
private MaterialDialog progressDialog;
private MaterialDialog messageDialog;
private MaterialDialog updateDialog;
private boolean isInHistoryMode = false;
private boolean isInFavoriteMode = false;
private String updateUrl = "";
private String updateFileName = "";
private PagerAdapter mPagerAdapter;
private TouchEventListener mTouchEventListener;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
DaggerMainComponent.builder()
.appModule(new AppModule(Application.getApplication()))
.mainModule(new MainModule(this))
.build()
.inject(this);
setContentView(R.layout.activity_main);
bindViews();
bindAdapter();
}
void bindViews() {
drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
leftDrawerList = (ListView) findViewById(R.id.left_drawer_list);
rightDrawer = (LinearLayout) findViewById(R.id.right_drawer);
rightDrawerList = (ListView) findViewById(R.id.right_drawer_list);
toolbar = (Toolbar) findViewById(R.id.toolbar);
recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
viewPager = (ViewPager) findViewById(R.id.full_image_container);
imageContainer = (FrameLayout) findViewById(R.id.image_container);
home = (ImageButton) findViewById(R.id.home);
history = (TextView) findViewById(R.id.history);
favorite = (TextView) findViewById(R.id.favorite);
floatSearch = (ButtonFloat) findViewById(R.id.float_search);
floatFavorite = (ButtonFloat) findViewById(R.id.float_favorite);
providerNames = getResources().getStringArray(R.array.provider_names);
providerValues = getResources().getStringArray(R.array.provider_values);
transparent = getResources().getColor(R.color.transparent);
black = getResources().getColor(R.color.black);
}
void bindAdapter() {
setSupportActionBar(toolbar);
updateDir = new File(Environment.getExternalStorageDirectory().getPath(), "Downloads");
progressDialog = new MaterialDialog.Builder(this)
.cancelable(false)
.theme(Theme.LIGHT)
.content(R.string.please_wait)
.progress(true, 0).build();
messageDialog = new MaterialDialog.Builder(this)
.positiveText(android.R.string.ok)
.title(R.string.network_error)
.cancelable(true)
.theme(Theme.DARK)
.build();
updateDialog = new MaterialDialog.Builder(this)
.positiveText(android.R.string.ok)
.callback(new MaterialDialog.ButtonCallback() {
@Override
public void onPositive(MaterialDialog dialog) {
super.onPositive(dialog);
downloadUpdate();
}
})
.negativeText(android.R.string.cancel)
.title(R.string.new_version)
.cancelable(true)
.theme(Theme.DARK)
.build();
showProgressDialog();
drawerLayout.setStatusBarBackgroundColor(
getResources().getColor(R.color.actionbar_background));
providerAdapter = new ArrayAdapter<>(this, R.layout.drawer_list_item, providerNames);
leftDrawerList.setAdapter(providerAdapter);
leftDrawerList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
providerUri = providerValues[position];
mSetting.setProvider(providerUri);
drawerLayout.closeDrawers();
setDefaultTitle();
clearModes();
reload();
}
});
historyTags.clear();
List<HistoryTag> historyTagList = new Select().from(HistoryTag.class).queryList();
Collections.sort(historyTagList);
for (HistoryTag tag : historyTagList) {
historyTags.add(tag.tag);
}
historyTagsAdapter = new ArrayAdapter<>(this, R.layout.drawer_list_item, historyTags);
rightDrawerList.setAdapter(historyTagsAdapter);
rightDrawerList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
tags = historyTags.get(position);
clearModes();
reload();
drawerLayout.closeDrawers();
}
});
providerUri = mSetting.provider();
mGalleryAdapter = new GalleryAdapter(this);
mGalleryAdapter.setRecyclerListener(this);
recyclerView.setAdapter(mGalleryAdapter);
final GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 3);
recyclerView.setLayoutManager(gridLayoutManager);
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
int lastPosition = gridLayoutManager.findLastVisibleItemPosition();
if (lastPosition == recyclerView.getAdapter().getItemCount() - 1) {
//Log.d(TAG, "" + lastPosition);
// load more
if (lastPosition
== ((GalleryAdapter) recyclerView.getAdapter()).getNextCount() - 1) {
((GalleryAdapter) recyclerView.getAdapter()).loadNextPage(tags);
}
}
}
});
home.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
tags = "";
clearModes();
reload();
drawerLayout.closeDrawers();
}
});
history.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
drawerLayout.closeDrawers();
if (!isInHistoryMode) {
providerUri = Providers.HISTORY;
setTitle(
getString(R.string.app_name) + " (" + getString(
R.string.history) + ")");
reloadFromHistory();
} else {
providerUri = mSetting.provider();
setDefaultTitle();
reload();
}
isInHistoryMode = !isInHistoryMode;
history.setTextColor(getResources().getColor(
isInHistoryMode ? android.R.color.holo_green_light :
android.R.color.white));
}
});
favorite.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
drawerLayout.closeDrawers();
if (!isInFavoriteMode) {
providerUri = Providers.FAVORITE;
setTitle(
getString(R.string.app_name) + " (" + getString(
R.string.favorite) + ")");
reloadFromFavorite();
} else {
providerUri = mSetting.provider();
setDefaultTitle();
reload();
}
isInFavoriteMode = !isInFavoriteMode;
favorite.setTextColor(getResources().getColor(
isInFavoriteMode ? android.R.color.holo_green_light :
android.R.color.white));
}
});
floatSearch.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
search();
}
});
floatFavorite.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
switchFavorite();
}
});
mPagerAdapter = new PagerAdapter(getSupportFragmentManager());
viewPager.setAdapter(mPagerAdapter);
viewPager.addOnPageChangeListener(this);
}
private void clearModes() {
isInHistoryMode = false;
isInFavoriteMode = false;
history.setTextColor(getResources().getColor(android.R.color.white));
favorite.setTextColor(getResources().getColor(android.R.color.white));
}
@UiThread
public void clearHistoryMode() {
providerUri = mSetting.provider();
setDefaultTitle();
isInHistoryMode = false;
history.setTextColor(getResources().getColor(android.R.color.white));
reload();
}
@UiThread
public void clearFavoriteMode() {
providerUri = mSetting.provider();
setDefaultTitle();
isInFavoriteMode = false;
favorite.setTextColor(getResources().getColor(android.R.color.white));
reload();
}
@Override
public void onBackPressed() {
if (viewPager.getVisibility() != View.GONE) {
hideImage();
hideFavorite();
if (!floatSearch.isShow) {
floatSearch.show();
}
} else {
super.onBackPressed();
}
}
private void hideFavorite() {
if (mSetting.floatFavorite()) {
if (floatFavorite.isShow()) {
floatFavorite.hide();
}
}
}
public void showFavorite() {
if (mSetting.floatFavorite()) {
floatFavorite.setVisibility(View.VISIBLE);
if (!floatFavorite.isShow()) {
floatFavorite.show();
}
}
}
private void hideImage() {
//fullImage.setVisibility(View.GONE);
//fullImage.setImageBitmap(null);
setDefaultTitle();
hideProgressDialog();
showSystemUI();
setMenu(true);
int orientation = getRequestedOrientation();
if (orientation != ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
View view = recyclerView.findViewWithTag(currentImage);
runExitAnimation(viewPager, view, orientation);
if (floatSearch.getVisibility() == View.VISIBLE) {
floatSearch.show();
}
//fullImage.setVisibility(View.GONE);
}
public Image getCurrentImage() {
return currentImage;
}
public void setCurrentImage(Image image) {
currentImage = image;
}
public void setMenu(boolean isMain) {
menuSearch.setVisible(isMain && !mSetting.floatSearch());
menuInfo.setVisible(!isMain);
menuWallpaper.setVisible(!isMain);
menuShare.setVisible(!isMain);
menuDownload.setVisible(!isMain && !mSetting.autoDownload());
menuFavorite.setVisible(!isMain && !mSetting.floatFavorite());
if (!isMain) {
List<FavoriteImage> favoriteImages = new Select().from(FavoriteImage.class).where(
Condition.column(FavoriteImage$Table.PREVIEWURL)
.eq(currentImage.getPreviewUrl())).queryList();
if (favoriteImages.size() == 1) {
menuFavorite.setTitle(R.string.remove_favorite);
favoriteImages.get(0).updateLast();
favoriteImages.get(0).save();
floatFavorite.setDrawableIcon(getResources().getDrawable(
R.drawable.ic_favorite_white_48dp));
} else {
menuFavorite.setTitle(R.string.add_favorite);
floatFavorite.setDrawableIcon(getResources().getDrawable(
R.drawable.ic_favorite_border_white_48dp));
}
}
}
public void setDefaultTitle() {
title = getString(R.string.app_name);
String hostname = Utils.getHostName(providerUri);
setTitle(title + " (" + hostname + ")");
}
@Override
protected void onDestroy() {
if (dialog != null && dialog.isShowing()) {
dialog.cancel();
}
if (progressDialog != null && progressDialog.isShowing()) {
progressDialog.getWindow().getAttributes().windowAnimations = android.R.anim.fade_out;
progressDialog.cancel();
}
if (messageDialog != null && messageDialog.isShowing()) {
messageDialog.cancel();
}
if (updateDialog != null && updateDialog.isShowing()) {
updateDialog.cancel();
}
super.onDestroy();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
menuSearch = menu.findItem(R.id.search);
menuInfo = menu.findItem(R.id.info);
menuWallpaper = menu.findItem(R.id.set_wallpaper);
menuDownload = menu.findItem(R.id.download);
menuFavorite = menu.findItem(R.id.favorite);
menuShare = menu.findItem(R.id.share);
boolean isFloatSearch = mSetting.floatSearch();
floatSearch.setVisibility(isFloatSearch ? View.VISIBLE : View.INVISIBLE);
if (menuSearch != null) {
menuSearch.setVisible(!isFloatSearch);
}
return super.onCreateOptionsMenu(menu);
}
@Override
protected void onStart() {
super.onStart();
if (providerUri != null && !providerUri.equals(mSetting.provider())) {
providerUri = mSetting.provider();
if (isInHistoryMode) {
reloadFromHistory();
} else if (isInFavoriteMode) {
reloadFromFavorite();
} else {
reload();
}
history.setTextColor(getResources().getColor(
isInHistoryMode ? android.R.color.holo_green_light :
android.R.color.white));
favorite.setTextColor(getResources().getColor(
isInFavoriteMode ? android.R.color.holo_green_light :
android.R.color.white));
}
if (viewPager.getVisibility() == View.GONE) {
setDefaultTitle();
boolean isFloatSearch = mSetting.floatSearch();
floatSearch.setVisibility(isFloatSearch ? View.VISIBLE : View.INVISIBLE);
if (menuSearch != null) {
menuSearch.setVisible(!isFloatSearch);
}
} else {
boolean isFloatFavorite = mSetting.floatFavorite();
floatFavorite.setVisibility(isFloatFavorite ? View.VISIBLE : View.INVISIBLE);
if (menuFavorite != null) {
menuFavorite.setVisible(!isFloatFavorite);
}
}
checkUpdate();
}
void checkUpdate() {
try {
PackageManager packageManager = getPackageManager();
String versionString = packageManager.getPackageInfo(getPackageName(), 0).versionName;
mDataSource.checkUpdate(versionString).subscribe(new Action1<GithubRelease.Asset>() {
@Override
public void call(GithubRelease.Asset asset) {
showUpdateDialog(asset.getName(), asset.getSize(),
asset.getBrowserDownloadUrl());
}
}, new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
onError(throwable.getMessage());
}
});
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) toolbar.getLayoutParams();
int top = (int) getResources().getDimension(R.dimen.toolbar_margin_top);
int right = 0;
Rect visibleFrame = new Rect();
getWindow().getDecorView().getWindowVisibleDisplayFrame(visibleFrame);
DisplayMetrics metrics = getResources().getDisplayMetrics();
// Log.e(TAG, "drawerLayout.getRootView().getHeight(): "+drawerLayout.getRootView().getHeight());
// Log.e(TAG, "drawerLayout.getRootView().getWidth(): "+drawerLayout.getRootView().getWidth());
// Log.e(TAG, "metrics.heightPixels: "+metrics.heightPixels);
// Log.e(TAG, "metrics.widthPixels: "+metrics.widthPixels);
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
right = drawerLayout.getRootView().getHeight() - metrics.widthPixels;
}
params.setMargins(0, top, right, 0);
toolbar.requestLayout();
if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
RelativeLayout.LayoutParams favoriteParams =
(RelativeLayout.LayoutParams) floatFavorite.getLayoutParams();
if (favoriteRightMargin == 0) {
favoriteRightMargin = favoriteParams.rightMargin;
}
favoriteParams.rightMargin = favoriteRightMargin;
floatFavorite.setShowPosition(favoriteShowPosition);
floatFavorite.setHidePosition(favoriteHidePosition);
floatFavorite.setVisibility(View.INVISIBLE);
floatFavorite.hide();
} else {
favoriteShowPosition = floatFavorite.getShowPosition();
favoriteHidePosition = floatFavorite.getHidePosition();
float favoriteBottomMargin = metrics.widthPixels - favoriteShowPosition;
RelativeLayout.LayoutParams favoriteParams =
(RelativeLayout.LayoutParams) floatFavorite.getLayoutParams();
if (favoriteRightMargin == 0) {
favoriteRightMargin = favoriteParams.rightMargin;
}
favoriteParams.rightMargin =
favoriteRightMargin + Utils.getNavigationBarHeight(this, newConfig.orientation);
floatFavorite.setShowPosition(metrics.heightPixels - favoriteBottomMargin);
floatFavorite.setHidePosition(
metrics.heightPixels - favoriteBottomMargin - (favoriteShowPosition
- favoriteHidePosition));
}
}
void launchSettings() {
startActivity(new Intent(this, SettingsActivity.class));
}
void setWallpaper() {
Intent intent = new Intent(Intent.ACTION_ATTACH_DATA);
intent.addCategory(Intent.CATEGORY_DEFAULT);
intent.setDataAndType(currentImageUri, "image/*");
intent.putExtra("mimeType", "image/*");
this.startActivity(Intent.createChooser(intent, getResources().getString(R.string.set_as)));
}
void share() {
Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND);
shareIntent.putExtra(Intent.EXTRA_STREAM, currentImageUri);
shareIntent.setType("image/*");
startActivity(Intent.createChooser(shareIntent, getResources().getText(R.string.share)));
}
void showDetails() {
Image image = currentImage;
if (mDataSource.getCachedDetail(image.getFileUrl()) != null) {
image = mDataSource.getCachedDetail(image.getFileUrl());
}
View detailsView = getLayoutInflater().inflate(R.layout.details,
(ViewGroup) findViewById(android.R.id.content), false);
final TextView name = (TextView) detailsView.findViewById(R.id.name);
final TextView resolution = (TextView) detailsView.findViewById(R.id.resolution);
final TextView size = (TextView) detailsView.findViewById(R.id.size);
final TextView type = (TextView) detailsView.findViewById(R.id.type);
final TextView count = (TextView) detailsView.findViewById(R.id.count);
final TextView user = (TextView) detailsView.findViewById(R.id.user);
final FlowLayout tagsView = (FlowLayout) detailsView.findViewById(R.id.tags);
View.OnClickListener clickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
hideImage();
hideFavorite();
tags = (String) v.getTag();
dialog.cancel();
reload();
}
};
if (image.getTagList().size() > 0) {
for (String s : image.getTagList()) {
// FlowLayout.LayoutParams params =
// new FlowLayout.LayoutParams(FlowLayout.LayoutParams.WRAP_CONTENT,
// FlowLayout.LayoutParams.WRAP_CONTENT);
// params.setMargins(0, 0, 20, 20);
ButtonRectangle button = (ButtonRectangle) getLayoutInflater().
inflate(R.layout.tag_button, tagsView, false);
button.setText(s.replace('_', ' '));
button.setTag(s);
button.setOnClickListener(clickListener);
tagsView.addView(button/*, params*/);
tagsView.invalidate();
button.setBackgroundColor(Utils.String2Color(s));
}
} else {
((View) tagsView.getParent()).setVisibility(View.GONE);
}
name.setText(image.getName());
resolution.setText("" + image.getWidth() + "x" + image.getHeight());
if (image.getSize() > 0) {
size.setText(Utils.humanReadableByteCount(image.getSize(), true));
} else {
((View) size.getParent()).setVisibility(View.GONE);
}
type.setText(image.getType());
if (image.getCount() > 0) {
count.setText("" + image.getCount());
} else {
((View) count.getParent()).setVisibility(View.GONE);
}
if (!image.getUser().isEmpty()) {
user.setText(image.getUser());
} else {
((View) user.getParent()).setVisibility(View.GONE);
}
AlertDialog.Builder builder = new AlertDialog.Builder(this)
.setTitle(R.string.info)
.setView(detailsView)
.setPositiveButton(android.R.string.ok, null);
dialog = builder.create();
dialog.show();
}
void downloadImage() {
if (!hasStoragePermission()) {
return;
}
Image image = currentImage;
if (mDataSource.getCachedDetail(image.getFileUrl()) != null) {
image = mDataSource.getCachedDetail(image.getFileUrl());
}
download(image);
}
private boolean hasStoragePermission() {
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED ||
ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
askForPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE, WRITE_STORAGE);
askForPermission(Manifest.permission.READ_EXTERNAL_STORAGE, READ_STORAGE);
return false;
}
return true;
}
void switchFavorite() {
Image image = currentImage;
List<FavoriteImage> favoriteImages = new Select().from(FavoriteImage.class).where(
Condition.column(FavoriteImage$Table.PREVIEWURL).eq(image.getPreviewUrl())).
queryList();
if (favoriteImages.size() == 1) {
favoriteImages.get(0).delete();
menuFavorite.setTitle(R.string.add_favorite);
floatFavorite.setDrawableIcon(getResources().getDrawable(
R.drawable.ic_favorite_border_white_48dp));
} else {
new FavoriteImage(image).save();
menuFavorite.setTitle(R.string.remove_favorite);
floatFavorite.setDrawableIcon(getResources().getDrawable(
R.drawable.ic_favorite_white_48dp));
}
}
@UiThread
void reload() {
showProgressDialog();
if (!tags.isEmpty()) {
int index = historyTags.indexOf(tags.replace('_', ' '));
if (index >= 0) {
historyTags.remove(index);
}
historyTags.add(0, tags.replace('_', ' '));
historyTagsAdapter.notifyDataSetChanged();
List<HistoryTag> historyTags = new Select().from(HistoryTag.class).where(
Condition.column(HistoryTag$Table.TAG).eq(tags.replace('_', ' '))).queryList();
if (historyTags.size() == 1) {
historyTags.get(0).count++;
historyTags.get(0).last = System.currentTimeMillis();
historyTags.get(0).save();
} else {
HistoryTag historyTag =
new HistoryTag(tags.replace('_', ' '), 1, System.currentTimeMillis());
historyTag.save();
}
switch (providerUri) {
case Providers.KONACHAN_URI:
case Providers.YANDERE_URI:
case Providers.BEHOIMI_URI:
case Providers.GELBOORU_URI:
case Providers.DANBOORU_URI:
tags = tags.trim().replace(' ', '_');
break;
}
}
mGalleryAdapter.reload(tags);
}
@UiThread
void reloadFromHistory() {
isInFavoriteMode = false;
favorite.setTextColor(getResources().getColor(android.R.color.white));
mGalleryAdapter.reloadFromHistory();
}
@UiThread
void reloadFromFavorite() {
isInHistoryMode = false;
history.setTextColor(getResources().getColor(android.R.color.white));
mGalleryAdapter.reloadFromFavorite();
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
switch (id) {
case R.id.search:
search();
break;
case R.id.favorite:
switchFavorite();
break;
case R.id.download:
downloadImage();
break;
case R.id.share:
share();
break;
case R.id.set_wallpaper:
setWallpaper();
break;
case R.id.info:
showDetails();
break;
case R.id.settings:
launchSettings();
break;
}
return true;
}
void search() {
View searchView = getLayoutInflater().inflate(R.layout.search_box,
(ViewGroup) findViewById(android.R.id.content), false);
final EditText searchText = (EditText) searchView.findViewById(R.id.search);
searchText.setText(tags.replace('_', ' '));
searchText.setSelection(searchText.getText().length());
searchText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
searchText.post(new Runnable() {
@Override
public void run() {
InputMethodManager inputMethodManager =
(InputMethodManager) MainActivity.this.getSystemService(
Context.INPUT_METHOD_SERVICE);
inputMethodManager.showSoftInput(searchText,
InputMethodManager.SHOW_IMPLICIT);
}
});
}
});
searchText.requestFocus();
AlertDialog.Builder builder = new AlertDialog.Builder(this)
.setTitle(android.R.string.search_go)
.setView(searchView)
.setNegativeButton(android.R.string.cancel, null)
.setPositiveButton(android.R.string.search_go,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
showProgressDialog();
tags = searchText.getText().toString();
mDataSource.listTag(tags)
.subscribe(new Action1<List<? extends Tag>>() {
@Override
public void call(List<? extends Tag> tags) {
listTagDialog(tags);
}
}, new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
showErrorDialog(throwable.getMessage());
}
});
}
});
dialog = builder.create();
dialog.show();
}
public void listTagDialog(final List<? extends Tag> tagList) {
hideProgressDialog();
if (tagList.size() == 1) {
tags = tagList.get(0).getName();
clearModes();
reload();
} else if (tagList.size() == 0) {
makeToast(R.string.no_tag_found);
} else {
// sort by count
Collections.sort(tagList, new Tag.TagComparator());
View tagsView = getLayoutInflater().inflate(R.layout.tag_list,
(ViewGroup) findViewById(android.R.id.content), false);
final ListView tagListView = (ListView) tagsView.findViewById(R.id.tag_list);
tagListView.setAdapter(new ArrayAdapter<>(this, R.layout.tag_item, tagList));
tagListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
tags = tagList.get(position).getName();
clearModes();
reload();
dialog.cancel();
}
});
AlertDialog.Builder builder = new AlertDialog.Builder(this)
.setTitle(R.string.search_suggest)
.setView(tagsView)
.setNegativeButton(android.R.string.cancel, null);
dialog = builder.create();
dialog.show();
}
}
@UiThread
public void makeToast(int resId) {
Toast.makeText(this, resId, Toast.LENGTH_SHORT).show();
}
@UiThread
public void makeToast(String message) {
Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
}
public void login() {
View loginView = getLayoutInflater().inflate(R.layout.login,
(ViewGroup) findViewById(android.R.id.content), false);
final EditText usernameText = (EditText) loginView.findViewById(R.id.username);
final EditText passwordText = (EditText) loginView.findViewById(R.id.password);
final TextView providerText = (TextView) loginView.findViewById(R.id.provider);
providerText.setText(providerUri);
usernameText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
usernameText.post(new Runnable() {
@Override
public void run() {
InputMethodManager inputMethodManager =
(InputMethodManager) MainActivity.this.getSystemService(
Context.INPUT_METHOD_SERVICE);
inputMethodManager.showSoftInput(usernameText,
InputMethodManager.SHOW_IMPLICIT);
}
});
}
});
usernameText.requestFocus();
AlertDialog.Builder builder = new AlertDialog.Builder(this)
.setTitle(R.string.login_required)
.setView(loginView)
.setNegativeButton(android.R.string.cancel, null)
.setPositiveButton(android.R.string.ok,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
showProgressDialog();
String username = usernameText.getText().toString();
String password = passwordText.getText().toString();
login(username, password);
}
});
dialog = builder.create();
dialog.show();
}
@Override
protected void onResume() {
super.onResume();
if (mSetting.autoDownload()) {
askForPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE, WRITE_STORAGE);
askForPermission(Manifest.permission.READ_EXTERNAL_STORAGE, READ_STORAGE);
}
}
public void login(String username, String password) {
String apiUri = mSetting.provider();
Retrofit.Builder restAdapter = mBuilder.baseUrl(apiUri);
switch (apiUri) {
case Providers.ANIME_PICTURES_URI:
AnimePictures animePictures = restAdapter.build().create(AnimePictures.class);
animePictures.login(RequestBody.create(MediaType.parse("text/plain"), username),
RequestBody.create(MediaType.parse("text/plain"), password),
RequestBody.create(MediaType.parse("text/plain"),
TimeZone.getDefault().getID()))
.enqueue(new Callback<AnimePicturesUser>() {
@Override
public void onResponse(retrofit2.Call<AnimePicturesUser> call,
Response<AnimePicturesUser> response) {
try {
AnimePicturesUser user = response.body();
if (user.getSuccess()) {
makeToast(R.string.login_success);
mSetting.setAnimePicturesToken(user.getToken());
} else {
makeToast(R.string.login_failed);
mSetting.setAnimePicturesToken("");
}
Headers headers = response.headers();
if (!headers.get("_server").isEmpty()) {
String server = headers.get("_server");
mSetting.setAnimePicturesServer(server);
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onFailure(retrofit2.Call<AnimePicturesUser> call,
Throwable t) {
}
});
break;
default:
// do nothing
}
hideProgressDialog();
}
@UiThread
public void showSystemUI() {
cancelHideSystemUIDelayed();
toolbar.animate().translationY(0).setInterpolator(new DecelerateInterpolator()).start();
int flags = 0;
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
flags = View.SYSTEM_UI_FLAG_VISIBLE;
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
flags = View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
}
getWindow().getDecorView().setSystemUiVisibility(flags);
}
@UiThread
public void hideSystemUIDelayed(int timeout) {
if (hideSystemUIRunnable == null) {
hideSystemUIRunnable = new Runnable() {
@Override
public void run() {
hideSystemUI();
}
};
}
handler.removeCallbacks(hideSystemUIRunnable);
handler.postDelayed(hideSystemUIRunnable, timeout);
}
@UiThread
public void cancelHideSystemUIDelayed() {
if (hideSystemUIRunnable != null) {
handler.removeCallbacks(hideSystemUIRunnable);
}
}
public boolean isSystemUIVisible() {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
return (getWindow().getDecorView().getSystemUiVisibility() &
View.SYSTEM_UI_FLAG_LOW_PROFILE) == 0;
} else {
return (getWindow().getDecorView().getSystemUiVisibility() &
View.SYSTEM_UI_FLAG_HIDE_NAVIGATION) == 0;
}
}
private void hideSystemUI() {
int flags = 0;
toolbar.animate().translationY(-toolbar.getBottom()).setInterpolator(
new AccelerateInterpolator()).start();
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
flags = View.SYSTEM_UI_FLAG_LOW_PROFILE;
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
flags = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_FULLSCREEN;
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
flags = flags | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
}
getWindow().getDecorView().setSystemUiVisibility(flags);
hideFavorite();
}
@UiThread
public void hideProgressDialog() {
if (progressDialog.isShowing()) {
handler.postDelayed(new Runnable() {
@Override
public void run() {
progressDialog.getWindow().getAttributes().windowAnimations =
android.R.anim.fade_out;
progressDialog.dismiss();
if (viewPager.getVisibility() == View.VISIBLE) {
hideSystemUI();
}
}
}, 300);
}
}
public void showProgressDialog() {
if (!progressDialog.isShowing()) {
progressDialog.getWindow().getAttributes().windowAnimations = android.R.anim.fade_in;
progressDialog.show();
}
}
@UiThread
public void runExitAnimation(final ViewPager target, final View to, final int orientation) {
final int duration = ANIMATION_DURATION;
// background
ObjectAnimator backgroundAnimator = ObjectAnimator.ofFloat(imageContainer,
"alpha", 1f, 0f);
backgroundAnimator.setDuration(duration);
backgroundAnimator.start();
if (to == null) {
target.setVisibility(View.GONE);
return;
}
int[] location = new int[2];
to.getLocationInWindow(location);
final int thumbnailLeft = location[0];
final int thumbnailTop = location[1];
final int thumbnailWidth = to.getWidth();
final int thumbnailHeight = to.getHeight();
// int height = target.getDrawable().getIntrinsicHeight();
// int width = target.getDrawable().getIntrinsicWidth();
int height = ((Image) target.getTag()).getHeight().intValue();
int width = ((Image) target.getTag()).getWidth().intValue();
//Log.d(TAG, "height: " + height + ", width: " + width);
final float ratioImage = (float) height / width;
final float ratioView = (float) thumbnailHeight / thumbnailWidth;
ValueAnimator valueAnimator = ValueAnimator.ofInt(0, ANIMATION_INT);
valueAnimator.setDuration(duration);
//photoViewAttacher.setScaleType(ImageView.ScaleType.FIT_CENTER);
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
if (orientation == getRequestedOrientation()
|| orientation == ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED) {
int animatedValue = (int) animation.getAnimatedValue();
if (lastAnimatedValue != animatedValue) {
lastAnimatedValue = animatedValue;
FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(
target.getLayoutParams());
float animatedProgress = (float) animatedValue / ANIMATION_INT;
View parent = target.getRootView();
int fullLeft = parent.getLeft();
int fullTop = parent.getTop();
int fullWidth = parent.getWidth();
int fullHeight = parent.getHeight();
int left = (int) ((thumbnailLeft - fullLeft) * animatedProgress) -
parent.getPaddingLeft();
int top = (int) ((thumbnailTop - fullTop) * animatedProgress) -
parent.getPaddingTop();
layoutParams.setMargins(left, top, 0, 0);
layoutParams.width = (int) ((fullWidth - thumbnailWidth) *
(1 - animatedProgress)) + thumbnailWidth;
layoutParams.height = (int) ((fullHeight - thumbnailHeight) *
(1 - animatedProgress)) + thumbnailHeight;
if (ratioImage >= ratioView) {
// has left/right spacing
float progress =
1 - (0.5f * (thumbnailWidth * ratioImage - thumbnailHeight)) /
(thumbnailTop - fullTop - parent.getPaddingTop());
if (animatedProgress < progress) {
layoutParams.width = (int) ((fullWidth - thumbnailWidth) *
(progress - animatedProgress) / progress) +
thumbnailWidth;
left =
(int) ((thumbnailLeft - fullLeft) * animatedProgress
/ progress) -
parent.getPaddingLeft();
} else if (!turn) {
//photoViewAttacher.setScaleType(ImageView.ScaleType.CENTER_CROP);
turn = true;
turnProgress = animatedProgress;
}
if (turn) {
layoutParams.width = thumbnailWidth;
left = ((thumbnailLeft - fullLeft)) - parent.getPaddingLeft();
}
} else {
// TODO
// has top/bottom spacing
if (layoutParams.width < ratioImage * thumbnailHeight) {
layoutParams.height = thumbnailHeight;
top = ((thumbnailTop - fullTop)) - parent.getPaddingTop();
} else if (!turn) {
//photoViewAttacher.setScaleType(ImageView.ScaleType.CENTER_CROP);
turn = true;
turnProgress = animatedProgress;
}
if (turn) {
layoutParams.height = (int) ((fullHeight - thumbnailHeight) *
(animatedProgress - turnProgress) /
(1 - turnProgress)) +
thumbnailHeight;
top = (int) ((thumbnailTop - fullTop) *
(1 - (animatedProgress - turnProgress) /
(1 - turnProgress))) -
parent.getPaddingTop();
}
}
layoutParams.setMargins(left, top, 0, 0);
target.setLayoutParams(layoutParams);
}
} else {
target.setVisibility(View.GONE);
}
}
});
valueAnimator.start();
handler.postDelayed(new Runnable() {
@Override
public void run() {
target.setVisibility(View.GONE);
turn = false;
}
}, duration + 100);
}
// Step 1: open the view
// Step 2: zoom the view
@UiThread
public void runEnterAnimation(final ImageView target, final View from, final int orientation) {
if (floatSearch.getVisibility() == View.VISIBLE) {
floatSearch.hide();
}
final int duration = ANIMATION_DURATION;
// background
ObjectAnimator backgroundAnimator = ObjectAnimator.ofFloat(imageContainer,
"alpha", 0f, 1f);
backgroundAnimator.setDuration(duration);
backgroundAnimator.start();
ViewGroup.LayoutParams layoutParams = from.getLayoutParams();
int[] location = new int[2];
from.getLocationInWindow(location);
final int thumbnailLeft = location[0];
final int thumbnailTop = location[1];
final int thumbnailWidth = from.getWidth();
final int thumbnailHeight = from.getHeight();
target.setTop(thumbnailTop);
target.setLeft(thumbnailLeft);
target.setLayoutParams(layoutParams);
// int height = target.getDrawable().getIntrinsicHeight();
// int width = target.getDrawable().getIntrinsicWidth();
int height = ((Image) target.getTag()).getHeight().intValue();
int width = ((Image) target.getTag()).getWidth().intValue();
//Log.d(TAG, "height: " + height + ", width: " + width);
final float ratioImage = (float) height / width;
final float ratioView = (float) thumbnailHeight / thumbnailWidth;
//photoViewAttacher.setScaleType(ImageView.ScaleType.CENTER_CROP);
target.setVisibility(View.VISIBLE);
ValueAnimator valueAnimator = ValueAnimator.ofInt(0, ANIMATION_INT);
valueAnimator.setDuration(duration);
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
int animatedValue = (int) animation.getAnimatedValue();
if (lastAnimatedValue != animatedValue) {
lastAnimatedValue = animatedValue;
FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(
target.getLayoutParams());
View parent = target.getRootView();
int fullLeft = parent.getLeft();
int fullTop = parent.getTop();
int fullWidth = parent.getWidth();
int fullHeight = parent.getHeight();
if (orientation == getRequestedOrientation()
|| orientation == ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED) {
float animatedProgress = (float) animatedValue / ANIMATION_INT;
int left = (int) ((thumbnailLeft - fullLeft) * (1 - animatedProgress)) -
parent.getPaddingLeft();
int top = (int) ((thumbnailTop - fullTop) * (1 - animatedProgress)) -
parent.getPaddingTop();
layoutParams.width =
(int) ((fullWidth - thumbnailWidth) * animatedProgress) +
thumbnailWidth;
layoutParams.height = (int) ((fullHeight - thumbnailHeight) *
animatedProgress) + thumbnailHeight;
if (ratioImage > ratioView) {
// has left/right spacing
if (layoutParams.height < ratioImage * thumbnailWidth) {
layoutParams.width = thumbnailWidth;
left = ((thumbnailLeft - fullLeft)) - parent.getPaddingLeft();
} else if (!turn) {
//photoViewAttacher.setScaleType(ImageView.ScaleType.FIT_CENTER);
turn = true;
turnProgress = animatedProgress;
}
if (turn) {
layoutParams.width = (int) ((fullWidth - thumbnailWidth) *
(animatedProgress - turnProgress) /
(1 - turnProgress)) +
thumbnailWidth;
left = (int) ((thumbnailLeft - fullLeft) *
(1 - (animatedProgress - turnProgress) /
(1 - turnProgress))) -
parent.getPaddingLeft();
}
} else {
// has top/bottom spacing
if (layoutParams.width < ratioImage * thumbnailHeight) {
layoutParams.height = thumbnailHeight;
top = ((thumbnailTop - fullTop)) - parent.getPaddingTop();
} else if (!turn) {
//photoViewAttacher.setScaleType(ImageView.ScaleType.FIT_CENTER);
turn = true;
turnProgress = animatedProgress;
}
if (turn) {
layoutParams.height = (int) ((fullHeight - thumbnailHeight) *
(animatedProgress - turnProgress) /
(1 - turnProgress)) +
thumbnailHeight;
top = (int) ((thumbnailTop - fullTop) *
(1 - (animatedProgress - turnProgress) /
(1 - turnProgress))) -
parent.getPaddingTop();
}
}
//Log.e(TAG, "width:" + layoutParams.width + ", left:" + left);
layoutParams.setMargins(left, top, 0, 0);
target.setLayoutParams(layoutParams);
} else {
layoutParams.width = parent.getWidth();
layoutParams.height = parent.getHeight();
layoutParams.setMargins(-parent.getPaddingLeft(), -parent.getPaddingTop(),
0, 0);
target.setLayoutParams(layoutParams);
//photoViewAttacher.setScaleType(ImageView.ScaleType.FIT_CENTER);
}
}
}
});
valueAnimator.start();
handler.postDelayed(new Runnable() {
@Override
public void run() {
//photoViewAttacher.setMinimumScale(1f);
turn = false;
}
}, duration + 100);
}
@UiThread
public void showErrorDialog(String message) {
messageDialog.setContent(getString(R.string.connect_error) + " (" + message + ")");
messageDialog.show();
}
@UiThread
public void showUpdateDialog(String name, long size, String uri) {
updateFileName = name;
updateUrl = uri;
updateDialog.setContent(getString(
R.string.new_version_available) + " \n" + name + " ("
+ Utils.humanReadableByteCount(
size, true) + ")");
updateDialog.show();
}
public File getDownloadDir() {
return downloadDir;
}
public void download(final Image image) {
mRequestManager.load(new GlideUrl(image.getFileUrl()))
.downloadOnly(new SimpleTarget<File>() {
@Override
public void onLoadFailed(Exception e, Drawable errorDrawable) {
super.onLoadFailed(e, errorDrawable);
showErrorDialog(e.getMessage());
}
@Override
public void onResourceReady(File resource,
GlideAnimation<? super File> glideAnimation) {
File dir = new File(
Environment.getExternalStorageDirectory().getPath(), "MoeGallery");
String fileName = image.getName().replace('/', '-');
Utils.copy(resource, dir, fileName);
mDataSource.cacheImageUri(currentImage.getFileUrl(),
Uri.fromFile(new File(dir, fileName)));
makeToast(R.string.download_complete);
if (reloadImageCallback != null) {
reloadImageCallback.onReloadImage(image);
}
}
});
}
void downloadUpdate() {
if (!hasStoragePermission()) {
return;
}
if (!updateDir.exists()) {
updateDir.mkdir();
}
showProgressDialog();
mDataSource.downloadUpdate(updateDir, updateFileName, updateUrl).subscribe(
new Action1<Uri>() {
@Override
public void call(Uri uri) {
hideProgressDialog();
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(uri, "application/vnd.android.package-archive");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
}, new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
onError(throwable.getMessage());
}
});
}
public void setReloadImageCallback(ReloadImageCallback callback) {
reloadImageCallback = callback;
}
public void updateOrientation(int width, int height) {
if (width == height) {
return;
}
if (mPagerAdapter.getCount() == 1) {
return;
}
int orientation = getRequestedOrientation();
if (width <= height && orientation != ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
} else if (width > height && orientation != ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
}
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public boolean onMenuOpened(int featureId, Menu menu) {
if (currentImage != null) {
Image image = mDataSource.getCachedDetail(currentImage.getFileUrl());
if (image != null) {
String fileName = image.getName().replace('/', '-');
File file = new File(Utils.getDir(), fileName);
if (file.exists()) {
mDataSource.cacheImageUri(currentImage.getFileUrl(), Uri.fromFile(file));
}
}
currentImageUri = mDataSource.getImageUri(currentImage.getFileUrl());
}
if (currentImageUri != null && viewPager.getVisibility() == View.VISIBLE) {
menuWallpaper.setVisible(true);
menuShare.setVisible(true);
menuDownload.setVisible(false);
} else {
menuWallpaper.setVisible(false);
menuShare.setVisible(false);
}
if (currentImageUri == null && viewPager.getVisibility() == View.VISIBLE &&
!mSetting.autoDownload()) {
menuDownload.setVisible(true);
}
return super.onMenuOpened(featureId, menu);
}
@Override
public void onPageSelected(int position) {
currentImage = mDataSource.get(position);
if (currentImage != null) {
String title = currentImage.getName();
Image image = mDataSource.getCachedDetail(currentImage.getFileUrl());
if (image != null) {
title = image.getName();
}
setTitle(title);
}
}
@Override
public void onPageScrollStateChanged(int state) {
}
public void setPagingEnabled(boolean enabled) {
viewPager.setPagingEnabled(enabled);
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if (mTouchEventListener != null) {
mTouchEventListener.onDispatchTouchEvent(ev);
}
return super.dispatchTouchEvent(ev);
}
public void setTouchEventListener(TouchEventListener listener) {
mTouchEventListener = listener;
}
@Override
public void onListUpdate() {
mPagerAdapter = new PagerAdapter(getSupportFragmentManager());
viewPager.setAdapter(mPagerAdapter);
hideProgressDialog();
}
@Override
public void onError(String message) {
hideProgressDialog();
showErrorDialog(message);
}
@Override
public void onItemClick(View view, int position) {
final Image image = mDataSource.get(position);
if (image instanceof AnimePicturesList.AnimePicturesPreview) {
if (((AnimePicturesList.AnimePicturesPreview) image).getErotics() > 1) {
if (mSetting.animePicturesToken().isEmpty()) {
// need login
login();
return;
}
}
}
if (floatSearch.isShow()) {
floatSearch.hide();
}
viewPager.setCurrentItem(position, false);
viewPager.setVisibility(View.VISIBLE);
setCurrentImage(image);
setMenu(false);
hideSystemUIDelayed(0);
}
private void askForPermission(String permission, int requestCode) {
if (ActivityCompat.checkSelfPermission(this, permission)
== PackageManager.PERMISSION_GRANTED) {
return;
}
if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, permission)) {
ActivityCompat.requestPermissions(MainActivity.this, new String[] { permission },
requestCode);
} else {
ActivityCompat.requestPermissions(MainActivity.this, new String[] { permission },
requestCode);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (grantResults.length > 0 && ActivityCompat.checkSelfPermission(this, permissions[0])
!= PackageManager.PERMISSION_GRANTED) {
switch (requestCode) {
case READ_STORAGE:
case WRITE_STORAGE:
mSetting.setAutoDownload(false);
break;
}
}
}
public interface ReloadImageCallback {
void onReloadImage(Image image);
}
public interface TouchEventListener {
boolean onDispatchTouchEvent(MotionEvent motionEvent);
}
}