package com.aptoide.amethyst.receivers; import android.app.ProgressDialog; import android.content.DialogInterface; import android.content.Intent; import android.os.AsyncTask; import android.os.Bundle; import android.text.TextUtils; import android.util.Log; import android.widget.Toast; import com.aptoide.amethyst.Aptoide; import com.aptoide.amethyst.AptoideBaseActivity; import com.aptoide.amethyst.R; import com.aptoide.amethyst.analytics.Analytics; import com.aptoide.amethyst.database.AptoideDatabase; import com.aptoide.amethyst.utils.AptoideUtils; import com.aptoide.amethyst.utils.Base64; import com.aptoide.amethyst.utils.Logger; import com.aptoide.amethyst.xml.XmlAppHandler; import com.aptoide.dataprovider.webservices.models.Constants; import com.aptoide.models.ApkSuggestionJson; import com.fasterxml.jackson.databind.ObjectMapper; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.XMLReader; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.StringReader; import java.io.UnsupportedEncodingException; import java.net.URI; import java.net.URL; import java.net.URLConnection; import java.net.URLDecoder; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import com.aptoide.amethyst.AppViewActivity; import com.aptoide.amethyst.MainActivity; import com.aptoide.amethyst.SearchActivity; import com.aptoide.amethyst.ui.SearchManager; /** * Created with IntelliJ IDEA. * User: rmateus * Date: 10-10-2013 * Time: 17:59 * To change this template use File | Settings | File Templates. */ public class IntentReceiver extends AptoideBaseActivity implements DialogInterface.OnDismissListener { private ArrayList<String> server; private String TMP_MYAPP_FILE; private HashMap<String, String> app; private final AptoideDatabase db = new AptoideDatabase(Aptoide.getDb()); private AsyncTask<String, Void, Void> asyncTask; // private DownloadService service; // private Class startClass = Aptoide.getConfiguration().getStartActivityClass(); // private Class appViewClass = Aptoide.getConfiguration().getAppViewActivityClass(); private Class startClass = MainActivity.class; private Class appViewClass = AppViewActivity.class; private Class searchManagerClass = SearchManager.class; // private ServiceConnection downloadConnection = new ServiceConnection() { // @Override // public void onServiceConnected(ComponentName name, IBinder downloadService) { //// service = ((DownloadService.LocalBinder) downloadService).getService(); // // try { // continueLoading(); // } catch (Exception e) { // Logger.printException(e); // finish(); // } // } // // @Override // public void onServiceDisconnected(ComponentName name) { // // } // }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // bindService(new Intent(this, DownloadService.class), downloadConnection, BIND_AUTO_CREATE); continueLoading(); } @Override protected void onDestroy() { super.onDestroy(); if (asyncTask != null) { asyncTask.cancel(true); } // unbindService(downloadConnection); } @Override public void onDismiss(DialogInterface dialog) { proceed(); } private void proceed() { if (server != null) { startActivityWithRepo(server); } else { Toast.makeText(this, getString(R.string.error_occured), Toast.LENGTH_LONG).show(); finish(); } } private void continueLoading() { TMP_MYAPP_FILE = getCacheDir() + "/myapp.myapp"; String uri = getIntent().getDataString(); Analytics.ApplicationLaunch.website(uri); if (uri.startsWith("aptoiderepo")) { ArrayList<String> repo = new ArrayList<>(); repo.add(uri.substring(14)); startActivityWithRepo(repo); } else if (uri.startsWith("aptoidexml")) { String repo = uri.substring(13); parseXmlString(repo); Intent i = new Intent(IntentReceiver.this, startClass); i.putExtra("newrepo", repo); i.addFlags(Constants.NEW_REPO_FLAG); startActivity(i); finish(); } else if (uri.startsWith("aptoidesearch://")) { startIntentFromPackageName(uri.split("aptoidesearch://")[1]); } else if (uri.startsWith("aptoidevoicesearch://")) { aptoidevoiceSearch(uri.split("aptoidevoicesearch://")[1]); } else if (uri.startsWith("market")) { String params = uri.split("&")[0]; String param = params.split("=")[1]; if (param.contains("pname:")) { param = param.substring(6); } else if (param.contains("pub:")) { param = param.substring(4); } startIntentFromPackageName(param); } else if (uri.startsWith("http://market.android.com/details?id=")) { String param = uri.split("=")[1]; startIntentFromPackageName(param); } else if (uri.startsWith("https://market.android.com/details?id=")) { String param = uri.split("=")[1]; startIntentFromPackageName(param); } else if (uri.startsWith("https://play.google.com/store/apps/details?id=")) { String params = uri.split("&")[0]; String param = params.split("=")[1]; if (param.contains("pname:")) { param = param.substring(6); } else if (param.contains("pub:")) { param = param.substring(4); } startIntentFromPackageName(param); } else if (uri.contains("aptword://")) { String param = uri.substring("aptword://".length()); if (!TextUtils.isEmpty(param)) { param = param.replaceAll("\\*", "_").replaceAll("\\+", "/"); String json = new String(Base64.decode(param.getBytes(), 0)); Log.d("AptoideAptWord", json); ApkSuggestionJson.Ads ad = null; try { ad = new ObjectMapper().readValue(json, ApkSuggestionJson.Ads.class); } catch (IOException e) { Logger.printException(e); } if (ad != null) { Intent i = new Intent(this, appViewClass); long id = ad.data.id.longValue(); i.putExtra(Constants.APP_ID_KEY, id); i.putExtra("packageName", ad.data.packageName); i.putExtra("repoName", ad.data.repo); i.putExtra("fromSponsored", true); i.putExtra("location", "homepage"); i.putExtra("keyword", "__NULL__"); i.putExtra("cpc", ad.info.cpc_url); i.putExtra("cpi", ad.info.cpi_url); i.putExtra("whereFrom", "sponsored"); i.putExtra("download_from", "sponsored"); if (ad.partner != null) { Bundle bundle = new Bundle(); bundle.putString("partnerType", ad.partner.partnerInfo.name); bundle.putString("partnerClickUrl", ad.partner.partnerData.click_url); i.putExtra("partnerExtra", bundle); } startActivity(i); } finish(); } } else if (uri.contains("imgs.aptoide.com")) { String[] strings = uri.split("-"); long id = Long.parseLong(strings[strings.length - 1].split("\\.myapp")[0]); startFromMyApp(id); finish(); } else if (uri.startsWith("http://webservices.aptoide.com")) { /** refactored to remove org.apache libs */ Map<String, String> params = null; try { params = AptoideUtils.StringUtils.splitQuery(URI.create(uri)); } catch (UnsupportedEncodingException e) { Logger.printException(e); } if (params != null) { String uid = null; for (Map.Entry<String, String> entry : params.entrySet()) { if (entry.getKey().equals("uid")) { uid = entry.getValue(); } } if (uid != null) { try { long id = Long.parseLong(uid); startFromMyApp(id); } catch (NumberFormatException e) { Logger.printException(e); Toast.makeText(getApplicationContext(), R.string.simple_error_occured + uid, Toast.LENGTH_LONG).show(); } } } finish(); } else if (uri.startsWith("file://")) { downloadMyApp(); } else if (uri.startsWith("aptoideinstall://")) { try { long id = Long.parseLong(uri.substring("aptoideinstall://".length())); startFromMyApp(id); } catch (NumberFormatException e) { Logger.printException(e); } finish(); } else if (uri.startsWith("aptwords://")) { String parsedString = uri.substring("aptwords://".length()); String[] splitString = parsedString.split("/"); long id = Long.parseLong(splitString[0]); String cpi = splitString[1]; try { cpi = URLDecoder.decode(cpi, "UTF-8"); } catch (UnsupportedEncodingException e) { Logger.printException(e); } Intent i = new Intent(this, appViewClass); i.putExtra(Constants.FROM_MY_APP_KEY, true); i.putExtra(Constants.APP_ID_KEY, id); i.putExtra("cpi", cpi); i.putExtra("download_from", "my_app_with_cpi"); startActivity(i); finish(); } else { finish(); } } public void startFromMyApp(long id) { Intent i = new Intent(this, appViewClass); i.putExtra(Constants.FROM_MY_APP_KEY, true); i.putExtra(Constants.APP_ID_KEY, id); i.putExtra("download_from", "my_app"); startActivity(i); } public void startActivityWithRepo(ArrayList<String> repo) { Intent i = new Intent(IntentReceiver.this, startClass); i.putExtra("newrepo", repo); i.addFlags(Constants.NEW_REPO_FLAG); startActivity(i); Analytics.ApplicationLaunch.newRepo(); finish(); } private void downloadMyApp() { asyncTask = new MyAppDownloader().execute(getIntent().getDataString()); } private void downloadMyappFile(String myappUri) throws Exception { try { URL url = new URL(myappUri); URLConnection connection; if (!myappUri.startsWith("file://")) { connection = url.openConnection(); connection.setReadTimeout(5000); connection.setConnectTimeout(5000); } else { connection = url.openConnection(); } BufferedInputStream getit = new BufferedInputStream(connection.getInputStream(), 1024); File file_teste = new File(TMP_MYAPP_FILE); if (file_teste.exists()) file_teste.delete(); FileOutputStream saveit = new FileOutputStream(TMP_MYAPP_FILE); BufferedOutputStream bout = new BufferedOutputStream(saveit, 1024); byte data[] = new byte[1024]; int readed = getit.read(data, 0, 1024); while (readed != -1) { bout.write(data, 0, readed); readed = getit.read(data, 0, 1024); } bout.close(); getit.close(); saveit.close(); } catch (Exception e) { Logger.printException(e); } } private void parseXmlMyapp(String file) throws Exception { try { SAXParserFactory spf = SAXParserFactory.newInstance(); SAXParser sp = spf.newSAXParser(); XmlAppHandler handler = new XmlAppHandler(); sp.parse(new File(file), handler); server = handler.getServers(); app = handler.getApp(); } catch (IOException | SAXException | ParserConfigurationException e) { Logger.printException(e); } } private void parseXmlString(String file) { try { SAXParserFactory spf = SAXParserFactory.newInstance(); SAXParser sp = spf.newSAXParser(); XMLReader xr = sp.getXMLReader(); XmlAppHandler handler = new XmlAppHandler(); xr.setContentHandler(handler); InputSource is = new InputSource(); is.setCharacterStream(new StringReader(file)); xr.parse(is); server = handler.getServers(); app = handler.getApp(); } catch (IOException | SAXException | ParserConfigurationException e) { Logger.printException(e); } } public void aptoidevoiceSearch(String param) { // TODO: voiceSearch was used by a foreign app, dunno if still used. // Cursor c = new AptoideDatabase(Aptoide.getDb()).getSearchResults(param, StoreActivity.Sort.DOWNLOADS); // // ArrayList<String> namelist = new ArrayList<String>(); // ArrayList<Long> idlist = new ArrayList<Long>(); // // for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) { // namelist.add(c.getString(c.getColumnIndex("name"))); // idlist.add(c.getLong(c.getColumnIndex("_id"))); // } // // Intent i = new Intent(); // i.putStringArrayListExtra("namelist", namelist); // i.putExtra("idlist", AptoideUtils.longListToLongArray(idlist)); // // setResult(UNKONWN_FLAG, i); finish(); } // public void startIntentFromPackageName(String param) { // long id = db.getApkFromPackage(param); // Intent i; // if (id > 0) { // i = new Intent(this, appViewClass); // i.putExtra(Constants.APP_ID_KEY, id); // i.putExtra("download_from", "market_intent"); // } else { // i = new Intent(this, searchManagerClass); // i.putExtra("search", param); // } // // startActivity(i); // finish(); // } public void startIntentFromPackageName(String packageName) { Intent i; if (AptoideUtils.AppUtils.isAppInstalled(this, packageName)) { i = new Intent(this, appViewClass); i.putExtra(Constants.MARKET_INTENT, true); i.putExtra(Constants.PACKAGENAME_KEY, packageName); } else { i = new Intent(this, SearchActivity.class); i.putExtra(android.app.SearchManager.QUERY, packageName); // i.putExtra("search", packageName); } startActivity(i); finish(); } class MyAppDownloader extends AsyncTask<String, Void, Void> { ProgressDialog pd; @Override protected void onPreExecute() { super.onPreExecute(); pd = new ProgressDialog(IntentReceiver.this); pd.show(); pd.setCancelable(false); pd.setMessage(getString(R.string.please_wait)); } @Override protected Void doInBackground(String... params) { try { downloadMyappFile(params[0]); parseXmlMyapp(TMP_MYAPP_FILE); } catch (Exception e) { Logger.printException(e); } return null; } @Override protected void onPostExecute(Void aVoid) { super.onPostExecute(aVoid); if (pd.isShowing() && !isFinishing()) pd.dismiss(); if (app != null && !app.isEmpty()) { /** never worked... */ // AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(IntentReceiver.this); // final AlertDialog installAppDialog = dialogBuilder.create(); //// installAppDialog.setTitle(ApplicationAptoide.MARKETNAME); // installAppDialog.setIcon(android.R.drawable.ic_menu_more); // installAppDialog.setCancelable(false); // // // installAppDialog.setMessage(getString(R.string.installapp_alrt) + app.get("name") + "?"); // // installAppDialog.setButton(Dialog.BUTTON_POSITIVE, getString(android.R.string.yes), new Dialog.OnClickListener() { // @Override // public void onClick(DialogInterface arg0, int arg1) { //// Download download = new Download(); //// Log.d("Aptoide-IntentReceiver", "getapk id: " + id); //// download.setId(id); //// ((Start)getApplicationContext()).installApp(0); // // Toast toast = Toast.makeText(IntentReceiver.this, getString(R.string.starting_download), Toast.LENGTH_SHORT); // toast.show(); // } // }); // // installAppDialog.setButton(Dialog.BUTTON_NEGATIVE, getString(android.R.string.no), neutralListener); // installAppDialog.setOnDismissListener(IntentReceiver.this); // installAppDialog.show(); } else { proceed(); } } } @Override protected String getScreenName() { return null; } }