package com.aptoide.amethyst;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.support.v4.app.Fragment;
import android.widget.Toast;
import com.aptoide.amethyst.database.AptoideDatabase;
import com.aptoide.amethyst.dialogs.AptoideDialog;
import com.aptoide.amethyst.utils.AptoideUtils;
import com.aptoide.amethyst.utils.Logger;
import com.aptoide.models.RollBackItem;
import java.io.File;
/**
* Created by brutus on 27-12-2013.
*/
public class UninstallRetainFragment extends Fragment {
private Activity activity;
private String appName;
private String packageName;
private String versionName;
private String iconPath;
private String versionToDowngrade;
private RollBackItem.Action rollBackAction;
private long id;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
Logger.d("Aptoide-Uninstaller", "Uninstalling");
Bundle args = getArguments();
if(args.containsKey( "id" )) {
id = args.getLong( "id" );
rollBackAction = RollBackItem.Action.UNINSTALLING;
} else if(args.containsKey( "downgradeVersion" ) ){
appName = args.getString( "name" );
packageName = args.getString( "package" );
versionName = args.getString( "version" );
iconPath = args.getString( "icon" );
versionToDowngrade = args.getString( "downgradeVersion" );
rollBackAction = RollBackItem.Action.DOWNGRADING;
} else {
appName = args.getString( "name" );
packageName = args.getString( "package" );
versionName = args.getString( "version" );
iconPath = args.getString( "icon" );
rollBackAction = RollBackItem.Action.UNINSTALLING;
}
new UninstallTask().execute();
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
if (context instanceof Activity) {
this.activity = (Activity) context;
}
}
@Override
public void onDetach() {
super.onDetach();
activity = null;
}
private class UninstallTask extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
super.onPreExecute();
AptoideDialog.pleaseWaitDialog().show(getFragmentManager(), "pleaseWaitDialog");
}
@Override
protected Void doInBackground(Void... params) {
AptoideDatabase db = new AptoideDatabase(Aptoide.getDb());
RollBackItem rollBackItem;
String apkMd5;
try {
if(id>0){
Cursor c = db.getApkInfo(id);
packageName = c.getString(c.getColumnIndex("package_name"));
appName = c.getString(c.getColumnIndex("name"));
versionName = c.getString(c.getColumnIndex("version_name"));
String icon = c.getString(c.getColumnIndex("icon"));
String repoIconPath = c.getString(c.getColumnIndex("iconpath"));
iconPath = repoIconPath + icon;
}
switch (rollBackAction) {
case DOWNGRADING:
apkMd5 = calcApkMd5(packageName);
rollBackItem = new RollBackItem(appName, packageName, versionToDowngrade, versionName, iconPath, null, apkMd5, null, "");
break;
default:
apkMd5 = db.getUnistallingActionMd5(packageName);
if (db.getUnistallingActionMd5(packageName) == null) {
apkMd5 = calcApkMd5(packageName);
}
rollBackItem = new RollBackItem(appName, packageName, versionName, null, iconPath, null, apkMd5, RollBackItem.Action.UNINSTALLING, "");
break;
}
db.insertRollbackAction(rollBackItem);
} catch (PackageManager.NameNotFoundException e) {
Logger.printException(e);
}
return null;
}
@Override
protected void onPostExecute(Void v) {
super.onPostExecute(v);
if (activity != null) {
if(rollBackAction == RollBackItem.Action.DOWNGRADING) {
uninstall(activity, packageName, true);
} else {
uninstall(activity, packageName, false);
}
}
if(getFragmentManager()!=null){
DialogFragment pd = (DialogFragment) getFragmentManager().findFragmentByTag("pleaseWaitDialog");
if(pd!=null){
pd.dismissAllowingStateLoss();
}
getFragmentManager().beginTransaction().remove(UninstallRetainFragment.this).commitAllowingStateLoss();
}
}
private String calcApkMd5(String packageName) throws PackageManager.NameNotFoundException {
String sourceDir = activity.getPackageManager().getPackageInfo(packageName, 0).applicationInfo.sourceDir;
File apkFile = new File(sourceDir);
return AptoideUtils.Algorithms.md5Calc(apkFile);
}
}
public static void uninstall(Activity context, String package_name, boolean isDowngrade) {
Uri uri = Uri.fromParts("package", package_name, null);
Intent intent = new Intent(Intent.ACTION_DELETE, uri);
if (!package_name.equals(context.getPackageName())) {
if (isDowngrade) {
context.startActivityForResult(intent, AppViewActivity.DOWNGRADE_REQUEST_CODE);
// FlurryAgent.logEvent("Rollback_Downgraded_App");
} else {
context.startActivity(intent);
}
} else {
Toast.makeText(context, context.getString(R.string.cannot_uninstall_self), Toast.LENGTH_LONG).show();
}
}
}