OSDN Git Service

Extract SHOW_TASKBAR to TaskbarIntent constant
[android-x86/packages-apps-Taskbar.git] / app / src / main / java / com / farmerbb / taskbar / activity / InvisibleActivityFreeform.java
1 /* Copyright 2016 Braden Farmer
2  *
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
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
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.
14  */
15
16 package com.farmerbb.taskbar.activity;
17
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;
32
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;
43
44 public class InvisibleActivityFreeform extends Activity {
45
46     boolean showTaskbar = false;
47     boolean doNotHide = false;
48     boolean proceedWithOnCreate = true;
49     boolean finish = false;
50     boolean bootToFreeform = false;
51     boolean initialLaunch = true;
52
53     private BroadcastReceiver appearingReceiver = new BroadcastReceiver() {
54         @Override
55         public void onReceive(Context context, Intent intent) {
56             doNotHide = true;
57         }
58     };
59
60     private BroadcastReceiver disappearingReceiver = new BroadcastReceiver() {
61         @Override
62         public void onReceive(Context context, Intent intent) {
63             doNotHide = false;
64         }
65     };
66
67     private BroadcastReceiver finishReceiver = new BroadcastReceiver() {
68         @Override
69         public void onReceive(Context context, Intent intent) {
70             reallyFinish();
71         }
72     };
73
74     @SuppressLint("HardwareIds")
75     @TargetApi(Build.VERSION_CODES.N)
76     @Override
77     protected void onCreate(Bundle savedInstanceState) {
78         super.onCreate(savedInstanceState);
79
80         FreeformHackHelper helper = FreeformHackHelper.getInstance();
81         if(helper.isFreeformHackActive()) {
82             proceedWithOnCreate = false;
83             super.finish();
84         }
85
86         if(getIntent().hasExtra("check_multiwindow")) {
87             showTaskbar = false;
88
89             if(!isInMultiWindowMode()) {
90                 proceedWithOnCreate = false;
91                 super.finish();
92             }
93         }
94
95         if(U.isOverridingFreeformHack(this)) {
96             helper.setFreeformHackActive(true);
97             helper.setInFreeformWorkspace(true);
98
99             proceedWithOnCreate = false;
100             super.finish();
101             overridePendingTransition(0, 0);
102         }
103
104         if(!proceedWithOnCreate)
105             return;
106
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);
110
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");
115
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");
120
121         LocalBroadcastManager.getInstance(this).registerReceiver(appearingReceiver, appearingReceiverFilter);
122         LocalBroadcastManager.getInstance(this).registerReceiver(disappearingReceiver, disappearingReceiverFilter);
123         LocalBroadcastManager
124                 .getInstance(this)
125                 .registerReceiver(
126                         finishReceiver,
127                         new IntentFilter(TaskbarIntent.ACTION_FINISH_FREEFORM_ACTIVITY)
128                 );
129
130         helper.setFreeformHackActive(true);
131
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;
139
140                         switch(pref.getString("theme", "light")) {
141                             case "light":
142                                 intent = new Intent(this, InvisibleActivityAlt.class);
143                                 break;
144                             case "dark":
145                                 intent = new Intent(this, InvisibleActivityAltDark.class);
146                                 break;
147                         }
148
149                         if(intent != null) {
150                             intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
151                             intent.putExtra("power_button_warning", true);
152                         }
153
154                         U.startActivityMaximized(getApplicationContext(), intent);
155                     }
156                 }, 100);
157             }
158         }
159
160         showTaskbar = true;
161     }
162
163     @TargetApi(Build.VERSION_CODES.N)
164     @Override
165     protected void onResume() {
166         super.onResume();
167
168         // Show the taskbar when activity is resumed (no other freeform windows are active)
169         if (showTaskbar) {
170             LocalBroadcastManager
171                     .getInstance(this)
172                     .sendBroadcast(new Intent(TaskbarIntent.ACTION_SHOW_TASKBAR));
173         }
174
175         if (!isInMultiWindowMode() && !initialLaunch) {
176             reallyFinish();
177         }
178
179         initialLaunch = false;
180     }
181
182     @Override
183     protected void onDestroy() {
184         super.onDestroy();
185
186         if(!proceedWithOnCreate)
187             return;
188
189         LocalBroadcastManager.getInstance(this).unregisterReceiver(appearingReceiver);
190         LocalBroadcastManager.getInstance(this).unregisterReceiver(disappearingReceiver);
191         LocalBroadcastManager.getInstance(this).unregisterReceiver(finishReceiver);
192
193         cleanup();
194     }
195
196     @Override
197     protected void onStart() {
198         super.onStart();
199
200         FreeformHackHelper.getInstance().setInFreeformWorkspace(true);
201
202         if(U.launcherIsDefault(this) && !U.isChromeOs(this)) {
203             LauncherHelper.getInstance().setOnPrimaryHomeScreen(true);
204             bootToFreeform = true;
205
206             SharedPreferences pref = U.getSharedPreferences(this);
207             if(pref.getBoolean("first_run", true)) {
208                 SharedPreferences.Editor editor = pref.edit();
209                 editor.putBoolean("first_run", false);
210                 editor.putBoolean("collapsed", true);
211                 editor.apply();
212
213                 new Handler().postDelayed(() -> {
214                     Intent intent = new Intent(this, DummyActivity.class);
215                     intent.putExtra("show_recent_apps_dialog", true);
216                     intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
217
218                     startActivity(intent);
219                 }, 250);
220             }
221
222             // We always start the Taskbar and Start Menu services, even if the app isn't normally running
223             startService(new Intent(this, TaskbarService.class));
224             startService(new Intent(this, StartMenuService.class));
225             startService(new Intent(this, DashboardService.class));
226
227             if(pref.getBoolean("taskbar_active", false) && !U.isServiceRunning(this, NotificationService.class))
228                 pref.edit().putBoolean("taskbar_active", false).apply();
229
230             // Show the taskbar when activity is started
231             if (showTaskbar) {
232                 new Handler().postDelayed(() ->
233                         LocalBroadcastManager
234                                 .getInstance(this)
235                                 .sendBroadcast(new Intent(TaskbarIntent.ACTION_SHOW_TASKBAR)),
236                         100
237                 );
238             }
239         }
240
241         // Show the taskbar when activity is started
242         if (showTaskbar) {
243             LocalBroadcastManager
244                     .getInstance(this)
245                     .sendBroadcast(new Intent(TaskbarIntent.ACTION_SHOW_TASKBAR));
246         }
247     }
248
249     @Override
250     protected void onPause() {
251         super.onPause();
252
253         possiblyHideTaskbar();
254     }
255
256     @Override
257     protected void onStop() {
258         super.onStop();
259
260         if(!finish)
261             FreeformHackHelper.getInstance().setInFreeformWorkspace(false);
262
263         possiblyHideTaskbar();
264
265         if(bootToFreeform && !finish) {
266             LauncherHelper.getInstance().setOnPrimaryHomeScreen(false);
267             bootToFreeform = false;
268
269             // Stop the Taskbar and Start Menu services if they should normally not be active
270             SharedPreferences pref = U.getSharedPreferences(this);
271             if(!pref.getBoolean("taskbar_active", false) || pref.getBoolean("is_hidden", false)) {
272                 stopService(new Intent(this, TaskbarService.class));
273                 stopService(new Intent(this, StartMenuService.class));
274                 stopService(new Intent(this, DashboardService.class));
275
276                 IconCache.getInstance(this).clearCache();
277             }
278         }
279     }
280
281     // We don't want this activity to finish under normal circumstances
282     @Override
283     public void finish() {}
284
285     private void possiblyHideTaskbar() {
286         if(!doNotHide) {
287             new Handler().postDelayed(() -> {
288                 if(U.shouldCollapse(this, false) && !LauncherHelper.getInstance().isOnHomeScreen()) {
289                     LocalBroadcastManager
290                             .getInstance(this)
291                             .sendBroadcast(new Intent(TaskbarIntent.ACTION_HIDE_TASKBAR));
292                 } else {
293                     LocalBroadcastManager
294                             .getInstance(this)
295                             .sendBroadcast(new Intent(TaskbarIntent.ACTION_HIDE_START_MENU));
296                 }
297             }, 100);
298         }
299     }
300
301     private void reallyFinish() {
302         super.finish();
303         overridePendingTransition(0, 0);
304
305         cleanup();
306     }
307
308     private void cleanup() {
309         if(!finish) {
310             FreeformHackHelper helper = FreeformHackHelper.getInstance();
311             helper.setFreeformHackActive(false);
312             helper.setInFreeformWorkspace(false);
313
314             finish = true;
315         }
316     }
317 }