1 /* Copyright 2016 Braden Farmer
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
7 * http://www.apache.org/licenses/LICENSE-2.0
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.
16 package com.farmerbb.taskbar.adapter;
18 import android.app.ActivityOptions;
19 import android.content.ComponentName;
20 import android.content.Context;
21 import android.content.Intent;
22 import android.content.SharedPreferences;
23 import android.graphics.Rect;
24 import android.hardware.display.DisplayManager;
25 import android.os.Build;
26 import android.os.Handler;
27 import android.support.v4.content.ContextCompat;
28 import android.support.v4.content.LocalBroadcastManager;
29 import android.view.Display;
30 import android.view.LayoutInflater;
31 import android.view.MotionEvent;
32 import android.view.View;
33 import android.view.ViewGroup;
34 import android.widget.ArrayAdapter;
35 import android.widget.ImageView;
36 import android.widget.LinearLayout;
37 import android.widget.TextView;
39 import com.farmerbb.taskbar.R;
40 import com.farmerbb.taskbar.activity.ContextMenuActivity;
41 import com.farmerbb.taskbar.activity.ContextMenuActivityDark;
42 import com.farmerbb.taskbar.activity.InvisibleActivityFreeform;
43 import com.farmerbb.taskbar.util.AppEntry;
44 import com.farmerbb.taskbar.util.FreeformHackHelper;
45 import com.farmerbb.taskbar.util.U;
47 import java.util.List;
49 import static android.content.Context.DISPLAY_SERVICE;
51 public class StartMenuAdapter extends ArrayAdapter<AppEntry> {
53 private boolean isGrid = false;
55 public StartMenuAdapter(Context context, int layout, List<AppEntry> list) {
56 super(context, layout, list);
57 isGrid = layout == R.layout.row_alt;
61 public View getView(int position, View convertView, final ViewGroup parent) {
62 // Check if an existing view is being reused, otherwise inflate the view
63 if(convertView == null)
64 convertView = LayoutInflater.from(getContext()).inflate(isGrid ? R.layout.row_alt : R.layout.row, parent, false);
66 final AppEntry entry = getItem(position);
67 final SharedPreferences pref = U.getSharedPreferences(getContext());
69 TextView textView = (TextView) convertView.findViewById(R.id.name);
70 textView.setText(entry.getLabel());
72 switch(pref.getString("theme", "light")) {
74 textView.setTextColor(ContextCompat.getColor(getContext(), R.color.text_color));
77 textView.setTextColor(ContextCompat.getColor(getContext(), R.color.text_color_dark));
81 ImageView imageView = (ImageView) convertView.findViewById(R.id.icon);
82 imageView.setImageDrawable(entry.getIcon(getContext()));
84 LinearLayout layout = (LinearLayout) convertView.findViewById(R.id.entry);
85 layout.setOnClickListener(new View.OnClickListener() {
87 public void onClick(View view) {
88 boolean shouldDelay = false;
90 SharedPreferences pref = U.getSharedPreferences(getContext());
91 if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N
92 && pref.getBoolean("freeform_hack", false)
93 && !FreeformHackHelper.getInstance().isFreeformHackActive()) {
96 Intent freeformHackIntent = new Intent(getContext(), InvisibleActivityFreeform.class);
97 freeformHackIntent.putExtra("check_multiwindow", true);
98 freeformHackIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
99 getContext().startActivity(freeformHackIntent);
103 new Handler().postDelayed(new Runnable() {
106 launchApp(entry.getComponentName());
109 } else launchApp(entry.getComponentName());
113 layout.setOnLongClickListener(new View.OnLongClickListener() {
115 public boolean onLongClick(View view) {
116 int[] location = new int[2];
117 view.getLocationOnScreen(location);
118 openContextMenu(entry, location);
123 layout.setOnGenericMotionListener(new View.OnGenericMotionListener() {
125 public boolean onGenericMotion(View view, MotionEvent motionEvent) {
126 if(motionEvent.getAction() == MotionEvent.ACTION_BUTTON_PRESS
127 && motionEvent.getButtonState() == MotionEvent.BUTTON_SECONDARY) {
128 int[] location = new int[2];
129 view.getLocationOnScreen(location);
130 openContextMenu(entry, location);
140 @SuppressWarnings("deprecation")
141 private void openContextMenu(AppEntry entry, int[] location) {
142 LocalBroadcastManager.getInstance(getContext()).sendBroadcast(new Intent("com.farmerbb.taskbar.HIDE_START_MENU"));
144 SharedPreferences pref = U.getSharedPreferences(getContext());
145 Intent intent = null;
147 switch(pref.getString("theme", "light")) {
149 intent = new Intent(getContext(), ContextMenuActivity.class);
152 intent = new Intent(getContext(), ContextMenuActivityDark.class);
157 intent.putExtra("package_name", entry.getPackageName());
158 intent.putExtra("app_name", entry.getLabel());
159 intent.putExtra("component_name", entry.getComponentName());
160 intent.putExtra("launched_from_start_menu", true);
161 intent.putExtra("x", location[0]);
162 intent.putExtra("y", location[1]);
163 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
166 if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N && pref.getBoolean("freeform_hack", false)) {
167 DisplayManager dm = (DisplayManager) getContext().getSystemService(DISPLAY_SERVICE);
168 Display display = dm.getDisplay(Display.DEFAULT_DISPLAY);
170 getContext().startActivity(intent, ActivityOptions.makeBasic().setLaunchBounds(new Rect(0, 0, display.getWidth(), display.getHeight())).toBundle());
172 getContext().startActivity(intent);
175 private void launchApp(String componentName) {
176 Intent intent = new Intent();
177 intent.setComponent(ComponentName.unflattenFromString(componentName));
178 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
179 intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
181 SharedPreferences pref = U.getSharedPreferences(getContext());
182 switch(pref.getString("window_size", "standard")) {
184 U.launchStandard(getContext(), intent);
187 U.launchFullscreen(getContext(), intent, true);
190 U.launchPhoneSize(getContext(), intent);
194 if(pref.getBoolean("hide_taskbar", true) && !pref.getBoolean("in_freeform_workspace", false))
195 LocalBroadcastManager.getInstance(getContext()).sendBroadcast(new Intent("com.farmerbb.taskbar.HIDE_TASKBAR"));
197 LocalBroadcastManager.getInstance(getContext()).sendBroadcast(new Intent("com.farmerbb.taskbar.HIDE_START_MENU"));