/*
* Copyright (c) 2015 Zelory.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package id.zelory.codepolitan.ui;
import android.content.ComponentName;
import android.content.Intent;
import android.content.pm.ResolveInfo;
import android.net.Uri;
import android.os.Bundle;
import android.os.PersistableBundle;
import android.support.v4.view.ViewPager;
import android.support.v7.widget.Toolbar;
import android.text.Html;
import android.view.Menu;
import android.view.MenuItem;
import com.orhanobut.dialogplus.DialogPlus;
import com.orhanobut.dialogplus.GridHolder;
import java.util.ArrayList;
import java.util.List;
import butterknife.Bind;
import id.zelory.benih.BenihActivity;
import id.zelory.benih.fragment.BenihFragment;
import id.zelory.benih.util.BenihWorker;
import id.zelory.codepolitan.R;
import id.zelory.codepolitan.controller.BookmarkController;
import id.zelory.codepolitan.controller.ReadLaterController;
import id.zelory.codepolitan.data.model.Article;
import id.zelory.codepolitan.data.LocalDataManager;
import id.zelory.codepolitan.ui.adapter.MenuShareAdapter;
import id.zelory.codepolitan.ui.adapter.ReadPagerAdapter;
import id.zelory.codepolitan.ui.fragment.ImageReadFragment;
import id.zelory.codepolitan.ui.fragment.ReadFragment;
/**
* Created on : July 28, 2015
* Author : zetbaitsu
* Name : Zetra
* Email : zetra@mail.ugm.ac.id
* GitHub : https://github.com/zetbaitsu
* LinkedIn : https://id.linkedin.com/in/zetbaitsu
*/
public class ReadActivity extends BenihActivity implements ViewPager.OnPageChangeListener,
ReadLaterController.Presenter, BookmarkController.Presenter
{
public static final String KEY_TYPE = "type";
public static final int TYPE_FROM_NOTIF = 1;
private ReadPagerAdapter adapter;
private List<BenihFragment> readFragments;
private List<Article> articles;
private int position = 0;
private ReadLaterController readLaterController;
private BookmarkController bookmarkController;
private MenuItem menuReadLater;
private MenuItem menuBookmark;
private DialogPlus dialogPlus;
private int type;
@Bind(R.id.toolbar) Toolbar toolbar;
@Bind(R.id.pager) ViewPager viewPager;
@Override
protected int getActivityView()
{
return R.layout.activity_read;
}
@Override
protected void onViewReady(Bundle bundle)
{
type = getIntent().getIntExtra(KEY_TYPE, 0);
if (type == 0 && bundle != null)
{
type = bundle.getInt(KEY_TYPE, 0);
}
setSupportActionBar(toolbar);
getSupportActionBar().setHomeButtonEnabled(true);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
readFragments = new ArrayList<>();
articles = LocalDataManager.getArticles();
position = LocalDataManager.getPosition();
if (articles.get(articles.size() - 1).getTitle() == null)
{
articles.remove(articles.size() - 1);
}
BenihWorker.pluck()
.doInNewThread(this::generateFragments)
.subscribe(o -> {
setUpAdapter();
setUpViewPager();
});
readLaterController = new ReadLaterController(this);
bookmarkController = new BookmarkController(this);
setUpShareMenu();
}
private void setUpViewPager()
{
viewPager.setAdapter(adapter);
viewPager.setCurrentItem(position);
viewPager.addOnPageChangeListener(this);
}
private void setUpAdapter()
{
adapter = new ReadPagerAdapter(getSupportFragmentManager(), readFragments);
}
private void generateFragments()
{
readFragments.clear();
int size = articles.size();
for (int i = 0; i < size; i++)
{
if (Article.TYPE_NEWS.equalsIgnoreCase(articles.get(i).getPostType()))
{
ReadFragment readFragment = new ReadFragment();
readFragment.setData(articles.get(i));
readFragments.add(readFragment);
} else
{
ImageReadFragment imageReadFragment = new ImageReadFragment();
imageReadFragment.setData(articles.get(i));
readFragments.add(imageReadFragment);
}
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
getMenuInflater().inflate(R.menu.menu_read, menu);
menuReadLater = menu.getItem(1);
menuBookmark = menu.getItem(2);
menuReadLater.setChecked(articles.get(position).isReadLater());
menuBookmark.setChecked(articles.get(position).isBookmarked());
bookmarkController.setArticle(articles.get(position));
readLaterController.setArticle(articles.get(position));
return true;
}
private void setUpShareMenu()
{
dialogPlus = DialogPlus.newDialog(this)
.setContentHolder(new GridHolder(4))
.setHeader(R.layout.menu_header_share)
.setFooter(R.layout.menu_footer_share)
.setCancelable(true)
.setAdapter(new MenuShareAdapter(this))
.setOnItemClickListener((dialogPlus, o, view, i) -> {
String packageName = "";
switch (i)
{
case 0:
packageName = "com.google.android.apps.plus";
break;
case 1:
packageName = "email";
break;
case 2:
packageName = "com.facebook.orca";
break;
case 3:
packageName = "com.whatsapp";
break;
case 4:
packageName = "sms";
break;
case 5:
packageName = "com.facebook.katana";
break;
case 6:
packageName = "com.twitter.android";
break;
case 7:
packageName = "more";
break;
}
onShareArticle(packageName);
dialogPlus.dismiss();
})
.create();
}
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
switch (item.getItemId())
{
case android.R.id.home:
onBackPressed();
break;
case R.id.action_share:
if (dialogPlus != null && dialogPlus.isShowing())
{
dialogPlus.dismiss();
} else if (dialogPlus != null)
{
dialogPlus.show();
}
break;
case R.id.action_read_later:
readLaterController.readLater(articles.get(position));
break;
case R.id.action_bookmark:
bookmarkController.bookmark(articles.get(position));
break;
}
return true;
}
private void onShareArticle(String packageName)
{
Article article = articles.get(position);
if ("more".equals(packageName))
{
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_SUBJECT, Html.fromHtml(article.getTitle()));
intent.putExtra(Intent.EXTRA_TEXT, Html.fromHtml(article.getTitle()) + "\n" + article.getLink());
startActivity(Intent.createChooser(intent, "Share"));
} else if ("email".equals(packageName))
{
Intent intent = new Intent(Intent.ACTION_SENDTO);
intent.setData(Uri.parse("mailto:"));
intent.putExtra(Intent.EXTRA_SUBJECT, Html.fromHtml(article.getTitle()));
intent.putExtra(Intent.EXTRA_TEXT, Html.fromHtml(article.getTitle()) + "\n" + article.getLink());
startActivity(intent);
} else if ("sms".equals(packageName))
{
Intent intent = new Intent(Intent.ACTION_SENDTO);
intent.setData(Uri.parse("smsto:"));
intent.putExtra(Intent.EXTRA_SUBJECT, Html.fromHtml(article.getTitle()));
intent.putExtra(Intent.EXTRA_TEXT, Html.fromHtml(article.getTitle()) + "\n" + article.getLink());
startActivity(intent);
} else
{
boolean shared = false;
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_SUBJECT, Html.fromHtml(article.getTitle()));
intent.putExtra(Intent.EXTRA_TEXT, Html.fromHtml(article.getTitle()) + "\n" + article.getLink());
for (ResolveInfo resolveInfo : getPackageManager().queryIntentActivities(intent, 0))
{
if (packageName.equals(resolveInfo.activityInfo.packageName))
{
intent.addCategory(Intent.CATEGORY_LAUNCHER);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.setComponent(new ComponentName(packageName, resolveInfo.activityInfo.name));
startActivity(intent);
shared = true;
break;
}
}
if (!shared)
{
openPlayStore(packageName);
}
}
}
private void openPlayStore(String packageName)
{
startActivity(new Intent(Intent.ACTION_VIEW,
Uri.parse("http://play.google.com/store/apps/details?id=" + packageName)));
}
@Override
protected void onDestroy()
{
viewPager = null;
adapter = null;
if (readFragments != null)
{
readFragments.clear();
readFragments = null;
}
if (articles != null)
{
articles.clear();
articles = null;
}
super.onDestroy();
}
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels)
{
if (this.position != position)
{
removeReadArticle();
this.position = position;
menuReadLater.setChecked(articles.get(position).isReadLater());
menuBookmark.setChecked(articles.get(position).isBookmarked());
}
}
@Override
public void onPageSelected(int position)
{
}
@Override
public void onPageScrollStateChanged(int state)
{
}
@Override
public void showListReadLaterArticles(List<Article> listArticle)
{
}
@Override
public void onReadLater(Article article)
{
menuReadLater.setChecked(true);
}
@Override
public void onUnReadLater(Article article)
{
menuReadLater.setChecked(false);
}
@Override
public void showListBookmarkedArticles(List<Article> listArticle)
{
}
@Override
public void onBookmark(Article article)
{
menuBookmark.setChecked(true);
}
@Override
public void onUnBookmark(Article article)
{
menuBookmark.setChecked(false);
}
@Override
public void showFilteredArticles(List<Article> articles)
{
}
@Override
public void showError(Throwable throwable)
{
}
@Override
public void showLoading()
{
}
@Override
public void dismissLoading()
{
}
@Override
public void onBackPressed()
{
removeReadArticle();
if (type == TYPE_FROM_NOTIF)
{
Intent intent = new Intent(this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
startActivity(intent);
finish();
} else
{
super.onBackPressed();
}
}
@Override
public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState)
{
super.onSaveInstanceState(outState, outPersistentState);
outState.putInt(KEY_TYPE, type);
}
private void removeReadArticle()
{
if (LocalDataManager.isAutoRemoveReadLater() && articles.get(position).isReadLater())
{
readLaterController.readLater(articles.get(position));
}
}
}