Clicks shows off its BlackBerry-inspired Communicator phone in new hands-on video
Back to Tutorials
techTutorialintermediate

Clicks shows off its BlackBerry-inspired Communicator phone in new hands-on video

June 30, 202621 views5 min read

Learn to build a keyboard input handler for Android that replicates the functionality of physical keyboard smartphones like the Clicks Communicator, including character input, haptic feedback, and advanced keyboard features.

Introduction

In this tutorial, we'll explore the technical architecture and software development aspects of physical keyboard smartphones like the Clicks Communicator. While the hardware itself is a specialized device, we'll focus on the software components that make such devices work, particularly keyboard input handling and communication protocols. This tutorial will teach you how to create a keyboard input handler for a smartphone application, similar to what would be needed for a BlackBerry-inspired device.

Prerequisites

  • Intermediate knowledge of Android development
  • Android Studio installed
  • Basic understanding of Android Activity lifecycle
  • Familiarity with Android Manifest permissions
  • Knowledge of input method frameworks

Step-by-Step Instructions

1. Create a New Android Project

We'll start by creating a new Android project in Android Studio. This project will serve as our foundation for implementing keyboard functionality.

File > New > New Project > Empty Activity
Project Name: KeyboardHandler
Language: Java
Minimum SDK: API 21 (Android 5.0)

Why: We're creating a fresh project to avoid conflicts with existing code and to ensure we have a clean environment to work with.

2. Configure AndroidManifest.xml

Next, we'll update the manifest to include necessary permissions for keyboard input handling.

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.keyboardhandler">

    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.READ_CONTACTS" />
    
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/Theme.KeyboardHandler">
        
        <activity
            android:name=".MainActivity"
            android:exported="true"
            android:windowSoftInputMode="adjustResize">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

Why: The permissions are essential for handling keyboard input and providing feedback to users, while the windowSoftInputMode ensures proper layout adjustments when keyboard appears.

3. Design the Main Activity Layout

Create a layout that simulates a physical keyboard interface, similar to what you'd see on a BlackBerry device.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="16dp">

    <TextView
        android:id="@+id/statusText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Keyboard Status: Ready"
        android:textSize="18sp"
        android:padding="16dp" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:gravity="center">

        <Button
            android:id="@+id/buttonA"
            android:layout_width="60dp"
            android:layout_height="60dp"
            android:text="A"
            android:layout_margin="4dp" />
        
        <Button
            android:id="@+id/buttonB"
            android:layout_width="60dp"
            android:layout_height="60dp"
            android:text="B"
            android:layout_margin="4dp" />
        
        <Button
            android:id="@+id/buttonC"
            android:layout_width="60dp"
            android:layout_height="60dp"
            android:text="C"
            android:layout_margin="4dp" />
    </LinearLayout>

    <EditText
        android:id="@+id/inputField"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Type here..."
        android:layout_marginTop="16dp" />

</LinearLayout>

Why: This layout mimics a physical keyboard interface with visual feedback elements, similar to what you'd see on the Clicks Communicator's hardware.

4. Implement Keyboard Input Handler

Create the core logic for handling keyboard input in MainActivity.java:

public class MainActivity extends AppCompatActivity {
    private TextView statusText;
    private EditText inputField;
    private Map<Button, String> buttonMap;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        initViews();
        setupButtonHandlers();
        setupInputField();
    }
    
    private void initViews() {
        statusText = findViewById(R.id.statusText);
        inputField = findViewById(R.id.inputField);
        buttonMap = new HashMap<>();
    }
    
    private void setupButtonHandlers() {
        // Map physical buttons to their corresponding characters
        buttonMap.put(findViewById(R.id.buttonA), "A");
        buttonMap.put(findViewById(R.id.buttonB), "B");
        buttonMap.put(findViewById(R.id.buttonC), "C");
        
        // Set click listeners for each button
        for (Map.Entry<Button, String> entry : buttonMap.entrySet()) {
            entry.getKey().setOnClickListener(v -> {
                String character = entry.getValue();
                handleCharacterInput(character);
                vibrateDevice();
            });
        }
    }
    
    private void handleCharacterInput(String character) {
        // Append character to input field
        String currentText = inputField.getText().toString();
        inputField.setText(currentText + character);
        
        // Update status text
        statusText.setText("Keyboard Status: " + character + " pressed");
        
        // Provide visual feedback
        inputField.requestFocus();
    }
    
    private void vibrateDevice() {
        Vibrator vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
        if (vibrator != null) {
            vibrator.vibrate(50); // Vibrate for 50 milliseconds
        }
    }
    
    private void setupInputField() {
        inputField.setOnKeyListener((v, keyCode, event) -> {
            if (event.getAction() == KeyEvent.ACTION_DOWN) {
                if (keyCode == KeyEvent.KEYCODE_ENTER) {
                    // Handle Enter key press
                    statusText.setText("Keyboard Status: Enter pressed");
                    return true;
                }
            }
            return false;
        });
    }
}

Why: This code creates the foundation for keyboard interaction, including character input handling, visual feedback, and haptic feedback - all essential features of a physical keyboard smartphone.

5. Add Advanced Keyboard Features

Enhance the keyboard functionality with additional features like shift keys, backspace, and predictive text:

// Add to MainActivity class
private boolean shiftPressed = false;
private Button shiftButton;

private void setupAdvancedKeyboard() {
    shiftButton = findViewById(R.id.shiftButton);
    shiftButton.setOnClickListener(v -> {
        shiftPressed = !shiftPressed;
        shiftButton.setText(shiftPressed ? "SHIFT ON" : "SHIFT");
        statusText.setText("Keyboard Status: Shift mode " + (shiftPressed ? "ON" : "OFF"));
    });
    
    Button backspaceButton = findViewById(R.id.backspaceButton);
    backspaceButton.setOnClickListener(v -> {
        String currentText = inputField.getText().toString();
        if (currentText.length() > 0) {
            inputField.setText(currentText.substring(0, currentText.length() - 1));
            statusText.setText("Keyboard Status: Backspace");
        }
    });
}

Why: These advanced features replicate the functionality found in physical keyboard devices, providing a more authentic user experience similar to what the Clicks Communicator offers.

6. Test the Implementation

Run the application on an emulator or physical device to test keyboard functionality:

  1. Click the physical buttons to input characters
  2. Verify haptic feedback works
  3. Test shift functionality
  4. Ensure backspace works properly
  5. Test Enter key handling

Why: Testing ensures all keyboard functionality works as expected, providing a realistic simulation of physical keyboard interaction.

Summary

In this tutorial, we've built a keyboard input handler that demonstrates key aspects of physical keyboard smartphone development. We've implemented core functionality including character input handling, visual and haptic feedback, and advanced features like shift keys and backspace. This approach mirrors the technical challenges faced by companies like Clicks Technology when developing devices like the Communicator phone. The skills learned here are transferable to developing full-featured keyboard applications and understanding the software architecture behind physical keyboard devices.

While this is a simplified simulation, it demonstrates the core principles that make physical keyboard smartphones like the Clicks Communicator functional and user-friendly.

Source: TNW Neural

Related Articles