package de.robv.android.xposed.installer;
import android.app.Fragment;
import android.app.FragmentManager;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.support.design.widget.Snackbar;
import android.support.design.widget.TabLayout;
import android.support.v13.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.ActionBar;
import android.support.v7.widget.Toolbar;
import android.text.TextUtils;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
import java.util.List;
import de.robv.android.xposed.installer.repo.Module;
import de.robv.android.xposed.installer.util.Loader;
import de.robv.android.xposed.installer.util.ModuleUtil;
import de.robv.android.xposed.installer.util.ModuleUtil.InstalledModule;
import de.robv.android.xposed.installer.util.ModuleUtil.ModuleListener;
import de.robv.android.xposed.installer.util.RepoLoader;
import de.robv.android.xposed.installer.util.ThemeUtil;
public class DownloadDetailsActivity extends XposedBaseActivity implements Loader.Listener<RepoLoader>, ModuleListener {
public static final int DOWNLOAD_DESCRIPTION = 0;
public static final int DOWNLOAD_VERSIONS = 1;
public static final int DOWNLOAD_SETTINGS = 2;
private static RepoLoader sRepoLoader = RepoLoader.getInstance();
private static ModuleUtil sModuleUtil = ModuleUtil.getInstance();
private ViewPager mPager;
private String mPackageName;
private Module mModule;
private InstalledModule mInstalledModule;
private MenuItem mItemBookmark;
@Override
public void onCreate(Bundle savedInstanceState) {
ThemeUtil.setTheme(this);
mPackageName = getModulePackageName();
mModule = sRepoLoader.getModule(mPackageName);
mInstalledModule = ModuleUtil.getInstance().getModule(mPackageName);
super.onCreate(savedInstanceState);
sRepoLoader.addListener(this);
sModuleUtil.addListener(this);
if (mModule != null) {
setContentView(R.layout.activity_download_details);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
finish();
}
});
ActionBar ab = getSupportActionBar();
if (ab != null) {
ab.setTitle(R.string.nav_item_download);
ab.setDisplayHomeAsUpEnabled(true);
}
setFloating(toolbar, 0);
setupTabs();
Boolean directDownload = getIntent().getBooleanExtra("direct_download", false);
// Updates available => start on the versions page
if (mInstalledModule != null && mInstalledModule.isUpdate(sRepoLoader.getLatestVersion(mModule)) || directDownload)
mPager.setCurrentItem(DOWNLOAD_VERSIONS);
if (Build.VERSION.SDK_INT >= 21)
findViewById(R.id.fake_elevation).setVisibility(View.GONE);
} else {
setContentView(R.layout.activity_download_details_not_found);
TextView txtMessage = (TextView) findViewById(android.R.id.message);
txtMessage.setText(getResources().getString(R.string.download_details_not_found, mPackageName));
findViewById(R.id.reload).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
v.setEnabled(false);
sRepoLoader.triggerReload(true);
}
});
}
}
private void setupTabs() {
mPager = (ViewPager) findViewById(R.id.download_pager);
mPager.setAdapter(new SwipeFragmentPagerAdapter(getFragmentManager()));
TabLayout mTabLayout = (TabLayout) findViewById(R.id.sliding_tabs);
mTabLayout.setupWithViewPager(mPager);
}
private String getModulePackageName() {
Uri uri = getIntent().getData();
if (uri == null)
return null;
String scheme = uri.getScheme();
if (TextUtils.isEmpty(scheme)) {
return null;
} else if (scheme.equals("package")) {
return uri.getSchemeSpecificPart();
} else if (scheme.equals("http")) {
List<String> segments = uri.getPathSegments();
if (segments.size() > 1)
return segments.get(1);
}
return null;
}
@Override
protected void onDestroy() {
super.onDestroy();
sRepoLoader.removeListener(this);
sModuleUtil.removeListener(this);
}
public Module getModule() {
return mModule;
}
public InstalledModule getInstalledModule() {
return mInstalledModule;
}
public void gotoPage(int page) {
mPager.setCurrentItem(page);
}
private void reload() {
runOnUiThread(new Runnable() {
@Override
public void run() {
recreate();
}
});
}
@Override
public void onReloadDone(RepoLoader loader) {
reload();
}
@Override
public void onInstalledModulesReloaded(ModuleUtil moduleUtil) {
reload();
}
@Override
public void onSingleInstalledModuleReloaded(ModuleUtil moduleUtil, String packageName, InstalledModule module) {
if (packageName.equals(mPackageName))
reload();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu_download_details, menu);
// TODO maybe enable again after checking the implementation
menu.findItem(R.id.menu_bookmark).setVisible(false);
menu.findItem(R.id.menu_share).setVisible(false);
//mItemBookmark = menu.findItem(R.id.menu_bookmark);
//setupBookmark(false);
return true;
}
private void setupBookmark(boolean clicked) {
SharedPreferences myPref = getSharedPreferences("bookmarks", MODE_PRIVATE);
boolean saved = myPref.getBoolean(mModule.packageName, false);
boolean newValue;
if (clicked) {
newValue = !saved;
myPref.edit().putBoolean(mModule.packageName, newValue).apply();
int msg = newValue ? R.string.bookmark_added : R.string.bookmark_removed;
Snackbar.make(findViewById(android.R.id.content), msg, Snackbar.LENGTH_SHORT).show();
}
saved = myPref.getBoolean(mModule.packageName, false);
if (saved) {
mItemBookmark.setTitle(R.string.remove_bookmark);
mItemBookmark.setIcon(R.drawable.ic_bookmark);
} else {
mItemBookmark.setTitle(R.string.add_bookmark);
mItemBookmark.setIcon(R.drawable.ic_bookmark_outline);
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_bookmark:
setupBookmark(true);
break;
case R.id.menu_refresh:
RepoLoader.getInstance().triggerReload(true);
return true;
case R.id.menu_share:
String text = mModule.name + " - ";
if (isPackageInstalled(mPackageName, this)) {
String s = getPackageManager().getInstallerPackageName(mPackageName);
boolean playStore;
try {
playStore = s.equals(ModulesFragment.PLAY_STORE_PACKAGE);
} catch (NullPointerException e) {
playStore = false;
}
if (playStore) {
text += String.format(ModulesFragment.PLAY_STORE_LINK, mPackageName);
} else {
text += String.format(ModulesFragment.XPOSED_REPO_LINK, mPackageName);
}
} else {
text += String.format(ModulesFragment.XPOSED_REPO_LINK,
mPackageName);
}
Intent sharingIntent = new Intent(Intent.ACTION_SEND);
sharingIntent.setType("text/plain");
sharingIntent.putExtra(Intent.EXTRA_TEXT, text);
startActivity(Intent.createChooser(sharingIntent, getString(R.string.share)));
return true;
}
return super.onOptionsItemSelected(item);
}
private boolean isPackageInstalled(String packagename, Context context) {
PackageManager pm = context.getPackageManager();
try {
pm.getPackageInfo(packagename, PackageManager.GET_ACTIVITIES);
return true;
} catch (PackageManager.NameNotFoundException e) {
return false;
}
}
class SwipeFragmentPagerAdapter extends FragmentPagerAdapter {
final int PAGE_COUNT = 3;
private String tabTitles[] = new String[]{getString(R.string.download_details_page_description), getString(R.string.download_details_page_versions), getString(R.string.download_details_page_settings),};
public SwipeFragmentPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public int getCount() {
return PAGE_COUNT;
}
@Override
public Fragment getItem(int position) {
switch (position) {
case DOWNLOAD_DESCRIPTION:
return new DownloadDetailsFragment();
case DOWNLOAD_VERSIONS:
return new DownloadDetailsVersionsFragment();
case DOWNLOAD_SETTINGS:
return new DownloadDetailsSettingsFragment();
default:
return null;
}
}
@Override
public CharSequence getPageTitle(int position) {
// Generate title based on item position
return tabTitles[position];
}
}
}