OSDN Git Service

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