Java程序  |  138行  |  3.98 KB

/*
 * Copyright (C) 2017 The Android Open Source Project
 *
 * 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 com.googlecode.android_scripting;

import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.SharedPreferences;
import android.content.DialogInterface.OnCancelListener;
import android.os.AsyncTask;
import android.preference.PreferenceManager;

import com.googlecode.android_scripting.exception.Sl4aException;
import com.googlecode.android_scripting.interpreter.InterpreterConstants;
import com.googlecode.android_scripting.interpreter.InterpreterDescriptor;
import com.googlecode.android_scripting.interpreter.InterpreterUtils;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

/**
 * AsyncTask for uninstalling interpreters.
 *
 */
public abstract class InterpreterUninstaller extends AsyncTask<Void, Void, Boolean> {

  protected final InterpreterDescriptor mDescriptor;
  protected final Context mContext;
  protected final ProgressDialog mDialog;
  protected final AsyncTaskListener<Boolean> mListener;

  protected final String mInterpreterRoot;

  public InterpreterUninstaller(InterpreterDescriptor descriptor, Context context,
      AsyncTaskListener<Boolean> listener) throws Sl4aException {

    super();

    mDescriptor = descriptor;
    mContext = context;
    mListener = listener;

    String packageName = mDescriptor.getClass().getPackage().getName();

    if (packageName.length() == 0) {
      throw new Sl4aException("Interpreter package name is empty.");
    }

    mInterpreterRoot = InterpreterConstants.SDCARD_ROOT + packageName;

    if (mDescriptor == null) {
      throw new Sl4aException("Interpreter description not provided.");
    }
    if (mDescriptor.getName() == null) {
      throw new Sl4aException("Interpreter not specified.");
    }
    if (!isInstalled()) {
      throw new Sl4aException("Interpreter not installed.");
    }

    if (context != null) {
      mDialog = new ProgressDialog(context);
    } else {
      mDialog = null;
    }
  }

  public final void execute() {
    execute(null, null, null);
  }

  @Override
  protected void onPreExecute() {
    if (mDialog != null) {
      mDialog.setMessage("Uninstalling " + mDescriptor.getNiceName());
      mDialog.setIndeterminate(true);
      mDialog.setOnCancelListener(new OnCancelListener() {
        @Override
        public void onCancel(DialogInterface dialog) {
          cancel(true);
        }
      });
      mDialog.show();
    }
  }

  @Override
  protected void onPostExecute(Boolean result) {
    if (mDialog != null && mDialog.isShowing()) {
      mDialog.dismiss();
    }
    if (result) {
      mListener.onTaskFinished(result, "Uninstallation successful.");
    } else {
      mListener.onTaskFinished(result, "Uninstallation failed.");
    }
  }

  @Override
  protected Boolean doInBackground(Void... params) {
    List<File> directories = new ArrayList<File>();

    directories.add(new File(mInterpreterRoot));

    if (mDescriptor.hasInterpreterArchive()) {
      directories.add(InterpreterUtils.getInterpreterRoot(mContext, mDescriptor.getName()));
    }

    for (File directory : directories) {
      FileUtils.delete(directory);
    }

    return cleanup();
  }

  protected boolean isInstalled() {
    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(mContext);
    return preferences.getBoolean(InterpreterConstants.INSTALLED_PREFERENCE_KEY, false);
  }

  protected abstract boolean cleanup();
}