/* * 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.activity; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.net.Uri; import android.os.Bundle; import android.preference.PreferenceManager; import android.view.Gravity; import android.view.View; import android.view.Window; import android.view.View.OnClickListener; import android.view.ViewGroup.LayoutParams; import android.view.ViewGroup.MarginLayoutParams; import android.widget.Button; import android.widget.LinearLayout; import com.googlecode.android_scripting.AsyncTaskListener; import com.googlecode.android_scripting.InterpreterInstaller; import com.googlecode.android_scripting.InterpreterUninstaller; import com.googlecode.android_scripting.Log; import com.googlecode.android_scripting.exception.Sl4aException; import com.googlecode.android_scripting.interpreter.InterpreterConstants; import com.googlecode.android_scripting.interpreter.InterpreterDescriptor; /** * Base activity for distributing interpreters as APK's. * */ public abstract class Main extends Activity { protected final static float MARGIN_DIP = 3.0f; protected final String mId = getClass().getPackage().getName(); protected SharedPreferences mPreferences; protected InterpreterDescriptor mDescriptor; protected Button mButton; protected LinearLayout mLayout; protected abstract InterpreterDescriptor getDescriptor(); protected abstract InterpreterInstaller getInterpreterInstaller(InterpreterDescriptor descriptor, Context context, AsyncTaskListener listener) throws Sl4aException; protected abstract InterpreterUninstaller getInterpreterUninstaller( InterpreterDescriptor descriptor, Context context, AsyncTaskListener listener) throws Sl4aException; protected enum RunningTask { INSTALL, UNINSTALL } protected volatile RunningTask mCurrentTask = null; protected final AsyncTaskListener mTaskListener = new AsyncTaskListener() { @Override public void onTaskFinished(Boolean result, String message) { getWindow().setFeatureInt(Window.FEATURE_INDETERMINATE_PROGRESS, Window.PROGRESS_VISIBILITY_OFF); if (result) { switch (mCurrentTask) { case INSTALL: setInstalled(true); prepareUninstallButton(); break; case UNINSTALL: setInstalled(false); prepareInstallButton(); break; } } Log.v(Main.this, message); mCurrentTask = null; } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mPreferences = PreferenceManager.getDefaultSharedPreferences(this); mDescriptor = getDescriptor(); requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); initializeViews(); if (checkInstalled()) { prepareUninstallButton(); } else { prepareInstallButton(); } } @Override protected void onStop() { super.onStop(); finish(); } // TODO(alexey): Pull out to a layout XML? protected void initializeViews() { mLayout = new LinearLayout(this); mLayout.setOrientation(LinearLayout.VERTICAL); mLayout.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); mLayout.setGravity(Gravity.CENTER_HORIZONTAL); mButton = new Button(this); MarginLayoutParams marginParams = new MarginLayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); final float scale = getResources().getDisplayMetrics().density; int marginPixels = (int) (MARGIN_DIP * scale + 0.5f); marginParams.setMargins(marginPixels, marginPixels, marginPixels, marginPixels); mButton.setLayoutParams(marginParams); mLayout.addView(mButton); setContentView(mLayout); } protected void prepareInstallButton() { mButton.setText("Install"); mButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { install(); } }); } protected void prepareUninstallButton() { mButton.setText("Uninstall"); mButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { uninstall(); } }); } protected void broadcastInstallationStateChange(boolean isInterpreterInstalled) { Intent intent = new Intent(); intent.setData(Uri.parse("package:" + mId)); if (isInterpreterInstalled) { intent.setAction(InterpreterConstants.ACTION_INTERPRETER_ADDED); } else { intent.setAction(InterpreterConstants.ACTION_INTERPRETER_REMOVED); } sendBroadcast(intent); } protected synchronized void install() { if (mCurrentTask != null) { return; } getWindow().setFeatureInt(Window.FEATURE_INDETERMINATE_PROGRESS, Window.PROGRESS_VISIBILITY_ON); mCurrentTask = RunningTask.INSTALL; InterpreterInstaller installTask; try { installTask = getInterpreterInstaller(mDescriptor, Main.this, mTaskListener); } catch (Sl4aException e) { Log.e(this, e.getMessage(), e); return; } installTask.execute(); } protected synchronized void uninstall() { if (mCurrentTask != null) { return; } getWindow().setFeatureInt(Window.FEATURE_INDETERMINATE_PROGRESS, Window.PROGRESS_VISIBILITY_ON); mCurrentTask = RunningTask.UNINSTALL; InterpreterUninstaller uninstallTask; try { uninstallTask = getInterpreterUninstaller(mDescriptor, Main.this, mTaskListener); } catch (Sl4aException e) { Log.e(this, e.getMessage(), e); return; } uninstallTask.execute(); } protected void setInstalled(boolean isInstalled) { SharedPreferences.Editor editor = mPreferences.edit(); editor.putBoolean(InterpreterConstants.INSTALLED_PREFERENCE_KEY, isInstalled); editor.commit(); broadcastInstallationStateChange(isInstalled); } protected boolean checkInstalled() { boolean isInstalled = mPreferences.getBoolean(InterpreterConstants.INSTALLED_PREFERENCE_KEY, false); broadcastInstallationStateChange(isInstalled); return isInstalled; } public LinearLayout getLayout() { return mLayout; } }