/*
* Copyright (C) 2012 Steven Luo
*
* 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.adblog.term;
import java.util.UUID;
import com.adblog.util.SessionList;
import com.adblog.util.TermSettings;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.os.IBinder;
import android.preference.PreferenceManager;
import android.util.Log;
import jackpal.androidterm.emulatorview.TermSession;
public class RemoteInterface extends Activity {
private static final String ACTION_OPEN_NEW_WINDOW = "jackpal.androidterm.OPEN_NEW_WINDOW";
private static final String ACTION_RUN_SCRIPT = "jackpal.androidterm.RUN_SCRIPT";
static final String PRIVACT_OPEN_NEW_WINDOW = "jackpal.androidterm.private.OPEN_NEW_WINDOW";
static final String PRIVACT_SWITCH_WINDOW = "jackpal.androidterm.private.SWITCH_WINDOW";
private static final String EXTRA_WINDOW_HANDLE = "jackpal.androidterm.window_handle";
private static final String EXTRA_INITIAL_COMMAND = "jackpal.androidterm.iInitialCommand";
static final String PRIVEXTRA_TARGET_WINDOW = "jackpal.androidterm.private.target_window";
private TermSettings mSettings;
private TermService mTermService;
private ServiceConnection mTSConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className, IBinder service) {
TermService.TSBinder binder = (TermService.TSBinder) service;
mTermService = binder.getService();
handleIntent();
}
public void onServiceDisconnected(ComponentName className) {
mTermService = null;
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
mSettings = new TermSettings(getResources(), prefs);
Intent TSIntent = new Intent(this, TermService.class);
startService(TSIntent);
if (!bindService(TSIntent, mTSConnection, BIND_AUTO_CREATE)) {
Log.e(TermDebug.LOG_TAG, "bind to service failed!");
finish();
}
}
private void handleIntent() {
TermService service = mTermService;
if (service == null) {
finish();
return;
}
Intent myIntent = getIntent();
if (myIntent.getAction().equals(ACTION_RUN_SCRIPT)) {
/* Someone with the appropriate permissions has asked us to
run a script */
String handle = myIntent.getStringExtra(EXTRA_WINDOW_HANDLE);
if (handle != null) {
// Target the request at an existing window if open
handle = appendToWindow(handle, myIntent.getStringExtra(EXTRA_INITIAL_COMMAND));
} else {
// Open a new window
handle = openNewWindow(myIntent.getStringExtra(EXTRA_INITIAL_COMMAND));
}
Intent result = new Intent();
result.putExtra(EXTRA_WINDOW_HANDLE, handle);
setResult(RESULT_OK, result);
} else {
// Intent sender may not have permissions, ignore any extras
openNewWindow(null);
}
unbindService(mTSConnection);
finish();
}
private String openNewWindow(String iInitialCommand) {
TermService service = mTermService;
String initialCommand = mSettings.getInitialCommand();
if (iInitialCommand != null) {
if (initialCommand != null) {
initialCommand += "\r" + iInitialCommand;
} else {
initialCommand = iInitialCommand;
}
}
TermSession session = Term.createTermSession(this, mSettings, initialCommand);
session.setFinishCallback(service);
service.getSessions().add(session);
String handle = UUID.randomUUID().toString();
((ShellTermSession) session).setHandle(handle);
Intent intent = new Intent(PRIVACT_OPEN_NEW_WINDOW);
intent.addCategory(Intent.CATEGORY_DEFAULT);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
return handle;
}
private String appendToWindow(String handle, String iInitialCommand) {
TermService service = mTermService;
// Find the target window
SessionList sessions = service.getSessions();
ShellTermSession target = null;
int index;
for (index = 0; index < sessions.size(); ++index) {
ShellTermSession session = (ShellTermSession) sessions.get(index);
String h = session.getHandle();
if (h != null && h.equals(handle)) {
target = session;
break;
}
}
if (target == null) {
// Target window not found, open a new one
return openNewWindow(iInitialCommand);
}
if (iInitialCommand != null) {
target.write(iInitialCommand);
target.write('\r');
}
Intent intent = new Intent(PRIVACT_SWITCH_WINDOW);
intent.addCategory(Intent.CATEGORY_DEFAULT);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra(PRIVEXTRA_TARGET_WINDOW, index);
startActivity(intent);
return handle;
}
}