From 0173ed6152860e725835cb68a4409c56a5b376cd Mon Sep 17 00:00:00 2001
From: hyb1996 <946994919@qq.com>
Date: Wed, 12 Jul 2017 10:07:20 +0800
Subject: [PATCH] add widget support
---
app/src/main/AndroidManifest.xml | 14 +++
.../external/widget/ScriptWidget.java | 58 ++++++++++
.../widget/ScriptWidgetSettingsActivity.java | 100 ++++++++++++++++++
.../external/widget/ScriptWidgets.java | 68 ++++++++++++
.../activity_script_widget_settings.xml | 33 ++++++
.../res/layout/widget_script_shortcut.xml | 25 +++++
.../res/menu/script_widget_settings_menu.xml | 19 ++++
app/src/main/res/xml/script_widget_config.xml | 8 ++
8 files changed, 325 insertions(+)
create mode 100644 app/src/main/java/com/stardust/scriptdroid/external/widget/ScriptWidget.java
create mode 100644 app/src/main/java/com/stardust/scriptdroid/external/widget/ScriptWidgetSettingsActivity.java
create mode 100644 app/src/main/java/com/stardust/scriptdroid/external/widget/ScriptWidgets.java
create mode 100644 app/src/main/res/layout/activity_script_widget_settings.xml
create mode 100644 app/src/main/res/layout/widget_script_shortcut.xml
create mode 100644 app/src/main/res/menu/script_widget_settings_menu.xml
create mode 100644 app/src/main/res/xml/script_widget_config.xml
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index c5eb4e22..291f9110 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -80,6 +80,11 @@
+
+
+
+
+
+
+
+
+
+
+
+
appWidgetIdSet = new HashSet<>();
+ for (int appWidgetId : appWidgetIds) {
+ updateWidget(context, appWidgetId, ScriptWidgets.getPathForAppWidgetId(appWidgetId));
+ appWidgetIdSet.add(appWidgetId);
+ }
+ if (appWidgetIdSet.size() > 1)
+ ScriptWidgets.removeAllNotIn(appWidgetIdSet);
+ }
+
+ static boolean updateWidget(Context context, int widgetId, String path) {
+ if (TextUtils.isEmpty(path) || widgetId == AppWidgetManager.INVALID_APPWIDGET_ID) {
+ return false;
+ }
+ String name = PFile.getNameWithoutExtension(path);
+ int requestCode = ScriptWidgets.getRequestCodeForAppWidgetId(widgetId);
+ Log.d(LOG_TAG, "updateWidget: id = " + widgetId + ", requestCode = " + requestCode + ", path = " + path);
+ AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
+ RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_script_shortcut);
+ views.setOnClickPendingIntent(R.id.widget, PendingIntent.getActivity(context, requestCode,
+ new Intent(context, RunIntentActivity.class)
+ .putExtra(CommonUtils.EXTRA_KEY_PATH, path)
+ .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK), PendingIntent.FLAG_UPDATE_CURRENT));
+ views.setTextViewText(R.id.name, name);
+ appWidgetManager.updateAppWidget(widgetId, views);
+ ScriptWidgets.setPathForAppWidgetId(widgetId, path);
+ return true;
+ }
+}
diff --git a/app/src/main/java/com/stardust/scriptdroid/external/widget/ScriptWidgetSettingsActivity.java b/app/src/main/java/com/stardust/scriptdroid/external/widget/ScriptWidgetSettingsActivity.java
new file mode 100644
index 00000000..70e35f42
--- /dev/null
+++ b/app/src/main/java/com/stardust/scriptdroid/external/widget/ScriptWidgetSettingsActivity.java
@@ -0,0 +1,100 @@
+package com.stardust.scriptdroid.external.widget;
+
+import android.app.PendingIntent;
+import android.appwidget.AppWidgetManager;
+import android.content.Intent;
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.text.TextUtils;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.widget.RemoteViews;
+import android.widget.Toast;
+
+import com.stardust.scriptdroid.R;
+import com.stardust.scriptdroid.external.CommonUtils;
+import com.stardust.scriptdroid.external.open.RunIntentActivity;
+import com.stardust.scriptdroid.external.tasker.TaskerScriptEditActivity;
+import com.stardust.scriptdroid.script.ScriptFile;
+import com.stardust.scriptdroid.script.StorageScriptProvider;
+import com.stardust.scriptdroid.ui.BaseActivity;
+import com.stardust.scriptdroid.ui.main.script_list.ScriptAndFolderListRecyclerView;
+import com.stardust.scriptdroid.ui.main.script_list.ScriptListWithProgressBarView;
+
+import org.androidannotations.annotations.AfterViews;
+import org.androidannotations.annotations.Click;
+import org.androidannotations.annotations.EActivity;
+
+/**
+ * Created by Stardust on 2017/7/11.
+ */
+@EActivity(R.layout.activity_script_widget_settings)
+public class ScriptWidgetSettingsActivity extends BaseActivity {
+
+
+ private String mSelectedScriptFilePath;
+ private StorageScriptProvider mStorageScriptProvider;
+ private int mAppWidgetId;
+
+ @Override
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ mAppWidgetId = getIntent().getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);
+ }
+
+ @AfterViews
+ void setUpViews() {
+ BaseActivity.setToolbarAsBack(this, R.id.toolbar, getString(R.string.text_please_choose_a_script));
+ initScriptListRecyclerView();
+ }
+
+
+ private void initScriptListRecyclerView() {
+ mStorageScriptProvider = StorageScriptProvider.getExternalStorageProvider();
+ ScriptListWithProgressBarView scriptList = (ScriptListWithProgressBarView) findViewById(R.id.script_list);
+ scriptList.setScriptFileOperationEnabled(false);
+ scriptList.setStorageScriptProvider(mStorageScriptProvider);
+ scriptList.setCurrentDirectory(StorageScriptProvider.DEFAULT_DIRECTORY);
+ scriptList.setOnItemClickListener(new ScriptAndFolderListRecyclerView.OnScriptFileClickListener() {
+ @Override
+ public void onClick(ScriptFile file, int position) {
+ mSelectedScriptFilePath = file.getPath();
+ finish();
+ }
+ });
+ }
+
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ if (item.getItemId() == R.id.action_refresh) {
+ mStorageScriptProvider.refreshAll();
+ } else if (item.getItemId() == R.id.action_clear_file_selection) {
+ mSelectedScriptFilePath = null;
+ }
+ return true;
+ }
+
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ getMenuInflater().inflate(R.menu.script_widget_settings_menu, menu);
+ return true;
+ }
+
+ @Override
+ public void finish() {
+ if (ScriptWidget.updateWidget(this, mAppWidgetId, mSelectedScriptFilePath)) {
+ setResult(RESULT_OK, new Intent()
+ .putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId));
+
+ } else {
+ setResult(RESULT_CANCELED, new Intent()
+ .putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId));
+ }
+ super.finish();
+ }
+
+
+}
diff --git a/app/src/main/java/com/stardust/scriptdroid/external/widget/ScriptWidgets.java b/app/src/main/java/com/stardust/scriptdroid/external/widget/ScriptWidgets.java
new file mode 100644
index 00000000..5c0dbdbd
--- /dev/null
+++ b/app/src/main/java/com/stardust/scriptdroid/external/widget/ScriptWidgets.java
@@ -0,0 +1,68 @@
+package com.stardust.scriptdroid.external.widget;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.util.Log;
+
+import com.stardust.scriptdroid.App;
+
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * Created by Stardust on 2017/7/11.
+ */
+
+public class ScriptWidgets {
+
+
+ private static final String LOG_TAG = "ScriptWidgets";
+ private static SharedPreferences widgets = App.getApp().getSharedPreferences("ScriptWidgets", Context.MODE_PRIVATE);
+ private static final Pattern ID_PATTERN = Pattern.compile("[a-zA-Z]+_([0-9])+");
+
+ static String getPathForAppWidgetId(int id) {
+ return widgets.getString("path_" + id, null);
+ }
+
+ static void setPathForAppWidgetId(int id, String path) {
+ widgets.edit().putString("path_" + id, path).apply();
+ }
+
+ static int getRequestCodeForAppWidgetId(int id) {
+ int requestCode = widgets.getInt("rc_" + id, -1);
+ if (requestCode == -1) {
+ requestCode = widgets.getInt("max_rc", 0) + 1;
+ widgets.edit()
+ .putInt("rc_" + id, requestCode)
+ .putInt("max_rc", requestCode)
+ .apply();
+ }
+ return requestCode;
+ }
+
+ static void removeAllNotIn(Set appWidgetIdSet) {
+ List keysToRemove = new LinkedList<>();
+ for (Map.Entry entry : widgets.getAll().entrySet()) {
+ Matcher matcher = ID_PATTERN.matcher(entry.getKey());
+ if (matcher.find()) {
+ int id = Integer.parseInt(matcher.group(1));
+ if (!appWidgetIdSet.contains(id)) {
+ keysToRemove.add(entry.getKey());
+ }
+ } else {
+ Log.e(LOG_TAG, "illegal key: " + entry.getKey());
+ }
+ }
+ SharedPreferences.Editor editor = widgets.edit();
+ for (String key : keysToRemove) {
+ editor.remove(key);
+ Log.v(LOG_TAG, "remove key: " + key);
+ }
+ editor.apply();
+ }
+}
diff --git a/app/src/main/res/layout/activity_script_widget_settings.xml b/app/src/main/res/layout/activity_script_widget_settings.xml
new file mode 100644
index 00000000..0112221c
--- /dev/null
+++ b/app/src/main/res/layout/activity_script_widget_settings.xml
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/widget_script_shortcut.xml b/app/src/main/res/layout/widget_script_shortcut.xml
new file mode 100644
index 00000000..4edf106e
--- /dev/null
+++ b/app/src/main/res/layout/widget_script_shortcut.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/menu/script_widget_settings_menu.xml b/app/src/main/res/menu/script_widget_settings_menu.xml
new file mode 100644
index 00000000..0409910d
--- /dev/null
+++ b/app/src/main/res/menu/script_widget_settings_menu.xml
@@ -0,0 +1,19 @@
+
+
\ No newline at end of file
diff --git a/app/src/main/res/xml/script_widget_config.xml b/app/src/main/res/xml/script_widget_config.xml
new file mode 100644
index 00000000..4c7bec47
--- /dev/null
+++ b/app/src/main/res/xml/script_widget_config.xml
@@ -0,0 +1,8 @@
+
+
\ No newline at end of file