Disable home button in android toddler app?
Asked Answered
N

5

14

I've developed and app that is a slide show of pictures which each play a sound when you tap them. It's like a picture book for ages 2-4.

The problem is, since android won't let you capture a home button press and essentially disable it, when parents give the phone to their child to play with unattended (brave parent), the child can inadvertenly exit the app and then make calls or otherwise tweak the phone.

There are two other apps that currently have a psuedo fix for this issue. The apps are Toddler Lock and ToddlePhone. I've tried contacting the developers of these apps for some guidance but they haven't been willing to disclose anything, which if fine, but does anyone here have any suggestions?

It looks like both of those other apps are acting like a home screen replacement app. When you enable the "childproof mode" on those apps the user is prompted to chose and app for the action and the choices are "Launcher, LauncherPro, etc." plus the toddler app. You then have to make the toddler app the default and voila, the phone is "locked" and can only be "unlocked" using a key combination or touching the four corners of the screen, etc. when you "unlock" the phone. your normal home screen app default restored. You don't even have to make the toddler app the default the next time you enable the "childproof mode".

I have read that these two apps have problems with Samsung phones and they can cause an an infinite crash-and-restart-loop that requires a factory reset to fix. Obviously this is not the ideal solution to the problem but it looks like the only one availiable at this point.

Does anyone have any ideas on how to implement a "childproof mode"?

Narceine answered 25/11, 2010 at 15:20 Comment(0)
C
5

I think you're right regarding the home screen replacement. Toddler Lock I know doesn't override the home button, because (at least on my LG GW620) while in Toddle Lock holding the home button brings up the ALT-TAB type menu - which then tends to crash the phone.

There is a home screen replacement app available, with source code, on the android dev site:

http://developer.android.com/resources/samples/Home/index.html

EDIT: also, ADW.Launcher:

http://code.google.com/p/adw-launcher-android/

Cockshy answered 25/11, 2010 at 15:27 Comment(2)
so i want to do something similar. I've installed adw. How do i disable the buttons ?Long
Check out yoah's answer below. It is the best solution for this question.Halfassed
B
17

I needed to have toddler lock in a new app, and did not want to use a launcher. Here is what I did, you can see the app at https://play.google.com/store/apps/details?id=com.justforkids.animalsounds

  1. When lock is activated, start a service, and stop it when lock is deactivated
  2. The service checks the top running app, and if it is not my activity, the service launches my activity
  3. There was still an issue that when the user clicks "home", it takes about 6 seconds before my activity is launched again. I assume this is a security feature in Android but not sure. To bypass this, when the service detects that another app is visible, it adds a top view (as an alert window) that covers the home screen for the few seconds it takes the app to re-launch.

For step 3, here are more details:

Create the overlay layout, for example file locked_overlay.xml:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#d0000000"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:gravity="center_horizontal"
        android:orientation="vertical" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="12dp"
        android:text="@string/app_name"
        android:textColor="#fff"
        android:textSize="18sp"
        android:textStyle="bold" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Locked mode is on"
        android:textColor="#fff"
        android:textSize="18sp" />

    </LinearLayout>

</FrameLayout>

In your service to show or hide the overlay use:

  private View lockedOverlay = null;

  private void hideLockedOverlay() {
    if (lockedOverlay != null) {
      WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
      windowManager.removeView(lockedOverlay);
      lockedOverlay = null;
    }
  }

  private void showLockedOverlay() {
    if (lockedOverlay != null) {
      return;
    }

    WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
    WindowManager.LayoutParams viewLayoutParams = new WindowManager.LayoutParams(
    LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT,
    WindowManager.LayoutParams.TYPE_SYSTEM_ALERT, 
    WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
        | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
        PixelFormat.TRANSLUCENT);
    viewLayoutParams.gravity = Gravity.TOP | Gravity.LEFT;

    LayoutInflater inflater = LayoutInflater.from(this);
    lockedOverlay = inflater.inflate(R.layout.locked_overlay, null);
    windowManager.addView(lockedOverlay, viewLayoutParams);
  }

You will need the permission

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
Bullfight answered 26/5, 2013 at 9:59 Comment(7)
Much much better way to execute this! BRAVO!Meacham
Please can you help me to add top view that covers the home screen for few second.. thank you in advance.Mavilia
@AmolSawant96Kuli : are you able to create the top view?Halfassed
@Yoah : I am able to do the first two steps. But, can't complete the Top view step. Can you help me with a sample code for that?Halfassed
@Halfassed Edited and added an exampleBullfight
@Yoah: Can you elaborate on steps 1 and 2?Pimpernel
Awesome ! You made my day :) , however, there is ugly idea to override home launcher with dummy launcher and when user select home you can check if it is on Lockscreen then ignore it ! otherwise open default user's favorite launcher and close your dummy launcher .Lennyleno
C
5

I think you're right regarding the home screen replacement. Toddler Lock I know doesn't override the home button, because (at least on my LG GW620) while in Toddle Lock holding the home button brings up the ALT-TAB type menu - which then tends to crash the phone.

There is a home screen replacement app available, with source code, on the android dev site:

http://developer.android.com/resources/samples/Home/index.html

EDIT: also, ADW.Launcher:

http://code.google.com/p/adw-launcher-android/

Cockshy answered 25/11, 2010 at 15:27 Comment(2)
so i want to do something similar. I've installed adw. How do i disable the buttons ?Long
Check out yoah's answer below. It is the best solution for this question.Halfassed
P
2
Add in to your Main Activity
@Override 
    public void onAttachedToWindow()
    {  
        this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);
        super.onAttachedToWindow();  
    }

And Override Key down event

@Override 
    public boolean onKeyDown(int iKeyCode, KeyEvent event)
    {

        if(iKeyCode == KeyEvent.KEYCODE_BACK || iKeyCode == KeyEvent.KEYCODE_HOME) 
        {
            return true;
        }
       }

Edit: This works in all older version of android. But will not work in ICS and jelly bean and will give you crash in app

Pelvis answered 7/5, 2012 at 7:10 Comment(1)
@sixeightzero but SO hasnt specify android version in question..!i have edited answer for some clarificationLinguini
E
1

For versions 4.0 and above you can avoid Android security restrictions and set your app as a launcher. Add this to your manifest file:

<uses-permission android:name="android.permission.GET_TASKS" />

 <activity
    android:launchMode="singleInstance"
    android:name=".MainActivity"
    android:label="@string/app_name" >
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.HOME" />
    </intent-filter>
</activity>
Epicurus answered 1/7, 2015 at 17:41 Comment(0)
P
0

I replaced the Default Home launcher using the following code:

Intent selector = new Intent("android.intent.action.MAIN");
selector.addCategory("android.intent.category.HOME");
selector.setComponent(new ComponentName("android","com.android.internal.app.ResolverActivity"));
startActivity(selector);
Pelvis answered 7/5, 2012 at 9:42 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.