1 /* Based on code by Leonardo Fischer
2 * See https://github.com/lgfischer/WidgetHostExample
4 * Copyright 2016 Braden Farmer
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
19 package com.farmerbb.taskbar.activity;
21 import android.app.Activity;
22 import android.app.AlertDialog;
23 import android.appwidget.AppWidgetHost;
24 import android.appwidget.AppWidgetManager;
25 import android.appwidget.AppWidgetProviderInfo;
26 import android.content.ActivityNotFoundException;
27 import android.content.BroadcastReceiver;
28 import android.content.Context;
29 import android.content.Intent;
30 import android.content.SharedPreferences;
31 import android.os.Build;
32 import android.os.Bundle;
33 import android.view.KeyEvent;
34 import android.view.MotionEvent;
35 import android.view.WindowManager;
36 import android.widget.FrameLayout;
37 import android.widget.LinearLayout;
39 import com.farmerbb.taskbar.R;
40 import com.farmerbb.taskbar.helper.DashboardHelper;
41 import com.farmerbb.taskbar.util.DisplayInfo;
42 import com.farmerbb.taskbar.helper.LauncherHelper;
43 import com.farmerbb.taskbar.util.U;
45 import static com.farmerbb.taskbar.util.Constants.*;
47 public class DashboardActivity extends Activity {
49 private AppWidgetManager mAppWidgetManager;
50 private AppWidgetHost mAppWidgetHost;
52 private final int REQUEST_PICK_APPWIDGET = 456;
53 private final int REQUEST_CREATE_APPWIDGET = 789;
55 private boolean shouldFinish = true;
56 private boolean shouldCollapse = true;
57 private boolean contextMenuFix = false;
58 private int cellId = -1;
60 private BroadcastReceiver addWidgetReceiver = new BroadcastReceiver() {
62 public void onReceive(Context context, Intent intent) {
63 mAppWidgetManager = AppWidgetManager.getInstance(context);
64 mAppWidgetHost = new AppWidgetHost(context, intent.getIntExtra(EXTRA_APPWIDGET_ID, -1));
65 cellId = intent.getIntExtra(EXTRA_CELL_ID, -1);
67 int appWidgetId = mAppWidgetHost.allocateAppWidgetId();
68 Intent pickIntent = new Intent(AppWidgetManager.ACTION_APPWIDGET_PICK);
69 pickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
72 startActivityForResult(pickIntent, REQUEST_PICK_APPWIDGET);
73 U.sendBroadcast(DashboardActivity.this, ACTION_TEMP_HIDE_TASKBAR);
74 } catch (ActivityNotFoundException e) {
75 U.showToast(DashboardActivity.this, R.string.tb_lock_device_not_supported);
83 private BroadcastReceiver removeWidgetReceiver = new BroadcastReceiver() {
85 public void onReceive(final Context context, Intent intent) {
86 cellId = intent.getIntExtra(EXTRA_CELL_ID, -1);
88 AlertDialog.Builder builder = new AlertDialog.Builder(DashboardActivity.this);
89 builder.setTitle(R.string.tb_remove_widget)
90 .setMessage(R.string.tb_are_you_sure)
91 .setNegativeButton(R.string.tb_action_cancel, (dialog, which) -> {
92 U.sendBroadcast(DashboardActivity.this, ACTION_REMOVE_WIDGET_COMPLETED);
96 .setPositiveButton(R.string.tb_action_ok, (dialog, which) -> {
97 Intent intent1 = new Intent(ACTION_REMOVE_WIDGET_COMPLETED);
98 intent1.putExtra(EXTRA_CELL_ID, cellId);
99 U.sendBroadcast(DashboardActivity.this, intent1);
104 AlertDialog dialog = builder.create();
106 dialog.setCancelable(false);
108 shouldFinish = false;
112 private BroadcastReceiver finishReceiver = new BroadcastReceiver() {
114 public void onReceive(Context context, Intent intent) {
115 shouldCollapse = false;
118 U.startFreeformHack(DashboardActivity.this);
125 protected void onCreate(Bundle savedInstanceState) {
126 super.onCreate(savedInstanceState);
128 contextMenuFix = getIntent().hasExtra("context_menu_fix");
130 // Detect outside touches, and finish the activity when one is detected
131 getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);
132 getWindow().setFlags(WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH);
134 DisplayInfo display = U.getDisplayInfo(this);
136 setContentView(R.layout.tb_incognito);
138 LinearLayout layout = findViewById(R.id.incognitoLayout);
139 layout.setLayoutParams(new FrameLayout.LayoutParams(display.width, display.height));
141 U.registerReceiver(this, addWidgetReceiver, ACTION_ADD_WIDGET_REQUESTED);
142 U.registerReceiver(this, removeWidgetReceiver, ACTION_REMOVE_WIDGET_REQUESTED);
143 U.registerReceiver(this, finishReceiver, ACTION_DASHBOARD_DISAPPEARING);
145 if(!DashboardHelper.getInstance().isDashboardOpen()) finish();
149 public boolean onTouchEvent(MotionEvent event) {
150 if(event.getAction() == MotionEvent.ACTION_DOWN || event.getAction() == MotionEvent.ACTION_OUTSIDE) onBackPressed();
151 return super.onTouchEvent(event);
155 public void onBackPressed() {
157 U.startFreeformHack(this);
160 U.sendBroadcast(this, ACTION_HIDE_DASHBOARD);
164 public boolean dispatchKeyShortcutEvent(KeyEvent event) {
165 if(event.getAction() == KeyEvent.ACTION_DOWN) {
170 return super.dispatchKeyShortcutEvent(event);
174 public void onTopResumedActivityChanged(boolean isTopResumedActivity) {
175 if(!isTopResumedActivity)
176 performOnPauseLogic();
180 protected void onPause() {
183 if(Build.VERSION.SDK_INT <= Build.VERSION_CODES.P)
184 performOnPauseLogic();
187 private void performOnPauseLogic() {
190 if(U.shouldCollapse(this, true)) {
191 U.sendBroadcast(this, ACTION_HIDE_TASKBAR);
193 U.sendBroadcast(this, ACTION_HIDE_START_MENU);
197 contextMenuFix = false;
203 protected void onDestroy() {
206 U.unregisterReceiver(this, addWidgetReceiver);
207 U.unregisterReceiver(this, removeWidgetReceiver);
208 U.unregisterReceiver(this, finishReceiver);
212 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
213 if(resultCode == RESULT_OK) {
214 if(requestCode == REQUEST_PICK_APPWIDGET) {
215 configureWidget(data);
216 } else if(requestCode == REQUEST_CREATE_APPWIDGET) {
219 } else if(resultCode == RESULT_CANCELED) {
221 int appWidgetId = data.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, -1);
222 if(appWidgetId != -1) {
223 mAppWidgetHost.deleteAppWidgetId(appWidgetId);
227 U.sendBroadcast(this, ACTION_ADD_WIDGET_COMPLETED);
228 U.sendBroadcast(this, ACTION_TEMP_SHOW_TASKBAR);
234 private void configureWidget(Intent data) {
235 Bundle extras = data.getExtras();
236 int appWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, -1);
237 AppWidgetProviderInfo appWidgetInfo = mAppWidgetManager.getAppWidgetInfo(appWidgetId);
238 if(appWidgetInfo.configure != null) {
239 Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_CONFIGURE);
240 intent.setComponent(appWidgetInfo.configure);
241 intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
242 startActivityForResult(intent, REQUEST_CREATE_APPWIDGET);
244 SharedPreferences pref = U.getSharedPreferences(this);
245 if(LauncherHelper.getInstance().isOnHomeScreen(this)
246 && (!pref.getBoolean(PREF_TASKBAR_ACTIVE, false)
247 || pref.getBoolean(PREF_IS_HIDDEN, false)))
248 pref.edit().putBoolean(PREF_DONT_STOP_DASHBOARD, true).apply();
250 shouldFinish = false;
256 private void createWidget(Intent data) {
257 Intent intent = new Intent(ACTION_ADD_WIDGET_COMPLETED);
260 data.getExtras().getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, -1)
262 intent.putExtra(EXTRA_CELL_ID, cellId);
264 U.sendBroadcast(this, intent);
265 U.sendBroadcast(this, ACTION_TEMP_SHOW_TASKBAR);