1 /* Copyright 2016 Braden Farmer
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
7 * http://www.apache.org/licenses/LICENSE-2.0
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
16 package com.farmerbb.taskbar.activity;
18 import android.annotation.SuppressLint;
19 import android.annotation.TargetApi;
20 import android.app.Activity;
21 import android.content.BroadcastReceiver;
22 import android.content.Context;
23 import android.content.Intent;
24 import android.content.IntentFilter;
25 import android.content.SharedPreferences;
26 import android.os.Build;
27 import android.os.Bundle;
28 import android.os.Handler;
29 import android.provider.Settings;
30 import androidx.localbroadcastmanager.content.LocalBroadcastManager;
31 import android.view.WindowManager;
33 import com.farmerbb.taskbar.activity.dark.InvisibleActivityAltDark;
34 import com.farmerbb.taskbar.content.TaskbarIntent;
35 import com.farmerbb.taskbar.service.DashboardService;
36 import com.farmerbb.taskbar.service.NotificationService;
37 import com.farmerbb.taskbar.service.StartMenuService;
38 import com.farmerbb.taskbar.service.TaskbarService;
39 import com.farmerbb.taskbar.util.FreeformHackHelper;
40 import com.farmerbb.taskbar.util.IconCache;
41 import com.farmerbb.taskbar.util.LauncherHelper;
42 import com.farmerbb.taskbar.util.U;
44 public class InvisibleActivityFreeform extends Activity {
46 boolean showTaskbar = false;
47 boolean doNotHide = false;
48 boolean proceedWithOnCreate = true;
49 boolean finish = false;
50 boolean bootToFreeform = false;
51 boolean initialLaunch = true;
53 private BroadcastReceiver appearingReceiver = new BroadcastReceiver() {
55 public void onReceive(Context context, Intent intent) {
60 private BroadcastReceiver disappearingReceiver = new BroadcastReceiver() {
62 public void onReceive(Context context, Intent intent) {
67 private BroadcastReceiver finishReceiver = new BroadcastReceiver() {
69 public void onReceive(Context context, Intent intent) {
74 @SuppressLint("HardwareIds")
75 @TargetApi(Build.VERSION_CODES.N)
77 protected void onCreate(Bundle savedInstanceState) {
78 super.onCreate(savedInstanceState);
80 FreeformHackHelper helper = FreeformHackHelper.getInstance();
81 if(helper.isFreeformHackActive()) {
82 proceedWithOnCreate = false;
86 if(getIntent().hasExtra("check_multiwindow")) {
89 if(!isInMultiWindowMode()) {
90 proceedWithOnCreate = false;
95 if(U.isOverridingFreeformHack(this)) {
96 helper.setFreeformHackActive(true);
97 helper.setInFreeformWorkspace(true);
99 proceedWithOnCreate = false;
101 overridePendingTransition(0, 0);
104 if(!proceedWithOnCreate)
107 // Detect outside touches, and pass them through to the underlying activity
108 getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);
109 getWindow().setFlags(WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH);
111 IntentFilter appearingReceiverFilter = new IntentFilter();
112 appearingReceiverFilter.addAction(TaskbarIntent.ACTION_START_MENU_APPEARING);
113 appearingReceiverFilter.addAction("com.farmerbb.taskbar.CONTEXT_MENU_APPEARING");
114 appearingReceiverFilter.addAction("com.farmerbb.taskbar.DASHBOARD_APPEARING");
116 IntentFilter disappearingReceiverFilter = new IntentFilter();
117 disappearingReceiverFilter.addAction(TaskbarIntent.ACTION_START_MENU_DISAPPEARING);
118 disappearingReceiverFilter.addAction("com.farmerbb.taskbar.CONTEXT_MENU_DISAPPEARING");
119 disappearingReceiverFilter.addAction("com.farmerbb.taskbar.DASHBOARD_DISAPPEARING");
121 LocalBroadcastManager.getInstance(this).registerReceiver(appearingReceiver, appearingReceiverFilter);
122 LocalBroadcastManager.getInstance(this).registerReceiver(disappearingReceiver, disappearingReceiverFilter);
123 LocalBroadcastManager
127 new IntentFilter(TaskbarIntent.ACTION_FINISH_FREEFORM_ACTIVITY)
130 helper.setFreeformHackActive(true);
132 // Show power button warning on CyanogenMod / LineageOS devices
133 if(getPackageManager().hasSystemFeature("com.cyanogenmod.android")) {
134 SharedPreferences pref = U.getSharedPreferences(this);
135 if(!pref.getString("power_button_warning", "null").equals(Settings.Secure.getString(getContentResolver(), Settings.Secure.ANDROID_ID))) {
136 new Handler().postDelayed(() -> {
137 if(helper.isInFreeformWorkspace()) {
138 Intent intent = null;
140 switch(pref.getString("theme", "light")) {
142 intent = new Intent(this, InvisibleActivityAlt.class);
145 intent = new Intent(this, InvisibleActivityAltDark.class);
150 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
151 intent.putExtra("power_button_warning", true);
154 U.startActivityMaximized(getApplicationContext(), intent);
163 @TargetApi(Build.VERSION_CODES.N)
165 protected void onResume() {
168 // Show the taskbar when activity is resumed (no other freeform windows are active)
170 LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent("com.farmerbb.taskbar.SHOW_TASKBAR"));
172 if(!isInMultiWindowMode() && !initialLaunch)
175 initialLaunch = false;
179 protected void onDestroy() {
182 if(!proceedWithOnCreate)
185 LocalBroadcastManager.getInstance(this).unregisterReceiver(appearingReceiver);
186 LocalBroadcastManager.getInstance(this).unregisterReceiver(disappearingReceiver);
187 LocalBroadcastManager.getInstance(this).unregisterReceiver(finishReceiver);
193 protected void onStart() {
196 FreeformHackHelper.getInstance().setInFreeformWorkspace(true);
198 if(U.launcherIsDefault(this) && !U.isChromeOs(this)) {
199 LauncherHelper.getInstance().setOnPrimaryHomeScreen(true);
200 bootToFreeform = true;
202 SharedPreferences pref = U.getSharedPreferences(this);
203 if(pref.getBoolean("first_run", true)) {
204 SharedPreferences.Editor editor = pref.edit();
205 editor.putBoolean("first_run", false);
206 editor.putBoolean("collapsed", true);
209 new Handler().postDelayed(() -> {
210 Intent intent = new Intent(this, DummyActivity.class);
211 intent.putExtra("show_recent_apps_dialog", true);
212 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
214 startActivity(intent);
218 // We always start the Taskbar and Start Menu services, even if the app isn't normally running
219 startService(new Intent(this, TaskbarService.class));
220 startService(new Intent(this, StartMenuService.class));
221 startService(new Intent(this, DashboardService.class));
223 if(pref.getBoolean("taskbar_active", false) && !U.isServiceRunning(this, NotificationService.class))
224 pref.edit().putBoolean("taskbar_active", false).apply();
226 // Show the taskbar when activity is started
228 new Handler().postDelayed(() -> LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent("com.farmerbb.taskbar.SHOW_TASKBAR")), 100);
231 // Show the taskbar when activity is started
233 LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent("com.farmerbb.taskbar.SHOW_TASKBAR"));
237 protected void onPause() {
240 possiblyHideTaskbar();
244 protected void onStop() {
248 FreeformHackHelper.getInstance().setInFreeformWorkspace(false);
250 possiblyHideTaskbar();
252 if(bootToFreeform && !finish) {
253 LauncherHelper.getInstance().setOnPrimaryHomeScreen(false);
254 bootToFreeform = false;
256 // Stop the Taskbar and Start Menu services if they should normally not be active
257 SharedPreferences pref = U.getSharedPreferences(this);
258 if(!pref.getBoolean("taskbar_active", false) || pref.getBoolean("is_hidden", false)) {
259 stopService(new Intent(this, TaskbarService.class));
260 stopService(new Intent(this, StartMenuService.class));
261 stopService(new Intent(this, DashboardService.class));
263 IconCache.getInstance(this).clearCache();
268 // We don't want this activity to finish under normal circumstances
270 public void finish() {}
272 private void possiblyHideTaskbar() {
274 new Handler().postDelayed(() -> {
275 if(U.shouldCollapse(this, false) && !LauncherHelper.getInstance().isOnHomeScreen()) {
276 LocalBroadcastManager
278 .sendBroadcast(new Intent(TaskbarIntent.ACTION_HIDE_TASKBAR));
280 LocalBroadcastManager
282 .sendBroadcast(new Intent(TaskbarIntent.ACTION_HIDE_START_MENU));
288 private void reallyFinish() {
290 overridePendingTransition(0, 0);
295 private void cleanup() {
297 FreeformHackHelper helper = FreeformHackHelper.getInstance();
298 helper.setFreeformHackActive(false);
299 helper.setInFreeformWorkspace(false);