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.fragment;
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;
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;
44 public class FreeformModeFragment extends SettingsFragment implements Preference.OnPreferenceClickListener {
46 private BroadcastReceiver checkBoxReceiver = new BroadcastReceiver() {
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));
58 public void onCreate(Bundle savedInstanceState) {
59 finishedLoadingPrefs = false;
61 super.onCreate(savedInstanceState);
64 addPreferencesFromResource(R.xml.pref_freeform_hack);
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);
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);
80 getPreferenceScreen().removePreference(findPreference("secondscreen"));
82 bindPreferenceSummaryToValue(findPreference("window_size"));
84 SharedPreferences pref = U.getSharedPreferences(getActivity());
85 boolean lockFreeformToggle = pref.getBoolean("freeform_hack", false)
86 && U.isChromeOs(getActivity());
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");
96 findPreference("freeform_hack").setEnabled(!lockFreeformToggle);
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());
105 AlertDialog dialog = builder.create();
107 dialog.setCancelable(false);
110 LocalBroadcastManager.getInstance(getActivity()).registerReceiver(checkBoxReceiver, new IntentFilter("com.farmerbb.taskbar.UPDATE_FREEFORM_CHECKBOX"));
112 finishedLoadingPrefs = true;
116 public void onActivityCreated(Bundle savedInstanceState) {
117 super.onActivityCreated(savedInstanceState);
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);
127 public void onResume() {
130 if(showReminderToast) {
131 showReminderToast = false;
133 freeformSetupComplete();
138 public void onDestroy() {
141 LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(checkBoxReceiver);
144 @TargetApi(Build.VERSION_CODES.N)
146 public boolean onPreferenceClick(final Preference p) {
147 final SharedPreferences pref = U.getSharedPreferences(getActivity());
150 case "freeform_hack":
151 if(((CheckBoxPreference) p).isChecked()) {
152 if(!U.hasFreeformSupport(getActivity())) {
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);
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());
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;
170 Intent intent = new Intent(Settings.ACTION_APPLICATION_DEVELOPMENT_SETTINGS);
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);
177 startActivity(intent);
178 U.showToastLong(getActivity(), R.string.enable_developer_options);
179 } catch (ActivityNotFoundException e2) { /* Gracefully fail */ }
184 AlertDialog dialog = builder.create();
186 dialog.setCancelable(false);
190 if(pref.getBoolean("taskbar_active", false)
191 && getActivity().isInMultiWindowMode()
192 && !FreeformHackHelper.getInstance().isFreeformHackActive()) {
193 U.startFreeformHack(getActivity(), false, false);
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"));
200 U.restartNotificationService(getActivity());
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);
208 AlertDialog dialog = builder.create();
212 CompatUtils.pinAppShortcut(getActivity());
215 if(Build.VERSION.SDK_INT > Build.VERSION_CODES.N_MR1) {
216 U.showToastLong(getActivity(), R.string.window_sizes_not_available);
221 PackageManager packageManager = getActivity().getPackageManager();
222 String packageName = getSecondScreenPackageName();
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"));
229 intent = packageManager.getLaunchIntentForPackage(packageName);
232 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
235 startActivity(intent);
236 } catch (ActivityNotFoundException e) { /* Gracefully fail */ }
245 private void freeformSetupComplete() {
246 ((CheckBoxPreference) findPreference("freeform_hack")).setChecked(U.hasFreeformSupport(getActivity()));
248 if(U.hasFreeformSupport(getActivity())) {
249 U.showToastLong(getActivity(), R.string.reboot_required);
253 private String getSecondScreenPackageName() {
254 PackageManager pm = getActivity().getPackageManager();
258 packageName = "com.farmerbb.secondscreen.free";
259 pm.getPackageInfo(packageName, 0);
260 } catch (PackageManager.NameNotFoundException e) {
262 packageName = "com.farmerbb.secondscreen";
263 pm.getPackageInfo(packageName, 0);
264 } catch (PackageManager.NameNotFoundException e1) {