From 3ec147e0e3399a31731419e9202ca6c148af8929 Mon Sep 17 00:00:00 2001 From: Jivan Ghadage Date: Tue, 21 Jul 2015 01:39:24 +0530 Subject: [PATCH] refering multiple Installation profiles sotred at /sdcard/profiles/ NativeHelper.java: scans all the present profiles and create required Installation profiles LilDebi.java: layout and selection of Install Profile InstallService.java: install the profile along with debian lildebi.xml: layout for choosing the profile strings.xml: --- res/layout/lildebi.xml | 27 ++++++ res/values/strings.xml | 1 + .../lildebi/InstallService.java | 1 + src/info/guardianproject/lildebi/LilDebi.java | 54 ++++++++++- .../guardianproject/lildebi/NativeHelper.java | 95 +++++++++++++++++++ 5 files changed, 177 insertions(+), 1 deletion(-) diff --git a/res/layout/lildebi.xml b/res/layout/lildebi.xml index 1466d8a..1591696 100644 --- a/res/layout/lildebi.xml +++ b/res/layout/lildebi.xml @@ -41,6 +41,33 @@ android:layout_height="wrap_content" android:text="@string/title_start" /> + + + + + + + + + Install on Internal Storage Install Debian into Internal Storage: /data/debian Not enough space (< 250MB) + Select Installation Profile diff --git a/src/info/guardianproject/lildebi/InstallService.java b/src/info/guardianproject/lildebi/InstallService.java index f5997d4..ebf8178 100644 --- a/src/info/guardianproject/lildebi/InstallService.java +++ b/src/info/guardianproject/lildebi/InstallService.java @@ -99,6 +99,7 @@ public void run() { command += "\\\n&& " + NativeHelper.app_bin + "/chroot " + NativeHelper.mnt + " " + NativeHelper.app_bin + "/complete-debian-setup.sh " + stdArgs; + command += "\\\n&& " + NativeHelper.app_profiles + "./"+ LilDebi.selProfile + stdArgs; writeCommand(os, "cd " + NativeHelper.app_bin.getAbsolutePath()); writeCommand(os, command); // Avoid keeping the resource mounted because of some failure diff --git a/src/info/guardianproject/lildebi/LilDebi.java b/src/info/guardianproject/lildebi/LilDebi.java index 10de066..d0fd69b 100644 --- a/src/info/guardianproject/lildebi/LilDebi.java +++ b/src/info/guardianproject/lildebi/LilDebi.java @@ -20,8 +20,12 @@ import android.view.View; import android.view.View.OnCreateContextMenuListener; import android.view.Window; +import android.widget.AdapterView; +import android.widget.AdapterView.OnItemSelectedListener; +import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.ScrollView; +import android.widget.Spinner; import android.widget.TextView; import android.widget.Toast; @@ -33,7 +37,7 @@ import java.io.InputStreamReader; import java.io.OutputStream; -public class LilDebi extends Activity implements OnCreateContextMenuListener { +public class LilDebi extends Activity implements OnCreateContextMenuListener, OnItemSelectedListener { public static final String TAG = "LilDebi"; private static TextView statusTitle; @@ -45,6 +49,12 @@ public class LilDebi extends Activity implements OnCreateContextMenuListener { private Handler commandThreadHandler; private LilDebiAction action; + + public static TextView selectInstallationProfile; + public static Spinner spinnerForProfile; + public static TextView selectedProfileTextView; + public static String selProfile; + public static ArrayAdapter adapter_state; private boolean foundSU = false; Thread findSUThread = new Thread() { @@ -64,6 +74,15 @@ protected void onCreate(Bundle savedInstanceState) { startStopButton = (Button) findViewById(R.id.startStopButton); consoleScroll = (ScrollView) findViewById(R.id.consoleScroll); consoleText = (TextView) findViewById(R.id.consoleText); + selectInstallationProfile = (TextView) findViewById(R.id.selectInstallationProfile); + selectedProfileTextView = (TextView) findViewById(R.id.selectedProfile); + spinnerForProfile = (Spinner) findViewById(R.id.selectProfile); + adapter_state = new ArrayAdapter(this, + android.R.layout.simple_spinner_item, NativeHelper.myGenProfileList); + adapter_state + .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + spinnerForProfile.setAdapter(adapter_state); + spinnerForProfile.setOnItemSelectedListener(this); // All SU calls are blocking calls. libsuperuser doen't allow // to make such blocking calls from Main Thread. @@ -197,6 +216,9 @@ private void updateScreenStatus() { statusText.setText(R.string.no_sdcard_status); savedStatus = R.string.no_sdcard_status; startStopButton.setVisibility(View.GONE); + spinnerForProfile.setVisibility(View.GONE); + selectedProfileTextView.setVisibility(View.GONE); + selectInstallationProfile.setVisibility(View.GONE); return; } @@ -211,6 +233,9 @@ private void updateScreenStatus() { statusText.setVisibility(View.VISIBLE); statusText.setText(R.string.needs_superuser_message); savedStatus = R.string.needs_superuser_message; + selectInstallationProfile.setVisibility(View.GONE); + spinnerForProfile.setVisibility(View.GONE); + selectedProfileTextView.setVisibility(View.GONE); startStopButton.setVisibility(View.VISIBLE); startStopButton.setText(R.string.get_superuser); startStopButton.setOnClickListener(new View.OnClickListener() { @@ -233,6 +258,9 @@ public void onClick(View view) { statusText.setVisibility(View.VISIBLE); statusText.setText(R.string.not_configured_message); savedStatus = R.string.not_configured_message; + selectInstallationProfile.setVisibility(View.GONE); + spinnerForProfile.setVisibility(View.GONE); + selectedProfileTextView.setVisibility(View.GONE); startStopButton.setVisibility(View.VISIBLE); startStopButton.setText(R.string.title_configure); startStopButton.setOnClickListener(new View.OnClickListener() { @@ -248,6 +276,9 @@ public void onClick(View view) { statusText.setVisibility(View.GONE); statusText.setText(R.string.mounted_message); savedStatus = R.string.mounted_message; + selectInstallationProfile.setVisibility(View.GONE); + spinnerForProfile.setVisibility(View.GONE); + selectedProfileTextView.setVisibility(View.GONE); startStopButton.setVisibility(View.VISIBLE); startStopButton.setText(R.string.title_stop); startStopButton.setOnClickListener(new View.OnClickListener() { @@ -263,6 +294,9 @@ public void onClick(View view) { statusText.setVisibility(View.VISIBLE); statusText.setText(R.string.not_mounted_message); savedStatus = R.string.not_mounted_message; + selectInstallationProfile.setVisibility(View.GONE); + spinnerForProfile.setVisibility(View.GONE); + selectedProfileTextView.setVisibility(View.GONE); startStopButton.setVisibility(View.VISIBLE); startStopButton.setText(R.string.title_start); startStopButton.setOnClickListener(new View.OnClickListener() { @@ -285,6 +319,9 @@ public void onClick(View view) { statusText.setVisibility(View.VISIBLE); statusText.setText(R.string.not_installed_message); savedStatus = R.string.not_installed_message; + selectInstallationProfile.setVisibility(View.VISIBLE); + spinnerForProfile.setVisibility(View.VISIBLE); + selectedProfileTextView.setVisibility(View.VISIBLE); startStopButton.setVisibility(View.VISIBLE); startStopButton.setText(R.string.install); startStopButton.setOnClickListener(new View.OnClickListener() { @@ -392,4 +429,19 @@ public void onSaveInstanceState(Bundle savedInstanceState) { super.onSaveInstanceState(savedInstanceState); } // the saved state is restored in onCreate() + + @Override + public void onItemSelected(AdapterView arg0, View arg1, int position, + long arg3) { + spinnerForProfile.setSelection(position); + selProfile = (String) spinnerForProfile.getSelectedItem(); + selectedProfileTextView.setText("Selected profile:" + selProfile); + + } + + @Override + public void onNothingSelected(AdapterView arg0) { + // overriden method not used + + } } diff --git a/src/info/guardianproject/lildebi/NativeHelper.java b/src/info/guardianproject/lildebi/NativeHelper.java index ed92777..1edd240 100644 --- a/src/info/guardianproject/lildebi/NativeHelper.java +++ b/src/info/guardianproject/lildebi/NativeHelper.java @@ -2,15 +2,20 @@ import java.io.BufferedOutputStream; import java.io.File; +import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; +import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; import java.io.OutputStreamWriter; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; +import java.util.ArrayList; import java.util.Calendar; +import java.util.List; import java.util.Locale; +import java.util.Properties; import java.util.Scanner; import android.content.Context; @@ -28,6 +33,7 @@ public class NativeHelper { public static File app_bin; public static File app_log; public static File install_log; + public static File app_profiles; public static File publicFiles; public static File sh; public static File install_conf; @@ -43,10 +49,24 @@ public class NativeHelper { public static boolean isInstallRunning = false; public static boolean installInInternalStorage; public static boolean limitTo4GB; + + public static File file; + public static String profileName; + public static String generatedFileName; + public static List myProfileList = new ArrayList(); + public static List myGenProfileList = new ArrayList(); + public static String DIRECTORY_PATH = "/data/data/info.guardianproject.lildebi/app_profiles"; + public static String Name; + public static String path_to_install_script; + public static String path_to_pre_start_script; + public static String path_to_post_start_script; + public static String gui_support; + public static String fileName; public static void setup(Context context) { app_bin = context.getDir("bin", Context.MODE_PRIVATE).getAbsoluteFile(); app_log = context.getDir("log", Context.MODE_PRIVATE).getAbsoluteFile(); + app_profiles = context.getDir("profiles", Context.MODE_PRIVATE).getAbsoluteFile(); install_log = new File(app_log, "install.log"); // this is the same as android-8's getExternalFilesDir() but works on android-1 publicFiles = new File(Environment.getExternalStorageDirectory(), @@ -93,6 +113,81 @@ && new File(NativeHelper.mnt + "/etc").exists() installInInternalStorage = prefs.getBoolean(prefName, detectedInternalInstall); if (installInInternalStorage) NativeHelper.image_path = NativeHelper.mnt; + try { + File folder = new File("/sdcard/profiles/"); + File[] listOfFiles = folder.listFiles(); + int countOfProfiles=0; + for (File file : listOfFiles) { + if (file.isFile()) { + profileName = file.getName(); + myProfileList.add(profileName); + Log.d("all profiles ", profileName); + countOfProfiles++; + } + } + String n[] = new String[countOfProfiles]; + for (int i = 0; i < countOfProfiles; i++) { + n[i] = myProfileList.get(i) ; + Log.d("[i] value", n[i]); + Log.d("No. of profiles", ""+countOfProfiles); + Log.d("printing data for ", ""+n[i]); + file = new File("/sdcard/profiles/" + n[i]); + Log.d("file name", file.getPath()); + Properties prop = new Properties(); + InputStream input = null; + try { + input = new FileInputStream(file); + prop.load(input); + Name = prop.getProperty("Name"); + path_to_install_script = prop.getProperty("path_to_install_script"); + path_to_install_script = prop.getProperty("path_to_pre_start_script"); + path_to_post_start_script = prop.getProperty("path_to_post_start_script"); + gui_support = prop.getProperty("gui_support"); + Log.d("Name", Name); + File root = new File(DIRECTORY_PATH); + fileName = Name + ".sh"; + File gpxfile = new File(root, fileName); + FileWriter writer; + writer = new FileWriter(gpxfile); + StringBuilder s = new StringBuilder(); + s.append("export TERM=linux \n"); + s.append("export HOME=/root \n"); + s.append("export PATH=$app_bin:/usr/bin:/usr/sbin:/bin:/sbin:$PATH \n"); + s.append("apt-get install "+ Name); + + writer.append(s); + writer.flush(); + writer.close(); + + Log.d("Name", Name); + Log.d("path_to_install_script", path_to_install_script); + Log.d("path_to_install_script", path_to_install_script); + Log.d("path_to_post_start_script", path_to_post_start_script); + Log.d("gui_support", gui_support); + } catch (IOException ex) { + ex.printStackTrace(); + } + } + }catch (Exception e) { + e.printStackTrace(); + } + try { + File folder = new File(DIRECTORY_PATH); + File[] listOfFiles = folder.listFiles(); + int countOfGeneratedFiles =0; + for (File file : listOfFiles) { + if (file.isFile()) { + generatedFileName = file.getName(); + myGenProfileList.add(generatedFileName); + chmod(0755, new File(app_profiles, generatedFileName)); + Log.d("all generated files ", generatedFileName); + countOfGeneratedFiles++; + } + } + Log.d("countOfGeneratedFiles", ""+countOfGeneratedFiles); + } catch (Exception e) { + e.printStackTrace(); + } } public static boolean isStarted() {