OSDN Git Service

Add freeform mode home screen shortcut
authorBraden Farmer <farmerbb@gmail.com>
Tue, 11 Oct 2016 23:56:22 +0000 (17:56 -0600)
committerBraden Farmer <farmerbb@gmail.com>
Tue, 11 Oct 2016 23:56:22 +0000 (17:56 -0600)
14 files changed:
app/src/main/AndroidManifest.xml
app/src/main/java/com/farmerbb/taskbar/MainActivity.java
app/src/main/java/com/farmerbb/taskbar/activity/ShortcutActivity.java [new file with mode: 0644]
app/src/main/java/com/farmerbb/taskbar/fragment/FreeformModeFragment.java
app/src/main/java/com/farmerbb/taskbar/fragment/SettingsFragment.java
app/src/main/java/com/farmerbb/taskbar/util/U.java
app/src/main/res/mipmap-hdpi/ic_freeform_mode.png [new file with mode: 0644]
app/src/main/res/mipmap-mdpi/ic_freeform_mode.png [new file with mode: 0644]
app/src/main/res/mipmap-xhdpi/ic_freeform_mode.png [new file with mode: 0644]
app/src/main/res/mipmap-xxhdpi/ic_freeform_mode.png [new file with mode: 0644]
app/src/main/res/mipmap-xxxhdpi/ic_freeform_mode.png [new file with mode: 0644]
app/src/main/res/values-ja/strings.xml
app/src/main/res/values/strings.xml
app/src/main/res/xml/pref_freeform_hack.xml

index 5cefce8..525e1fa 100644 (file)
@@ -30,6 +30,8 @@
     <uses-permission android:name="${applicationId}.START_STOP_TASKBAR" />
     <uses-permission android:name="${applicationId}.SEND_RECEIVE_SETTINGS" />
 
+    <uses-permission-sdk-23 android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
+
     <uses-feature
         android:name="android.hardware.touchscreen"
         android:required="false"/>
                 <category android:name="android.intent.category.DEFAULT"/>
             </intent-filter>
         </activity>
+        <activity
+            android:name=".activity.ShortcutActivity"
+            android:label="@string/pref_header_freeform"
+            android:documentLaunchMode="always"
+            android:excludeFromRecents="true"
+            android:enabled="false"
+            android:theme="@android:style/Theme.NoDisplay" >
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <action android:name="android.intent.action.CREATE_SHORTCUT" />
+
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+        </activity>
 
         <service android:name=".service.TaskbarService"/>
         <service android:name=".service.StartMenuService"/>
index e4ddc4b..d0232c3 100644 (file)
@@ -47,6 +47,7 @@ import com.farmerbb.taskbar.activity.HomeActivity;
 import com.farmerbb.taskbar.activity.ImportSettingsActivity;
 import com.farmerbb.taskbar.activity.InvisibleActivityFreeform;
 import com.farmerbb.taskbar.activity.KeyboardShortcutActivity;
+import com.farmerbb.taskbar.activity.ShortcutActivity;
 import com.farmerbb.taskbar.fragment.AboutFragment;
 import com.farmerbb.taskbar.fragment.AdvancedFragment;
 import com.farmerbb.taskbar.fragment.FreeformModeFragment;
@@ -110,6 +111,11 @@ public class MainActivity extends AppCompatActivity {
                 pref.getBoolean("keyboard_shortcut", false) ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED : PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
                 PackageManager.DONT_KILL_APP);
 
