OSDN Git Service

Fix adding widgets to dashboard when on home screen
[android-x86/packages-apps-Taskbar.git] / app / src / main / java / com / farmerbb / taskbar / activity / DashboardActivity.java
1 /* Based on code by Leonardo Fischer
2  * See https://github.com/lgfischer/WidgetHostExample
3  *
4  * Copyright 2016 Braden Farmer
5  *
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
9  *
10  *     http://www.apache.org/licenses/LICENSE-2.0
11  *
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.
17  */
18
19 package com.farmerbb.taskbar.activity;
20
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.IntentFilter;
31 import android.content.SharedPreferences;
32 import android.os.Bundle;
33 import android.support.v4.content.LocalBroadcastManager;
34 import android.view.KeyEvent;
35 import android.view.MotionEvent;
36 import android.view.WindowManager;
37 import android.widget.FrameLayout;
38 import android.widget.LinearLayout;
39
40 import com.farmerbb.taskbar.R;
41 import com.farmerbb.taskbar.util.DashboardHelper;
42 import com.farmerbb.taskbar.util.DisplayInfo;
43 import com.farmerbb.taskbar.util.LauncherHelper;
44 import com.farmerbb.taskbar.util.U;
45
46 public class DashboardActivity extends Activity {
47
48     private AppWidgetManager mAppWidgetManager;
49     private AppWidgetHost mAppWidgetHost;
50
51     private final int REQUEST_PICK_APPWIDGET = 456;
52     private final int REQUEST_CREATE_APPWIDGET = 789;
53
54     private boolean shouldFinish = true;
55     private boolean shouldCollapse = true;
56     private boolean contextMenuFix = false;
57     private int cellId = -1;
58
59     private BroadcastReceiver addWidgetReceiver = new BroadcastReceiver() {
60         @Override
61         public void onReceive(Context context, Intent intent) {
62             mAppWidgetManager = AppWidgetManager.getInstance(context);
63             mAppWidgetHost = new AppWidgetHost(context, intent.getIntExtra("appWidgetId", -1));
64             cellId = intent.getIntExtra("cellId", -1);
65
66             int appWidgetId = mAppWidgetHost.allocateAppWidgetId();
67             Intent pickIntent = new Intent(AppWidgetManager.ACTION_APPWIDGET_PICK);
68             pickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
69
70             try {
71                 startActivityForResult(pickIntent, REQUEST_PICK_APPWIDGET);
72                 LocalBroadcastManager.getInstance(DashboardActivity.this).sendBroadcast(new Intent("com.farmerbb.taskbar.TEMP_HIDE_TASKBAR"));
73             } catch (ActivityNotFoundException e) {
74                 U.showToast(DashboardActivity.this, R.string.lock_device_not_supported);
75                 finish();
76             }
77
78             shouldFinish = false;
79         }
80     };
81
82     private BroadcastReceiver removeWidgetReceiver = new BroadcastReceiver() {
83         @Override
84         public void onReceive(final Context context, Intent intent) {
85             cellId = intent.getIntExtra("cellId", -1);
86
87             AlertDialog.Builder builder = new AlertDialog.Builder(DashboardActivity.this);
88             builder.setTitle(R.string.remove_widget)
89                     .setMessage(R.string.are_you_sure)
90                     .setNegativeButton(R.string.action_cancel, (dialog, which) -> {
91                         LocalBroadcastManager.getInstance(DashboardActivity.this).sendBroadcast(new Intent("com.farmerbb.taskbar.REMOVE_WIDGET_COMPLETED"));
92
93                         shouldFinish = true;
94                     })
95                     .setPositiveButton(R.string.action_ok, (dialog, which) -> {
96                         Intent intent1 = new Intent("com.farmerbb.taskbar.REMOVE_WIDGET_COMPLETED");
97                         intent1.putExtra("cellId", cellId);
98                         LocalBroadcastManager.getInstance(DashboardActivity.this).sendBroadcast(intent1);
99
100                         shouldFinish = true;
101                     });
102
103             AlertDialog dialog = builder.create();
104             dialog.show();
105             dialog.setCancelable(false);
106
107             shouldFinish = false;
108         }
109     };
110
111     private BroadcastReceiver finishReceiver = new BroadcastReceiver() {
112         @Override
113         public void onReceive(Context context, Intent intent) {
114             shouldCollapse = false;
115
116             if(contextMenuFix)
117                 U.startFreeformHack(DashboardActivity.this);
118
119             finish();
120         }
121     };
122
123     @Override
124     protected void onCreate(Bundle savedInstanceState) {
125         super.onCreate(savedInstanceState);
126
127         contextMenuFix = getIntent().hasExtra("context_menu_fix");
128
129         // Detect outside touches, and finish the activity when one is detected
130         getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);
131         getWindow().setFlags(WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH);
132
133         DisplayInfo display = U.getDisplayInfo(this);
134
135         setContentView(R.layout.incognito);
136
137         LinearLayout layout = findViewById(R.id.incognitoLayout);
138         layout.setLayoutParams(new FrameLayout.LayoutParams(display.width, display.height));
139
140         LocalBroadcastManager.getInstance(this).registerReceiver(addWidgetReceiver, new IntentFilter("com.farmerbb.taskbar.ADD_WIDGET_REQUESTED"));
141         LocalBroadcastManager.getInstance(this).registerReceiver(removeWidgetReceiver, new IntentFilter("com.farmerbb.taskbar.REMOVE_WIDGET_REQUESTED"));
142         LocalBroadcastManager.getInstance(this).registerReceiver(finishReceiver, new IntentFilter("com.farmerbb.taskbar.DASHBOARD_DISAPPEARING"));
143
144         if(!DashboardHelper.getInstance().isDashboardOpen()) finish();
145     }
146
147     @Override
148     public boolean onTouchEvent(MotionEvent event) {
149         if(event.getAction() == MotionEvent.ACTION_DOWN || event.getAction() == MotionEvent.ACTION_OUTSIDE) onBackPressed();
150         return super.onTouchEvent(event);
151     }
152
153     @Override
154     public void onBackPressed() {
155         if(contextMenuFix)
156             U.startFreeformHack(this);
157
158         LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent("com.farmerbb.taskbar.HIDE_DASHBOARD"));
159     }
160
161     @Override
162     public boolean dispatchKeyShortcutEvent(KeyEvent event) {
163         if(event.getAction() == KeyEvent.ACTION_DOWN) {
164             event.getKeyCode();
165
166             return true;
167         }
168         return super.dispatchKeyShortcutEvent(event);
169     }
170
171     @Override
172     protected void onPause() {
173         super.onPause();
174
175         if(shouldFinish) {
176             if(shouldCollapse) {
177                 if(U.shouldCollapse(this, true))
178                     LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent("com.farmerbb.taskbar.HIDE_TASKBAR"));
179                 else
180                     LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent("com.farmerbb.taskbar.HIDE_START_MENU"));
181             }
182
183             contextMenuFix = false;
184             onBackPressed();
185         }
186     }
187
188     @Override
189     protected void onDestroy() {
190         super.onDestroy();
191
192         LocalBroadcastManager.getInstance(this).unregisterReceiver(addWidgetReceiver);
193         LocalBroadcastManager.getInstance(this).unregisterReceiver(removeWidgetReceiver);
194         LocalBroadcastManager.getInstance(this).unregisterReceiver(finishReceiver);
195     }
196
197     @Override
198     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
199         if(resultCode == RESULT_OK) {
200             if(requestCode == REQUEST_PICK_APPWIDGET) {
201                 configureWidget(data);
202             } else if(requestCode == REQUEST_CREATE_APPWIDGET) {
203                 createWidget(data);
204             }
205         } else if(resultCode == RESULT_CANCELED) {
206             if(data != null) {
207                 int appWidgetId = data.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, -1);
208                 if(appWidgetId != -1) {
209                     mAppWidgetHost.deleteAppWidgetId(appWidgetId);
210                 }
211             }
212
213             LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent("com.farmerbb.taskbar.ADD_WIDGET_COMPLETED"));
214             LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent("com.farmerbb.taskbar.TEMP_SHOW_TASKBAR"));
215
216             shouldFinish = true;
217         }
218     }
219
220     private void configureWidget(Intent data) {
221         Bundle extras = data.getExtras();
222         int appWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, -1);
223         AppWidgetProviderInfo appWidgetInfo = mAppWidgetManager.getAppWidgetInfo(appWidgetId);
224         if(appWidgetInfo.configure != null) {
225             Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_CONFIGURE);
226             intent.setComponent(appWidgetInfo.configure);
227             intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
228             startActivityForResult(intent, REQUEST_CREATE_APPWIDGET);
229
230             SharedPreferences pref = U.getSharedPreferences(this);
231             if(LauncherHelper.getInstance().isOnHomeScreen() && !pref.getBoolean("taskbar_active", false))
232                 pref.edit().putBoolean("dont_stop_dashboard", true).apply();
233
234             shouldFinish = false;
235         } else {
236             createWidget(data);
237         }
238     }
239
240     private void createWidget(Intent data) {
241         Intent intent = new Intent("com.farmerbb.taskbar.ADD_WIDGET_COMPLETED");
242         intent.putExtra("appWidgetId", data.getExtras().getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, -1));
243         intent.putExtra("cellId", cellId);
244
245         LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(this);
246         lbm.sendBroadcast(intent);
247         lbm.sendBroadcast(new Intent("com.farmerbb.taskbar.TEMP_SHOW_TASKBAR"));
248
249         shouldFinish = true;
250     }
251 }