OSDN Git Service

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