+        ComponentName component3 = new ComponentName(BuildConfig.APPLICATION_ID, ShortcutActivity.class.getName());
+        getPackageManager().setComponentEnabledSetting(component3,
+                pref.getBoolean("freeform_hack", false) ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED : PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
+                PackageManager.DONT_KILL_APP);
+
         if(BuildConfig.APPLICATION_ID.equals(BuildConfig.BASE_APPLICATION_ID))
             proceedWithAppLaunch(savedInstanceState);
         else {
diff --git a/app/src/main/java/com/farmerbb/taskbar/activity/ShortcutActivity.java b/app/src/main/java/com/farmerbb/taskbar/activity/ShortcutActivity.java
new file mode 100644 (file)
index 0000000..24f3f08
--- /dev/null
@@ -0,0 +1,59 @@
+/* Copyright 2016 Braden Farmer
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.farmerbb.taskbar.activity;
+
+import android.annotation.TargetApi;
+import android.app.Activity;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.content.pm.PackageManager;
+import android.os.Build;
+import android.os.Bundle;
+import android.os.Handler;
+import android.provider.Settings;
+
+import com.farmerbb.taskbar.util.U;
+
+public class ShortcutActivity extends Activity {
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        if(getIntent().hasExtra("is_launching_shortcut")) {
+            SharedPreferences pref = U.getSharedPreferences(this);
+            if(pref.getBoolean("freeform_hack", false) && hasFreeformSupport()) {
+                sendBroadcast(new Intent("com.farmerbb.taskbar.START"));
+
+                new Handler().postDelayed(new Runnable() {
+                    @Override
+                    public void run() {
+                        U.startFreeformHack(ShortcutActivity.this, false);
+                    }
+                }, 100);
+            }
+        } else setResult(RESULT_OK, U.getShortcutIntent(this));
+
+        finish();
+    }
+
+    @TargetApi(Build.VERSION_CODES.N)
+    private boolean hasFreeformSupport() {
+        return getPackageManager().hasSystemFeature(PackageManager.FEATURE_FREEFORM_WINDOW_MANAGEMENT)
+                || Settings.Global.getInt(getContentResolver(), "enable_freeform_support", -1) == 1
+                || Settings.Global.getInt(getContentResolver(), "force_resizable_activities", -1) == 1;
+    }
+}
\ No newline at end of file
index f8f68b4..45a0c0b 100644 (file)
 
 package com.farmerbb.taskbar.fragment;
 
+import android.content.ComponentName;
 import android.content.SharedPreferences;
+import android.content.pm.PackageManager;
 import android.os.Bundle;
 import android.preference.CheckBoxPreference;
 import android.support.v7.app.ActionBar;
 import android.support.v7.app.AppCompatActivity;
 
+import com.farmerbb.taskbar.BuildConfig;
 import com.farmerbb.taskbar.R;
+import com.farmerbb.taskbar.activity.KeyboardShortcutActivity;
+import com.farmerbb.taskbar.activity.ShortcutActivity;
 import com.farmerbb.taskbar.util.U;
 
 public class FreeformModeFragment extends SettingsFragment {
@@ -37,6 +42,7 @@ public class FreeformModeFragment extends SettingsFragment {
 
         findPreference("freeform_hack").setOnPreferenceClickListener(this);
         findPreference("freeform_mode_help").setOnPreferenceClickListener(this);
+        findPreference("add_shortcut").setOnPreferenceClickListener(this);
 
         bindPreferenceSummaryToValue(findPreference("window_size"));
 
@@ -45,6 +51,12 @@ public class FreeformModeFragment extends SettingsFragment {
         findPreference("open_in_fullscreen").setEnabled(freeformHackEnabled);
         findPreference("save_window_sizes").setEnabled(freeformHackEnabled);
         findPreference("window_size").setEnabled(freeformHackEnabled);
+        findPreference("add_shortcut").setEnabled(freeformHackEnabled);
+
+        ComponentName component = new ComponentName(BuildConfig.APPLICATION_ID, ShortcutActivity.class.getName());
+        getActivity().getPackageManager().setComponentEnabledSetting(component,
+                freeformHackEnabled ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED : PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
+                PackageManager.DONT_KILL_APP);
 
         AppCompatActivity activity = (AppCompatActivity) getActivity();
         activity.setTitle(R.string.pref_header_freeform);
@@ -68,6 +80,12 @@ public class FreeformModeFragment extends SettingsFragment {
             findPreference("open_in_fullscreen").setEnabled(hasFreeformSupport());
             findPreference("save_window_sizes").setEnabled(hasFreeformSupport());
             findPreference("window_size").setEnabled(hasFreeformSupport());
+            findPreference("add_shortcut").setEnabled(hasFreeformSupport());
+
+            ComponentName component = new ComponentName(BuildConfig.APPLICATION_ID, ShortcutActivity.class.getName());
+            getActivity().getPackageManager().setComponentEnabledSetting(component,
+                    hasFreeformSupport() ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED : PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
+                    PackageManager.DONT_KILL_APP);
 
             if(hasFreeformSupport()) {
                 U.showToastLong(getActivity(), R.string.reboot_required);
index 1d1a797..59a4697 100644 (file)
@@ -57,6 +57,7 @@ import com.farmerbb.taskbar.activity.InvisibleActivityFreeform;
 import com.farmerbb.taskbar.activity.KeyboardShortcutActivity;
 import com.farmerbb.taskbar.activity.SelectAppActivity;
 import com.farmerbb.taskbar.activity.SelectAppActivityDark;
+import com.farmerbb.taskbar.activity.ShortcutActivity;
 import com.farmerbb.taskbar.service.NotificationService;
 import com.farmerbb.taskbar.service.StartMenuService;
 import com.farmerbb.taskbar.service.TaskbarService;
@@ -278,6 +279,13 @@ public class SettingsFragment extends PreferenceFragment implements OnPreference
                 findPreference("open_in_fullscreen").setEnabled(((CheckBoxPreference) p).isChecked());
                 findPreference("save_window_sizes").setEnabled(((CheckBoxPreference) p).isChecked());
                 findPreference("window_size").setEnabled(((CheckBoxPreference) p).isChecked());
+                findPreference("add_shortcut").setEnabled(((CheckBoxPreference) p).isChecked());
+
+                ComponentName component2 = new ComponentName(BuildConfig.APPLICATION_ID, ShortcutActivity.class.getName());
+                getActivity().getPackageManager().setComponentEnabledSetting(component2,
+                        ((CheckBoxPreference) p).isChecked() ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED : PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
+                        PackageManager.DONT_KILL_APP);
+
                 break;
             case "freeform_mode_help":
                 AlertDialog.Builder builder2 = new AlertDialog.Builder(getActivity());
@@ -378,6 +386,15 @@ public class SettingsFragment extends PreferenceFragment implements OnPreference
 
                 startActivityForResult(intent2, 123);
                 break;
+            case "add_shortcut":
+                Intent intent3 = U.getShortcutIntent(getActivity());
+                intent3.setAction("com.android.launcher.action.INSTALL_SHORTCUT");
+                intent3.putExtra("duplicate", false);
+
+                getActivity().sendBroadcast(intent3);
+
+                U.showToast(getActivity(), R.string.shortcut_created);
+                break;
         }
 
         return true;
index b75c15f..f1d91fc 100644 (file)
@@ -30,6 +30,7 @@ import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
 import android.content.res.Configuration;
 import android.graphics.Rect;
+import android.graphics.drawable.BitmapDrawable;
 import android.hardware.display.DisplayManager;
 import android.net.Uri;
 import android.os.Build;
@@ -46,6 +47,7 @@ import com.farmerbb.taskbar.BuildConfig;
 import com.farmerbb.taskbar.R;
 import com.farmerbb.taskbar.activity.DummyActivity;
 import com.farmerbb.taskbar.activity.InvisibleActivityFreeform;
+import com.farmerbb.taskbar.activity.ShortcutActivity;
 import com.farmerbb.taskbar.receiver.LockDeviceReceiver;
 
 import java.util.ArrayList;
@@ -182,7 +184,7 @@ public class U {
 
     @SuppressWarnings("deprecation")
     @TargetApi(Build.VERSION_CODES.N)
-    private static void startFreeformHack(Context context, boolean launchedFromTaskbar) {
+    public static void startFreeformHack(Context context, boolean launchedFromTaskbar) {
         Intent freeformHackIntent = new Intent(context, InvisibleActivityFreeform.class);
         freeformHackIntent.putExtra("check_multiwindow", true);
         freeformHackIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT);
@@ -588,4 +590,19 @@ public class U {
             pba.addBlockedApp(context, entry);
         }
     }
+
+    public static Intent getShortcutIntent(Context context) {
+        Intent shortcutIntent = new Intent(context, ShortcutActivity.class);
+        shortcutIntent.setAction(Intent.ACTION_MAIN);
+        shortcutIntent.putExtra("is_launching_shortcut", true);
+
+        BitmapDrawable drawable = (BitmapDrawable) context.getDrawable(R.mipmap.ic_freeform_mode);
+
+        Intent intent = new Intent();
+        intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);
+        if(drawable != null) intent.putExtra(Intent.EXTRA_SHORTCUT_ICON, drawable.getBitmap());
+        intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, context.getString(R.string.pref_header_freeform));
+
+        return intent;
+    }
 }
diff --git a/app/src/main/res/mipmap-hdpi/ic_freeform_mode.png b/app/src/main/res/mipmap-hdpi/ic_freeform_mode.png
new file mode 100644 (file)
index 0000000..b355c8a
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_freeform_mode.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_freeform_mode.png b/app/src/main/res/mipmap-mdpi/ic_freeform_mode.png
new file mode 100644 (file)
index 0000000..6b61be8
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_freeform_mode.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_freeform_mode.png b/app/src/main/res/mipmap-xhdpi/ic_freeform_mode.png
new file mode 100644 (file)
index 0000000..692cbf2
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_freeform_mode.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_freeform_mode.png b/app/src/main/res/mipmap-xxhdpi/ic_freeform_mode.png
new file mode 100644 (file)
index 0000000..bbd86cf
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_freeform_mode.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_freeform_mode.png b/app/src/main/res/mipmap-xxxhdpi/ic_freeform_mode.png
new file mode 100644 (file)
index 0000000..3fb9833
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_freeform_mode.png differ
index a082099..b509055 100644 (file)
     <string name="pref_title_save_window_sizes">Save window sizes for apps</string>
     <string name="pref_description_save_window_sizes">When opening new windows from the context menu</string>
 
+    <string name="add_shortcut">Add shortcut to home screen</string>
+    <string name="shortcut_created">Freeform mode shortcut created</string>
+
 </resources>
index 1724e92..a802e54 100644 (file)
     <string name="pref_title_save_window_sizes">Save window sizes for apps</string>
     <string name="pref_description_save_window_sizes">When opening new windows from the context menu</string>
 
+    <string name="add_shortcut">Add shortcut to home screen</string>
+    <string name="shortcut_created">Freeform mode shortcut created</string>
+
 </resources>
index 8635c15..05104d5 100644 (file)
         android:title="@string/pref_title_window_size"/>
 
     <Preference
+        android:key="add_shortcut"
+        android:title="@string/add_shortcut" />
+
+    <Preference
         android:key="freeform_mode_help"
         android:title="@string/pref_title_freeform_mode_help" />