OSDN Git Service

b21765edca91c69ed17e46dd214212d9a405dff3
[android-x86/packages-apps-Taskbar.git] / app / src / main / java / com / farmerbb / taskbar / activity / HomeActivityDelegate.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.app.AlertDialog;
22 import android.app.WallpaperManager;
23 import android.content.ActivityNotFoundException;
24 import android.content.BroadcastReceiver;
25 import android.content.Context;
26 import android.content.Intent;
27 import android.content.IntentFilter;
28 import android.content.SharedPreferences;
29 import android.os.Build;
30 import android.os.Bundle;
31 import android.os.Handler;
32 import android.support.v4.content.LocalBroadcastManager;
33 import android.view.GestureDetector;
34 import android.view.MotionEvent;
35 import android.view.View;
36 import android.view.WindowManager;
37
38 import com.farmerbb.taskbar.R;
39 import com.farmerbb.taskbar.service.DashboardService;
40 import com.farmerbb.taskbar.service.NotificationService;
41 import com.farmerbb.taskbar.service.StartMenuService;
42 import com.farmerbb.taskbar.service.TaskbarService;
43 import com.farmerbb.taskbar.util.CompatUtils;
44 import com.farmerbb.taskbar.util.DisplayInfo;
45 import com.farmerbb.taskbar.util.FreeformHackHelper;
46 import com.farmerbb.taskbar.util.IconCache;
47 import com.farmerbb.taskbar.util.LauncherHelper;
48 import com.farmerbb.taskbar.util.U;
49
50 public class HomeActivityDelegate extends Activity {
51
52     private boolean forceTaskbarStart = false;
53     private AlertDialog dialog;
54
55     private boolean shouldDelayFreeformHack;
56     private int hits;
57
58     private BroadcastReceiver killReceiver = new BroadcastReceiver() {
59         @Override
60         public void onReceive(Context context, Intent intent) {
61             killHomeActivity();
62         }
63     };
64
65     private BroadcastReceiver forceTaskbarStartReceiver = new BroadcastReceiver() {
66         @Override
67         public void onReceive(Context context, Intent intent) {
68             forceTaskbarStart = true;
69         }
70     };
71
72     private BroadcastReceiver freeformToggleReceiver = new BroadcastReceiver() {
73         @Override
74         public void onReceive(Context context, Intent intent) {
75             updateWindowFlags();
76         }
77     };
78
79     @SuppressLint("RestrictedApi")
80     @Override
81     protected void onCreate(Bundle savedInstanceState) {
82         super.onCreate(savedInstanceState);
83
84         shouldDelayFreeformHack = true;
85         hits = 0;
86
87         WindowManager.LayoutParams params = getWindow().getAttributes();
88         if(CompatUtils.applyDisplayCutoutModeTo(params))
89             getWindow().setAttributes(params);
90
91         getWindow().setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
92
93         View view = new View(this) {
94             @Override
95             protected void onAttachedToWindow() {
96                 super.onAttachedToWindow();
97
98                 WallpaperManager wallpaperManager = (WallpaperManager) getSystemService(WALLPAPER_SERVICE);
99                 wallpaperManager.setWallpaperOffsets(getWindowToken(), 0.5f, 0.5f);
100
101                 if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
102                     DisplayInfo display = U.getDisplayInfo(HomeActivityDelegate.this);
103                     wallpaperManager.suggestDesiredDimensions(display.width, display.height);
104                 }
105
106                 boolean shouldStartFreeformHack = shouldDelayFreeformHack && hits > 0;
107                 shouldDelayFreeformHack = false;
108
109                 if(shouldStartFreeformHack)
110                     startFreeformHack();
111             }
112         };
113
114         view.setOnClickListener(view1 -> LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent("com.farmerbb.taskbar.HIDE_START_MENU")));
115
116         view.setOnLongClickListener(view12 -> {
117             setWallpaper();
118             return false;
119         });
120
121         view.setOnGenericMotionListener((view13, motionEvent) -> {
122             if(motionEvent.getAction() == MotionEvent.ACTION_BUTTON_PRESS
123                     && motionEvent.getButtonState() == MotionEvent.BUTTON_SECONDARY) {
124                 setWallpaper();
125             }
126             return false;
127         });
128
129         final GestureDetector detector = new GestureDetector(this, new GestureDetector.OnGestureListener() {
130             @Override
131             public boolean onSingleTapUp(MotionEvent e) {
132                 return false;
133             }
134
135             @Override
136             public void onShowPress(MotionEvent e) {}
137
138             @Override
139             public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
140                 return false;
141             }
142
143             @Override
144             public void onLongPress(MotionEvent e) {}
145
146             @Override
147             public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
148                 return false;
149             }
150
151             @Override
152             public boolean onDown(MotionEvent e) {
153                 return false;
154             }
155         });
156
157         detector.setOnDoubleTapListener(new GestureDetector.OnDoubleTapListener() {
158             @Override
159             public boolean onDoubleTap(MotionEvent e) {
160                 final SharedPreferences pref = U.getSharedPreferences(HomeActivityDelegate.this);
161                 if(!pref.getBoolean("dont_show_double_tap_dialog", false)) {
162                     if(pref.getBoolean("double_tap_to_sleep", false)) {
163                         U.lockDevice(HomeActivityDelegate.this);
164                     } else {
165                         AlertDialog.Builder builder = new AlertDialog.Builder(U.wrapContext(HomeActivityDelegate.this));
166                         builder.setTitle(R.string.double_tap_to_sleep)
167                                 .setMessage(R.string.enable_double_tap_to_sleep)
168                                 .setNegativeButton(pref.getBoolean("double_tap_dialog_shown", false)
169                                         ? R.string.action_dont_show_again
170                                         : R.string.action_cancel, (dialog, which) -> pref.edit().putBoolean(pref.getBoolean("double_tap_dialog_shown", false)
171                                         ? "dont_show_double_tap_dialog"
172                                         : "double_tap_dialog_shown", true).apply())
173                                 .setPositiveButton(R.string.action_ok, (dialog, which) -> {
174                                     pref.edit().putBoolean("double_tap_to_sleep", true).apply();
175                                     U.lockDevice(HomeActivityDelegate.this);
176                                 });
177
178                         AlertDialog dialog = builder.create();
179                         dialog.show();
180                     }
181                 }
182
183                 return false;
184             }
185
186             @Override
187             public boolean onDoubleTapEvent(MotionEvent e) {
188                 return false;
189             }
190
191             @Override
192             public boolean onSingleTapConfirmed(MotionEvent e) {
193                 return false;
194             }
195
196         });
197
198         view.setOnTouchListener((v, event) -> {
199             detector.onTouchEvent(event);
200             return false;
201         });
202
203         if((this instanceof HomeActivity || U.isLauncherPermanentlyEnabled(this))
204                 && !U.isChromeOs(this)) {
205             setContentView(view);
206
207             SharedPreferences pref = U.getSharedPreferences(this);
208             pref.edit().putBoolean("launcher", true).apply();
209         } else
210             killHomeActivity();
211
212         updateWindowFlags();
213
214         LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(this);
215         lbm.registerReceiver(killReceiver, new IntentFilter("com.farmerbb.taskbar.KILL_HOME_ACTIVITY"));
216         lbm.registerReceiver(forceTaskbarStartReceiver, new IntentFilter("com.farmerbb.taskbar.FORCE_TASKBAR_RESTART"));
217
218         IntentFilter intentFilter = new IntentFilter();
219         intentFilter.addAction("com.farmerbb.taskbar.UPDATE_FREEFORM_CHECKBOX");
220         intentFilter.addAction("com.farmerbb.taskbar.TOUCH_ABSORBER_STATE_CHANGED");
221
222         lbm.registerReceiver(freeformToggleReceiver, intentFilter);
223
224         U.initPrefs(this);
225     }
226
227     private void setWallpaper() {
228         if(U.shouldCollapse(this, true))
229             LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent("com.farmerbb.taskbar.TEMP_HIDE_TASKBAR"));
230         else
231             LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent("com.farmerbb.taskbar.HIDE_START_MENU"));
232
233         try {
234             startActivity(Intent.createChooser(new Intent(Intent.ACTION_SET_WALLPAPER), getString(R.string.set_wallpaper)));
235         } catch (ActivityNotFoundException e) { /* Gracefully fail */ }
236     }
237
238     @SuppressWarnings("deprecation")
239     @TargetApi(Build.VERSION_CODES.N)
240     @Override
241     protected void onResume() {
242         super.onResume();
243
244         if(bootToFreeform()) {
245             if(U.launcherIsDefault(this))
246                 startFreeformHack();
247             else {
248                 U.showToastLong(this, R.string.set_as_default_home);
249
250                 Intent homeIntent = new Intent(Intent.ACTION_MAIN);
251                 homeIntent.addCategory(Intent.CATEGORY_HOME);
252                 homeIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
253
254                 try {
255                     startActivity(homeIntent);
256                     finish();
257                 } catch (ActivityNotFoundException e) { /* Gracefully fail */ }
258             }
259         } else {
260             LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent("com.farmerbb.taskbar.TEMP_SHOW_TASKBAR"));
261         }
262     }
263
264     @Override
265     protected void onStart() {
266         super.onStart();
267
268         LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent("com.farmerbb.taskbar.HIDE_START_MENU"));
269
270         if(U.canDrawOverlays(this)) {
271             if(!bootToFreeform()) {
272                 final LauncherHelper helper = LauncherHelper.getInstance();
273                 helper.setOnHomeScreen(true);
274
275                 if(forceTaskbarStart) {
276                     forceTaskbarStart = false;
277                     new Handler().postDelayed(() -> {
278                         helper.setOnHomeScreen(true);
279                         startTaskbar();
280                     }, 250);
281                 } else
282                     startTaskbar();
283             } else if(U.launcherIsDefault(this))
284                 startFreeformHack();
285         } else
286             dialog = U.showPermissionDialog(U.wrapContext(this),
287                     () -> dialog = U.showErrorDialog(U.wrapContext(this), "SYSTEM_ALERT_WINDOW"),
288                     null);
289     }
290
291     private boolean bootToFreeform() {
292         SharedPreferences pref = U.getSharedPreferences(this);
293         return U.hasFreeformSupport(this)
294                 && pref.getBoolean("freeform_hack", false)
295                 && !U.isOverridingFreeformHack(this);
296     }
297
298     private void startTaskbar() {
299         SharedPreferences pref = U.getSharedPreferences(this);
300         if(pref.getBoolean("first_run", true)) {
301             SharedPreferences.Editor editor = pref.edit();
302             editor.putBoolean("first_run", false);
303             editor.putBoolean("collapsed", true);
304             editor.apply();
305
306             dialog = U.showRecentAppsDialog(U.wrapContext(this),
307                     () -> dialog = U.showErrorDialog(U.wrapContext(this), "GET_USAGE_STATS"),
308                     null);
309         }
310
311         // We always start the Taskbar and Start Menu services, even if the app isn't normally running
312         startService(new Intent(this, TaskbarService.class));
313         startService(new Intent(this, StartMenuService.class));
314         startService(new Intent(this, DashboardService.class));
315
316         if(pref.getBoolean("taskbar_active", false) && !U.isServiceRunning(this, NotificationService.class))
317             pref.edit().putBoolean("taskbar_active", false).apply();
318
319         // Show the Taskbar temporarily, as nothing else will be visible on screen
320         new Handler().postDelayed(() -> LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent("com.farmerbb.taskbar.TEMP_SHOW_TASKBAR")), 100);
321     }
322
323     private void startFreeformHack() {
324         if(shouldDelayFreeformHack)
325             hits++;
326         else
327             U.startFreeformHack(this);
328     }
329
330     @Override
331     protected void onStop() {
332         super.onStop();
333
334         SharedPreferences pref = U.getSharedPreferences(this);
335         if(!bootToFreeform()) {
336             LauncherHelper.getInstance().setOnHomeScreen(false);
337
338             if(U.shouldCollapse(this, true))
339                 LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent("com.farmerbb.taskbar.TEMP_HIDE_TASKBAR"));
340             else
341                 LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent("com.farmerbb.taskbar.HIDE_START_MENU"));
342
343             // Stop the Taskbar and Start Menu services if they should normally not be active
344             if(!pref.getBoolean("taskbar_active", false) || pref.getBoolean("is_hidden", false)) {
345                 stopService(new Intent(this, TaskbarService.class));
346                 stopService(new Intent(this, StartMenuService.class));
347                 stopService(new Intent(this, DashboardService.class));
348
349                 IconCache.getInstance(this).clearCache();
350             }
351         }
352
353         if(dialog != null) {
354             dialog.dismiss();
355             dialog = null;
356         }
357     }
358
359     @Override
360     protected void onDestroy() {
361         super.onDestroy();
362
363         LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(this);
364         lbm.unregisterReceiver(killReceiver);
365         lbm.unregisterReceiver(forceTaskbarStartReceiver);
366         lbm.unregisterReceiver(freeformToggleReceiver);
367     }
368
369     @Override
370     public void onBackPressed() {
371         LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent("com.farmerbb.taskbar.HIDE_START_MENU"));
372     }
373
374     private void killHomeActivity() {
375         LauncherHelper.getInstance().setOnHomeScreen(false);
376
377         // Stop the Taskbar and Start Menu services if they should normally not be active
378         SharedPreferences pref = U.getSharedPreferences(this);
379         if(!pref.getBoolean("taskbar_active", false) || pref.getBoolean("is_hidden", false)) {
380             stopService(new Intent(this, TaskbarService.class));
381             stopService(new Intent(this, StartMenuService.class));
382             stopService(new Intent(this, DashboardService.class));
383
384             IconCache.getInstance(this).clearCache();
385
386             U.stopFreeformHack(this);
387         }
388
389         finish();
390     }
391
392     private void updateWindowFlags() {
393         int flags = WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
394         if(FreeformHackHelper.getInstance().isTouchAbsorberActive() && U.isOverridingFreeformHack(this))
395             getWindow().setFlags(flags, flags);
396         else
397             getWindow().clearFlags(flags);
398     }
399 }