OSDN Git Service

9e8271ec6cb86c79b9ec757bd21c1c7bbfebfc36
[android-x86/packages-apps-Taskbar.git] / app / src / main / java / com / farmerbb / taskbar / fragment / FreeformModeFragment.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.fragment;
17
18 import android.annotation.TargetApi;
19 import android.content.ActivityNotFoundException;
20 import android.content.BroadcastReceiver;
21 import android.content.Context;
22 import android.content.Intent;
23 import android.content.IntentFilter;
24 import android.content.SharedPreferences;
25 import android.content.pm.PackageManager;
26 import android.net.Uri;
27 import android.os.Build;
28 import android.os.Bundle;
29 import android.preference.CheckBoxPreference;
30 import android.preference.Preference;
31 import android.provider.Settings;
32 import android.support.v4.content.LocalBroadcastManager;
33 import android.support.v7.app.ActionBar;
34 import android.support.v7.app.AlertDialog;
35 import android.support.v7.app.AppCompatActivity;
36 import android.view.View;
37
38 import com.farmerbb.taskbar.BuildConfig;
39 import com.farmerbb.taskbar.R;
40 import com.farmerbb.taskbar.util.FreeformHackHelper;
41 import com.farmerbb.taskbar.util.CompatUtils;
42 import com.farmerbb.taskbar.util.U;
43
44 public class FreeformModeFragment extends SettingsFragment implements Preference.OnPreferenceClickListener {
45
46     private BroadcastReceiver checkBoxReceiver = new BroadcastReceiver() {
47         @Override
48         public void onReceive(Context context, Intent intent) {
49             CheckBoxPreference preference = (CheckBoxPreference) findPreference("freeform_hack");
50             if(preference != null) {
51                 SharedPreferences pref = U.getSharedPreferences(getActivity());
52                 preference.setChecked(pref.getBoolean("freeform_hack", false));
53             }
54         }
55     };
56
57     @Override
58     public void onCreate(Bundle savedInstanceState) {
59         finishedLoadingPrefs = false;
60
61         super.onCreate(savedInstanceState);
62
63         // Add preferences
64         addPreferencesFromResource(R.xml.pref_freeform_hack);
65
66         findPreference("freeform_hack").setOnPreferenceClickListener(this);
67         findPreference("freeform_mode_help").setOnPreferenceClickListener(this);
68         findPreference("add_shortcut").setOnPreferenceClickListener(this);
69         findPreference("window_size").setOnPreferenceClickListener(this);
70
71         if(!BuildConfig.APPLICATION_ID.equals(BuildConfig.ANDROIDX86_APPLICATION_ID)
72                 && !U.hasSupportLibrary(getActivity())
73                 && U.isPlayStoreInstalled(getActivity())) {
74             findPreference("secondscreen").setOnPreferenceClickListener(this);
75             findPreference("secondscreen").setTitle(
76                     getSecondScreenPackageName() == null
77                             ? R.string.pref_secondscreen_title_install
78                             : R.string.pref_secondscreen_title_open);
79         } else
80             getPreferenceScreen().removePreference(findPreference("secondscreen"));
81
82         bindPreferenceSummaryToValue(findPreference("window_size"));
83
84         SharedPreferences pref = U.getSharedPreferences(getActivity());
85         boolean lockFreeformToggle = pref.getBoolean("freeform_hack", false)
86                 && U.isChromeOs(getActivity());
87
88         if(!lockFreeformToggle) {
89             findPreference("save_window_sizes").setDependency("freeform_hack");
90             findPreference("force_new_window").setDependency("freeform_hack");
91             findPreference("launch_games_fullscreen").setDependency("freeform_hack");
92             findPreference("window_size").setDependency("freeform_hack");
93             findPreference("add_shortcut").setDependency("freeform_hack");
94         }
95
96         findPreference("freeform_hack").setEnabled(!lockFreeformToggle);
97
98         // Dialog shown on devices which seem to not work correctly with freeform mode
99         if(U.hasPartialFreeformSupport() && !pref.getBoolean("samsung_dialog_shown", false)) {
100             AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
101             builder.setTitle(R.string.samsung_freeform_title)
102                     .setMessage(R.string.samsung_freeform_message)
103                     .setPositiveButton(R.string.action_ok, (dialog, which) -> pref.edit().putBoolean("samsung_dialog_shown", true).apply());
104
105             AlertDialog dialog = builder.create();
106             dialog.show();
107             dialog.setCancelable(false);
108         }
109
110         LocalBroadcastManager.getInstance(getActivity()).registerReceiver(checkBoxReceiver, new IntentFilter("com.farmerbb.taskbar.UPDATE_FREEFORM_CHECKBOX"));
111
112         finishedLoadingPrefs = true;
113     }
114
115     @Override
116     public void onActivityCreated(Bundle savedInstanceState) {
117         super.onActivityCreated(savedInstanceState);
118
119         AppCompatActivity activity = (AppCompatActivity) getActivity();
120         activity.setTitle(R.string.pref_header_freeform);
121         ActionBar actionBar = activity.getSupportActionBar();
122         if(actionBar != null)
123             actionBar.setDisplayHomeAsUpEnabled(true);
124     }
125
126     @Override
127     public void onResume() {
128         super.onResume();
129
130         if(showReminderToast) {
131             showReminderToast = false;
132
133             freeformSetupComplete();
134         }
135     }
136
137     @Override
138     public void onDestroy() {
139         super.onDestroy();
140
141         LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(checkBoxReceiver);
142     }
143
144     @TargetApi(Build.VERSION_CODES.N)
145     @Override
146     public boolean onPreferenceClick(final Preference p) {
147         final SharedPreferences pref = U.getSharedPreferences(getActivity());
148
149         switch(p.getKey()) {
150             case "freeform_hack":
151                 if(((CheckBoxPreference) p).isChecked()) {
152                     if(!U.hasFreeformSupport(getActivity())) {
153                         try {
154                             Settings.Global.putInt(getActivity().getContentResolver(), "enable_freeform_support", 1);
155                             U.showToastLong(getActivity(), R.string.reboot_required);
156                         } catch (Exception e) {
157                             ((CheckBoxPreference) p).setChecked(false);
158
159                             AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
160                             if(Build.VERSION.SDK_INT > Build.VERSION_CODES.N_MR1) {
161                                 builder.setTitle(R.string.freeform_dialog_title)
162                                         .setMessage(R.string.freeform_dialog_message_alt)
163                                         .setPositiveButton(R.string.action_ok, (dialogInterface, i) -> freeformSetupComplete());
164                             } else {
165                                 builder.setTitle(R.string.freeform_dialog_title)
166                                         .setMessage(R.string.freeform_dialog_message)
167                                         .setPositiveButton(R.string.action_developer_options, (dialogInterface, i) -> {
168                                             showReminderToast = true;
169
170                                             Intent intent = new Intent(Settings.ACTION_APPLICATION_DEVELOPMENT_SETTINGS);
171                                             try {
172                                                 startActivity(intent);
173                                                 U.showToastLong(getActivity(), R.string.enable_force_activities_resizable);
174                                             } catch (ActivityNotFoundException e1) {
175                                                 intent = new Intent(Settings.ACTION_DEVICE_INFO_SETTINGS);
176                                                 try {
177                                                     startActivity(intent);
178                                                     U.showToastLong(getActivity(), R.string.enable_developer_options);
179                                                 } catch (ActivityNotFoundException e2) { /* Gracefully fail */ }
180                                             }
181                                         });
182                             }
183
184                             AlertDialog dialog = builder.create();
185                             dialog.show();
186                             dialog.setCancelable(false);
187                         }
188                     }
189
190                     if(pref.getBoolean("taskbar_active", false)
191                             && getActivity().isInMultiWindowMode()
192                             && !FreeformHackHelper.getInstance().isFreeformHackActive()) {
193                         U.startFreeformHack(getActivity(), false, false);
194                     }
195                 } else {
196                     LocalBroadcastManager.getInstance(getActivity()).sendBroadcast(new Intent("com.farmerbb.taskbar.FINISH_FREEFORM_ACTIVITY"));
197                     LocalBroadcastManager.getInstance(getActivity()).sendBroadcast(new Intent("com.farmerbb.taskbar.FORCE_TASKBAR_RESTART"));
198                 }
199
200                 U.restartNotificationService(getActivity());
201                 break;
202             case "freeform_mode_help":
203                 AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
204                 builder.setView(View.inflate(getActivity(), R.layout.freeform_help_dialog, null))
205                         .setTitle(R.string.freeform_help_dialog_title)
206                         .setPositiveButton(R.string.action_close, null);
207
208                 AlertDialog dialog = builder.create();
209                 dialog.show();
210                 break;
211             case "add_shortcut":
212                 CompatUtils.pinAppShortcut(getActivity());
213                 break;
214             case "window_size":
215                 if(Build.VERSION.SDK_INT > Build.VERSION_CODES.N_MR1) {
216                     U.showToastLong(getActivity(), R.string.window_sizes_not_available);
217                 }
218
219                 break;
220             case "secondscreen":
221                 PackageManager packageManager = getActivity().getPackageManager();
222                 String packageName = getSecondScreenPackageName();
223                 Intent intent;
224
225                 if(packageName == null) {
226                     intent = new Intent(Intent.ACTION_VIEW);
227                     intent.setData(Uri.parse("https://play.google.com/store/apps/details?id=com.farmerbb.secondscreen.free"));
228                 } else
229                     intent = packageManager.getLaunchIntentForPackage(packageName);
230
231                 if(intent != null) {
232                     intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
233
234                     try {
235                         startActivity(intent);
236                     } catch (ActivityNotFoundException e) { /* Gracefully fail */ }
237                 }
238
239                 break;
240         }
241
242         return true;
243     }
244
245     private void freeformSetupComplete() {
246         ((CheckBoxPreference) findPreference("freeform_hack")).setChecked(U.hasFreeformSupport(getActivity()));
247
248         if(U.hasFreeformSupport(getActivity())) {
249             U.showToastLong(getActivity(), R.string.reboot_required);
250         }
251     }
252
253     private String getSecondScreenPackageName() {
254         PackageManager pm = getActivity().getPackageManager();
255         String packageName;
256
257         try {
258             packageName = "com.farmerbb.secondscreen.free";
259             pm.getPackageInfo(packageName, 0);
260         } catch (PackageManager.NameNotFoundException e) {
261             try {
262                 packageName = "com.farmerbb.secondscreen";
263                 pm.getPackageInfo(packageName, 0);
264             } catch (PackageManager.NameNotFoundException e1) {
265                 packageName = null;
266             }
267         }
268
269         return packageName;
270     }
271 }