| /* |
| * Copyright (C) 2016 Google Inc. |
| * |
| * 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<Interpreter> mInterpreters; |
| private List<String> 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<Interpreter>(); |
| 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; |
| } |
| } |
| } |