On the latest version of Android app Facebook showed lock screen notification feature, like on this screenshot:
Did anyone try to implement this?
I know that It's simple to show Activity on top of lock screen, but unfortunately It doesn't work with translucent background. Basically it works but below our activity we see launcher screen, not lock screen (like lock screen in this case would be also transparent).
What I tried right now is:
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
in my Activity.
Also I tried this example: https://gist.github.com/daichan4649/5352944
And as I described - everything works but no transparency.
From my observation Facebook uses theme:
@android:style/Theme.Translucent.NoTitleBar
and doesn't have permission:
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
Also I noticed that lock screen notification aquires touches so we cannot show notifications from statusbar by gesture.
Any ideas how to create that kind of notification before Android L release.
Open your phone's Settings app. Notifications. Under "Lock screen," tap Notifications on lock screen or On lock screen. Choose Show alerting and silent notifications.
Enable apps to push notifications and display them on the lock screen: Open Settings, search for and access Apps, locate and access the app in question, and touch Notifications. Enable Allow notifications and set Lock screen notifications to Show.
You can access additional settings by tapping on the menu key, then selecting "Home Settings" while the Cover Feed lock screen is displayed. You can turn the lock screen on or off, toggle the display of the status bar, and set data use (low, medium, high). That's it.
Actually, ferdy182
was/is onto something.
Here's what I got using the android.permission.SYSTEM_ALERT_WINDOW
:
So, I couldn't do this with an Activity
. It just wouldn't work. I had to implement a Service
which added a View
using the WindowManager
.
One possible workflow would be: a broadcast is received by your BroadcastReceiver
=> it starts a Service => the Service adds the required view.
Now, the code (the comments explain a few things):
public class MyService extends Service {
View mView;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
// instance of WindowManager
WindowManager mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
LayoutInflater mInflater = (LayoutInflater)
getSystemService(Context.LAYOUT_INFLATER_SERVICE);
// inflate required layout file
mView = mInflater.inflate(R.layout.abc, null);
// attach OnClickListener
mView.findViewById(R.id.some_id).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// you can fire an Intent accordingly - to deal with the click event
// stop the service - this also removes `mView` from the window
// because onDestroy() is called - that's where we remove `mView`
stopSelf();
}
});
// the LayoutParams for `mView`
// main attraction here is `TYPE_SYSTEM_ERROR`
// as you noted above, `TYPE_SYSTEM_ALERT` does not work on the lockscreen
// `TYPE_SYSTEM_OVERLAY` works very well but is focusable - no click events
// `TYPE_SYSTEM_ERROR` supports all these requirements
WindowManager.LayoutParams mLayoutParams = new WindowManager.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT, 0, 0,
WindowManager.LayoutParams.TYPE_SYSTEM_ERROR,
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
| WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
| WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,
PixelFormat.RGBA_8888);
// finally, add the view to window
mWindowManager.addView(mView, mLayoutParams);
}
@Override
public void onDestroy() {
super.onDestroy();
// remove `mView` from the window
removeViewFromWindow();
}
// Removes `mView` from the window
public void removeNow() {
if (mView != null) {
WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
wm.removeView(mView);
}
}
}
And finally, add the permission to your app's manifest:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With