/* * 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.AlertDialog; import android.app.ListActivity; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.content.Intent; import android.content.SharedPreferences; import android.database.DataSetObserver; import android.net.Uri; import android.os.Bundle; import android.preference.PreferenceManager; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.SubMenu; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.TextView; import com.googlecode.android_scripting.ActivityFlinger; import com.googlecode.android_scripting.BaseApplication; import com.googlecode.android_scripting.Constants; import com.googlecode.android_scripting.FeaturedInterpreters; import com.googlecode.android_scripting.R; import com.googlecode.android_scripting.interpreter.Interpreter; import com.googlecode.android_scripting.interpreter.InterpreterConfiguration; import com.googlecode.android_scripting.interpreter.InterpreterConfiguration.ConfigurationObserver; import java.net.URL; import java.util.ArrayList; import java.util.List; public class InterpreterManager extends ListActivity { private InterpreterManagerAdapter mAdapter; private InterpreterListObserver mObserver; private List mInterpreters; private List mFeaturedInterpreters; private InterpreterConfiguration mConfiguration; private SharedPreferences mPreferences; private static enum MenuId { HELP, ADD, NETWORK, PREFERENCES; public int getId() { return ordinal() + Menu.FIRST; } } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); CustomizeWindow.requestCustomTitle(this, "Interpreters", R.layout.interpreter_manager); mConfiguration = ((BaseApplication) getApplication()).getInterpreterConfiguration(); mInterpreters = new ArrayList(); mAdapter = new InterpreterManagerAdapter(); mObserver = new InterpreterListObserver(); mAdapter.registerDataSetObserver(mObserver); setListAdapter(mAdapter); ActivityFlinger.attachView(getListView(), this); ActivityFlinger.attachView(getWindow().getDecorView(), this); mFeaturedInterpreters = FeaturedInterpreters.getList(); mPreferences = PreferenceManager.getDefaultSharedPreferences(this); } @Override public void onStart() { super.onStart(); mConfiguration.registerObserver(mObserver); mAdapter.notifyDataSetInvalidated(); } @Override protected void onResume() { super.onResume(); mAdapter.notifyDataSetInvalidated(); } @Override public void onStop() { super.onStop(); mConfiguration.unregisterObserver(mObserver); } @Override public boolean onPrepareOptionsMenu(Menu menu) { menu.clear(); buildInstallLanguagesMenu(menu); menu.add(Menu.NONE, MenuId.NETWORK.getId(), Menu.NONE, "Start Server").setIcon( android.R.drawable.ic_menu_share); menu.add(Menu.NONE, MenuId.PREFERENCES.getId(), Menu.NONE, "Preferences").setIcon( android.R.drawable.ic_menu_preferences); return super.onPrepareOptionsMenu(menu); } private void buildInstallLanguagesMenu(Menu menu) { SubMenu installMenu = menu.addSubMenu(Menu.NONE, MenuId.ADD.getId(), Menu.NONE, "Add").setIcon( android.R.drawable.ic_menu_add); int i = MenuId.values().length + Menu.FIRST; for (String interpreterName : mFeaturedInterpreters) { installMenu.add(Menu.NONE, i++, Menu.NONE, interpreterName); } } @Override public boolean onOptionsItemSelected(MenuItem item) { int itemId = item.getItemId(); if (itemId == MenuId.NETWORK.getId()) { AlertDialog.Builder dialog = new AlertDialog.Builder(this); dialog.setItems(new CharSequence[] { "Public", "Private" }, new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { launchService(which == 0 /* usePublicIp */); } }); dialog.show(); } else if (itemId == MenuId.PREFERENCES.getId()) { startActivity(new Intent(this, Preferences.class)); } else if (itemId >= MenuId.values().length + Menu.FIRST) { int i = itemId - MenuId.values().length - Menu.FIRST; if (i < mFeaturedInterpreters.size()) { URL url = FeaturedInterpreters.getUrlForName(mFeaturedInterpreters.get(i)); Intent viewIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url.toString())); startActivity(viewIntent); } } return true; } private int getPrefInt(String key, int defaultValue) { int result = defaultValue; String value = mPreferences.getString(key, null); if (value != null) { try { result = Integer.parseInt(value); } catch (NumberFormatException e) { result = defaultValue; } } return result; } private void launchService(boolean usePublicIp) { Intent intent = new Intent(this, ScriptingLayerService.class); intent.setAction(Constants.ACTION_LAUNCH_SERVER); intent.putExtra(Constants.EXTRA_USE_EXTERNAL_IP, usePublicIp); intent.putExtra(Constants.EXTRA_USE_SERVICE_PORT, getPrefInt("use_service_port", 0)); startService(intent); } private void launchTerminal(Interpreter interpreter) { Intent intent = new Intent(this, ScriptingLayerService.class); intent.setAction(Constants.ACTION_LAUNCH_INTERPRETER); intent.putExtra(Constants.EXTRA_INTERPRETER_NAME, interpreter.getName()); startService(intent); } @Override protected void onListItemClick(ListView list, View view, int position, long id) { Interpreter interpreter = (Interpreter) list.getItemAtPosition(position); launchTerminal(interpreter); } @Override public void onDestroy() { super.onDestroy(); mConfiguration.unregisterObserver(mObserver); } private class InterpreterListObserver extends DataSetObserver implements ConfigurationObserver { @Override public void onInvalidated() { mInterpreters = mConfiguration.getInteractiveInterpreters(); } @Override public void onChanged() { mInterpreters = mConfiguration.getInteractiveInterpreters(); } @Override public void onConfigurationChanged() { runOnUiThread(new Runnable() { @Override public void run() { mAdapter.notifyDataSetChanged(); } }); } } private class InterpreterManagerAdapter extends BaseAdapter { @Override public int getCount() { return mInterpreters.size(); } @Override public Object getItem(int position) { return mInterpreters.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { LinearLayout container; Interpreter interpreter = mInterpreters.get(position); if (convertView == null) { LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); container = (LinearLayout) inflater.inflate(R.layout.list_item, null); } else { container = (LinearLayout) convertView; } ImageView img = (ImageView) container.findViewById(R.id.list_item_icon); int imgId = FeaturedInterpreters.getInterpreterIcon(InterpreterManager.this, interpreter.getExtension()); if (imgId == 0) { imgId = R.drawable.sl4a_logo_32; } img.setImageResource(imgId); TextView text = (TextView) container.findViewById(R.id.list_item_title); text.setText(interpreter.getNiceName()); return container; } } }