From 203a9bc341d13084621538ea98c7339794e40242 Mon Sep 17 00:00:00 2001 From: Adnan Begovic Date: Sat, 15 Aug 2015 00:54:48 -0700 Subject: [PATCH] cmsdk: Add gradle sample project. Change-Id: Ic239848fb3be4b7e2b5d6930860900c794624fee --- .../ExampleApplication/.gitignore | 7 + .../ExampleApplication/MyApplication.iml | 19 ++ .../ExampleApplication/app/.gitignore | 1 + .../ExampleApplication/app/app.iml | 98 +++++++++ .../ExampleApplication/app/build.gradle | 29 +++ .../ExampleApplication/app/proguard-rules.pro | 17 ++ .../adnan/myapplication/ApplicationTest.java | 13 ++ .../app/src/main/AndroidManifest.xml | 34 ++++ .../myapplication/DeleteIntentReceiver.java | 21 ++ .../adnan/myapplication/MainActivity.java | 187 ++++++++++++++++++ .../app/src/main/res/layout/activity_main.xml | 22 +++ .../src/main/res/layout/tile_remote_view.xml | 23 +++ .../app/src/main/res/menu/menu_main.xml | 6 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 3418 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2206 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 4842 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 7718 bytes .../app/src/main/res/values-w820dp/dimens.xml | 6 + .../app/src/main/res/values/dimens.xml | 5 + .../app/src/main/res/values/strings.xml | 6 + .../app/src/main/res/values/styles.xml | 8 + .../ExampleApplication/build.gradle | 23 +++ .../ExampleApplication/gradle.properties | 18 ++ .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 49896 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 + .../gradle-sample/ExampleApplication/gradlew | 164 +++++++++++++++ .../ExampleApplication/gradlew.bat | 90 +++++++++ .../ExampleApplication/settings.gradle | 1 + 28 files changed, 804 insertions(+) create mode 100644 samples/gradle-sample/ExampleApplication/.gitignore create mode 100644 samples/gradle-sample/ExampleApplication/MyApplication.iml create mode 100644 samples/gradle-sample/ExampleApplication/app/.gitignore create mode 100644 samples/gradle-sample/ExampleApplication/app/app.iml create mode 100644 samples/gradle-sample/ExampleApplication/app/build.gradle create mode 100644 samples/gradle-sample/ExampleApplication/app/proguard-rules.pro create mode 100644 samples/gradle-sample/ExampleApplication/app/src/androidTest/java/com/example/adnan/myapplication/ApplicationTest.java create mode 100644 samples/gradle-sample/ExampleApplication/app/src/main/AndroidManifest.xml create mode 100644 samples/gradle-sample/ExampleApplication/app/src/main/java/com/example/adnan/myapplication/DeleteIntentReceiver.java create mode 100644 samples/gradle-sample/ExampleApplication/app/src/main/java/com/example/adnan/myapplication/MainActivity.java create mode 100644 samples/gradle-sample/ExampleApplication/app/src/main/res/layout/activity_main.xml create mode 100644 samples/gradle-sample/ExampleApplication/app/src/main/res/layout/tile_remote_view.xml create mode 100644 samples/gradle-sample/ExampleApplication/app/src/main/res/menu/menu_main.xml create mode 100644 samples/gradle-sample/ExampleApplication/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 samples/gradle-sample/ExampleApplication/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 samples/gradle-sample/ExampleApplication/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 samples/gradle-sample/ExampleApplication/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 samples/gradle-sample/ExampleApplication/app/src/main/res/values-w820dp/dimens.xml create mode 100644 samples/gradle-sample/ExampleApplication/app/src/main/res/values/dimens.xml create mode 100644 samples/gradle-sample/ExampleApplication/app/src/main/res/values/strings.xml create mode 100644 samples/gradle-sample/ExampleApplication/app/src/main/res/values/styles.xml create mode 100644 samples/gradle-sample/ExampleApplication/build.gradle create mode 100644 samples/gradle-sample/ExampleApplication/gradle.properties create mode 100644 samples/gradle-sample/ExampleApplication/gradle/wrapper/gradle-wrapper.jar create mode 100644 samples/gradle-sample/ExampleApplication/gradle/wrapper/gradle-wrapper.properties create mode 100755 samples/gradle-sample/ExampleApplication/gradlew create mode 100644 samples/gradle-sample/ExampleApplication/gradlew.bat create mode 100644 samples/gradle-sample/ExampleApplication/settings.gradle diff --git a/samples/gradle-sample/ExampleApplication/.gitignore b/samples/gradle-sample/ExampleApplication/.gitignore new file mode 100644 index 0000000..9c4de58 --- /dev/null +++ b/samples/gradle-sample/ExampleApplication/.gitignore @@ -0,0 +1,7 @@ +.gradle +/local.properties +/.idea/workspace.xml +/.idea/libraries +.DS_Store +/build +/captures diff --git a/samples/gradle-sample/ExampleApplication/MyApplication.iml b/samples/gradle-sample/ExampleApplication/MyApplication.iml new file mode 100644 index 0000000..bec5806 --- /dev/null +++ b/samples/gradle-sample/ExampleApplication/MyApplication.iml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/samples/gradle-sample/ExampleApplication/app/.gitignore b/samples/gradle-sample/ExampleApplication/app/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/samples/gradle-sample/ExampleApplication/app/.gitignore @@ -0,0 +1 @@ +/build diff --git a/samples/gradle-sample/ExampleApplication/app/app.iml b/samples/gradle-sample/ExampleApplication/app/app.iml new file mode 100644 index 0000000..9e992a8 --- /dev/null +++ b/samples/gradle-sample/ExampleApplication/app/app.iml @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/samples/gradle-sample/ExampleApplication/app/build.gradle b/samples/gradle-sample/ExampleApplication/app/build.gradle new file mode 100644 index 0000000..89e2b5f --- /dev/null +++ b/samples/gradle-sample/ExampleApplication/app/build.gradle @@ -0,0 +1,29 @@ +apply plugin: 'com.android.application' + +android { + compileSdkVersion 22 + buildToolsVersion "19.1.0" + + defaultConfig { + applicationId "com.example.test.myapplication" + minSdkVersion 15 + targetSdkVersion 22 + versionCode 1 + versionName "1.0" + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } +} + +dependencies { + compile fileTree(dir: 'libs', include: ['*.jar']) + compile 'com.android.support:appcompat-v7:22.+' +} + +dependencies { + compile 'org.cyanogenmod:platform.sdk:2.0-SNAPSHOT' +} diff --git a/samples/gradle-sample/ExampleApplication/app/proguard-rules.pro b/samples/gradle-sample/ExampleApplication/app/proguard-rules.pro new file mode 100644 index 0000000..1f8e664 --- /dev/null +++ b/samples/gradle-sample/ExampleApplication/app/proguard-rules.pro @@ -0,0 +1,17 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in /usr/local/var/lib/android-sdk/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the proguardFiles +# directive in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} diff --git a/samples/gradle-sample/ExampleApplication/app/src/androidTest/java/com/example/adnan/myapplication/ApplicationTest.java b/samples/gradle-sample/ExampleApplication/app/src/androidTest/java/com/example/adnan/myapplication/ApplicationTest.java new file mode 100644 index 0000000..a8e4c2f --- /dev/null +++ b/samples/gradle-sample/ExampleApplication/app/src/androidTest/java/com/example/adnan/myapplication/ApplicationTest.java @@ -0,0 +1,13 @@ +package com.example.test.myapplication; + +import android.app.Application; +import android.test.ApplicationTestCase; + +/** + * Testing Fundamentals + */ +public class ApplicationTest extends ApplicationTestCase { + public ApplicationTest() { + super(Application.class); + } +} \ No newline at end of file diff --git a/samples/gradle-sample/ExampleApplication/app/src/main/AndroidManifest.xml b/samples/gradle-sample/ExampleApplication/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..6e8678e --- /dev/null +++ b/samples/gradle-sample/ExampleApplication/app/src/main/AndroidManifest.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/samples/gradle-sample/ExampleApplication/app/src/main/java/com/example/adnan/myapplication/DeleteIntentReceiver.java b/samples/gradle-sample/ExampleApplication/app/src/main/java/com/example/adnan/myapplication/DeleteIntentReceiver.java new file mode 100644 index 0000000..c96464c --- /dev/null +++ b/samples/gradle-sample/ExampleApplication/app/src/main/java/com/example/adnan/myapplication/DeleteIntentReceiver.java @@ -0,0 +1,21 @@ +package com.example.test.myapplication; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.widget.Toast; + +/** + * Created by test on 8/7/15. + */ +public class DeleteIntentReceiver extends BroadcastReceiver { + + public static final String DELETE_ACTION = "com.example.test.myapplication.ACTION_DELETED"; + + @Override + public void onReceive(Context context, Intent intent) { + if (DELETE_ACTION.equals(intent.getAction())) { + Toast.makeText(context, "WE WERE DELETED", Toast.LENGTH_SHORT).show(); + } + } +} diff --git a/samples/gradle-sample/ExampleApplication/app/src/main/java/com/example/adnan/myapplication/MainActivity.java b/samples/gradle-sample/ExampleApplication/app/src/main/java/com/example/adnan/myapplication/MainActivity.java new file mode 100644 index 0000000..c7ab172 --- /dev/null +++ b/samples/gradle-sample/ExampleApplication/app/src/main/java/com/example/adnan/myapplication/MainActivity.java @@ -0,0 +1,187 @@ +package com.example.test.myapplication; + +import android.app.PendingIntent; +import android.content.Context; +import android.content.Intent; +import android.net.Uri; +import android.net.wifi.WifiConfiguration; +import android.net.wifi.WifiManager; +import android.support.v7.app.AppCompatActivity; +import android.os.Bundle; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; +import android.widget.Button; +import android.widget.RemoteViews; +import android.widget.Toast; + +import java.util.ArrayList; +import java.util.List; + +import cyanogenmod.app.CMStatusBarManager; +import cyanogenmod.app.CustomTile; +import cyanogenmod.app.Profile; +import cyanogenmod.app.ProfileManager; +import cyanogenmod.profiles.ConnectionSettings; + +public class MainActivity extends AppCompatActivity implements View.OnClickListener { + + private CMStatusBarManager mCMStatusBarManager; + private Button mPublishRemoteViewButton; + + private ProfileManager mProfileMangager; + private WifiManager mWifiManager; + private Profile mProfile; + private List mTriggers = new ArrayList(); + private Button mProfileButton; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + + // CUSTOM TILES + mCMStatusBarManager = CMStatusBarManager.getInstance(this); + mPublishRemoteViewButton = (Button) findViewById(R.id.publish_remote_view_tile); + mPublishRemoteViewButton.setOnClickListener(this); + + + // PROFILES + mProfileButton = (Button) findViewById(R.id.publish_ap_triggered_profile); + mProfileButton.setOnClickListener(this); + mProfileManager = ProfileManager.getInstance(this); + mWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); + populateWifiTriggerList(); + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + // Inflate the menu; this adds items to the action bar if it is present. + getMenuInflater().inflate(R.menu.menu_main, menu); + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + // Handle action bar item clicks here. The action bar will + // automatically handle clicks on the Home/Up button, so long + // as you specify a parent activity in AndroidManifest.xml. + int id = item.getItemId(); + + //noinspection SimplifiableIfStatement + if (id == R.id.action_settings) { + return true; + } + + return super.onOptionsItemSelected(item); + } + + @Override + public void onClick(View v) { + switch (v.getId()) { + case R.id.publish_remote_view_tile: + Intent intent = new Intent(Intent.ACTION_DIAL); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + intent.setData(Uri.parse("tel:2813308004")); + + PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0); + + RemoteViews remoteViews = new RemoteViews(getPackageName(), R.layout.tile_remote_view); + remoteViews.setOnClickPendingIntent(R.id.remote_view_button, pendingIntent); + + CustomTile.RemoteExpandedStyle remoteExpandedStyle = new CustomTile.RemoteExpandedStyle(); + remoteExpandedStyle.setRemoteViews(remoteViews); + + Intent deleteIntent = new Intent(); + deleteIntent.setAction(DeleteIntentReceiver.DELETE_ACTION); + + CustomTile customTile = new CustomTile.Builder(this) + .setDeleteIntent(PendingIntent.getBroadcast(this, 0, deleteIntent, 0)) + .setLabel("Remote Tile") + .setIcon(R.mipmap.ic_launcher) + .setContentDescription("Remote Expanded Style Tile") + .setExpandedStyle(remoteExpandedStyle) + .build(); + + mCMStatusBarManager.publishTile(1337, customTile); + break; + case R.id.publish_ap_triggered_profile: + mProfile = new Profile("Enable Bluetooth on WiFi connect"); + mProfile.setProfileType(Profile.Type.TOGGLE); + + final String triggerId; + final String triggerName; + final int triggerType; + final int triggerState; + + WifiTrigger trigger = mTriggers.get(0); // get first AP, doesn't matter what it is + + // Populate the arguments for the ProfileTrigger + triggerId = trigger.getSSID(); + triggerName = trigger.getTitle(); + triggerType = Profile.TriggerType.WIFI; // This is a wifi trigger + triggerState = Profile.TriggerState.ON_CONNECT; // On Connect of this, trigger + + Profile.ProfileTrigger profileTrigger = + new Profile.ProfileTrigger(triggerType, triggerId, triggerState, triggerName); + + ConnectionSettings connectionSettings = new ConnectionSettings( + ConnectionSettings.PROFILE_CONNECTION_BLUETOOTH, + ConnectionSettings.BooleanState.STATE_ENABLED, true); + + mProfile.setConnectionSettings(connectionSettings); + mProfile.setTrigger(profileTrigger); + + mProfileManager.addProfile(mProfile); + mProfileManager.setActiveProfile(mProfile.getUuid()); + + Toast.makeText(this, "Set up for AP " + triggerId + "\n" + + "With state pending on " + triggerState, Toast.LENGTH_SHORT).show(); + break; + } + } + + private void populateWifiTriggerList() { + final List configs = mWifiManager.getConfiguredNetworks(); + + if (configs != null) { + for (WifiConfiguration config : configs) { + WifiTrigger wifiTrigger = new WifiTrigger(config); + mTriggers.add(wifiTrigger); + } + } + } + + public static class WifiTrigger { + public String mSSID; + public WifiConfiguration mConfig; + + public WifiTrigger(WifiConfiguration config) { + mConfig = config; + loadConfig(config); + } + + public String getSSID() { + return mSSID; + } + + public String getTitle() { + return mSSID; + } + + private void loadConfig(WifiConfiguration config) { + mSSID = (config.SSID == null ? "" : removeDoubleQuotes(config.SSID)); + mConfig = config; + } + + public static String removeDoubleQuotes(String string) { + final int length = string.length(); + if (length >= 2) { + if (string.startsWith("\"") && string.endsWith("\"")) { + return string.substring(1, length - 1); + } + } + return string; + } + } +} diff --git a/samples/gradle-sample/ExampleApplication/app/src/main/res/layout/activity_main.xml b/samples/gradle-sample/ExampleApplication/app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..ba8b9a4 --- /dev/null +++ b/samples/gradle-sample/ExampleApplication/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,22 @@ + + +