19f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li/*
2f04335f899f2cce69f843692a3cb9cec229683c2tturney * Copyright (C) 2017 The Android Open Source Project
39f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li *
4f04335f899f2cce69f843692a3cb9cec229683c2tturney * Licensed under the Apache License, Version 2.0 (the "License");
5f04335f899f2cce69f843692a3cb9cec229683c2tturney * you may not use this file except in compliance with the License.
6f04335f899f2cce69f843692a3cb9cec229683c2tturney * You may obtain a copy of the License at
79f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li *
8f04335f899f2cce69f843692a3cb9cec229683c2tturney *      http://www.apache.org/licenses/LICENSE-2.0
99f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li *
109f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li * Unless required by applicable law or agreed to in writing, software
11f04335f899f2cce69f843692a3cb9cec229683c2tturney * distributed under the License is distributed on an "AS IS" BASIS,
12f04335f899f2cce69f843692a3cb9cec229683c2tturney * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f04335f899f2cce69f843692a3cb9cec229683c2tturney * See the License for the specific language governing permissions and
14f04335f899f2cce69f843692a3cb9cec229683c2tturney * limitations under the License.
159f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li */
169f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
179f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Lipackage com.googlecode.android_scripting;
189f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
199f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Liimport android.content.Context;
209f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
219f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Liimport java.net.MalformedURLException;
229f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Liimport java.net.URL;
239f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Liimport java.util.ArrayList;
249f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Liimport java.util.Collections;
259f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Liimport java.util.HashMap;
269f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Liimport java.util.List;
279f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Liimport java.util.Map;
289f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
299f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Lipublic class FeaturedInterpreters {
309f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  private static final Map<String, FeaturedInterpreter> mNameMap =
319f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li      new HashMap<String, FeaturedInterpreter>();
329f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  private static final Map<String, FeaturedInterpreter> mExtensionMap =
339f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li      new HashMap<String, FeaturedInterpreter>();
349f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
359f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  static {
369f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    try {
379f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li      FeaturedInterpreter interpreters[] =
389f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li          {
399f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li            new FeaturedInterpreter("BeanShell 2.0b4", ".bsh",
409f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li                "http://android-scripting.googlecode.com/files/beanshell_for_android_r2.apk"),
419f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li            new FeaturedInterpreter("JRuby", ".rb",
429f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li                "https://github.com/downloads/ruboto/sl4a_jruby_interpreter/JRubyForAndroid_r2dev.apk"),
439f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li            new FeaturedInterpreter("Lua 5.1.4", ".lua",
449f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li                "http://android-scripting.googlecode.com/files/lua_for_android_r1.apk"),
459f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li            new FeaturedInterpreter("Perl 5.10.1", ".pl",
469f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li                "http://android-scripting.googlecode.com/files/perl_for_android_r1.apk"),
479f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li            new FeaturedInterpreter("Python 2.6.2", ".py",
489f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li                "http://python-for-android.googlecode.com/files/PythonForAndroid_r5.apk"),
499f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li            new FeaturedInterpreter("Rhino 1.7R2", ".js",
509f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li                "http://android-scripting.googlecode.com/files/rhino_for_android_r2.apk"),
519f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li            new FeaturedInterpreter("PHP 5.3.3", ".php",
529f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li                "http://php-for-android.googlecode.com/files/phpforandroid_r1.apk") };
539f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li      for (FeaturedInterpreter interpreter : interpreters) {
549f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li        mNameMap.put(interpreter.mmName, interpreter);
559f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li        mExtensionMap.put(interpreter.mmExtension, interpreter);
569f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li      }
579f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    } catch (MalformedURLException e) {
589f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li      Log.e(e);
599f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    }
609f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  }
619f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
629f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  public static List<String> getList() {
639f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    ArrayList<String> list = new ArrayList<String>(mNameMap.keySet());
649f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    Collections.sort(list);
659f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    return list;
669f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  }
679f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
689f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  public static URL getUrlForName(String name) {
699f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    if (!mNameMap.containsKey(name)) {
709f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li      return null;
719f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    }
729f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    return mNameMap.get(name).mmUrl;
739f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  }
749f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
759f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  public static String getInterpreterNameForScript(String fileName) {
769f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    String extension = getExtension(fileName);
779f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    if (extension == null || !mExtensionMap.containsKey(extension)) {
789f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li      return null;
799f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    }
809f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    return mExtensionMap.get(extension).mmName;
819f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  }
829f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
839f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  public static boolean isSupported(String fileName) {
849f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    String extension = getExtension(fileName);
859f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    return (extension != null) && (mExtensionMap.containsKey(extension));
869f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  }
879f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
889f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  public static int getInterpreterIcon(Context context, String key) {
899f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    String packageName = context.getPackageName();
909f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    String name = "_icon";
919f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    if (key.contains(".")) {
929f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li      name = key.substring(key.lastIndexOf('.') + 1) + name;
939f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    } else {
949f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li      name = key + name;
959f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    }
969f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    return context.getResources().getIdentifier(name, "drawable", packageName);
979f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  }
989f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
999f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  private static String getExtension(String fileName) {
1009f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    int dotIndex = fileName.lastIndexOf('.');
1019f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    if (dotIndex == -1) {
1029f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li      return null;
1039f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    }
1049f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    return fileName.substring(dotIndex);
1059f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  }
1069f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
1079f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  private static class FeaturedInterpreter {
1089f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    private final String mmName;
1099f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    private final String mmExtension;
1109f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    private final URL mmUrl;
1119f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
1129f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    private FeaturedInterpreter(String name, String extension, String url)
1139f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li        throws MalformedURLException {
1149f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li      mmName = name;
1159f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li      mmExtension = extension;
1169f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li      mmUrl = new URL(url);
1179f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    }
1189f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  }
1199f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
1209f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li}
121