1 /*
2  * Copyright (C) 2017 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.googlecode.android_scripting.activity;
18 
19 import android.app.ListActivity;
20 import android.content.Context;
21 import android.content.Intent;
22 import android.database.DataSetObserver;
23 import android.os.Bundle;
24 import android.os.Parcelable;
25 import android.view.LayoutInflater;
26 import android.view.View;
27 import android.view.ViewGroup;
28 import android.widget.BaseAdapter;
29 import android.widget.ImageView;
30 import android.widget.LinearLayout;
31 import android.widget.ListView;
32 import android.widget.TextView;
33 
34 import com.googlecode.android_scripting.BaseApplication;
35 import com.googlecode.android_scripting.FeaturedInterpreters;
36 import com.googlecode.android_scripting.IntentBuilders;
37 import com.googlecode.android_scripting.R;
38 import com.googlecode.android_scripting.interpreter.Interpreter;
39 import com.googlecode.android_scripting.interpreter.InterpreterConfiguration;
40 import com.googlecode.android_scripting.interpreter.InterpreterConfiguration.ConfigurationObserver;
41 
42 import java.util.List;
43 
44 /**
45  * Presents available scripts and returns the selected one.
46  *
47  */
48 public class InterpreterPicker extends ListActivity {
49 
50   private List<Interpreter> mInterpreters;
51   private InterpreterPickerAdapter mAdapter;
52   private InterpreterConfiguration mConfiguration;
53   private ScriptListObserver mObserver;
54 
55   @Override
onCreate(Bundle savedInstanceState)56   public void onCreate(Bundle savedInstanceState) {
57     super.onCreate(savedInstanceState);
58     CustomizeWindow.requestCustomTitle(this, "Interpreters", R.layout.script_manager);
59     mObserver = new ScriptListObserver();
60     mConfiguration = ((BaseApplication) getApplication()).getInterpreterConfiguration();
61     mInterpreters = mConfiguration.getInteractiveInterpreters();
62     mConfiguration.registerObserver(mObserver);
63     mAdapter = new InterpreterPickerAdapter();
64     mAdapter.registerDataSetObserver(mObserver);
65     setListAdapter(mAdapter);
66   }
67 
68   @Override
onListItemClick(ListView list, View view, int position, long id)69   protected void onListItemClick(ListView list, View view, int position, long id) {
70     final Interpreter interpreter = (Interpreter) list.getItemAtPosition(position);
71     if (Intent.ACTION_CREATE_SHORTCUT.equals(getIntent().getAction())) {
72       int icon =
73           FeaturedInterpreters.getInterpreterIcon(InterpreterPicker.this, interpreter
74               .getExtension());
75       if (icon == 0) {
76         icon = R.drawable.sl4a_logo_48;
77       }
78       Parcelable iconResource =
79           Intent.ShortcutIconResource.fromContext(InterpreterPicker.this, icon);
80       Intent intent = IntentBuilders.buildInterpreterShortcutIntent(interpreter, iconResource);
81       setResult(RESULT_OK, intent);
82     }
83     finish();
84   }
85 
86   @Override
onDestroy()87   protected void onDestroy() {
88     super.onDestroy();
89     mConfiguration.unregisterObserver(mObserver);
90   }
91 
92   private class ScriptListObserver extends DataSetObserver implements ConfigurationObserver {
93     @Override
onInvalidated()94     public void onInvalidated() {
95       mInterpreters = mConfiguration.getInteractiveInterpreters();
96     }
97 
98     @Override
onConfigurationChanged()99     public void onConfigurationChanged() {
100       mAdapter.notifyDataSetInvalidated();
101     }
102   }
103 
104   private class InterpreterPickerAdapter extends BaseAdapter {
105 
106     @Override
getCount()107     public int getCount() {
108       return mInterpreters.size();
109     }
110 
111     @Override
getItem(int position)112     public Object getItem(int position) {
113       return mInterpreters.get(position);
114     }
115 
116     @Override
getItemId(int position)117     public long getItemId(int position) {
118       return position;
119     }
120 
121     @Override
getView(int position, View convertView, ViewGroup parent)122     public View getView(int position, View convertView, ViewGroup parent) {
123       LinearLayout container;
124 
125       Interpreter interpreter = mInterpreters.get(position);
126 
127       if (convertView == null) {
128         LayoutInflater inflater =
129             (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
130         container = (LinearLayout) inflater.inflate(R.layout.list_item, null);
131       } else {
132         container = (LinearLayout) convertView;
133       }
134       ImageView img = (ImageView) container.findViewById(R.id.list_item_icon);
135 
136       int imgId =
137           FeaturedInterpreters.getInterpreterIcon(InterpreterPicker.this, interpreter
138               .getExtension());
139       if (imgId == 0) {
140         imgId = R.drawable.sl4a_logo_32;
141       }
142 
143       img.setImageResource(imgId);
144 
145       TextView text = (TextView) container.findViewById(R.id.list_item_title);
146 
147       text.setText(interpreter.getNiceName());
148       return container;
149     }
150   }
151 }
152