diff options
Diffstat (limited to 'app/src/main/java/com/example/mylauncher/MainActivity.java')
| -rw-r--r-- | app/src/main/java/com/example/mylauncher/MainActivity.java | 649 |
1 files changed, 649 insertions, 0 deletions
diff --git a/app/src/main/java/com/example/mylauncher/MainActivity.java b/app/src/main/java/com/example/mylauncher/MainActivity.java new file mode 100644 index 0000000..ab740e8 --- /dev/null +++ b/app/src/main/java/com/example/mylauncher/MainActivity.java @@ -0,0 +1,649 @@ +package com.example.mylauncher; + +import android.app.Activity; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.util.Log; +import android.content.pm.ResolveInfo; +import android.os.Bundle; +import android.provider.Settings; +import android.provider.MediaStore; +import android.view.KeyEvent; +import android.view.View; +import android.widget.Toast; +import android.widget.ListView; +import android.widget.EditText; +import android.widget.LinearLayout; +import android.widget.TextView; +import java.io.DataOutputStream; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import android.net.Uri; +import android.net.wifi.WifiManager; +import android.net.wifi.ScanResult; +import android.content.Context; +import android.Manifest; +import androidx.core.app.ActivityCompat; +import androidx.core.content.ContextCompat; + +import android.app.AlertDialog; +import android.content.DialogInterface; +import android.net.NetworkRequest; +import android.net.NetworkCapabilities; +import android.net.wifi.WifiNetworkSpecifier; +import android.net.ConnectivityManager; +import android.net.wifi.WifiConfiguration; +import android.os.Build; +import android.text.InputType; +import android.annotation.TargetApi; +import android.text.Editable; +import android.text.TextWatcher; +import android.widget.AdapterView; + +import androidx.annotation.RequiresApi; + +import android.view.inputmethod.EditorInfo; +import android.view.inputmethod.InputMethodManager; + +import java.util.Set; +import java.util.HashSet; + +public class MainActivity extends Activity { + private ListView menuList; + private LinearLayout menuContainer; + private EditText searchBar; + private TextView itemCount; + private List<String> menuItems; + private boolean isInAppsMenu = false; + private boolean isInPowerMenu = false; + private WifiManager wifiManager; + private List<String> wifiNetworks; + private boolean isInWifiMenu = false; + private static final int WIFI_PERMISSION_REQUEST = 100; + + private List<AppInfo> appInfoList; // All available apps + private List<AppInfo> filteredAppInfoList; // Apps after filtering + + private static final String[] DEFAULT_MENU = { + "💻 t-mode", + "📱 Apps", + "📂 Files", + "Web Browser", + "📞 Dialer", + "✉️ Texts", + "👤 Contacts", + "📷 Camera", + "🌐 Networks", + "🔊 Audio", + "⚙️ Config", + "⚡ Power", + "❌ Close Menu" + }; + + @Override + public void onBackPressed() { + // Do nothing to disable the back button + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + + menuContainer = findViewById(R.id.menu_container); + menuList = findViewById(R.id.menu_list); + searchBar = findViewById(R.id.search_bar); + itemCount = findViewById(R.id.item_count); + + if (menuContainer == null || menuList == null || + searchBar == null || itemCount == null) { + finish(); + return; + } + + menuItems = new ArrayList<>(Arrays.asList(DEFAULT_MENU)); + loadApps(); + showMainMenu(); + + searchBar.addTextChangedListener(new SearchTextWatcher(this)); + + menuList.requestFocus(); // Ensure the ListView has focus + + // Replace the previous EditText listeners with these new ones + searchBar.setOnEditorActionListener((v, actionId, event) -> { + // Handle both hardware and software keyboard Enter presses + if (event != null || actionId == EditorInfo.IME_ACTION_DONE || + actionId == EditorInfo.IME_ACTION_GO || + actionId == EditorInfo.IME_ACTION_SEARCH) { + handleEnterKeyPress(); + return true; + } + return false; + }); + + // Add key listener for hardware keyboard + searchBar.setOnKeyListener((v, keyCode, event) -> { + if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_ENTER) { + handleEnterKeyPress(); + return true; + } + return false; + }); + + + } + + public void filterList(String query) { + List<String> filteredNames = new ArrayList<>(); + + if (isInAppsMenu && appInfoList != null) { + filteredAppInfoList = new ArrayList<>(); + for (AppInfo appInfo : appInfoList) { + if (appInfo.name.toLowerCase().contains(query)) { + filteredAppInfoList.add(appInfo); + filteredNames.add(appInfo.name); + } + } + filteredNames.add("Back"); + } else if (isInPowerMenu) { + // For simplicity, we won't filter the power menu options + filteredNames = Arrays.asList( + "Lock", + "Reboot", + "Shutdown", + "Back" + ); + } else if (isInWifiMenu) { + // Filter Wi-Fi networks + filteredNames = new ArrayList<>(); + for (String network : wifiNetworks) { + if (network.toLowerCase().contains(query)) { + filteredNames.add(network); + } + } + filteredNames.add("Back"); + } else { + filteredAppInfoList = null; // Not applicable + for (String item : menuItems) { + if (item.toLowerCase().contains(query)) { + filteredNames.add(item); + } + } + } + + setMenuItems(filteredNames); + } + + private void setMenuItems(List<String> items) { + CustomAdapter adapter = new CustomAdapter(this, items); + menuList.setAdapter(adapter); + updateCount(); + + // Update the OnItemClickListener + if (isInAppsMenu) { + menuList.setOnItemClickListener(new AppsMenuItemClickListener(this)); + } else if (isInPowerMenu) { + menuList.setOnItemClickListener(new PowerMenuItemClickListener(this)); + } else if (isInWifiMenu) { + menuList.setOnItemClickListener(new WifiMenuItemClickListener(this)); + } else { + menuList.setOnItemClickListener(new MainMenuItemClickListener(this)); + } + + // Set the first item as selected by default + menuList.setSelection(0); + menuList.setItemChecked(0, true); + } + + private void loadApps() { + try { + PackageManager pm = getPackageManager(); + Intent intent = new Intent(Intent.ACTION_MAIN); + intent.addCategory(Intent.CATEGORY_LAUNCHER); + List<ResolveInfo> resolveInfos = pm.queryIntentActivities(intent, 0); + appInfoList = new ArrayList<>(); + for (ResolveInfo resolveInfo : resolveInfos) { + String name = resolveInfo.loadLabel(pm).toString(); + appInfoList.add(new AppInfo(name, resolveInfo)); + } + } catch (Exception e) { + appInfoList = new ArrayList<>(); + } + } + + public void showMainMenu() { + isInAppsMenu = false; + isInPowerMenu = false; + isInWifiMenu = false; + setMenuItems(menuItems); + searchBar.setText(""); + } + + private void showAppMenu() { + if (appInfoList == null || appInfoList.isEmpty()) { + Toast.makeText(this, "No apps found", Toast.LENGTH_SHORT).show(); + return; + } + + isInAppsMenu = true; + isInPowerMenu = false; + isInWifiMenu = false; + filteredAppInfoList = new ArrayList<>(appInfoList); // Start with all apps + + List<String> appNames = new ArrayList<>(); + for (AppInfo appInfo : filteredAppInfoList) { + appNames.add(appInfo.name); + } + appNames.add("Back"); + + setMenuItems(appNames); + searchBar.setText(""); + } + + private void showPowerMenu() { + isInPowerMenu = true; + isInAppsMenu = false; + isInWifiMenu = false; + List<String> powerOptions = Arrays.asList( + "Lock", + "Reboot", + "Shutdown", + "Back" + ); + setMenuItems(powerOptions); + searchBar.setText(""); + } + + private void showWifiMenu() { + if (checkWifiPermissions()) { + scanWifiNetworks(); + } + } + + private boolean checkWifiPermissions() { + if (ContextCompat.checkSelfPermission(this, + Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { + ActivityCompat.requestPermissions(this, + new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, + WIFI_PERMISSION_REQUEST); + return false; + } + return true; + } + + private void scanWifiNetworks() { + wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE); + if (!wifiManager.isWifiEnabled()) { + wifiManager.setWifiEnabled(true); + } + + Set<String> wifiNetworkSet = new HashSet<>(); + wifiManager.startScan(); // Start a new scan + List<ScanResult> scanResults = wifiManager.getScanResults(); + + for (ScanResult scanResult : scanResults) { + if (scanResult.SSID != null && !scanResult.SSID.isEmpty()) { + wifiNetworkSet.add(scanResult.SSID); + } + } + wifiNetworks = new ArrayList<>(wifiNetworkSet); + + isInWifiMenu = true; + isInAppsMenu = false; + isInPowerMenu = false; + + setMenuItems(wifiNetworks); + searchBar.setText(""); +} + + + public void connectToWifi(String ssid) { + final String finalSsid = ssid; // Declare ssid as final + + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setTitle("Connect to " + finalSsid); + + // Set up the input + final EditText input = new EditText(this); + input.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD); + input.setHint("Password"); + + builder.setView(input); + + // Set up the buttons + builder.setPositiveButton("Connect", new ConnectButtonClickListener(this, finalSsid, input)); + builder.setNegativeButton("Cancel", new CancelButtonClickListener()); + + builder.show(); + } + + @RequiresApi(api = Build.VERSION_CODES.Q) + public void connectToWifiAndroidQ(final String ssid, final String password) { + WifiNetworkSpecifier.Builder builder = new WifiNetworkSpecifier.Builder() + .setSsid(ssid); + + if (password != null && !password.isEmpty()) { + builder.setWpa2Passphrase(password); + } + + WifiNetworkSpecifier wifiNetworkSpecifier = builder.build(); + + NetworkRequest networkRequest = new NetworkRequest.Builder() + .addTransportType(NetworkCapabilities.TRANSPORT_WIFI) + .setNetworkSpecifier(wifiNetworkSpecifier) + .build(); + + final ConnectivityManager connectivityManager = (ConnectivityManager) getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE); + + final WifiNetworkCallback networkCallback = new WifiNetworkCallback(this, ssid, connectivityManager); + + connectivityManager.requestNetwork(networkRequest, networkCallback); + } + + public void connectToWifiPreAndroidQ(final String ssid, final String password) { + WifiConfiguration wifiConfig = new WifiConfiguration(); + wifiConfig.SSID = "\"" + ssid + "\""; + if (password != null && !password.isEmpty()) { + wifiConfig.preSharedKey = "\"" + password + "\""; + } else { + wifiConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); + } + + WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE); + + int netId = wifiManager.addNetwork(wifiConfig); + if (netId != -1) { + wifiManager.disconnect(); + wifiManager.enableNetwork(netId, true); + wifiManager.reconnect(); + runOnUiThread(new WifiConnectedRunnable(this, ssid)); + } else { + runOnUiThread(new WifiConnectionFailedRunnable(this)); + } + } + + @Override + public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { + if (requestCode == WIFI_PERMISSION_REQUEST) { + if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { + scanWifiNetworks(); + } else { + Toast.makeText(this, "WiFi scanning requires location permission", Toast.LENGTH_LONG).show(); + } + } + } + + public void launchAppByName(String appName) { + if (filteredAppInfoList != null) { + for (AppInfo appInfo : filteredAppInfoList) { + if (appInfo.name.equals(appName)) { + launchApp(appInfo.resolveInfo); + break; + } + } + } else { + // Fallback to searching in the full list + for (AppInfo appInfo : appInfoList) { + if (appInfo.name.equals(appName)) { + launchApp(appInfo.resolveInfo); + break; + } + } + } + } + + private void launchApp(ResolveInfo app) { + try { + Intent intent = getPackageManager().getLaunchIntentForPackage(app.activityInfo.packageName); + if (intent != null) { + startActivity(intent); + } else { + Toast.makeText(this, "Unable to launch app", Toast.LENGTH_SHORT).show(); + } + } catch (Exception e) { + Toast.makeText(this, "Error launching app", Toast.LENGTH_SHORT).show(); + } + } + + private void updateCount() { + if (menuList.getAdapter() != null) { + itemCount.setText(String.valueOf(menuList.getAdapter().getCount())); + } + } + + public void handleMenuSelection(String item) { + if (isInWifiMenu) { + if (item.equals("Back")) { + showMainMenu(); + } else { + connectToWifi(item); + } + return; + } + + switch (item) { + case "💻 t-mode": + Intent termuxIntent = getPackageManager().getLaunchIntentForPackage("com.termux.x11"); + if (termuxIntent != null) { + startActivity(termuxIntent); + } else { + Toast.makeText(this, "Termux X11 not installed", Toast.LENGTH_SHORT).show(); + } + break; + case "📱 Apps": + showAppMenu(); + break; + case "Web Browser": + Intent browserIntent = getPackageManager().getLaunchIntentForPackage("app.vanadium.browser"); + if (browserIntent != null) { + startActivity(browserIntent); + } else { + Toast.makeText(this, "Vanadium browser not found", Toast.LENGTH_SHORT).show(); + } + break; + case "📂 Files": + Intent filesIntent = new Intent(Intent.ACTION_VIEW); + filesIntent.setDataAndType(Uri.parse("file:///"), "*/*"); + if (filesIntent.resolveActivity(getPackageManager()) != null) { + startActivity(filesIntent); + } else { + Toast.makeText(this, "No file manager found", Toast.LENGTH_SHORT).show(); + } + break; + case "📞 Dialer": + startActivity(new Intent(Intent.ACTION_DIAL)); + break; + case "✉️ Texts": + Intent msgIntent = new Intent(Intent.ACTION_MAIN); + msgIntent.addCategory(Intent.CATEGORY_APP_MESSAGING); + if (msgIntent.resolveActivity(getPackageManager()) != null) { + startActivity(msgIntent); + } else { + Toast.makeText(this, "No messaging app found", Toast.LENGTH_SHORT).show(); + } + break; + case "👤 Contacts": + Intent contactsIntent = new Intent(Intent.ACTION_VIEW); + contactsIntent.setType("vnd.android.cursor.dir/contact"); + if (contactsIntent.resolveActivity(getPackageManager()) != null) { + startActivity(contactsIntent); + } else { + Toast.makeText(this, "No contacts app found", Toast.LENGTH_SHORT).show(); + } + break; + case "📷 Camera": + Intent cameraIntent = getPackageManager().getLaunchIntentForPackage("app.grapheneos.camera"); + if (cameraIntent != null) { + startActivity(cameraIntent); + } else { + startActivity(new Intent(MediaStore.ACTION_IMAGE_CAPTURE)); + } + break; + case "🌐 Networks": + showWifiMenu(); + break; + case "🔊 Audio": + startActivity(new Intent(Settings.ACTION_SOUND_SETTINGS)); + break; + case "⚙️ Config": + startActivity(new Intent(Settings.ACTION_SETTINGS)); + break; + case "⚡ Power": + showPowerMenu(); + break; + case "❌ Close Menu": + menuContainer.setVisibility(View.GONE); + break; + default: + Toast.makeText(this, "Unknown selection", Toast.LENGTH_SHORT).show(); + } + } + + public void handlePowerOption(String option) { + switch (option) { + case "Lock": + executeRootCommand("input keyevent 26"); + break; + case "Reboot": + executeRootCommand("reboot"); + break; + case "Shutdown": + executeRootCommand("reboot -p"); + break; + default: + Toast.makeText(this, "Unknown power option", Toast.LENGTH_SHORT).show(); + } + } + + private void executeRootCommand(String command) { + try { + Process suProcess = Runtime.getRuntime().exec("su"); + DataOutputStream os = new DataOutputStream(suProcess.getOutputStream()); + os.writeBytes(command + "\n"); + os.writeBytes("exit\n"); + os.flush(); + suProcess.waitFor(); + suProcess.destroy(); + } catch (Exception e) { + Toast.makeText(this, "Error executing command: " + e.getMessage(), Toast.LENGTH_LONG).show(); + } + } + + @Override + public boolean dispatchKeyEvent(KeyEvent event) { + int action = event.getAction(); + int keyCode = event.getKeyCode(); + if (action == KeyEvent.ACTION_DOWN) { + switch (keyCode) { + case KeyEvent.KEYCODE_VOLUME_UP: + case KeyEvent.KEYCODE_VOLUME_DOWN: + return onKeyDown(keyCode, event); // Handle volume keys + default: + break; + } + } + return super.dispatchKeyEvent(event); + } + + @Override + public boolean onKeyDown(int keyCode, KeyEvent event) { + if (menuList == null || menuList.getAdapter() == null) return super.onKeyDown(keyCode, event); + + // Get current state + int currentPosition = menuList.getSelectedItemPosition(); + int itemCount = menuList.getAdapter().getCount(); + + // If nothing is selected, start at first item + if (currentPosition == -1) { + currentPosition = 0; + } + + switch (keyCode) { + case KeyEvent.KEYCODE_VOLUME_DOWN: + if (currentPosition < itemCount - 1) { + currentPosition++; + } + menuList.requestFocusFromTouch(); + menuList.setSelection(currentPosition); + menuList.setItemChecked(currentPosition, true); + menuList.requestFocus(); + return true; + + case KeyEvent.KEYCODE_VOLUME_UP: + if (currentPosition > 0) { + currentPosition--; + } + menuList.requestFocusFromTouch(); + menuList.setSelection(currentPosition); + menuList.setItemChecked(currentPosition, true); + menuList.requestFocus(); + return true; + + case KeyEvent.KEYCODE_POWER: + case KeyEvent.KEYCODE_ENTER: + case KeyEvent.KEYCODE_DPAD_CENTER: + // Handle item selection + View selectedView = menuList.getChildAt(currentPosition - menuList.getFirstVisiblePosition()); + if (selectedView != null) { + menuList.performItemClick( + selectedView, + currentPosition, + menuList.getAdapter().getItemId(currentPosition) + ); + } + return true; + + default: + return super.onKeyDown(keyCode, event); + } + } + + // Add new method to handle Enter key press + private void handleEnterKeyPress() { + if (menuList.getAdapter() != null && menuList.getAdapter().getCount() > 0) { + String selectedItem = (String) menuList.getAdapter().getItem(0); + + // Execute the action before clearing focus + if (isInAppsMenu) { + if (!selectedItem.equals("Back")) { + // Post the action to ensure it runs after the current operation + menuList.post(() -> { + launchAppByName(selectedItem); + }); + } else { + showMainMenu(); + } + } else if (isInWifiMenu) { + if (!selectedItem.equals("Back")) { + menuList.post(() -> { + connectToWifi(selectedItem); + }); + } else { + showMainMenu(); + } + } else if (isInPowerMenu) { + if (!selectedItem.equals("Back")) { + menuList.post(() -> { + handlePowerOption(selectedItem); + }); + } else { + showMainMenu(); + } + } else { + menuList.post(() -> { + handleMenuSelection(selectedItem); + }); + } + + // Clear focus after posting the action + searchBar.clearFocus(); + + // Hide keyboard explicitly + InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); + imm.hideSoftInputFromWindow(searchBar.getWindowToken(), 0); + } + } + + +} |
