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