OSDN Git Service

Merge pull request #6 from farmerbb/master
[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.hardware.display.DisplayManager;
33 import android.os.Bundle;
34 import android.support.v4.content.LocalBroadcastManager;
35 import android.view.Display;
36 import android.view.KeyEvent;
37 import android.view.MotionEvent;
38 import android.view.WindowManager;
39 import android.widget.FrameLayout;
40 import android.widget.LinearLayout;
41
42 import com.farmerbb.taskbar.R;
43 import com.farmerbb.taskbar.util.DashboardHelper;
44 import com.farmerbb.taskbar.util.FreeformHackHelper;
45 import com.farmerbb.taskbar.util.U;
46
47 public class DashboardActivity extends Activity {
48
49     private AppWidgetManager mAppWidgetManager;
50     private AppWidgetHost mAppWidgetHost;
51
52     private final int REQUEST_PICK_APPWIDGET = 456;
53     private final int REQUEST_CREATE_APPWIDGET = 789;
54
55     private boolean shouldFinish = true;
56     private boolean shouldCollapse = true;
57     private boolean contextMenuFix = false;
58     private int cellId = -1;
59
60     private BroadcastReceiver addWidgetReceiver = new BroadcastReceiver() {
61         @Override
62         public void onReceive(Context context, Intent intent) {
63             mAppWidgetManager = AppWidgetManager.getInstance(context);
64             mAppWidgetHost = new AppWidgetHost(context, intent.getIntExtra("appWidgetId", -1));
65             cellId = intent.getIntExtra("cellId", -1);
66
67             int appWidgetId = mAppWidgetHost.allocateAppWidgetId();
68             Intent pickIntent = new Intent(AppWidgetManager.ACTION_APPWIDGET_PICK);
69             pickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
70
71             try {
72                 startActivityForResult(pickIntent, REQUEST_PICK_APPWIDGET);
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, false, false);
118
119             finish();
120         }
121     };
122
123     @SuppressWarnings("deprecation")
124     @Override
125     protected void onCreate(Bundle savedInstanceState) {
126         super.onCreate(savedInstanceState);
127
128         contextMenuFix = getIntent().hasExtra("context_menu_fix");
129
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);
133
134         DisplayManager dm = (DisplayManager) getSystemService(DISPLAY_SERVICE);
135         Display display = dm.getDisplay(Display.DEFAULT_DISPLAY);
136
137         setContentView(R.layout.incognito);
138
139         LinearLayout layout = (LinearLayout) findViewById(R.id.incognitoLayout);
140         layout.setLayoutParams(new FrameLayout.LayoutParams(display.getWidth(), display.getHeight()));
141
142         LocalBroadcastManager.getInstance(this).registerReceiver(addWidgetReceiver, new IntentFilter("com.farmerbb.taskbar.ADD_WIDGET_REQUESTED"));
143         LocalBroadcastManager.getInstance(this).registerReceiver(removeWidgetReceiver, new IntentFilter("com.farmerbb.taskbar.REMOVE_WIDGET_REQUESTED"));
144         LocalBroadcastManager.getInstance(this).registerReceiver(finishReceiver, new IntentFilter("com.farmerbb.taskbar.DASHBOARD_DISAPPEARING"));
145
146         if(!DashboardHelper.getInstance().isDashboardOpen()) finish();
147     }
148
149     @Override
150     public boolean onTouchEvent(MotionEvent event) {
151         if(event.getAction() == MotionEvent.ACTION_DOWN || event.getAction() == MotionEvent.ACTION_OUTSIDE) onBackPressed();
152         return super.onTouchEvent(event);
153     }
154
155     @Override
156     public void onBackPressed() {
157         if(contextMenuFix)
158             U.startFreeformHack(this, false, false);
159
160         LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent("com.farmerbb.taskbar.HIDE_DASHBOARD"));
161     }
162
163     @Override
164     public boolean dispatchKeyShortcutEvent(KeyEvent event) {
165         if(event.getAction() == KeyEvent.ACTION_DOWN) {
166             event.getKeyCode();
167
168             return true;
169         }
170         return super.dispatchKeyShortcutEvent(event);
171     }
172
173     @Override
174     protected void onPause() {
175         super.onPause();
176
177         if(shouldFinish) {
178             if(shouldCollapse) {
179                 SharedPreferences pref = U.getSharedPreferences(this);
180                 if(pref.getBoolean("hide_taskbar", true) && !FreeformHackHelper.getInstance().isInFreeformWorkspace())
181                     LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent("com.farmerbb.taskbar.HIDE_TASKBAR"));
182                 else
183                     LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent("com.farmerbb.taskbar.HIDE_START_MENU"));
184             }
185
186             contextMenuFix = false;
187             onBackPressed();
188         }
189     }
190
191     @Override
192     protected void onDestroy() {
193         super.onDestroy();
194
195         LocalBroadcastManager.getInstance(this).unregisterReceiver(addWidgetReceiver);
196         LocalBroadcastManager.getInstance(this).unregisterReceiver(removeWidgetReceiver);
197         LocalBroadcastManager.getInstance(this).unregisterReceiver(finishReceiver);
198     }
199
200     @Override
201     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
202         if(resultCode == RESULT_OK) {
203             if(requestCode == REQUEST_PICK_APPWIDGET) {
204                 configureWidget(data);
205             } else if(requestCode == REQUEST_CREATE_APPWIDGET) {
206                 createWidget(data);
207             }
208         } else if(resultCode == RESULT_CANCELED) {
209             if(data != null) {
210                 int appWidgetId = data.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, -1);
211                 if(appWidgetId != -1) {
212                     mAppWidgetHost.deleteAppWidgetId(appWidgetId);
213                 }
214             }
215
216             LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent("com.farmerbb.taskbar.ADD_WIDGET_COMPLETED"));
217
218             shouldFinish = true;
219         }
220     }
221
222     private void configureWidget(Intent data) {
223         Bundle extras = data.getExtras();
224         int appWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, -1);
225         AppWidgetProviderInfo appWidgetInfo = mAppWidgetManager.getAppWidgetInfo(appWidgetId);
226         if(appWidgetInfo.configure != null) {
227             Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_CONFIGURE);
228             intent.setComponent(appWidgetInfo.configure);
229             intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
230             startActivityForResult(intent, REQUEST_CREATE_APPWIDGET);
231
232             shouldFinish = false;
233         } else {
234             createWidget(data);
235         }
236     }
237
238     private void createWidget(Intent data) {
239         Intent intent = new Intent("com.farmerbb.taskbar.ADD_WIDGET_COMPLETED");
240         intent.putExtra("appWidgetId", data.getExtras().getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, -1));
241         intent.putExtra("cellId", cellId);
242         LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
243
244         shouldFinish = true;
245     }
246 }