Skip to content
This repository has been archived by the owner on Sep 18, 2023. It is now read-only.

Commit

Permalink
Enabling a little more kiosk security
Browse files Browse the repository at this point in the history
  • Loading branch information
Jnesselr committed Sep 7, 2019
1 parent 88321a5 commit f44199b
Show file tree
Hide file tree
Showing 6 changed files with 123 additions and 10 deletions.
3 changes: 2 additions & 1 deletion app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,10 @@
</intent-filter>
</receiver>
</application>

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

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

</manifest>
116 changes: 116 additions & 0 deletions app/src/main/java/org/denhac/kiosk/KioskActivity.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
package org.denhac.kiosk;

import android.annotation.SuppressLint;
import android.app.ActivityManager;
import android.content.Context;
import android.os.Build;
import android.os.Handler;

import androidx.appcompat.app.AppCompatActivity;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public abstract class KioskActivity extends AppCompatActivity {
// To keep track of activity's window focus
boolean currentFocus;

// To keep track of activity's foreground/background status
boolean isPaused;

Handler collapseNotificationHandler;
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);

currentFocus = hasFocus;

if (!hasFocus) {

// Method that handles loss of window focus
collapseNow();
}
}

@Override
protected void onPause() {
super.onPause();

isPaused = true;

ActivityManager activityManager = (ActivityManager) getApplicationContext()
.getSystemService(Context.ACTIVITY_SERVICE);

activityManager.moveTaskToFront(getTaskId(), 0);
}

@Override
protected void onResume() {
super.onResume();

isPaused = false;
}

public void collapseNow() {

// Initialize 'collapseNotificationHandler'
if (collapseNotificationHandler == null) {
collapseNotificationHandler = new Handler();
}

// If window focus has been lost && activity is not in a paused state
// Its a valid check because showing of notification panel
// steals the focus from current activity's window, but does not
// 'pause' the activity
if (!currentFocus && !isPaused) {

// Post a Runnable with some delay - currently set to 300 ms
collapseNotificationHandler.postDelayed(new Runnable() {

@Override
public void run() {

// Use reflection to trigger a method from 'StatusBarManager'

@SuppressLint("WrongConstant") Object statusBarService = getSystemService("statusbar");
Class<?> statusBarManager = null;

try {
statusBarManager = Class.forName("android.app.StatusBarManager");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}

Method collapseStatusBar = null;

try {

// Prior to API 17, the method to call is 'collapse()'
// API 17 onwards, the method to call is `collapsePanels()`

collapseStatusBar = statusBarManager.getMethod("collapsePanels");
} catch (NoSuchMethodException e) {
e.printStackTrace();
}

collapseStatusBar.setAccessible(true);

try {
collapseStatusBar.invoke(statusBarService);
} catch (IllegalArgumentException | IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}

// Check if the window focus has been returned
// If it hasn't been returned, post this Runnable again
// Currently, the delay is 100 ms. You can change this
// value to suit your needs.
if (!currentFocus && !isPaused) {
collapseNotificationHandler.postDelayed(this, 100L);
}

}
}, 300L);
}
}
}
3 changes: 1 addition & 2 deletions app/src/main/java/org/denhac/kiosk/MainActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,11 @@
import android.view.View;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;
import androidx.constraintlayout.widget.ConstraintLayout;

import org.denhac.kiosk.events.EventsActivity;

public class MainActivity extends AppCompatActivity {
public class MainActivity extends KioskActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
Expand Down
3 changes: 1 addition & 2 deletions app/src/main/java/org/denhac/kiosk/WebViewActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@
import android.widget.TextView;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.core.widget.ContentLoadingProgressBar;

Expand All @@ -37,7 +36,7 @@
import io.reactivex.functions.Consumer;


public class WebViewActivity extends AppCompatActivity implements WebAppInterface.Callback {
public class WebViewActivity extends KioskActivity implements WebAppInterface.Callback {
private static final String EXTRA_URL = "ExtraUrl";

private ConstraintLayout loadingScreen;
Expand Down
4 changes: 1 addition & 3 deletions app/src/main/java/org/denhac/kiosk/WifiActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,12 @@
import android.view.View;
import android.widget.ImageView;

import androidx.appcompat.app.AppCompatActivity;

import com.google.zxing.WriterException;

import androidmads.library.qrgenearator.QRGContents;
import androidmads.library.qrgenearator.QRGEncoder;

public class WifiActivity extends AppCompatActivity {
public class WifiActivity extends KioskActivity {

private ImageView qrCodeView;

Expand Down
4 changes: 2 additions & 2 deletions app/src/main/java/org/denhac/kiosk/events/EventsActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@
import android.widget.ImageView;
import android.widget.TextView;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.GridLayoutManager;

import org.denhac.kiosk.KioskActivity;
import org.denhac.kiosk.R;
import org.denhac.kiosk.events.meetup.MeetupRepository;
import org.denhac.kiosk.events.popup.PopupView;
Expand All @@ -24,7 +24,7 @@
import io.reactivex.functions.Consumer;
import io.reactivex.schedulers.Schedulers;

public class EventsActivity extends AppCompatActivity implements MeetupRepository.NetworkStatus, PopupWindow.Callback {
public class EventsActivity extends KioskActivity implements MeetupRepository.NetworkStatus, PopupWindow.Callback {

private TextView monthText;
private Calendar currentDay;
Expand Down

0 comments on commit f44199b

Please sign in to comment.